From 3f4bbfb17caa9d7e8f6ef3e8c5bebac23c31d4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Fri, 30 Oct 2026 14:26:49 -0500 Subject: [PATCH 01/11] Preserve reviewed publisher headers in lazy dataset contracts --- docs/config.md | 58 +++ ...1b37fc9957eaadcc3ac936d49180bddac5ba6.json | 1 + ...b90596606cbfa71aeaaf540cc82c29d2a0639.json | 1 + ...340accc45accf084e940fef3de3d30123a63f.json | 1 + teadata/__init__.py | 46 ++- teadata/column_schema.py | 189 ++++++++-- teadata/manifest.py | 88 ++++- ..._student_staff_profile--2025--default.json | 1 - ..._student_staff_profile--2025--default.json | 1 - .../schemas/tapr--2025--header-crosswalk.json | 1 + teadata/scripts/build_tapr_2025_profiles.py | 210 ++++++----- teadata/teadata_config.py | 76 +++- teadata/teadata_sources.yaml | 26 +- tests/test_column_schema.py | 2 +- tests/test_header_crosswalk.py | 335 ++++++++++++++++++ tests/test_script_paths.py | 24 +- tests/test_tapr_profile_reader.py | 224 ++++++++++++ 17 files changed, 1136 insertions(+), 148 deletions(-) create mode 100644 provenance/records/819e8d1701c1e74b9419a62b9ae1b37fc9957eaadcc3ac936d49180bddac5ba6.json create mode 100644 provenance/records/a4fd3db96bc747077ec46c3b6a3b90596606cbfa71aeaaf540cc82c29d2a0639.json create mode 100644 provenance/records/bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f.json delete mode 100644 teadata/schemas/data_sources--campus_tapr_student_staff_profile--2025--default.json delete mode 100644 teadata/schemas/data_sources--district_tapr_student_staff_profile--2025--default.json create mode 100644 teadata/schemas/tapr--2025--header-crosswalk.json create mode 100644 tests/test_header_crosswalk.py create mode 100644 tests/test_tapr_profile_reader.py diff --git a/docs/config.md b/docs/config.md index 60c461e..b06af0c 100644 --- a/docs/config.md +++ b/docs/config.md @@ -197,6 +197,64 @@ not gain verified provenance merely because their configuration is extended. ## Maintenance Script Paths +Catalogs that bind a reviewed header crosswalk expose the publisher's source +codes, exact human labels and canonical Python field names without reading +source datasets or current YAML: + +```python +records = catalog.header_records( + "campus_tapr_student_staff_profile", edition="2025", table="student" +) +rename = catalog.header_mapping( + "campus_tapr_student_staff_profile", edition="2025", table="student", + from_="code", to="field", columns=df.columns, +) +renamed = df.rename(columns=rename) +``` + +For renaming your own data without a data release, use the explicit packaged +source-contract entry point instead. No raw datasets or cache artifacts are +required, and `TEADATA_RELEASE` is not consulted: + +```python +from teadata import load_config + +contract = load_config() # Packaged teadata_sources.yaml; an explicit path is also accepted. +records = contract.header_records( + "district_tapr_student_staff_profile", edition="2025", table="student" +) +rename = contract.header_mapping( + "district_tapr_student_staff_profile", edition="2025", table="student", + from_="code", to="field", columns=df.columns, +) +``` + +This selects the packaged source contract's reviewed mapping, which identifies +the exact edition and retained raw input SHA. It does not claim that those +facts belong to an installed data release. Release-bound catalog queries stay +independent and never fall back to this configuration. + +Records are detached ordinary dictionaries suitable for a pandas/Polars table +or `pyarrow.Table.from_pylist(records)`. They include dataset, selected edition, +table, position, exact code/label, canonical field, input and header-schema +hashes, and mapping version. Rename dictionaries also support `label` and +reverse directions. Ambiguous mappings, duplicate external headers and +collisions with unchanged destination columns raise errors. Source codes are +recorded metadata, not alternate canonical query-field authorities. +Passing `columns` also limits the dictionary to headers actually present, so +partial tables work with libraries that reject unknown rename keys. + +The same reviewed resource in `DatasetDefinition.reader.column_schema` drives +ETL and derives prepared column order. `BuildRecorder` binds its exact bytes +once into the catalog, together with the selected input, edition and read +schema. Lookup never falls back to package files or a newer configuration. +Older catalogs, including published 0.0.126, explicitly report the crosswalk +unavailable; the new contract requires a separately qualified future bundle. +Unreviewed years/datasets are not inferred. A retained-input comparison and a +new local observation do not establish an original download or historical +transformation event. Source layout and naming remain separate from masking +policies and measurement interpretation. + Maintenance scripts use the package-adjacent `teadata/data/` directory by default. Moving a checkout or invoking a script from another working directory does not change that default. Raw source datasets are ignored by Git and must diff --git a/provenance/records/819e8d1701c1e74b9419a62b9ae1b37fc9957eaadcc3ac936d49180bddac5ba6.json b/provenance/records/819e8d1701c1e74b9419a62b9ae1b37fc9957eaadcc3ac936d49180bddac5ba6.json new file mode 100644 index 0000000..f1994fa --- /dev/null +++ b/provenance/records/819e8d1701c1e74b9419a62b9ae1b37fc9957eaadcc3ac936d49180bddac5ba6.json @@ -0,0 +1 @@ +{"artifact":{"filename":"DISTPROF_2024-2025_FINAL.xlsx","sha256":"6068c6ac7a51c607c0f45744cf62948a339ee20f246db4ac08fee016f1b6f47d","size_bytes":1950210},"dataset":"district_tapr_student_staff_profile","downloaded_at":null,"kind":"acquisition","method":"local_observation","parameters":{},"recorded_at":"2026-10-30T18:22:57.360326+00:00","requested_url":null,"requested_year":null,"resolved_url":null,"resolved_year":2025,"response_headers":{},"schema_version":1,"section":"data_sources","source_metadata":{"field_year":2025,"identifiers":[],"metrics":{"student_enrollment_all_students_count":{"field":"district_2025_student_enrollment_all_students_count","unit":"count"},"student_membership_attrition_all_students_percent":{"field":"district_2025_student_membership_2023_24_attrition_all_students_percent","period":{"end_year":2024,"kind":"school_year","start_year":2023},"unit":"percent"},"student_membership_mobility_all_students_percent":{"field":"district_2025_student_membership_2024_mobility_all_students_percent","period":{"end_year":2024,"kind":"school_year","start_year":2023},"unit":"percent"}},"notes":"Migrated local input. Original download timestamp and acquisition URL are unknown; local observation must not be presented as an original download.","period":{"end_year":2025,"kind":"school_year","start_year":2024},"provenance_ids":[],"publisher":"Texas Education Agency","references":[{"provenance_ids":["e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db"],"reference_id":"glossary","role":"glossary","status":"available","title":"2024-25 Comprehensive TAPR Glossary","url":"https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf"},{"provenance_ids":[],"reference_id":"dictionary","role":"data_dictionary","status":"unreviewed"},{"provenance_ids":["6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554"],"reference_id":"masking","reviewed_sha256":"7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8","role":"masking_methodology","status":"available","title":"2024-2025 TAPR Masking Rules","url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html"},{"path":"schemas/tapr--2025--header-crosswalk.json","provenance_ids":["bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f"],"reference_id":"columns_default","reviewed_sha256":"fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339","role":"schema","status":"available","title":"TEA Data 2025 TAPR audited source-code, human-label and canonical-field crosswalk; not a publisher dictionary or historical processing receipt"}],"source_url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html","title":"2024-2025 TAPR District Profile","value_policy":"tapr_profile","version":"2025"}} diff --git a/provenance/records/a4fd3db96bc747077ec46c3b6a3b90596606cbfa71aeaaf540cc82c29d2a0639.json b/provenance/records/a4fd3db96bc747077ec46c3b6a3b90596606cbfa71aeaaf540cc82c29d2a0639.json new file mode 100644 index 0000000..655ce30 --- /dev/null +++ b/provenance/records/a4fd3db96bc747077ec46c3b6a3b90596606cbfa71aeaaf540cc82c29d2a0639.json @@ -0,0 +1 @@ +{"artifact":{"filename":"CAMPPROF_2024-2025_FINAL.xlsx","sha256":"bbe2c6432590faae7643a49415aaea66a9212021875cdf7be77e28250157bfc9","size_bytes":13206224},"dataset":"campus_tapr_student_staff_profile","downloaded_at":null,"kind":"acquisition","method":"local_observation","parameters":{},"recorded_at":"2026-10-30T18:22:57.338431+00:00","requested_url":null,"requested_year":null,"resolved_url":null,"resolved_year":2025,"response_headers":{},"schema_version":1,"section":"data_sources","source_metadata":{"field_year":2025,"identifiers":[],"metrics":{"student_enrollment_all_students_count":{"field":"campus_2025_student_enrollment_all_students_count","unit":"count"},"student_membership_attrition_all_students_percent":{"field":"campus_2025_student_membership_2023_24_attrition_all_students_percent","period":{"end_year":2024,"kind":"school_year","start_year":2023},"unit":"percent"},"student_membership_mobility_all_students_percent":{"field":"campus_2025_student_membership_2024_mobility_all_students_percent","period":{"end_year":2024,"kind":"school_year","start_year":2023},"unit":"percent"}},"notes":"Migrated local input. Original download timestamp and acquisition URL are unknown; local observation must not be presented as an original download.","period":{"end_year":2025,"kind":"school_year","start_year":2024},"provenance_ids":[],"publisher":"Texas Education Agency","references":[{"provenance_ids":["e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db"],"reference_id":"glossary","role":"glossary","status":"available","title":"2024-25 Comprehensive TAPR Glossary","url":"https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf"},{"provenance_ids":[],"reference_id":"dictionary","role":"data_dictionary","status":"unreviewed"},{"provenance_ids":["6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554"],"reference_id":"masking","reviewed_sha256":"7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8","role":"masking_methodology","status":"available","title":"2024-2025 TAPR Masking Rules","url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html"},{"path":"schemas/tapr--2025--header-crosswalk.json","provenance_ids":["bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f"],"reference_id":"columns_default","reviewed_sha256":"fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339","role":"schema","status":"available","title":"TEA Data 2025 TAPR audited source-code, human-label and canonical-field crosswalk; not a publisher dictionary or historical processing receipt"}],"source_url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html","title":"2024-2025 TAPR Campus Profile","value_policy":"tapr_profile","version":"2025"}} diff --git a/provenance/records/bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f.json b/provenance/records/bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f.json new file mode 100644 index 0000000..e5157d7 --- /dev/null +++ b/provenance/records/bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f.json @@ -0,0 +1 @@ +{"artifact":{"filename":"tapr--2025--header-crosswalk.json","sha256":"fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339","size_bytes":110866},"dataset":"reference:columns_default","downloaded_at":null,"kind":"acquisition","method":"local_observation","parameters":{},"recorded_at":"2026-10-30T18:22:57.258987+00:00","requested_url":null,"requested_year":null,"resolved_url":null,"resolved_year":2025,"response_headers":{},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"TEA Data 2025 TAPR audited source-code, human-label and canonical-field crosswalk; not a publisher dictionary or historical processing receipt"}} diff --git a/teadata/__init__.py b/teadata/__init__.py index 2b36606..4f9111e 100644 --- a/teadata/__init__.py +++ b/teadata/__init__.py @@ -1,6 +1,8 @@ # teadata/__init__.py from importlib.metadata import PackageNotFoundError, version +from importlib import import_module import sys +from typing import TYPE_CHECKING, Any import warnings _MINIMUM_PYTHON = (3, 11) @@ -65,12 +67,43 @@ def _gte(installed: str, required: str) -> bool: except PackageNotFoundError: __version__ = "0.0.0" -from .classes import DataEngine, District, Campus # noqa: E402 -from .dataset_metadata import DataPeriod, DatasetMetadata, ResolvedDataset # noqa: E402 -from .provenance import ProvenanceStore # noqa: E402 -from .manifest import DatasetCatalog # noqa: E402 -from .release import DataRelease, current_release # noqa: E402 -from .values import Measurement, ValueStatus, ValuePolicy, EstimationPolicy, measure, aggregate # noqa: E402 +if TYPE_CHECKING: + from .classes import DataEngine, District, Campus + from .dataset_metadata import DataPeriod, DatasetMetadata, ResolvedDataset + from .provenance import ProvenanceStore + from .manifest import DatasetCatalog + from .release import DataRelease, current_release + from .teadata_config import load_config + from .values import Measurement, ValueStatus, ValuePolicy, EstimationPolicy, measure, aggregate + + +_EXPORT_MODULES = { + **dict.fromkeys(("DataEngine", "District", "Campus"), ".classes"), + **dict.fromkeys(("DataPeriod", "DatasetMetadata", "ResolvedDataset"), ".dataset_metadata"), + "ProvenanceStore": ".provenance", + "DatasetCatalog": ".manifest", + **dict.fromkeys(("DataRelease", "current_release"), ".release"), + "load_config": ".teadata_config", + **dict.fromkeys(("Measurement", "ValueStatus", "ValuePolicy", "EstimationPolicy", "measure", "aggregate"), ".values"), +} + + +def __getattr__(name: str) -> Any: + """Load public symbols on demand; metadata discovery does not load the engine. + + Heavy entity exports still use the existing classes module so this step + preserves the released snapshot module paths until their planned retirement. + """ + module = _EXPORT_MODULES.get(name) + if module is None: + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + value = getattr(import_module(module, __name__), name) + globals()[name] = value + return value + + +def __dir__() -> list[str]: + return sorted(set(globals()) | _EXPORT_MODULES.keys()) __all__ = [ "DataEngine", @@ -84,6 +117,7 @@ def _gte(installed: str, required: str) -> bool: "DatasetCatalog", "DataRelease", "current_release", + "load_config", "Measurement", "ValueStatus", "ValuePolicy", diff --git a/teadata/column_schema.py b/teadata/column_schema.py index f47adfa..c5ded3d 100644 --- a/teadata/column_schema.py +++ b/teadata/column_schema.py @@ -4,8 +4,10 @@ from hashlib import sha256 import json +import keyword from pathlib import Path, PurePosixPath -from typing import Any, Mapping +import re +from typing import Any, Iterable, Mapping def reader_options(reader: Mapping[str, Any], profile: str | None) -> dict[str, Any]: @@ -57,28 +59,167 @@ def _unique_object(pairs: list[tuple[str, Any]]) -> dict[str, Any]: return result -def load_column_schema( - base_dir: Path, relative: str, reviewed_sha256: str -) -> list[str]: - """Read exact reviewed bytes and validate the complete schema document.""" - path = portable_schema_path(base_dir, relative) - data = path.read_bytes() - if sha256(data).hexdigest() != reviewed_sha256: - raise ValueError("Column schema bytes differ from the reviewed contract") +def source_schema_fingerprint(labels: list[str], codes: list[str]) -> str: + """Identify the exact ordered human-label/code headers, including whitespace.""" + data = json.dumps({"labels": labels, "codes": codes}, sort_keys=True, + separators=(",", ":"), ensure_ascii=True) + "\n" + return sha256(data.encode()).hexdigest() + + +def _checksum(value: Any) -> bool: + return isinstance(value, str) and re.fullmatch(r"[0-9a-f]{64}", value) is not None + + +def validate_header_table(table: Mapping[str, Any]) -> None: + """Validate one explicit mapping; never synthesize or deduplicate names.""" + if (not isinstance(table, dict) + or set(table) != {"table", "input_sha256", "source_schema_sha256", "fields"} + or not isinstance(table["table"], str) or not table["table"].strip() + or not _checksum(table["input_sha256"]) or not _checksum(table["source_schema_sha256"]) + or not isinstance(table["fields"], list) or not table["fields"]): + raise ValueError("Invalid header crosswalk table") + seen_codes, seen_fields = set(), set() + for position, field in enumerate(table["fields"], 1): + if (not isinstance(field, dict) or set(field) != {"position", "code", "label", "field"} + or type(field["position"]) is not int or field["position"] != position + or not isinstance(field["code"], str) or not field["code"].strip() + or not isinstance(field["label"], str) or not field["label"].strip() + or not isinstance(field["field"], str)): + raise ValueError(f"Invalid header crosswalk column {position}") + name = field["field"] + if re.fullmatch(r"[a-z_][a-z0-9_]*", name) is None or keyword.iskeyword(name): + raise ValueError(f"Invalid canonical header in column {position}: {name!r}; ASCII snake_case is required") + if field["code"].strip() in seen_codes: + raise ValueError(f"Duplicate source code in header column {position}: {field['code']!r}") + if name in seen_fields: + raise ValueError(f"Canonical header collision in column {position}: {name!r}") + seen_codes.add(field["code"].strip()) + seen_fields.add(name) + if source_schema_fingerprint([f["label"] for f in table["fields"]], + [f["code"] for f in table["fields"]]) != table["source_schema_sha256"]: + raise ValueError("Header crosswalk source-schema checksum mismatch") + + +def parse_column_schema(data: bytes) -> dict[str, Any]: + """Validate either retained flat columns or an explicit qualified crosswalk.""" document = json.loads(data, object_pairs_hook=_unique_object) - if ( - not isinstance(document, dict) - or set(document) != {"schema_version", "columns"} - or type(document["schema_version"]) is not int - or document["schema_version"] != 1 - or not isinstance(document["columns"], list) - or any( - not isinstance(column, str) or not column.strip() - for column in document["columns"] - ) - ): + if not isinstance(document, dict) or type(document.get("schema_version")) is not int: + raise ValueError("Invalid column schema document") + if document["schema_version"] == 1: + if (set(document) != {"schema_version", "columns"} + or not isinstance(document["columns"], list) + or any(not isinstance(c, str) or not c.strip() for c in document["columns"])): + raise ValueError("Invalid column schema document") + if len(document["columns"]) != len(set(document["columns"])): + raise ValueError("Column schema contains duplicate columns") + elif document["schema_version"] == 2: + if (set(document) != {"schema_version", "mapping_version", "datasets"} + or type(document["mapping_version"]) is not int or document["mapping_version"] < 1 + or not isinstance(document["datasets"], list) or not document["datasets"]): + raise ValueError("Invalid column schema document") + seen = set() + for dataset in document["datasets"]: + if (not isinstance(dataset, dict) + or set(dataset) != {"dataset", "edition", "prepared_input_sha256", "tables"} + or any(not isinstance(dataset[k], str) or not dataset[k].strip() for k in ("dataset", "edition")) + or not _checksum(dataset["prepared_input_sha256"]) + or not isinstance(dataset["tables"], list) or not dataset["tables"]): + raise ValueError("Invalid header crosswalk dataset") + identity = dataset["dataset"], dataset["edition"] + if identity in seen: + raise ValueError("Duplicate header crosswalk dataset edition") + seen.add(identity) + tables, shared = set(), {} + for table in dataset["tables"]: + validate_header_table(table) + if table["table"] in tables: + raise ValueError("Duplicate header crosswalk table") + tables.add(table["table"]) + for field in table["fields"]: + old = shared.setdefault(field["field"], (field["code"], field["label"])) + if old != (field["code"], field["label"]): + raise ValueError("Conflicting shared crosswalk field definitions") + else: raise ValueError("Invalid column schema document") - columns = document["columns"] - if len(columns) != len(set(columns)): - raise ValueError("Column schema contains duplicate columns") - return list(columns) + return document + + +def load_column_contract(base_dir: Path, relative: str, reviewed_sha256: str) -> dict[str, str]: + """Return verified exact resource text for binding into a build catalog.""" + data = portable_schema_path(base_dir, relative).read_bytes() + if sha256(data).hexdigest() != reviewed_sha256: + raise ValueError("Column schema bytes differ from the reviewed contract") + parse_column_schema(data) + return {"path": relative, "sha256": reviewed_sha256, "text": data.decode("utf-8")} + + +def crosswalk_dataset(document: Mapping[str, Any], dataset: str, edition: str) -> dict[str, Any]: + if document.get("schema_version") == 2: + for item in document["datasets"]: + if item["dataset"] == dataset and item["edition"] == edition: + return item + raise ValueError(f"Header crosswalk unavailable for {dataset!r}, edition {edition!r}") + + +def schema_columns(document: Mapping[str, Any], *, dataset: str | None = None, + edition: str | None = None) -> list[str]: + if document["schema_version"] == 1: + return list(document["columns"]) + if dataset is None or edition is None: + raise ValueError("Header crosswalk requires an explicit dataset and edition") + selected = crosswalk_dataset(document, dataset, edition) + return list(dict.fromkeys(field["field"] for table in selected["tables"] for field in table["fields"])) + + +def validate_selected_crosswalk(document: Mapping[str, Any], *, dataset: str, edition: str, + input_sha256: str, columns: list[str]) -> None: + selected = crosswalk_dataset(document, dataset, edition) + if selected["prepared_input_sha256"] != input_sha256: + raise ValueError("Header crosswalk belongs to a different prepared input") + if schema_columns(document, dataset=dataset, edition=edition) != columns: + raise ValueError("Header crosswalk differs from the selected prepared schema") + + +def header_records(document: Mapping[str, Any], *, dataset: str, edition: str, + table: str | None = None) -> list[dict[str, Any]]: + selected = crosswalk_dataset(document, dataset, edition) + tables = [item for item in selected["tables"] if table is None or item["table"] == table] + if not tables: + raise ValueError(f"Header crosswalk table unavailable: {table!r}") + return [{**field, "dataset": dataset, "edition": edition, "table": item["table"], + "mapping_version": document["mapping_version"], "input_sha256": item["input_sha256"], + "source_schema_sha256": item["source_schema_sha256"]} + for item in tables for field in item["fields"]] + + +def header_rename_map(records: list[dict[str, Any]], *, from_: str = "code", to: str = "field", + columns: Iterable[str] | None = None) -> dict[str, str]: + """Produce an ordinary rename dictionary, refusing ambiguous destinations.""" + if from_ not in {"code", "label", "field"} or to not in {"code", "label", "field"}: + raise ValueError("Header mapping requires code, label or field") + result: dict[str, str] = {} + destinations = set() + for record in records: + source, target = record[from_], record[to] + if source in result or target in destinations: + raise ValueError("Ambiguous header mapping; select one table and distinct source/destination headers") + result[source] = target + destinations.add(target) + if columns is not None: + if isinstance(columns, (str, bytes)): + raise ValueError("External headers must be a sequence of column names") + names = list(columns) + if any(not isinstance(name, str) for name in names) or len(names) != len(set(names)): + raise ValueError("External headers contain invalid or duplicate names") + renamed = [result.get(name, name) for name in names] + if len(renamed) != len(set(renamed)): + raise ValueError("Header mapping collides with an external destination column") + selected = set(names) + result = {source: target for source, target in result.items() if source in selected} + return result + + +def load_column_schema(base_dir: Path, relative: str, reviewed_sha256: str, *, + dataset: str | None = None, edition: str | None = None) -> list[str]: + contract = load_column_contract(base_dir, relative, reviewed_sha256) + return schema_columns(parse_column_schema(contract["text"].encode()), dataset=dataset, edition=edition) diff --git a/teadata/manifest.py b/teadata/manifest.py index 538b3c4..97b510c 100644 --- a/teadata/manifest.py +++ b/teadata/manifest.py @@ -13,13 +13,17 @@ import platform import os import sqlite3 -from typing import Any, Mapping +from typing import Any, Iterable, Mapping from .dataset_metadata import DataPeriod, DatasetMetadata, MetricDefinition, ResolvedDataset from .metric_bindings import MetricBinding, parse_bindings from .provenance import ProvenanceStore from .values import Measurement, ValuePolicy, ValueStatus, measure from .transfer_summary import charter_transfer_observations +from .column_schema import ( + parse_column_schema, reader_options, validate_selected_crosswalk, + header_records as crosswalk_records, header_rename_map, +) CATALOG_SCHEMA = 2 @@ -123,6 +127,17 @@ def __init__(self, document: Mapping[str, Any], *, expected_build_id: str | None raise ContractError("A data release requires loaded dataset metadata") policies = document.get("value_policies", {}) records = document.get("provenance", {}) + column_schemas = document.get("column_schemas", {}) + if not isinstance(column_schemas, dict): + raise ContractError("Invalid catalog column-schema resources") + self._column_schemas = {} + for digest, text in column_schemas.items(): + if not isinstance(text, str) or sha256(text.encode()).hexdigest() != digest: + raise ContractError("Catalog column-schema resource checksum mismatch") + try: + self._column_schemas[digest] = parse_column_schema(text.encode()) + except ValueError as error: + raise ContractError(f"Invalid catalog column-schema resource: {error}") from error for identifier, record in records.items(): if ( sha256((canonical_json(record) + "\n").encode()).hexdigest() @@ -164,6 +179,9 @@ def __init__(self, document: Mapping[str, Any], *, expected_build_id: str | None for identifier in metadata.provenance_ids: record = records.get(identifier, {}) _verify_input_receipt(record, dataset=key, section=section, artifact=artifact) + if (value.get("column_schema_sha256") is not None + and record.get("resolved_year") != value.get("resolved_year")): + raise ContractError("Header crosswalk source year differs from its acquisition receipt") metadata_matched |= _metadata_content(metadata) == _metadata_content(DatasetMetadata.from_dict(record.get("source_metadata"))) if not metadata_matched: raise ContractError(f"Source metadata differs from its receipt: {key}") @@ -190,6 +208,26 @@ def __init__(self, document: Mapping[str, Any], *, expected_build_id: str | None raise ContractError("Reference receipt belongs to a different document") if reference.reviewed_sha256 is not None and record.get("artifact", {}).get("sha256") != reference.reviewed_sha256: raise ContractError("Reference bytes differ from reviewed methodology") + crosswalk_sha = value.get("column_schema_sha256") + if crosswalk_sha is not None: + if crosswalk_sha not in self._column_schemas or metadata.version is None: + raise ContractError("Header crosswalk is not bound to the selected source edition and schema reference") + reads = value.get("reads", []) + if not reads: + raise ContractError("Header crosswalk requires a recorded prepared-schema read") + try: + for read in reads: + options = reader_options(value.get("reader", {}), read["profile"]) + schema_references = [item for item in metadata.references + if item.role == "schema" and item.path == options.get("column_schema")] + if (len(schema_references) != 1 or schema_references[0].status != "available" + or schema_references[0].reviewed_sha256 != crosswalk_sha): + raise ValueError("Header crosswalk differs from the selected reader profile's reviewed schema reference") + validate_selected_crosswalk(self._column_schemas[crosswalk_sha], dataset=key, + edition=metadata.version, input_sha256=artifact["sha256"], + columns=read["columns"]) + except (KeyError, ValueError) as error: + raise ContractError(f"Invalid selected header crosswalk: {error}") from error self._build_id = identity self._serialized = canonical_json(document) self._policies = { @@ -230,6 +268,7 @@ def create( records: Mapping[str, Any] | None = None, environment: Mapping[str, Any] | None = None, metric_bindings: Mapping[str, Any] | None = None, + column_schemas: Mapping[str, str] | None = None, ) -> DatasetCatalog: content = { "schema_version": CATALOG_SCHEMA, @@ -240,6 +279,8 @@ def create( "build_environment": dict(environment or {}), "metric_bindings": dict(metric_bindings or {}), } + if column_schemas: + content["column_schemas"] = dict(column_schemas) return cls( { **content, @@ -266,6 +307,35 @@ def metadata(self, dataset: str) -> DatasetMetadata: f"Dataset was not loaded in this release: {dataset}" ) from exc + def header_records(self, dataset: str, *, edition: str | None = None, + table: str | None = None) -> list[dict[str, Any]]: + """Return detached code/label/field records from this release's bound resource. + + Only the selected source edition is available. No package YAML, files, + source rows or network are consulted, including for older releases. + """ + metadata = self.metadata(dataset) + selected = metadata.version + if edition is not None and edition != selected: + raise ContractError(f"Header crosswalk edition unavailable: {edition!r}; selected {selected!r}") + digest = self._sources[dataset].get("column_schema_sha256") + if digest is None or selected is None: + raise ContractError(f"Header crosswalk unavailable for selected dataset {dataset!r}") + try: + return crosswalk_records(self._column_schemas[digest], dataset=dataset, edition=selected, table=table) + except ValueError as error: + raise ContractError(str(error)) from error + + def header_mapping(self, dataset: str, *, table: str, edition: str | None = None, + from_: str = "code", to: str = "field", + columns: Iterable[str] | None = None) -> dict[str, str]: + """Return a plain rename map; optional external headers detect collisions.""" + try: + return header_rename_map(self.header_records(dataset, edition=edition, table=table), + from_=from_, to=to, columns=columns) + except ValueError as error: + raise ContractError(str(error)) from error + def acquisitions(self, dataset: str) -> list[dict[str, Any]]: """Return immutable acquisition observations, including unknown download dates.""" records = self.to_dict()["provenance"] @@ -593,6 +663,7 @@ def __init__(self, cfg: Any, store: ProvenanceStore): self.processor_sha256 = processor_identity() self.store = store self.datasets: dict[str, Any] = {} + self.column_schemas: dict[str, str] = {} self._token = None def __enter__(self) -> BuildRecorder: @@ -659,6 +730,20 @@ def after_read( "status": "loaded", "reads": [], } + contract = self.cfg.column_contract(source.dataset, source.requested_year, + section=source.section, reader_profile=profile) + if contract is not None: + schema = parse_column_schema(contract["text"].encode()) + if schema["schema_version"] == 2: + if source.metadata.version is None: + raise ContractError("Header crosswalk requires an explicit source edition") + try: + validate_selected_crosswalk(schema, dataset=source.dataset, edition=source.metadata.version, + input_sha256=identity["sha256"], columns=columns) + except ValueError as error: + raise ContractError(f"Invalid build header crosswalk: {error}") from error + document["column_schema_sha256"] = contract["sha256"] + self.column_schemas[contract["sha256"]] = contract["text"] old = self.datasets.get(source.dataset) if old is not None: if {k: v for k, v in old.items() if k != "reads"} != { @@ -719,6 +804,7 @@ def catalog(self) -> DatasetCatalog: ) }, }, + column_schemas=self.column_schemas, ) diff --git a/teadata/schemas/data_sources--campus_tapr_student_staff_profile--2025--default.json b/teadata/schemas/data_sources--campus_tapr_student_staff_profile--2025--default.json deleted file mode 100644 index cea421e..0000000 --- a/teadata/schemas/data_sources--campus_tapr_student_staff_profile--2025--default.json +++ /dev/null @@ -1 +0,0 @@ -{"columns":["campus_number","campus_name","district_number","district_name","campus_2025_class_size_sec_english_avg_size","campus_2025_class_size_sec_math_avg_size","campus_2025_class_size_sec_sci_avg_size","campus_2025_class_size_sec_soc_stud_avg_size","campus_2025_class_size_sec_for_lng_avg_size","campus_2025_class_size_kindergarten_avg_size","campus_2025_class_size_grade_1_avg_size","campus_2025_class_size_grade_2_avg_size","campus_2025_class_size_grade_3_avg_size","campus_2025_class_size_grade_4_avg_size","campus_2025_class_size_grade_5_avg_size","campus_2025_class_size_grade_6_avg_size","campus_2024_retention_regular_ed_kg_rate","campus_2024_retention_regular_ed_01_rate","campus_2024_retention_regular_ed_02_rate","campus_2024_retention_regular_ed_03_rate","campus_2024_retention_regular_ed_04_rate","campus_2024_retention_regular_ed_05_rate","campus_2024_retention_regular_ed_06_rate","campus_2024_retention_regular_ed_07_rate","campus_2024_retention_regular_ed_08_rate","campus_2024_retention_regular_ed_09_rate","campus_2024_retention_special_ed_kg_rate","campus_2024_retention_special_ed_01_rate","campus_2024_retention_special_ed_02_rate","campus_2024_retention_special_ed_03_rate","campus_2024_retention_special_ed_04_rate","campus_2024_retention_special_ed_05_rate","campus_2024_retention_special_ed_06_rate","campus_2024_retention_special_ed_07_rate","campus_2024_retention_special_ed_08_rate","campus_2024_retention_special_ed_09_rate","campus_2025_student_membership_total_students_with_disabilities_count","campus_2025_student_membership_intellectual_disabilities_count","campus_2025_student_membership_physical_disabilities_count","campus_2025_student_membership_behavioral_disabilities_count","campus_2025_student_membership_autism_count","campus_2025_student_membership_non_categorical_early_childhood_count","campus_2025_student_membership_intellectual_disabilities_percent","campus_2025_student_membership_physical_disabilities_percent","campus_2025_student_membership_behavioral_disabilities_percent","campus_2025_student_membership_autism_percent","campus_2025_student_membership_non_categorical_early_childhood_percent","campus_2024_daep_count","campus_2024_daep_percent","campus_2025_student_membership_2023_24_attrition_all_students_count","campus_2025_student_membership_2023_24_attrition_all_students_percent","campus_2025_student_membership_eb_el_percent","campus_2025_student_membership_econ_disadv_percent","campus_2025_student_membership_at_risk_percent","campus_2025_student_membership_non_educationally_disadv_percent","campus_2025_student_membership_econ_disadv_count","campus_2025_student_membership_at_risk_count","campus_2025_student_membership_eb_el_count","campus_2025_student_membership_non_educationally_disadv_count","campus_2025_student_membership_special_ed_count","campus_2025_student_membership_gifted_and_talented_count","campus_2025_student_membership_all_students_count","campus_2025_student_membership_title_i_count","campus_2025_student_membership_homeless_count","campus_2025_student_membership_immigrant_count","campus_2025_student_membership_section_504_count","campus_2025_student_membership_dyslexia_count","campus_2025_student_membership_migrant_count","campus_2025_student_membership_military_connected_count","campus_2025_student_membership_foster_care_count","campus_2025_student_membership_pk_ages_3_and_under_count","campus_2025_student_membership_pk_ages_4_and_over_count","campus_2025_student_membership_bilingual_esl_count","campus_2025_student_membership_american_indian_count","campus_2025_student_membership_asian_count","campus_2025_student_membership_pacific_islander_count","campus_2025_student_membership_two_or_more_races_count","campus_2025_student_membership_african_american_count","campus_2025_student_membership_hispanic_count","campus_2025_student_membership_white_count","campus_2025_student_membership_ee_count","campus_2025_student_membership_pk_count","campus_2025_student_membership_kg_count","campus_2025_student_membership_01_count","campus_2025_student_membership_02_count","campus_2025_student_membership_03_count","campus_2025_student_membership_04_count","campus_2025_student_membership_05_count","campus_2025_student_membership_06_count","campus_2025_student_membership_07_count","campus_2025_student_membership_08_count","campus_2025_student_membership_09_count","campus_2025_student_membership_10_count","campus_2025_student_membership_11_count","campus_2025_student_membership_12_count","campus_2025_student_membership_male_count","campus_2025_student_membership_female_count","campus_2025_student_membership_white_percent","campus_2025_student_membership_african_american_percent","campus_2025_student_membership_hispanic_percent","campus_2025_student_membership_american_indian_percent","campus_2025_student_membership_asian_percent","campus_2025_student_membership_pacific_islander_percent","campus_2025_student_membership_two_or_more_races_percent","campus_2025_student_membership_special_ed_percent","campus_2025_student_membership_bilingual_esl_percent","campus_2025_student_membership_gifted_and_talented_percent","campus_2025_student_membership_dyslexia_percent","campus_2025_student_membership_section_504_percent","campus_2025_student_membership_title_i_percent","campus_2025_student_membership_homeless_percent","campus_2025_student_membership_immigrant_percent","campus_2025_student_membership_foster_care_percent","campus_2025_student_membership_migrant_percent","campus_2025_student_membership_military_connected_percent","campus_2025_student_membership_ee_percent","campus_2025_student_membership_pk_percent","campus_2025_student_membership_pk_ages_3_and_under_percent","campus_2025_student_membership_pk_ages_4_and_over_percent","campus_2025_student_membership_kg_percent","campus_2025_student_membership_01_percent","campus_2025_student_membership_02_percent","campus_2025_student_membership_03_percent","campus_2025_student_membership_04_percent","campus_2025_student_membership_05_percent","campus_2025_student_membership_06_percent","campus_2025_student_membership_07_percent","campus_2025_student_membership_08_percent","campus_2025_student_membership_09_percent","campus_2025_student_membership_10_percent","campus_2025_student_membership_11_percent","campus_2025_student_membership_12_percent","campus_2025_student_membership_male_percent","campus_2025_student_membership_female_percent","campus_2025_student_membership_career_and_technical_education_count","campus_2025_student_membership_career_and_technical_9_12_education_count","campus_2025_student_membership_career_and_technical_education_percent","campus_2025_student_membership_career_and_technical_9_12_education_percent","campus_2025_student_enrollment_all_students_count","campus_2025_student_enrollment_early_childhood_education_count","campus_2025_student_enrollment_early_childhood_education_percent","campus_2025_student_enrollment_pre_kindergarten_count","campus_2025_student_enrollment_pre_kindergarten_percent","campus_2025_student_enrollment_pre_kindergarten_3_year_old_count","campus_2025_student_enrollment_pre_kindergarten_3_year_old_percent","campus_2025_student_enrollment_pre_kindergarten_4_year_old_count","campus_2025_student_enrollment_pre_kindergarten_4_year_old_percent","campus_2025_student_enrollment_kindergarten_count","campus_2025_student_enrollment_kindergarten_percent","campus_2025_student_enrollment_grade_1_count","campus_2025_student_enrollment_grade_1_percent","campus_2025_student_enrollment_grade_2_count","campus_2025_student_enrollment_grade_2_percent","campus_2025_student_enrollment_grade_3_count","campus_2025_student_enrollment_grade_3_percent","campus_2025_student_enrollment_grade_4_count","campus_2025_student_enrollment_grade_4_percent","campus_2025_student_enrollment_grade_5_count","campus_2025_student_enrollment_grade_5_percent","campus_2025_student_enrollment_grade_6_count","campus_2025_student_enrollment_grade_6_percent","campus_2025_student_enrollment_grade_7_count","campus_2025_student_enrollment_grade_7_percent","campus_2025_student_enrollment_grade_8_count","campus_2025_student_enrollment_grade_8_percent","campus_2025_student_enrollment_grade_9_count","campus_2025_student_enrollment_grade_9_percent","campus_2025_student_enrollment_grade_10_count","campus_2025_student_enrollment_grade_10_percent","campus_2025_student_enrollment_grade_11_count","campus_2025_student_enrollment_grade_11_percent","campus_2025_student_enrollment_grade_12_count","campus_2025_student_enrollment_grade_12_percent","campus_2025_student_enrollment_african_american_count","campus_2025_student_enrollment_african_american_percent","campus_2025_student_enrollment_hispanic_count","campus_2025_student_enrollment_hispanic_percent","campus_2025_student_enrollment_white_count","campus_2025_student_enrollment_white_percent","campus_2025_student_enrollment_asian_count","campus_2025_student_enrollment_asian_percent","campus_2024_25_asian_students_count","campus_2024_25_asian_students_percent","campus_2025_student_enrollment_pacific_islander_count","campus_2025_student_enrollment_pacific_islander_percent","campus_2025_student_enrollment_two_or_more_races_count","campus_2025_student_enrollment_two_or_more_races_percent","campus_2025_student_enrollment_female_count","campus_2025_student_enrollment_female_percent","campus_2025_student_enrollment_male_count","campus_2025_student_enrollment_male_percent","campus_2025_student_enrollment_economically_disadvantaged_count","campus_2025_student_enrollment_economically_disadvantaged_percent","campus_2025_student_enrollment_non_educationally_disadv_count","campus_2025_student_enrollment_non_educationally_disadv_percent","campus_2025_student_enrollment_section_504_count","campus_2025_student_enrollment_section_504_percent","campus_2025_student_enrollment_english_learner_count","campus_2025_student_enrollment_english_learner_percent","campus_2025_student_enrollment_dyslexia_count","campus_2025_student_enrollment_dyslexia_percent","campus_2025_student_enrollment_foster_care_count","campus_2025_student_enrollment_foster_care_percent","campus_2025_student_enrollment_homeless_count","campus_2025_student_enrollment_homeless_percent","campus_2025_student_enrollment_immigrant_count","campus_2025_student_enrollment_immigrant_percent","campus_2025_student_enrollment_migrant_count","campus_2025_student_enrollment_migrant_percent","campus_2025_student_enrollment_title_i_count","campus_2025_student_enrollment_title_i_percent","campus_2025_student_enrollment_military_connected_count","campus_2025_student_enrollment_military_connected_percent","campus_2025_student_enrollment_at_risk_count","campus_2025_student_enrollment_at_risk_percent","campus_2025_student_enrollment_bilingual_esl_count","campus_2025_student_enrollment_bilingual_esl_percent","campus_2025_student_enrollment_gifted_and_talented_count","campus_2025_student_enrollment_gifted_and_talented_percent","campus_2025_student_enrollment_special_ed_count","campus_2025_student_enrollment_special_ed_percent","campus_2025_student_membership_2024_mobility_all_students_count","campus_2025_student_membership_2024_mobility_american_indian_count","campus_2025_student_membership_2024_mobility_asian_count","campus_2025_student_membership_2024_mobility_pacific_islander_count","campus_2025_student_membership_2024_mobility_two_or_more_races_count","campus_2025_student_membership_2024_mobility_african_american_count","campus_2025_student_membership_2024_mobility_hispanic_count","campus_2025_student_membership_2024_mobility_white_count","campus_2025_student_membership_2024_mobility_econ_disadv_count","campus_2025_student_membership_2024_mobility_eb_el_count","campus_2025_student_membership_2024_mobility_special_ed_count","campus_2025_student_membership_2024_mobility_all_students_percent","campus_2025_student_membership_2024_mobility_african_american_percent","campus_2025_student_membership_2024_mobility_hispanic_percent","campus_2025_student_membership_2024_mobility_american_indian_percent","campus_2025_student_membership_2024_mobility_white_percent","campus_2025_student_membership_2024_mobility_asian_percent","campus_2025_student_membership_2024_mobility_pacific_islander_percent","campus_2025_student_membership_2024_mobility_two_or_more_races_percent","campus_2025_student_membership_2024_mobility_econ_disadv_percent","campus_2025_student_membership_2024_mobility_eb_el_percent","campus_2025_student_membership_2024_mobility_special_ed_percent","campus_2025_staff_teacher_total_full_time_equiv_count","campus_2025_staff_support_total_full_time_equiv_count","campus_2025_staff_school_admin_total_full_time_equiv_count","campus_2025_staff_central_admin_total_full_time_equiv_count","campus_2025_staff_educ_aide_total_full_time_equiv_count","campus_2025_staff_teacher_beginning_full_time_equiv_count","campus_2025_staff_teacher_1_5_years_full_time_equiv_count","campus_2025_staff_teacher_6_10_years_full_time_equiv_count","campus_2025_staff_teacher_11_20_years_full_time_equiv_count","campus_2025_staff_teacher_21_30_years_full_time_equiv_count","campus_2025_staff_teacher_gt_30_years_full_time_equiv_count","campus_2025_staff_teacher_no_degree_full_time_equiv_count","campus_2025_staff_teacher_ba_degree_full_time_equiv_count","campus_2025_staff_teacher_ms_degree_full_time_equiv_count","campus_2025_staff_teacher_ph_degree_full_time_equiv_count","campus_2025_staff_professional_total_full_time_equiv_count","campus_2025_staff_all_staff_total_full_time_equiv_count","campus_2025_staff_counselor_total_part_time_equiv_count","campus_2025_staff_counselor_total_full_time_equiv_count","campus_2025_staff_librarian_total_part_time_equiv_count","campus_2025_staff_librarian_total_full_time_equiv_count","campus_2025_staff_support_total_base_salary_average","campus_2025_staff_school_admin_total_base_salary_average","campus_2025_staff_central_admin_total_base_salary_average","campus_2025_staff_teacher_total_base_salary_average","campus_2025_staff_teacher_beginning_base_salary_average","campus_2025_staff_teacher_1_5_years_base_salary_average","campus_2025_staff_teacher_6_10_years_base_salary_average","campus_2025_staff_teacher_11_20_years_base_salary_average","campus_2025_staff_teacher_21_30_years_base_salary_average","campus_2025_staff_teacher_gt_30_years_base_salary_average","campus_2025_staff_teacher_american_indian_full_time_equiv_count","campus_2025_staff_teacher_pacific_islander_full_time_equiv_count","campus_2025_staff_teacher_asian_full_time_equiv_count","campus_2025_staff_teacher_african_american_full_time_equiv_count","campus_2025_staff_teacher_hispanic_full_time_equiv_count","campus_2025_staff_teacher_white_full_time_equiv_count","campus_2025_staff_teacher_two_or_more_races_full_time_equiv_count","campus_2025_staff_teacher_male_full_time_equiv_count","campus_2025_staff_teacher_female_full_time_equiv_count","campus_2025_staff_average_years_experience_of_teachers_with_district","campus_2025_staff_teacher_experience_average","campus_2025_staff_teacher_regular_program_full_time_equiv_count","campus_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_count","campus_2025_staff_teacher_bilingual_program_full_time_equiv_count","campus_2025_staff_teacher_compensatory_program_full_time_equiv_count","campus_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_count","campus_2025_staff_teacher_special_education_full_time_equiv_count","campus_2025_staff_teacher_other_full_time_equiv_count","campus_2025_staff_principal_experience_average","campus_2025_staff_average_years_experience_of_principals_with_district","campus_2025_staff_assistant_principal_experience_average","campus_2025_staff_average_years_experience_of_assistant_principals_with_district","campus_2025_staff_all_staff_minority_full_time_equiv_count","campus_2025_staff_teacher_total_full_time_equiv_percent","campus_2025_staff_support_total_full_time_equiv_percent","campus_2025_staff_school_admin_total_full_time_equiv_percent","campus_2025_staff_educ_aide_total_full_time_equiv_percent","campus_2025_staff_professional_total_full_time_equiv_percent","campus_2025_staff_all_staff_minority_full_time_equiv_percent","campus_2025_staff_teacher_beginning_full_time_equiv_percent","campus_2025_staff_teacher_1_5_years_full_time_equiv_percent","campus_2025_staff_teacher_6_10_years_full_time_equiv_percent","campus_2025_staff_teacher_11_20_years_full_time_equiv_percent","campus_2025_staff_teacher_21_30_years_full_time_equiv_percent","campus_2025_staff_teacher_gt_30_years_full_time_equiv_percent","campus_2025_staff_teacher_regular_program_full_time_equiv_percent","campus_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","campus_2025_staff_teacher_bilingual_program_full_time_equiv_percent","campus_2025_staff_teacher_compensatory_program_full_time_equiv_percent","campus_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","campus_2025_staff_teacher_special_education_full_time_equiv_percent","campus_2025_staff_teacher_other_full_time_equiv_percent","campus_2025_staff_teacher_no_degree_full_time_equiv_percent","campus_2025_staff_teacher_ba_degree_full_time_equiv_percent","campus_2025_staff_teacher_ms_degree_full_time_equiv_percent","campus_2025_staff_teacher_ph_degree_full_time_equiv_percent","campus_2025_staff_teacher_white_full_time_equiv_percent","campus_2025_staff_teacher_african_american_full_time_equiv_percent","campus_2025_staff_teacher_hispanic_full_time_equiv_percent","campus_2025_staff_teacher_pacific_islander_full_time_equiv_percent","campus_2025_staff_teacher_american_indian_full_time_equiv_percent","campus_2025_staff_teacher_asian_full_time_equiv_percent","campus_2025_staff_teacher_two_or_more_races_full_time_equiv_percent","campus_2025_staff_teacher_male_full_time_equiv_percent","campus_2025_staff_teacher_female_full_time_equiv_percent","campus_2025_staff_teacher_student_ratio"],"schema_version":1} diff --git a/teadata/schemas/data_sources--district_tapr_student_staff_profile--2025--default.json b/teadata/schemas/data_sources--district_tapr_student_staff_profile--2025--default.json deleted file mode 100644 index c49669c..0000000 --- a/teadata/schemas/data_sources--district_tapr_student_staff_profile--2025--default.json +++ /dev/null @@ -1 +0,0 @@ -{"columns":["district_number","district_name","district_2025_class_size_sec_soc_stud_avg_size","district_2025_class_size_sec_sci_avg_size","district_2025_class_size_sec_math_avg_size","district_2025_class_size_kindergarten_avg_size","district_2025_class_size_grade_6_avg_size","district_2025_class_size_grade_5_avg_size","district_2025_class_size_grade_4_avg_size","district_2025_class_size_grade_3_avg_size","district_2025_class_size_grade_2_avg_size","district_2025_class_size_grade_1_avg_size","district_2025_class_size_sec_for_lng_avg_size","district_2025_class_size_sec_english_avg_size","district_2025_student_membership_ee_count","district_2025_student_membership_pk_count","district_2025_student_membership_kg_count","district_2025_student_membership_01_count","district_2025_student_membership_02_count","district_2025_student_membership_03_count","district_2025_student_membership_04_count","district_2025_student_membership_05_count","district_2025_student_membership_06_count","district_2025_student_membership_07_count","district_2025_student_membership_08_count","district_2025_student_membership_09_count","district_2025_student_membership_10_count","district_2025_student_membership_11_count","district_2025_student_membership_12_count","district_2025_student_membership_all_students_count","district_2025_student_membership_special_ed_count","district_2025_student_membership_bilingual_esl_count","district_2025_student_membership_gifted_and_talented_count","district_2025_student_membership_eb_el_count","district_2025_student_membership_econ_disadv_count","district_2025_student_membership_non_educationally_disadv_count","district_2025_student_membership_at_risk_count","district_2025_student_membership_american_indian_count","district_2025_student_membership_asian_count","district_2025_student_membership_pacific_islander_count","district_2025_student_membership_two_or_more_races_count","district_2025_student_membership_african_american_count","district_2025_student_membership_hispanic_count","district_2025_student_membership_white_count","district_2025_student_membership_male_count","district_2025_student_membership_female_count","district_2025_student_membership_dyslexia_count","district_2025_student_membership_section_504_count","district_2025_student_membership_title_i_count","district_2025_student_membership_homeless_count","district_2025_student_membership_immigrant_count","district_2025_student_membership_migrant_count","district_2025_student_membership_military_connected_count","district_2025_student_membership_foster_care_count","district_2025_student_membership_pk_count_ages_3_and_under_count","district_2025_student_membership_pk_count_ages_4_and_over_count","district_2024_daep_count","district_2024_daep_percent","district_2025_student_membership_2023_24_attrition_all_students_count","district_2025_student_membership_2023_24_attrition_all_students_percent","district_2025_student_membership_total_students_with_disabilities_count","district_2025_student_membership_intellectual_disabilities_count","district_2025_student_membership_physical_disabilities_count","district_2025_student_membership_behavioral_disabilities_count","district_2025_student_membership_autism_count","district_2025_student_membership_non_categorical_early_childhood_count","district_2025_student_membership_intellectual_disabilities_percent","district_2025_student_membership_physical_disabilities_percent","district_2025_student_membership_behavioral_disabilities_percent","district_2025_student_membership_autism_percent","district_2025_student_membership_non_categorical_early_childhood_percent","district_2024_retention_regular_ed_kg_rate","district_2024_retention_regular_ed_01_rate","district_2024_retention_regular_ed_02_rate","district_2024_retention_regular_ed_03_rate","district_2024_retention_regular_ed_04_rate","district_2024_retention_regular_ed_05_rate","district_2024_retention_regular_ed_06_rate","district_2024_retention_regular_ed_07_rate","district_2024_retention_regular_ed_08_rate","district_2024_retention_regular_ed_09_rate","district_2024_retention_special_ed_kg_rate","district_2024_retention_special_ed_01_rate","district_2024_retention_special_ed_02_rate","district_2024_retention_special_ed_03_rate","district_2024_retention_special_ed_04_rate","district_2024_retention_special_ed_05_rate","district_2024_retention_special_ed_06_rate","district_2024_retention_special_ed_07_rate","district_2024_retention_special_ed_08_rate","district_2024_retention_special_ed_09_rate","district_2024_underreported_students_count","district_2025_student_membership_white_percent","district_2025_student_membership_african_american_percent","district_2025_student_membership_hispanic_percent","district_2025_student_membership_american_indian_percent","district_2025_student_membership_asian_percent","district_2025_student_membership_pacific_islander_percent","district_2025_student_membership_two_or_more_races_percent","district_2025_student_membership_econ_disadv_percent","district_2025_student_membership_non_educationally_disadv_percent","district_2025_student_membership_at_risk_percent","district_2025_student_membership_eb_el_percent","district_2025_student_membership_special_ed_percent","district_2025_student_membership_bilingual_esl_percent","district_2025_student_membership_gifted_and_talented_percent","district_2025_student_membership_section_504_percent","district_2025_student_membership_dyslexia_percent","district_2025_student_membership_title_i_percent","district_2025_student_membership_homeless_percent","district_2025_student_membership_immigrant_percent","district_2025_student_membership_migrant_percent","district_2025_student_membership_military_connected_percent","district_2025_student_membership_foster_care_percent","district_2025_student_membership_ee_percent","district_2025_student_membership_pk_percent","district_2025_student_membership_pk_count_ages_3_and_under_percent","district_2025_student_membership_pk_count_ages_4_and_over_percent","district_2025_student_membership_kg_percent","district_2025_student_membership_01_percent","district_2025_student_membership_02_percent","district_2025_student_membership_03_percent","district_2025_student_membership_04_percent","district_2025_student_membership_05_percent","district_2025_student_membership_06_percent","district_2025_student_membership_07_percent","district_2025_student_membership_08_percent","district_2025_student_membership_09_percent","district_2025_student_membership_10_percent","district_2025_student_membership_11_percent","district_2025_student_membership_12_percent","district_2025_student_membership_male_percent","district_2025_student_membership_female_percent","district_2025_student_membership_career_and_technical_education_count","district_2025_student_membership_career_and_technical_9_12_education_count","district_2025_student_membership_career_and_technical_education_percent","district_2025_student_membership_career_and_technical_9_12_education_percent","district_2025_student_enrollment_all_students_count","district_2025_student_enrollment_early_childhood_education_count","district_2025_student_enrollment_early_childhood_education_percent","district_2025_student_enrollment_pre_kindergarten_count","district_2025_student_enrollment_pre_kindergarten_percent","district_2025_student_enrollment_pre_kindergarten_3_year_old_count","district_2025_student_enrollment_pre_kindergarten_3_year_old_percent","district_2025_student_enrollment_pre_kindergarten_4_year_old_count","district_2025_student_enrollment_pre_kindergarten_4_year_old_percent","district_2025_student_enrollment_kindergarten_count","district_2025_student_enrollment_kindergarten_percent","district_2025_student_enrollment_grade_1_count","district_2025_student_enrollment_grade_1_percent","district_2025_student_enrollment_grade_2_count","district_2025_student_enrollment_grade_2_percent","district_2025_student_enrollment_grade_3_count","district_2025_student_enrollment_grade_3_percent","district_2025_student_enrollment_grade_4_count","district_2025_student_enrollment_grade_4_percent","district_2025_student_enrollment_grade_5_count","district_2025_student_enrollment_grade_5_percent","district_2025_student_enrollment_grade_6_count","district_2025_student_enrollment_grade_6_percent","district_2025_student_enrollment_grade_7_count","district_2025_student_enrollment_grade_7_percent","district_2025_student_enrollment_grade_8_count","district_2025_student_enrollment_grade_8_percent","district_2025_student_enrollment_grade_9_count","district_2025_student_enrollment_grade_9_percent","district_2025_student_enrollment_grade_10_count","district_2025_student_enrollment_grade_10_percent","district_2025_student_enrollment_grade_11_count","district_2025_student_enrollment_grade_11_percent","district_2025_student_enrollment_grade_12_count","district_2025_student_enrollment_grade_12_percent","district_2025_student_enrollment_african_american_count","district_2025_student_enrollment_african_american_percent","district_2025_student_enrollment_hispanic_count","district_2025_student_enrollment_hispanic_percent","district_2025_student_enrollment_white_count","district_2025_student_enrollment_white_percent","district_2025_student_enrollment_asian_count","district_2025_student_enrollment_asian_percent","district_2024_25_asian_students_count","district_2024_25_asian_students_percent","district_2025_student_enrollment_pacific_islander_count","district_2025_student_enrollment_pacific_islander_percent","district_2025_student_enrollment_two_or_more_races_count","district_2025_student_enrollment_two_or_more_races_percent","district_2025_student_enrollment_female_count","district_2025_student_enrollment_female_percent","district_2025_student_enrollment_male_count","district_2025_student_enrollment_male_percent","district_2025_student_enrollment_economically_disadvantaged_count","district_2025_student_enrollment_economically_disadvantaged_percent","district_2025_student_enrollment_non_educationally_disadv_count","district_2025_student_enrollment_non_educationally_disadv_percent","district_2025_student_enrollment_section_504_count","district_2025_student_enrollment_section_504_percent","district_2025_student_enrollment_english_learner_count","district_2025_student_enrollment_english_learner_percent","district_2025_student_enrollment_dyslexia_count","district_2025_student_enrollment_dyslexia_percent","district_2025_student_enrollment_foster_care_count","district_2025_student_enrollment_foster_care_percent","district_2025_student_enrollment_homeless_count","district_2025_student_enrollment_homeless_percent","district_2025_student_enrollment_immigrant_count","district_2025_student_enrollment_immigrant_percent","district_2025_student_enrollment_migrant_count","district_2025_student_enrollment_migrant_percent","district_2025_student_enrollment_title_i_count","district_2025_student_enrollment_title_i_percent","district_2025_student_enrollment_military_connected_count","district_2025_student_enrollment_military_connected_percent","district_2025_student_enrollment_at_risk_count","district_2025_student_enrollment_at_risk_percent","district_2025_student_enrollment_bilingual_esl_count","district_2025_student_enrollment_bilingual_esl_percent","district_2025_student_enrollment_gifted_and_talented_count","district_2025_student_enrollment_gifted_and_talented_percent","district_2025_student_enrollment_special_ed_count","district_2025_student_enrollment_special_ed_percent","district_2025_student_membership_2024_mobility_all_students_count","district_2025_student_membership_2024_mobility_american_indian_count","district_2025_student_membership_2024_mobility_pacific_islander_count","district_2025_student_membership_2024_mobility_asian_count","district_2025_student_membership_2024_mobility_african_american_count","district_2025_student_membership_2024_mobility_hispanic_count","district_2025_student_membership_2024_mobility_white_count","district_2025_student_membership_2024_mobility_two_or_more_races_count","district_2025_student_membership_2024_mobility_econ_disadv_count","district_2025_student_membership_2024_mobility_eb_el_count","district_2025_student_membership_2024_mobility_special_ed_count","district_2025_student_membership_2024_mobility_all_students_percent","district_2025_student_membership_2024_mobility_american_indian_percent","district_2025_student_membership_2024_mobility_asian_percent","district_2025_student_membership_2024_mobility_pacific_islander_percent","district_2025_student_membership_2024_mobility_two_or_more_races_percent","district_2025_student_membership_2024_mobility_african_american_percent","district_2025_student_membership_2024_mobility_hispanic_percent","district_2025_student_membership_2024_mobility_white_percent","district_2025_student_membership_2024_mobility_econ_disadv_percent","district_2025_student_membership_2024_mobility_eb_el_percent","district_2025_student_membership_2024_mobility_special_ed_percent","district_2025_staff_teacher_total_full_time_equiv_count","district_2025_staff_support_total_full_time_equiv_count","district_2025_staff_school_admin_total_full_time_equiv_count","district_2025_staff_central_admin_total_full_time_equiv_count","district_2025_staff_educ_aide_total_full_time_equiv_count","district_2025_staff_teacher_beginning_full_time_equiv_count","district_2025_staff_teacher_1_5_years_full_time_equiv_count","district_2025_staff_teacher_6_10_years_full_time_equiv_count","district_2025_staff_teacher_11_20_years_full_time_equiv_count","district_2025_staff_teacher_21_30_years_full_time_equiv_count","district_2025_staff_teacher_gt_30_years_full_time_equiv_count","district_2025_staff_teacher_no_degree_full_time_equiv_count","district_2025_staff_teacher_ba_degree_full_time_equiv_count","district_2025_staff_teacher_ms_degree_full_time_equiv_count","district_2025_staff_teacher_ph_degree_full_time_equiv_count","district_2025_staff_ssa_educational_aides_full_time_equiv_count","district_2025_staff_professional_total_full_time_equiv_count","district_2025_staff_counselor_total_part_time_equiv_count","district_2025_staff_counselor_total_full_time_equiv_count","district_2025_staff_librarian_total_part_time_equiv_count","district_2025_staff_librarian_total_full_time_equiv_count","district_2025_staff_auxiliary_total_full_time_equiv_count","district_2025_staff_all_staff_total_full_time_equiv_count","district_2025_staff_contract_serv_total_full_time_equiv_count","district_2025_staff_teacher_american_indian_full_time_equiv_count","district_2025_staff_teacher_pacific_islander_full_time_equiv_count","district_2025_staff_teacher_asian_full_time_equiv_count","district_2025_staff_teacher_african_american_full_time_equiv_count","district_2025_staff_teacher_hispanic_full_time_equiv_count","district_2025_staff_teacher_white_full_time_equiv_count","district_2025_staff_teacher_two_or_more_races_full_time_equiv_count","district_2025_staff_teacher_male_full_time_equiv_count","district_2025_staff_teacher_female_full_time_equiv_count","district_2025_staff_teacher_regular_program_full_time_equiv_count","district_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_count","district_2025_staff_teacher_bilingual_program_full_time_equiv_count","district_2025_staff_teacher_compensatory_program_full_time_equiv_count","district_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_count","district_2025_staff_teacher_special_education_full_time_equiv_count","district_2025_staff_teacher_other_full_time_equiv_count","district_2025_staff_teacher_turnover_ratio","district_2025_staff_average_years_experience_of_teachers_with_district","district_2025_staff_teacher_experience_average","district_2025_staff_principal_experience_average","district_2025_staff_average_years_experience_of_principals_with_district","district_2025_staff_assistant_principal_experience_average","district_2025_staff_average_years_experience_of_assistant_principals_with_district","district_2025_staff_all_staff_minority_full_time_equiv_count","district_2025_staff_professional_total_full_time_equiv_percent","district_2025_staff_teacher_total_full_time_equiv_percent","district_2025_staff_support_total_full_time_equiv_percent","district_2025_staff_school_admin_total_full_time_equiv_percent","district_2025_staff_central_admin_total_full_time_equiv_percent","district_2025_staff_educ_aide_total_full_time_equiv_percent","district_2025_staff_auxiliary_total_full_time_equiv_percent","district_2025_staff_all_staff_minority_full_time_equiv_percent","district_2025_staff_teacher_no_degree_full_time_equiv_percent","district_2025_staff_teacher_ba_degree_full_time_equiv_percent","district_2025_staff_teacher_ms_degree_full_time_equiv_percent","district_2025_staff_teacher_ph_degree_full_time_equiv_percent","district_2025_staff_teacher_beginning_full_time_equiv_percent","district_2025_staff_teacher_1_5_years_full_time_equiv_percent","district_2025_staff_teacher_6_10_years_full_time_equiv_percent","district_2025_staff_teacher_11_20_years_full_time_equiv_percent","district_2025_staff_teacher_21_30_years_full_time_equiv_percent","district_2025_staff_teacher_gt_30_years_full_time_equiv_percent","district_2025_staff_teacher_regular_program_full_time_equiv_percent","district_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","district_2025_staff_teacher_bilingual_program_full_time_equiv_percent","district_2025_staff_teacher_compensatory_program_full_time_equiv_percent","district_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","district_2025_staff_teacher_special_education_full_time_equiv_percent","district_2025_staff_teacher_other_full_time_equiv_percent","district_2025_staff_teacher_african_american_full_time_equiv_percent","district_2025_staff_teacher_white_full_time_equiv_percent","district_2025_staff_teacher_hispanic_full_time_equiv_percent","district_2025_staff_teacher_pacific_islander_full_time_equiv_percent","district_2025_staff_teacher_american_indian_full_time_equiv_percent","district_2025_staff_teacher_asian_full_time_equiv_percent","district_2025_staff_teacher_two_or_more_races_full_time_equiv_percent","district_2025_staff_teacher_male_full_time_equiv_percent","district_2025_staff_teacher_female_full_time_equiv_percent","district_2025_staff_teacher_student_ratio","district_2025_staff_teacher_beginning_base_salary_average","district_2025_staff_teacher_1_5_years_base_salary_average","district_2025_staff_teacher_6_10_years_base_salary_average","district_2025_staff_teacher_11_20_years_base_salary_average","district_2025_staff_teacher_21_30_years_base_salary_average","district_2025_staff_teacher_gt_30_years_base_salary_average","district_2025_staff_teacher_total_base_salary_average","district_2025_staff_support_total_base_salary_average","district_2025_staff_school_admin_total_base_salary_average","district_2025_staff_central_admin_total_base_salary_average","district_2025_staff_teacher_incentive_allotment_master_head_count","district_2025_staff_teacher_incentive_allotment_exemplary_head_count","district_2025_staff_teacher_incentive_allotment_recognized_head_count","district_2025_staff_teacher_incentive_allotment_recognized_payout_average","district_2025_staff_teacher_incentive_allotment_exemplary_payout_average","district_2025_staff_teacher_incentive_allotment_master_payout_average"],"schema_version":1} diff --git a/teadata/schemas/tapr--2025--header-crosswalk.json b/teadata/schemas/tapr--2025--header-crosswalk.json new file mode 100644 index 0000000..2c3d5e1 --- /dev/null +++ b/teadata/schemas/tapr--2025--header-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_student_staff_profile","edition":"2025","prepared_input_sha256":"bbe2c6432590faae7643a49415aaea66a9212021875cdf7be77e28250157bfc9","tables":[{"fields":[{"code":"CAMPUS","field":"campus_number","label":"9 Digit Campus Number","position":1},{"code":"CAMPNAME","field":"campus_name","label":"Campus Name","position":2},{"code":"DISTRICT","field":"district_number","label":"6 Digit County District Number","position":3},{"code":"DISTNAME","field":"district_name","label":"District Name","position":4},{"code":"CPCTENGA","field":"campus_2025_class_size_sec_english_avg_size","label":"Campus 2025 Class Size: Sec English - Avg Size","position":5},{"code":"CPCTMATA","field":"campus_2025_class_size_sec_math_avg_size","label":"Campus 2025 Class Size: Sec Math - Avg Size","position":6},{"code":"CPCTSCIA","field":"campus_2025_class_size_sec_sci_avg_size","label":"Campus 2025 Class Size: Sec Sci - Avg Size","position":7},{"code":"CPCTSOCA","field":"campus_2025_class_size_sec_soc_stud_avg_size","label":"Campus 2025 Class Size: Sec Soc Stud- Avg Size","position":8},{"code":"CPCTFLAA","field":"campus_2025_class_size_sec_for_lng_avg_size","label":"Campus 2025 Class Size: Sec For Lng - Avg Size","position":9},{"code":"CPCTGKGA","field":"campus_2025_class_size_kindergarten_avg_size","label":"Campus 2025 Class Size: Kindergarten- Avg Size","position":10},{"code":"CPCTG01A","field":"campus_2025_class_size_grade_1_avg_size","label":"Campus 2025 Class Size: Grade 1 - Avg Size","position":11},{"code":"CPCTG02A","field":"campus_2025_class_size_grade_2_avg_size","label":"Campus 2025 Class Size: Grade 2 - Avg Size","position":12},{"code":"CPCTG03A","field":"campus_2025_class_size_grade_3_avg_size","label":"Campus 2025 Class Size: Grade 3 - Avg Size","position":13},{"code":"CPCTG04A","field":"campus_2025_class_size_grade_4_avg_size","label":"Campus 2025 Class Size: Grade 4 - Avg Size","position":14},{"code":"CPCTG05A","field":"campus_2025_class_size_grade_5_avg_size","label":"Campus 2025 Class Size: Grade 5 - Avg Size","position":15},{"code":"CPCTG06A","field":"campus_2025_class_size_grade_6_avg_size","label":"Campus 2025 Class Size: Grade 6 - Avg Size","position":16},{"code":"CPERRAKR","field":"campus_2024_retention_regular_ed_kg_rate","label":"Campus 2024 Retention: Regular Ed KG Rate","position":17},{"code":"CPERRA1R","field":"campus_2024_retention_regular_ed_01_rate","label":"Campus 2024 Retention: Regular Ed 01 Rate","position":18},{"code":"CPERRA2R","field":"campus_2024_retention_regular_ed_02_rate","label":"Campus 2024 Retention: Regular Ed 02 Rate","position":19},{"code":"CPERRA3R","field":"campus_2024_retention_regular_ed_03_rate","label":"Campus 2024 Retention: Regular Ed 03 Rate","position":20},{"code":"CPERRA4R","field":"campus_2024_retention_regular_ed_04_rate","label":"Campus 2024 Retention: Regular Ed 04 Rate","position":21},{"code":"CPERRA5R","field":"campus_2024_retention_regular_ed_05_rate","label":"Campus 2024 Retention: Regular Ed 05 Rate","position":22},{"code":"CPERRA6R","field":"campus_2024_retention_regular_ed_06_rate","label":"Campus 2024 Retention: Regular Ed 06 Rate","position":23},{"code":"CPERRA7R","field":"campus_2024_retention_regular_ed_07_rate","label":"Campus 2024 Retention: Regular Ed 07 Rate","position":24},{"code":"CPERRA8R","field":"campus_2024_retention_regular_ed_08_rate","label":"Campus 2024 Retention: Regular Ed 08 Rate","position":25},{"code":"CPERRA9R","field":"campus_2024_retention_regular_ed_09_rate","label":"Campus 2024 Retention: Regular Ed 09 Rate","position":26},{"code":"CPERSAKR","field":"campus_2024_retention_special_ed_kg_rate","label":"Campus 2024 Retention: Special Ed KG Rate","position":27},{"code":"CPERSA1R","field":"campus_2024_retention_special_ed_01_rate","label":"Campus 2024 Retention: Special Ed 01 Rate","position":28},{"code":"CPERSA2R","field":"campus_2024_retention_special_ed_02_rate","label":"Campus 2024 Retention: Special Ed 02 Rate","position":29},{"code":"CPERSA3R","field":"campus_2024_retention_special_ed_03_rate","label":"Campus 2024 Retention: Special Ed 03 Rate","position":30},{"code":"CPERSA4R","field":"campus_2024_retention_special_ed_04_rate","label":"Campus 2024 Retention: Special Ed 04 Rate","position":31},{"code":"CPERSA5R","field":"campus_2024_retention_special_ed_05_rate","label":"Campus 2024 Retention: Special Ed 05 Rate","position":32},{"code":"CPERSA6R","field":"campus_2024_retention_special_ed_06_rate","label":"Campus 2024 Retention: Special Ed 06 Rate","position":33},{"code":"CPERSA7R","field":"campus_2024_retention_special_ed_07_rate","label":"Campus 2024 Retention: Special Ed 07 Rate","position":34},{"code":"CPERSA8R","field":"campus_2024_retention_special_ed_08_rate","label":"Campus 2024 Retention: Special Ed 08 Rate","position":35},{"code":"CPERSA9R","field":"campus_2024_retention_special_ed_09_rate","label":"Campus 2024 Retention: Special Ed 09 Rate","position":36},{"code":"CPETSIMC","field":"campus_2025_student_membership_total_students_with_disabilities_count","label":"Campus 2025 Student Membership: Total Students with Disabilities Count","position":37},{"code":"CPETSINC","field":"campus_2025_student_membership_intellectual_disabilities_count","label":"Campus 2025 Student Membership: Intellectual Disabilities Count","position":38},{"code":"CPETSPHC","field":"campus_2025_student_membership_physical_disabilities_count","label":"Campus 2025 Student Membership: Physical Disabilities Count","position":39},{"code":"CPETSBHC","field":"campus_2025_student_membership_behavioral_disabilities_count","label":"Campus 2025 Student Membership: Behavioral Disabilities Count","position":40},{"code":"CPETSAUC","field":"campus_2025_student_membership_autism_count","label":"Campus 2025 Student Membership: Autism Count","position":41},{"code":"CPETSNOC","field":"campus_2025_student_membership_non_categorical_early_childhood_count","label":"Campus 2025 Student Membership: Non-Categorical Early Childhood Count","position":42},{"code":"CPETSINP","field":"campus_2025_student_membership_intellectual_disabilities_percent","label":"Campus 2025 Student Membership: Intellectual Disabilities Percent","position":43},{"code":"CPETSPHP","field":"campus_2025_student_membership_physical_disabilities_percent","label":"Campus 2025 Student Membership: Physical Disabilities Percent","position":44},{"code":"CPETSBHP","field":"campus_2025_student_membership_behavioral_disabilities_percent","label":"Campus 2025 Student Membership: Behavioral Disabilities Percent","position":45},{"code":"CPETSAUP","field":"campus_2025_student_membership_autism_percent","label":"Campus 2025 Student Membership: Autism Percent","position":46},{"code":"CPETSNOP","field":"campus_2025_student_membership_non_categorical_early_childhood_percent","label":"Campus 2025 Student Membership: Non-Categorical Early Childhood Percent","position":47},{"code":"CPETDISC","field":"campus_2024_daep_count","label":"Campus 2024 DAEP: Count","position":48},{"code":"CPETDISP","field":"campus_2024_daep_percent","label":"Campus 2024 DAEP: Percent","position":49},{"code":"CPETATTC","field":"campus_2025_student_membership_2023_24_attrition_all_students_count","label":"Campus 2025 Student Membership: 2023-24 Attrition All Students Count","position":50},{"code":"CPETATTP","field":"campus_2025_student_membership_2023_24_attrition_all_students_percent","label":"Campus 2025 Student Membership: 2023-24 Attrition All Students Percent","position":51},{"code":"CPETLEPP","field":"campus_2025_student_membership_eb_el_percent","label":"Campus 2025 Student Membership: EB/EL Percent","position":52},{"code":"CPETECOP","field":"campus_2025_student_membership_econ_disadv_percent","label":"Campus 2025 Student Membership: Econ Disadv Percent","position":53},{"code":"CPETRSKP","field":"campus_2025_student_membership_at_risk_percent","label":"Campus 2025 Student Membership: At Risk Percent","position":54},{"code":"CPETNEDP","field":"campus_2025_student_membership_non_educationally_disadv_percent","label":"Campus 2025 Student Membership: Non-Educationally Disadv Percent","position":55},{"code":"CPETECOC","field":"campus_2025_student_membership_econ_disadv_count","label":"Campus 2025 Student Membership: Econ Disadv Count","position":56},{"code":"CPETRSKC","field":"campus_2025_student_membership_at_risk_count","label":"Campus 2025 Student Membership: At Risk Count","position":57},{"code":"CPETLEPC","field":"campus_2025_student_membership_eb_el_count","label":"Campus 2025 Student Membership: EB/EL Count","position":58},{"code":"CPETNEDC","field":"campus_2025_student_membership_non_educationally_disadv_count","label":"Campus 2025 Student Membership: Non-Educationally Disadv Count","position":59},{"code":"CPETSPEC","field":"campus_2025_student_membership_special_ed_count","label":"Campus 2025 Student Membership: Special Ed Count","position":60},{"code":"CPETGIFC","field":"campus_2025_student_membership_gifted_and_talented_count","label":"Campus 2025 Student Membership: Gifted & Talented Count","position":61},{"code":"CPETALLC","field":"campus_2025_student_membership_all_students_count","label":"Campus 2025 Student Membership: All Students Count","position":62},{"code":"CPETTT1C","field":"campus_2025_student_membership_title_i_count","label":"Campus 2025 Student Membership: Title I Count","position":63},{"code":"CPETHOMC","field":"campus_2025_student_membership_homeless_count","label":"Campus 2025 Student Membership: Homeless Count","position":64},{"code":"CPETIMMC","field":"campus_2025_student_membership_immigrant_count","label":"Campus 2025 Student Membership: Immigrant Count","position":65},{"code":"CPET504C","field":"campus_2025_student_membership_section_504_count","label":"Campus 2025 Student Membership: Section 504 Count","position":66},{"code":"CPETDSLC","field":"campus_2025_student_membership_dyslexia_count","label":"Campus 2025 Student Membership: Dyslexia Count","position":67},{"code":"CPETMIGC","field":"campus_2025_student_membership_migrant_count","label":"Campus 2025 Student Membership: Migrant Count","position":68},{"code":"CPETMLCC","field":"campus_2025_student_membership_military_connected_count","label":"Campus 2025 Student Membership: Military-Connected Count","position":69},{"code":"CPETFOSC","field":"campus_2025_student_membership_foster_care_count","label":"Campus 2025 Student Membership: Foster Care Count","position":70},{"code":"CPETGP3C","field":"campus_2025_student_membership_pk_ages_3_and_under_count","label":"Campus 2025 Student Membership: PK Ages 3 and Under Count","position":71},{"code":"CPETGP4C","field":"campus_2025_student_membership_pk_ages_4_and_over_count","label":"Campus 2025 Student Membership: PK Ages 4 and Over Count","position":72},{"code":"CPETBILC","field":"campus_2025_student_membership_bilingual_esl_count","label":"Campus 2025 Student Membership: Bilingual/ESL Count","position":73},{"code":"CPETINDC","field":"campus_2025_student_membership_american_indian_count","label":"Campus 2025 Student Membership: American Indian Count","position":74},{"code":"CPETASIC","field":"campus_2025_student_membership_asian_count","label":"Campus 2025 Student Membership: Asian Count","position":75},{"code":"CPETPCIC","field":"campus_2025_student_membership_pacific_islander_count","label":"Campus 2025 Student Membership: Pacific Islander Count","position":76},{"code":"CPETTWOC","field":"campus_2025_student_membership_two_or_more_races_count","label":"Campus 2025 Student Membership: Two or More Races Count","position":77},{"code":"CPETBLAC","field":"campus_2025_student_membership_african_american_count","label":"Campus 2025 Student Membership: African American Count","position":78},{"code":"CPETHISC","field":"campus_2025_student_membership_hispanic_count","label":"Campus 2025 Student Membership: Hispanic Count","position":79},{"code":"CPETWHIC","field":"campus_2025_student_membership_white_count","label":"Campus 2025 Student Membership: White Count","position":80},{"code":"CPETGEEC","field":"campus_2025_student_membership_ee_count","label":"Campus 2025 Student Membership: EE Count","position":81},{"code":"CPETGPKC","field":"campus_2025_student_membership_pk_count","label":"Campus 2025 Student Membership: PK Count","position":82},{"code":"CPETGKNC","field":"campus_2025_student_membership_kg_count","label":"Campus 2025 Student Membership: KG Count","position":83},{"code":"CPETG01C","field":"campus_2025_student_membership_01_count","label":"Campus 2025 Student Membership: 01 Count","position":84},{"code":"CPETG02C","field":"campus_2025_student_membership_02_count","label":"Campus 2025 Student Membership: 02 Count","position":85},{"code":"CPETG03C","field":"campus_2025_student_membership_03_count","label":"Campus 2025 Student Membership: 03 Count","position":86},{"code":"CPETG04C","field":"campus_2025_student_membership_04_count","label":"Campus 2025 Student Membership: 04 Count","position":87},{"code":"CPETG05C","field":"campus_2025_student_membership_05_count","label":"Campus 2025 Student Membership: 05 Count","position":88},{"code":"CPETG06C","field":"campus_2025_student_membership_06_count","label":"Campus 2025 Student Membership: 06 Count","position":89},{"code":"CPETG07C","field":"campus_2025_student_membership_07_count","label":"Campus 2025 Student Membership: 07 Count","position":90},{"code":"CPETG08C","field":"campus_2025_student_membership_08_count","label":"Campus 2025 Student Membership: 08 Count","position":91},{"code":"CPETG09C","field":"campus_2025_student_membership_09_count","label":"Campus 2025 Student Membership: 09 Count","position":92},{"code":"CPETG10C","field":"campus_2025_student_membership_10_count","label":"Campus 2025 Student Membership: 10 Count","position":93},{"code":"CPETG11C","field":"campus_2025_student_membership_11_count","label":"Campus 2025 Student Membership: 11 Count","position":94},{"code":"CPETG12C","field":"campus_2025_student_membership_12_count","label":"Campus 2025 Student Membership: 12 Count","position":95},{"code":"CPETMALC","field":"campus_2025_student_membership_male_count","label":"Campus 2025 Student Membership: Male Count","position":96},{"code":"CPETFEMC","field":"campus_2025_student_membership_female_count","label":"Campus 2025 Student Membership: Female Count","position":97},{"code":"CPETWHIP","field":"campus_2025_student_membership_white_percent","label":"Campus 2025 Student Membership: White Percent","position":98},{"code":"CPETBLAP","field":"campus_2025_student_membership_african_american_percent","label":"Campus 2025 Student Membership: African American Percent","position":99},{"code":"CPETHISP","field":"campus_2025_student_membership_hispanic_percent","label":"Campus 2025 Student Membership: Hispanic Percent","position":100},{"code":"CPETINDP","field":"campus_2025_student_membership_american_indian_percent","label":"Campus 2025 Student Membership: American Indian Percent","position":101},{"code":"CPETASIP","field":"campus_2025_student_membership_asian_percent","label":"Campus 2025 Student Membership: Asian Percent","position":102},{"code":"CPETPCIP","field":"campus_2025_student_membership_pacific_islander_percent","label":"Campus 2025 Student Membership: Pacific Islander Percent","position":103},{"code":"CPETTWOP","field":"campus_2025_student_membership_two_or_more_races_percent","label":"Campus 2025 Student Membership: Two or More Races Percent","position":104},{"code":"CPETSPEP","field":"campus_2025_student_membership_special_ed_percent","label":"Campus 2025 Student Membership: Special Ed Percent","position":105},{"code":"CPETBILP","field":"campus_2025_student_membership_bilingual_esl_percent","label":"Campus 2025 Student Membership: Bilingual/ESL Percent","position":106},{"code":"CPETGIFP","field":"campus_2025_student_membership_gifted_and_talented_percent","label":"Campus 2025 Student Membership: Gifted & Talented Percent","position":107},{"code":"CPETDSLP","field":"campus_2025_student_membership_dyslexia_percent","label":"Campus 2025 Student Membership: Dyslexia Percent","position":108},{"code":"CPET504P","field":"campus_2025_student_membership_section_504_percent","label":"Campus 2025 Student Membership: Section 504 Percent","position":109},{"code":"CPETTT1P","field":"campus_2025_student_membership_title_i_percent","label":"Campus 2025 Student Membership: Title I Percent","position":110},{"code":"CPETHOMP","field":"campus_2025_student_membership_homeless_percent","label":"Campus 2025 Student Membership: Homeless Percent","position":111},{"code":"CPETIMMP","field":"campus_2025_student_membership_immigrant_percent","label":"Campus 2025 Student Membership: Immigrant Percent","position":112},{"code":"CPETFOSP","field":"campus_2025_student_membership_foster_care_percent","label":"Campus 2025 Student Membership: Foster Care Percent","position":113},{"code":"CPETMIGP","field":"campus_2025_student_membership_migrant_percent","label":"Campus 2025 Student Membership: Migrant Percent","position":114},{"code":"CPETMLCP","field":"campus_2025_student_membership_military_connected_percent","label":"Campus 2025 Student Membership: Military-Connected Percent","position":115},{"code":"CPETGEEP","field":"campus_2025_student_membership_ee_percent","label":"Campus 2025 Student Membership: EE Percent","position":116},{"code":"CPETGPKP","field":"campus_2025_student_membership_pk_percent","label":"Campus 2025 Student Membership: PK Percent","position":117},{"code":"CPETGP3P","field":"campus_2025_student_membership_pk_ages_3_and_under_percent","label":"Campus 2025 Student Membership: PK Ages 3 and Under Percent","position":118},{"code":"CPETGP4P","field":"campus_2025_student_membership_pk_ages_4_and_over_percent","label":"Campus 2025 Student Membership: PK Ages 4 and Over Percent","position":119},{"code":"CPETGKNP","field":"campus_2025_student_membership_kg_percent","label":"Campus 2025 Student Membership: KG Percent","position":120},{"code":"CPETG01P","field":"campus_2025_student_membership_01_percent","label":"Campus 2025 Student Membership: 01 Percent","position":121},{"code":"CPETG02P","field":"campus_2025_student_membership_02_percent","label":"Campus 2025 Student Membership: 02 Percent","position":122},{"code":"CPETG03P","field":"campus_2025_student_membership_03_percent","label":"Campus 2025 Student Membership: 03 Percent","position":123},{"code":"CPETG04P","field":"campus_2025_student_membership_04_percent","label":"Campus 2025 Student Membership: 04 Percent","position":124},{"code":"CPETG05P","field":"campus_2025_student_membership_05_percent","label":"Campus 2025 Student Membership: 05 Percent","position":125},{"code":"CPETG06P","field":"campus_2025_student_membership_06_percent","label":"Campus 2025 Student Membership: 06 Percent","position":126},{"code":"CPETG07P","field":"campus_2025_student_membership_07_percent","label":"Campus 2025 Student Membership: 07 Percent","position":127},{"code":"CPETG08P","field":"campus_2025_student_membership_08_percent","label":"Campus 2025 Student Membership: 08 Percent","position":128},{"code":"CPETG09P","field":"campus_2025_student_membership_09_percent","label":"Campus 2025 Student Membership: 09 Percent","position":129},{"code":"CPETG10P","field":"campus_2025_student_membership_10_percent","label":"Campus 2025 Student Membership: 10 Percent","position":130},{"code":"CPETG11P","field":"campus_2025_student_membership_11_percent","label":"Campus 2025 Student Membership: 11 Percent","position":131},{"code":"CPETG12P","field":"campus_2025_student_membership_12_percent","label":"Campus 2025 Student Membership: 12 Percent","position":132},{"code":"CPETMALP","field":"campus_2025_student_membership_male_percent","label":"Campus 2025 Student Membership: Male Percent","position":133},{"code":"CPETFEMP","field":"campus_2025_student_membership_female_percent","label":"Campus 2025 Student Membership: Female Percent","position":134},{"code":"CPETVOCC","field":"campus_2025_student_membership_career_and_technical_education_count","label":"Campus 2025 Student Membership: Career & Technical Education Count","position":135},{"code":"CPETVHSC","field":"campus_2025_student_membership_career_and_technical_9_12_education_count","label":"Campus 2025 Student Membership: Career & Technical (9-12) Education Count","position":136},{"code":"CPETVOCP","field":"campus_2025_student_membership_career_and_technical_education_percent","label":"Campus 2025 Student Membership: Career & Technical Education Percent","position":137},{"code":"CPETVHSP","field":"campus_2025_student_membership_career_and_technical_9_12_education_percent","label":"Campus 2025 Student Membership: Career & Technical (9-12) Education Percent","position":138},{"code":"CPNTALLC","field":"campus_2025_student_enrollment_all_students_count","label":"Campus 2025 Student Enrollment: All Students Count","position":139},{"code":"CPNTGEEC","field":"campus_2025_student_enrollment_early_childhood_education_count","label":"Campus 2025 Student Enrollment: Early Childhood Education Count","position":140},{"code":"CPNTGEEP","field":"campus_2025_student_enrollment_early_childhood_education_percent","label":"Campus 2025 Student Enrollment: Early Childhood Education Percent","position":141},{"code":"CPNTGPKC","field":"campus_2025_student_enrollment_pre_kindergarten_count","label":"Campus 2025 Student Enrollment: Pre-Kindergarten Count","position":142},{"code":"CPNTGPKP","field":"campus_2025_student_enrollment_pre_kindergarten_percent","label":"Campus 2025 Student Enrollment: Pre-Kindergarten Percent","position":143},{"code":"CPNTGP3C","field":"campus_2025_student_enrollment_pre_kindergarten_3_year_old_count","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Count","position":144},{"code":"CPNTGP3P","field":"campus_2025_student_enrollment_pre_kindergarten_3_year_old_percent","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Percent","position":145},{"code":"CPNTGP4C","field":"campus_2025_student_enrollment_pre_kindergarten_4_year_old_count","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Count","position":146},{"code":"CPNTGP4P","field":"campus_2025_student_enrollment_pre_kindergarten_4_year_old_percent","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Percent","position":147},{"code":"CPNTGKNC","field":"campus_2025_student_enrollment_kindergarten_count","label":"Campus 2025 Student Enrollment: Kindergarten Count","position":148},{"code":"CPNTGKNP","field":"campus_2025_student_enrollment_kindergarten_percent","label":"Campus 2025 Student Enrollment: Kindergarten Percent","position":149},{"code":"CPNTG01C","field":"campus_2025_student_enrollment_grade_1_count","label":"Campus 2025 Student Enrollment: Grade 1 Count","position":150},{"code":"CPNTG01P","field":"campus_2025_student_enrollment_grade_1_percent","label":"Campus 2025 Student Enrollment: Grade 1 Percent","position":151},{"code":"CPNTG02C","field":"campus_2025_student_enrollment_grade_2_count","label":"Campus 2025 Student Enrollment: Grade 2 Count","position":152},{"code":"CPNTG02P","field":"campus_2025_student_enrollment_grade_2_percent","label":"Campus 2025 Student Enrollment: Grade 2 Percent","position":153},{"code":"CPNTG03C","field":"campus_2025_student_enrollment_grade_3_count","label":"Campus 2025 Student Enrollment: Grade 3 Count","position":154},{"code":"CPNTG03P","field":"campus_2025_student_enrollment_grade_3_percent","label":"Campus 2025 Student Enrollment: Grade 3 Percent","position":155},{"code":"CPNTG04C","field":"campus_2025_student_enrollment_grade_4_count","label":"Campus 2025 Student Enrollment: Grade 4 Count","position":156},{"code":"CPNTG04P","field":"campus_2025_student_enrollment_grade_4_percent","label":"Campus 2025 Student Enrollment: Grade 4 Percent","position":157},{"code":"CPNTG05C","field":"campus_2025_student_enrollment_grade_5_count","label":"Campus 2025 Student Enrollment: Grade 5 Count","position":158},{"code":"CPNTG05P","field":"campus_2025_student_enrollment_grade_5_percent","label":"Campus 2025 Student Enrollment: Grade 5 Percent","position":159},{"code":"CPNTG06C","field":"campus_2025_student_enrollment_grade_6_count","label":"Campus 2025 Student Enrollment: Grade 6 Count","position":160},{"code":"CPNTG06P","field":"campus_2025_student_enrollment_grade_6_percent","label":"Campus 2025 Student Enrollment: Grade 6 Percent","position":161},{"code":"CPNTG07C","field":"campus_2025_student_enrollment_grade_7_count","label":"Campus 2025 Student Enrollment: Grade 7 Count","position":162},{"code":"CPNTG07P","field":"campus_2025_student_enrollment_grade_7_percent","label":"Campus 2025 Student Enrollment: Grade 7 Percent","position":163},{"code":"CPNTG08C","field":"campus_2025_student_enrollment_grade_8_count","label":"Campus 2025 Student Enrollment: Grade 8 Count","position":164},{"code":"CPNTG08P","field":"campus_2025_student_enrollment_grade_8_percent","label":"Campus 2025 Student Enrollment: Grade 8 Percent","position":165},{"code":"CPNTG09C","field":"campus_2025_student_enrollment_grade_9_count","label":"Campus 2025 Student Enrollment: Grade 9 Count","position":166},{"code":"CPNTG09P","field":"campus_2025_student_enrollment_grade_9_percent","label":"Campus 2025 Student Enrollment: Grade 9 Percent","position":167},{"code":"CPNTG10C","field":"campus_2025_student_enrollment_grade_10_count","label":"Campus 2025 Student Enrollment: Grade 10 Count","position":168},{"code":"CPNTG10P","field":"campus_2025_student_enrollment_grade_10_percent","label":"Campus 2025 Student Enrollment: Grade 10 Percent","position":169},{"code":"CPNTG11C","field":"campus_2025_student_enrollment_grade_11_count","label":"Campus 2025 Student Enrollment: Grade 11 Count","position":170},{"code":"CPNTG11P","field":"campus_2025_student_enrollment_grade_11_percent","label":"Campus 2025 Student Enrollment: Grade 11 Percent","position":171},{"code":"CPNTG12C","field":"campus_2025_student_enrollment_grade_12_count","label":"Campus 2025 Student Enrollment: Grade 12 Count","position":172},{"code":"CPNTG12P","field":"campus_2025_student_enrollment_grade_12_percent","label":"Campus 2025 Student Enrollment: Grade 12 Percent","position":173},{"code":"CPNTBLAC","field":"campus_2025_student_enrollment_african_american_count","label":"Campus 2025 Student Enrollment: African American Count","position":174},{"code":"CPNTBLAP","field":"campus_2025_student_enrollment_african_american_percent","label":"Campus 2025 Student Enrollment: African American Percent","position":175},{"code":"CPNTHISC","field":"campus_2025_student_enrollment_hispanic_count","label":"Campus 2025 Student Enrollment: Hispanic Count","position":176},{"code":"CPNTHISP","field":"campus_2025_student_enrollment_hispanic_percent","label":"Campus 2025 Student Enrollment: Hispanic Percent","position":177},{"code":"CPNTWHIC","field":"campus_2025_student_enrollment_white_count","label":"Campus 2025 Student Enrollment: White Count","position":178},{"code":"CPNTWHIP","field":"campus_2025_student_enrollment_white_percent","label":"Campus 2025 Student Enrollment: White Percent","position":179},{"code":"CPNTINDC","field":"campus_2025_student_enrollment_asian_count","label":"Campus 2025 Student Enrollment: Asian Count","position":180},{"code":"CPNTINDP","field":"campus_2025_student_enrollment_asian_percent","label":"Campus 2025 Student Enrollment: Asian Percent","position":181},{"code":"CPNTASIC","field":"campus_2024_25_asian_students_count","label":"Campus 2024-25 Asian Students Count","position":182},{"code":"CPNTASIP","field":"campus_2024_25_asian_students_percent","label":"Campus 2024-25 Asian Students Percent","position":183},{"code":"CPNTPCIC","field":"campus_2025_student_enrollment_pacific_islander_count","label":"Campus 2025 Student Enrollment: Pacific Islander Count","position":184},{"code":"CPNTPCIP","field":"campus_2025_student_enrollment_pacific_islander_percent","label":"Campus 2025 Student Enrollment: Pacific Islander Percent","position":185},{"code":"CPNTTWOC","field":"campus_2025_student_enrollment_two_or_more_races_count","label":"Campus 2025 Student Enrollment: Two or More Races Count","position":186},{"code":"CPNTTWOP","field":"campus_2025_student_enrollment_two_or_more_races_percent","label":"Campus 2025 Student Enrollment: Two or More Races Percent","position":187},{"code":"CPNTFEMC","field":"campus_2025_student_enrollment_female_count","label":"Campus 2025 Student Enrollment: Female~ Count","position":188},{"code":"CPNTFEMP","field":"campus_2025_student_enrollment_female_percent","label":"Campus 2025 Student Enrollment: Female~ Percent","position":189},{"code":"CPNTMALC","field":"campus_2025_student_enrollment_male_count","label":"Campus 2025 Student Enrollment: Male Count","position":190},{"code":"CPNTMALP","field":"campus_2025_student_enrollment_male_percent","label":"Campus 2025 Student Enrollment: Male Percent","position":191},{"code":"CPNTECOC","field":"campus_2025_student_enrollment_economically_disadvantaged_count","label":"Campus 2025 Student Enrollment: Economically Disadvantaged Count","position":192},{"code":"CPNTECOP","field":"campus_2025_student_enrollment_economically_disadvantaged_percent","label":"Campus 2025 Student Enrollment: Economically Disadvantaged Percent","position":193},{"code":"CPNTNEDC","field":"campus_2025_student_enrollment_non_educationally_disadv_count","label":"Campus 2025 Student Enrollment: Non-Educationally Disadv Count","position":194},{"code":"CPNTNEDP","field":"campus_2025_student_enrollment_non_educationally_disadv_percent","label":"Campus 2025 Student Enrollment: Non-Educationally Disadv Percent","position":195},{"code":"CPNT504C","field":"campus_2025_student_enrollment_section_504_count","label":"Campus 2025 Student Enrollment: Section 504 Count","position":196},{"code":"CPNT504P","field":"campus_2025_student_enrollment_section_504_percent","label":"Campus 2025 Student Enrollment: Section 504 Percent","position":197},{"code":"CPNTLEPC","field":"campus_2025_student_enrollment_english_learner_count","label":"Campus 2025 Student Enrollment: English Learner Count","position":198},{"code":"CPNTLEPP","field":"campus_2025_student_enrollment_english_learner_percent","label":"Campus 2025 Student Enrollment: English Learner Percent","position":199},{"code":"CPNTDSLC","field":"campus_2025_student_enrollment_dyslexia_count","label":"Campus 2025 Student Enrollment: Dyslexia Count","position":200},{"code":"CPNTDSLP","field":"campus_2025_student_enrollment_dyslexia_percent","label":"Campus 2025 Student Enrollment: Dyslexia Percent","position":201},{"code":"CPNTFOSC","field":"campus_2025_student_enrollment_foster_care_count","label":"Campus 2025 Student Enrollment: Foster Care Count","position":202},{"code":"CPNTFOSP","field":"campus_2025_student_enrollment_foster_care_percent","label":"Campus 2025 Student Enrollment: Foster Care Percent","position":203},{"code":"CPNTHOMC","field":"campus_2025_student_enrollment_homeless_count","label":"Campus 2025 Student Enrollment: Homeless Count","position":204},{"code":"CPNTHOMP","field":"campus_2025_student_enrollment_homeless_percent","label":"Campus 2025 Student Enrollment: Homeless Percent","position":205},{"code":"CPNTIMMC","field":"campus_2025_student_enrollment_immigrant_count","label":"Campus 2025 Student Enrollment: Immigrant Count","position":206},{"code":"CPNTIMMP","field":"campus_2025_student_enrollment_immigrant_percent","label":"Campus 2025 Student Enrollment: Immigrant Percent","position":207},{"code":"CPNTMIGC","field":"campus_2025_student_enrollment_migrant_count","label":"Campus 2025 Student Enrollment: Migrant Count","position":208},{"code":"CPNTMIGP","field":"campus_2025_student_enrollment_migrant_percent","label":"Campus 2025 Student Enrollment: Migrant Percent","position":209},{"code":"CPNTTT1C","field":"campus_2025_student_enrollment_title_i_count","label":"Campus 2025 Student Enrollment: Title I Count","position":210},{"code":"CPNTTT1P","field":"campus_2025_student_enrollment_title_i_percent","label":"Campus 2025 Student Enrollment: Title I Percent","position":211},{"code":"CPNTMLCC","field":"campus_2025_student_enrollment_military_connected_count","label":"Campus 2025 Student Enrollment: Military-Connected Count","position":212},{"code":"CPNTMLCP","field":"campus_2025_student_enrollment_military_connected_percent","label":"Campus 2025 Student Enrollment: Military-Connected Percent","position":213},{"code":"CPNTRSKC","field":"campus_2025_student_enrollment_at_risk_count","label":"Campus 2025 Student Enrollment: At Risk Count","position":214},{"code":"CPNTRSKP","field":"campus_2025_student_enrollment_at_risk_percent","label":"Campus 2025 Student Enrollment: At Risk Percent","position":215},{"code":"CPNTBILC","field":"campus_2025_student_enrollment_bilingual_esl_count","label":"Campus 2025 Student Enrollment: Bilingual/ESL Count","position":216},{"code":"CPNTBILP","field":"campus_2025_student_enrollment_bilingual_esl_percent","label":"Campus 2025 Student Enrollment: Bilingual/ESL Percent","position":217},{"code":"CPNTGIFC","field":"campus_2025_student_enrollment_gifted_and_talented_count","label":"Campus 2025 Student Enrollment: Gifted and Talented Count","position":218},{"code":"CPNTGIFP","field":"campus_2025_student_enrollment_gifted_and_talented_percent","label":"Campus 2025 Student Enrollment: Gifted and Talented Percent","position":219},{"code":"CPNTSPEC","field":"campus_2025_student_enrollment_special_ed_count","label":"Campus 2025 Student Enrollment: Special Ed Count","position":220},{"code":"CPNTSPEP","field":"campus_2025_student_enrollment_special_ed_percent","label":"Campus 2025 Student Enrollment: Special Ed Percent","position":221},{"code":"CPEMALLC","field":"campus_2025_student_membership_2024_mobility_all_students_count","label":"Campus 2025 Student Membership: 2024 Mobility All Students Count","position":222},{"code":"CPEMINDC","field":"campus_2025_student_membership_2024_mobility_american_indian_count","label":"Campus 2025 Student Membership: 2024 Mobility American Indian Count","position":223},{"code":"CPEMASIC","field":"campus_2025_student_membership_2024_mobility_asian_count","label":"Campus 2025 Student Membership: 2024 Mobility Asian Count","position":224},{"code":"CPEMPCIC","field":"campus_2025_student_membership_2024_mobility_pacific_islander_count","label":"Campus 2025 Student Membership: 2024 Mobility Pacific Islander Count","position":225},{"code":"CPEMTWOC","field":"campus_2025_student_membership_2024_mobility_two_or_more_races_count","label":"Campus 2025 Student Membership: 2024 Mobility Two or More Races Count","position":226},{"code":"CPEMBLAC","field":"campus_2025_student_membership_2024_mobility_african_american_count","label":"Campus 2025 Student Membership: 2024 Mobility African American Count","position":227},{"code":"CPEMHISC","field":"campus_2025_student_membership_2024_mobility_hispanic_count","label":"Campus 2025 Student Membership: 2024 Mobility Hispanic Count","position":228},{"code":"CPEMWHIC","field":"campus_2025_student_membership_2024_mobility_white_count","label":"Campus 2025 Student Membership: 2024 Mobility White Count","position":229},{"code":"CPEMECOC","field":"campus_2025_student_membership_2024_mobility_econ_disadv_count","label":"Campus 2025 Student Membership: 2024 Mobility Econ Disadv Count","position":230},{"code":"CPEMLEPC","field":"campus_2025_student_membership_2024_mobility_eb_el_count","label":"Campus 2025 Student Membership: 2024 Mobility EB/EL Count","position":231},{"code":"CPEMSPEC","field":"campus_2025_student_membership_2024_mobility_special_ed_count","label":"Campus 2025 Student Membership: 2024 Mobility Special Ed Count","position":232},{"code":"CPEMALLP","field":"campus_2025_student_membership_2024_mobility_all_students_percent","label":"Campus 2025 Student Membership: 2024 Mobility All Students Percent","position":233},{"code":"CPEMBLAP","field":"campus_2025_student_membership_2024_mobility_african_american_percent","label":"Campus 2025 Student Membership: 2024 Mobility African American Percent","position":234},{"code":"CPEMHISP","field":"campus_2025_student_membership_2024_mobility_hispanic_percent","label":"Campus 2025 Student Membership: 2024 Mobility Hispanic Percent","position":235},{"code":"CPEMINDP","field":"campus_2025_student_membership_2024_mobility_american_indian_percent","label":"Campus 2025 Student Membership: 2024 Mobility American Indian Percent","position":236},{"code":"CPEMWHIP","field":"campus_2025_student_membership_2024_mobility_white_percent","label":"Campus 2025 Student Membership: 2024 Mobility White Percent","position":237},{"code":"CPEMASIP","field":"campus_2025_student_membership_2024_mobility_asian_percent","label":"Campus 2025 Student Membership: 2024 Mobility Asian Percent","position":238},{"code":"CPEMPCIP","field":"campus_2025_student_membership_2024_mobility_pacific_islander_percent","label":"Campus 2025 Student Membership: 2024 Mobility Pacific Islander Percent","position":239},{"code":"CPEMTWOP","field":"campus_2025_student_membership_2024_mobility_two_or_more_races_percent","label":"Campus 2025 Student Membership: 2024 Mobility Two or More Races Percent","position":240},{"code":"CPEMECOP","field":"campus_2025_student_membership_2024_mobility_econ_disadv_percent","label":"Campus 2025 Student Membership: 2024 Mobility Econ Disadv Percent","position":241},{"code":"CPEMLEPP","field":"campus_2025_student_membership_2024_mobility_eb_el_percent","label":"Campus 2025 Student Membership: 2024 Mobility EB/EL Percent","position":242},{"code":"CPEMSPEP","field":"campus_2025_student_membership_2024_mobility_special_ed_percent","label":"Campus 2025 Student Membership: 2024 Mobility Special Ed Percent","position":243}],"input_sha256":"7e0e762a8f2ba50687fd8c6a59e8052d5740ba57abbedecddfca064bbd77548e","source_schema_sha256":"ebf5b5ce1a0b88979d307f0911bdb7887911701c8624afb62ef8e45c373f0fed","table":"student"},{"fields":[{"code":"CAMPUS","field":"campus_number","label":"9 Digit Campus Number","position":1},{"code":"CAMPNAME","field":"campus_name","label":"Campus Name","position":2},{"code":"DISTRICT","field":"district_number","label":"6 Digit County District Number","position":3},{"code":"DISTNAME","field":"district_name","label":"District Name","position":4},{"code":"CPSTTOFC","field":"campus_2025_staff_teacher_total_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Total Full Time Equiv Count","position":5},{"code":"CPSUTOFC","field":"campus_2025_staff_support_total_full_time_equiv_count","label":"Campus 2025 Staff: Support Total Full Time Equiv Count","position":6},{"code":"CPSSTOFC","field":"campus_2025_staff_school_admin_total_full_time_equiv_count","label":"Campus 2025 Staff: School Admin Total Full Time Equiv Count","position":7},{"code":"CPSCTOFC","field":"campus_2025_staff_central_admin_total_full_time_equiv_count","label":"Campus 2025 Staff: Central Admin Total Full Time Equiv Count","position":8},{"code":"CPSETOFC","field":"campus_2025_staff_educ_aide_total_full_time_equiv_count","label":"Campus 2025 Staff: Educ Aide Total Full Time Equiv Count","position":9},{"code":"CPST00FC","field":"campus_2025_staff_teacher_beginning_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Beginning Full Time Equiv Count","position":10},{"code":"CPST01FC","field":"campus_2025_staff_teacher_1_5_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 1-5 Years Full Time Equiv Count","position":11},{"code":"CPST06FC","field":"campus_2025_staff_teacher_6_10_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 6-10 Years Full Time Equiv Count","position":12},{"code":"CPST11FC","field":"campus_2025_staff_teacher_11_20_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 11-20 Years Full Time Equiv Count","position":13},{"code":"CPST21FC","field":"campus_2025_staff_teacher_21_30_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 21-30 Years Full Time Equiv Count","position":14},{"code":"CPST30FC","field":"campus_2025_staff_teacher_gt_30_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher > 30 Years Full Time Equiv Count","position":15},{"code":"CPSTNOFC","field":"campus_2025_staff_teacher_no_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher No Degree Full Time Equiv Count","position":16},{"code":"CPSTBAFC","field":"campus_2025_staff_teacher_ba_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher BA Degree Full Time Equiv Count","position":17},{"code":"CPSTMSFC","field":"campus_2025_staff_teacher_ms_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher MS Degree Full Time Equiv Count","position":18},{"code":"CPSTPHFC","field":"campus_2025_staff_teacher_ph_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher PH Degree Full Time Equiv Count","position":19},{"code":"CPSPTOFC","field":"campus_2025_staff_professional_total_full_time_equiv_count","label":"Campus 2025 Staff: Professional Total Full Time Equiv Count","position":20},{"code":"CPSATOFC","field":"campus_2025_staff_all_staff_total_full_time_equiv_count","label":"Campus 2025 Staff: All Staff Total Full Time Equiv Count","position":21},{"code":"CPSRTOPC","field":"campus_2025_staff_counselor_total_part_time_equiv_count","label":"Campus 2025 Staff: Counselor Total Part Time Equiv Count","position":22},{"code":"CPSRTOFC","field":"campus_2025_staff_counselor_total_full_time_equiv_count","label":"Campus 2025 Staff: Counselor Total Full Time Equiv Count","position":23},{"code":"CPSBTOPC","field":"campus_2025_staff_librarian_total_part_time_equiv_count","label":"Campus 2025 Staff: Librarian Total Part Time Equiv Count","position":24},{"code":"CPSBTOFC","field":"campus_2025_staff_librarian_total_full_time_equiv_count","label":"Campus 2025 Staff: Librarian Total Full Time Equiv Count","position":25},{"code":"CPSUTOSA","field":"campus_2025_staff_support_total_base_salary_average","label":"Campus 2025 Staff: Support Total Base Salary Average","position":26},{"code":"CPSSTOSA","field":"campus_2025_staff_school_admin_total_base_salary_average","label":"Campus 2025 Staff: School Admin Total Base Salary Average","position":27},{"code":"CPSCTOSA","field":"campus_2025_staff_central_admin_total_base_salary_average","label":"Campus 2025 Staff: Central Admin Total Base Salary Average","position":28},{"code":"CPSTTOSA","field":"campus_2025_staff_teacher_total_base_salary_average","label":"Campus 2025 Staff: Teacher Total Base Salary Average","position":29},{"code":"CPST00SA","field":"campus_2025_staff_teacher_beginning_base_salary_average","label":"Campus 2025 Staff: Teacher Beginning Base Salary Average","position":30},{"code":"CPST01SA","field":"campus_2025_staff_teacher_1_5_years_base_salary_average","label":"Campus 2025 Staff: Teacher 1-5 Years Base Salary Average","position":31},{"code":"CPST06SA","field":"campus_2025_staff_teacher_6_10_years_base_salary_average","label":"Campus 2025 Staff: Teacher 6-10 Years Base Salary Average","position":32},{"code":"CPST11SA","field":"campus_2025_staff_teacher_11_20_years_base_salary_average","label":"Campus 2025 Staff: Teacher 11-20 Years Base Salary Average","position":33},{"code":"CPST21SA","field":"campus_2025_staff_teacher_21_30_years_base_salary_average","label":"Campus 2025 Staff: Teacher 21-30 Years Base Salary Average","position":34},{"code":"CPST30SA","field":"campus_2025_staff_teacher_gt_30_years_base_salary_average","label":"Campus 2025 Staff: Teacher > 30 Years Base Salary Average","position":35},{"code":"CPSTINFC","field":"campus_2025_staff_teacher_american_indian_full_time_equiv_count","label":"Campus 2025 Staff: Teacher American Indian Full Time Equiv Count","position":36},{"code":"CPSTPIFC","field":"campus_2025_staff_teacher_pacific_islander_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Pacific Islander Full Time Equiv Count","position":37},{"code":"CPSTASFC","field":"campus_2025_staff_teacher_asian_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Asian Full Time Equiv Count","position":38},{"code":"CPSTBLFC","field":"campus_2025_staff_teacher_african_american_full_time_equiv_count","label":"Campus 2025 Staff: Teacher African American Full Time Equiv Count","position":39},{"code":"CPSTHIFC","field":"campus_2025_staff_teacher_hispanic_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Hispanic Full Time Equiv Count","position":40},{"code":"CPSTWHFC","field":"campus_2025_staff_teacher_white_full_time_equiv_count","label":"Campus 2025 Staff: Teacher White Full Time Equiv Count","position":41},{"code":"CPSTTWFC","field":"campus_2025_staff_teacher_two_or_more_races_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Two or more races Full Time Equiv Count","position":42},{"code":"CPSTMAFC","field":"campus_2025_staff_teacher_male_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Male Full Time Equiv Count","position":43},{"code":"CPSTFEFC","field":"campus_2025_staff_teacher_female_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Female Full Time Equiv Count","position":44},{"code":"CPSTTENA","field":"campus_2025_staff_average_years_experience_of_teachers_with_district","label":"Campus 2025 Staff: Average Years Experience of Teachers with District","position":45},{"code":"CPSTEXPA","field":"campus_2025_staff_teacher_experience_average","label":"Campus 2025 Staff: Teacher Experience Average","position":46},{"code":"CPSTREFC","field":"campus_2025_staff_teacher_regular_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Regular Program Full Time Equiv Count","position":47},{"code":"CPSTVOFC","field":"campus_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":48},{"code":"CPSTBIFC","field":"campus_2025_staff_teacher_bilingual_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Bilingual Program Full Time Equiv Count","position":49},{"code":"CPSTCOFC","field":"campus_2025_staff_teacher_compensatory_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Compensatory Program Full Time Equiv Count","position":50},{"code":"CPSTGIFC","field":"campus_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":51},{"code":"CPSTSPFC","field":"campus_2025_staff_teacher_special_education_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Special Education Full Time Equiv Count","position":52},{"code":"CPSTOPFC","field":"campus_2025_staff_teacher_other_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Other Full Time Equiv Count","position":53},{"code":"CPSHEXPA","field":"campus_2025_staff_principal_experience_average","label":"Campus 2025 Staff: Principal Experience Average","position":54},{"code":"CPSHTENA","field":"campus_2025_staff_average_years_experience_of_principals_with_district","label":"Campus 2025 Staff: Average Years Experience of Principals with District","position":55},{"code":"CPSLEXPA","field":"campus_2025_staff_assistant_principal_experience_average","label":"Campus 2025 Staff: Assistant Principal Experience Average","position":56},{"code":"CPSLTENA","field":"campus_2025_staff_average_years_experience_of_assistant_principals_with_district","label":"Campus 2025 Staff: Average Years Experience of Assistant Principals with District","position":57},{"code":"CPSAMIFC","field":"campus_2025_staff_all_staff_minority_full_time_equiv_count","label":"Campus 2025 Staff: All Staff Minority Full Time Equiv Count","position":58},{"code":"CPSTTOFP","field":"campus_2025_staff_teacher_total_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Total Full Time Equiv Percent","position":59},{"code":"CPSUTOFP","field":"campus_2025_staff_support_total_full_time_equiv_percent","label":"Campus 2025 Staff: Support Total Full Time Equiv Percent","position":60},{"code":"CPSSTOFP","field":"campus_2025_staff_school_admin_total_full_time_equiv_percent","label":"Campus 2025 Staff: School Admin Total Full Time Equiv Percent","position":61},{"code":"CPSETOFP","field":"campus_2025_staff_educ_aide_total_full_time_equiv_percent","label":"Campus 2025 Staff: Educ Aide Total Full Time Equiv Percent","position":62},{"code":"CPSPTOFP","field":"campus_2025_staff_professional_total_full_time_equiv_percent","label":"Campus 2025 Staff: Professional Total Full Time Equiv Percent","position":63},{"code":"CPSAMIFP","field":"campus_2025_staff_all_staff_minority_full_time_equiv_percent","label":"Campus 2025 Staff: All Staff Minority Full Time Equiv Percent","position":64},{"code":"CPST00FP","field":"campus_2025_staff_teacher_beginning_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Beginning Full Time Equiv Percent","position":65},{"code":"CPST01FP","field":"campus_2025_staff_teacher_1_5_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":66},{"code":"CPST06FP","field":"campus_2025_staff_teacher_6_10_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":67},{"code":"CPST11FP","field":"campus_2025_staff_teacher_11_20_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":68},{"code":"CPST21FP","field":"campus_2025_staff_teacher_21_30_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":69},{"code":"CPST30FP","field":"campus_2025_staff_teacher_gt_30_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher > 30 Years Full Time Equiv Percent","position":70},{"code":"CPSTREFP","field":"campus_2025_staff_teacher_regular_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Regular Program Full Time Equiv Percent","position":71},{"code":"CPSTVOFP","field":"campus_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":72},{"code":"CPSTBIFP","field":"campus_2025_staff_teacher_bilingual_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":73},{"code":"CPSTCOFP","field":"campus_2025_staff_teacher_compensatory_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":74},{"code":"CPSTGIFP","field":"campus_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":75},{"code":"CPSTSPFP","field":"campus_2025_staff_teacher_special_education_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Special Education Full Time Equiv Percent","position":76},{"code":"CPSTOPFP","field":"campus_2025_staff_teacher_other_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Other Full Time Equiv Percent","position":77},{"code":"CPSTNOFP","field":"campus_2025_staff_teacher_no_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher No Degree Full Time Equiv Percent","position":78},{"code":"CPSTBAFP","field":"campus_2025_staff_teacher_ba_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher BA Degree Full Time Equiv Percent","position":79},{"code":"CPSTMSFP","field":"campus_2025_staff_teacher_ms_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher MS Degree Full Time Equiv Percent","position":80},{"code":"CPSTPHFP","field":"campus_2025_staff_teacher_ph_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher PH Degree Full Time Equiv Percent","position":81},{"code":"CPSTWHFP","field":"campus_2025_staff_teacher_white_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher White Full Time Equiv Percent","position":82},{"code":"CPSTBLFP","field":"campus_2025_staff_teacher_african_american_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher African American Full Time Equiv Percent","position":83},{"code":"CPSTHIFP","field":"campus_2025_staff_teacher_hispanic_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Hispanic Full Time Equiv Percent","position":84},{"code":"CPSTPIFP","field":"campus_2025_staff_teacher_pacific_islander_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":85},{"code":"CPSTINFP","field":"campus_2025_staff_teacher_american_indian_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher American Indian Full Time Equiv Percent","position":86},{"code":"CPSTASFP","field":"campus_2025_staff_teacher_asian_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Asian Full Time Equiv Percent","position":87},{"code":"CPSTTWFP","field":"campus_2025_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Two or more races Full Time Equiv Percent","position":88},{"code":"CPSTMAFP","field":"campus_2025_staff_teacher_male_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Male Full Time Equiv Percent","position":89},{"code":"CPSTFEFP","field":"campus_2025_staff_teacher_female_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Female Full Time Equiv Percent","position":90},{"code":"CPSTKIDR","field":"campus_2025_staff_teacher_student_ratio","label":"Campus 2025 Staff: Teacher Student Ratio","position":91}],"input_sha256":"2fa9ae5285daae8587a6be3af9e4d600fb343c3f2ec011d67bc3092515a43f68","source_schema_sha256":"a0977622623ad8790de14ace7edb04e48b838170c2c7ac7a8842f8c7b27bc5f5","table":"staff"}]},{"dataset":"district_tapr_student_staff_profile","edition":"2025","prepared_input_sha256":"6068c6ac7a51c607c0f45744cf62948a339ee20f246db4ac08fee016f1b6f47d","tables":[{"fields":[{"code":"DISTRICT","field":"district_number","label":"6 Digit County District Number","position":1},{"code":"DISTNAME","field":"district_name","label":"District Name","position":2},{"code":"DPCTSOCA","field":"district_2025_class_size_sec_soc_stud_avg_size","label":"District 2025 Class Size: Sec Soc Stud- Avg Size","position":3},{"code":"DPCTSCIA","field":"district_2025_class_size_sec_sci_avg_size","label":"District 2025 Class Size: Sec Sci - Avg Size","position":4},{"code":"DPCTMATA","field":"district_2025_class_size_sec_math_avg_size","label":"District 2025 Class Size: Sec Math - Avg Size","position":5},{"code":"DPCTGKGA","field":"district_2025_class_size_kindergarten_avg_size","label":"District 2025 Class Size: Kindergarten- Avg Size","position":6},{"code":"DPCTG06A","field":"district_2025_class_size_grade_6_avg_size","label":"District 2025 Class Size: Grade 6 - Avg Size","position":7},{"code":"DPCTG05A","field":"district_2025_class_size_grade_5_avg_size","label":"District 2025 Class Size: Grade 5 - Avg Size","position":8},{"code":"DPCTG04A","field":"district_2025_class_size_grade_4_avg_size","label":"District 2025 Class Size: Grade 4 - Avg Size","position":9},{"code":"DPCTG03A","field":"district_2025_class_size_grade_3_avg_size","label":"District 2025 Class Size: Grade 3 - Avg Size","position":10},{"code":"DPCTG02A","field":"district_2025_class_size_grade_2_avg_size","label":"District 2025 Class Size: Grade 2 - Avg Size","position":11},{"code":"DPCTG01A","field":"district_2025_class_size_grade_1_avg_size","label":"District 2025 Class Size: Grade 1 - Avg Size","position":12},{"code":"DPCTFLAA","field":"district_2025_class_size_sec_for_lng_avg_size","label":"District 2025 Class Size: Sec For Lng - Avg Size","position":13},{"code":"DPCTENGA","field":"district_2025_class_size_sec_english_avg_size","label":"District 2025 Class Size: Sec English - Avg Size","position":14},{"code":"DPETGEEC","field":"district_2025_student_membership_ee_count","label":"District 2025 Student Membership: EE Count","position":15},{"code":"DPETGPKC","field":"district_2025_student_membership_pk_count","label":"District 2025 Student Membership: PK Count","position":16},{"code":"DPETGKNC","field":"district_2025_student_membership_kg_count","label":"District 2025 Student Membership: KG Count","position":17},{"code":"DPETG01C","field":"district_2025_student_membership_01_count","label":"District 2025 Student Membership: 01 Count","position":18},{"code":"DPETG02C","field":"district_2025_student_membership_02_count","label":"District 2025 Student Membership: 02 Count","position":19},{"code":"DPETG03C","field":"district_2025_student_membership_03_count","label":"District 2025 Student Membership: 03 Count","position":20},{"code":"DPETG04C","field":"district_2025_student_membership_04_count","label":"District 2025 Student Membership: 04 Count","position":21},{"code":"DPETG05C","field":"district_2025_student_membership_05_count","label":"District 2025 Student Membership: 05 Count","position":22},{"code":"DPETG06C","field":"district_2025_student_membership_06_count","label":"District 2025 Student Membership: 06 Count","position":23},{"code":"DPETG07C","field":"district_2025_student_membership_07_count","label":"District 2025 Student Membership: 07 Count","position":24},{"code":"DPETG08C","field":"district_2025_student_membership_08_count","label":"District 2025 Student Membership: 08 Count","position":25},{"code":"DPETG09C","field":"district_2025_student_membership_09_count","label":"District 2025 Student Membership: 09 Count","position":26},{"code":"DPETG10C","field":"district_2025_student_membership_10_count","label":"District 2025 Student Membership: 10 Count","position":27},{"code":"DPETG11C","field":"district_2025_student_membership_11_count","label":"District 2025 Student Membership: 11 Count","position":28},{"code":"DPETG12C","field":"district_2025_student_membership_12_count","label":"District 2025 Student Membership: 12 Count","position":29},{"code":"DPETALLC","field":"district_2025_student_membership_all_students_count","label":"District 2025 Student Membership: All Students Count","position":30},{"code":"DPETSPEC","field":"district_2025_student_membership_special_ed_count","label":"District 2025 Student Membership: Special Ed Count","position":31},{"code":"DPETBILC","field":"district_2025_student_membership_bilingual_esl_count","label":"District 2025 Student Membership: Bilingual/ESL Count","position":32},{"code":"DPETGIFC","field":"district_2025_student_membership_gifted_and_talented_count","label":"District 2025 Student Membership: Gifted & Talented Count","position":33},{"code":"DPETLEPC","field":"district_2025_student_membership_eb_el_count","label":"District 2025 Student Membership: EB/EL Count","position":34},{"code":"DPETECOC","field":"district_2025_student_membership_econ_disadv_count","label":"District 2025 Student Membership: Econ Disadv Count","position":35},{"code":"DPETNEDC","field":"district_2025_student_membership_non_educationally_disadv_count","label":"District 2025 Student Membership: Non-Educationally Disadv Count","position":36},{"code":"DPETRSKC","field":"district_2025_student_membership_at_risk_count","label":"District 2025 Student Membership: At Risk Count","position":37},{"code":"DPETINDC","field":"district_2025_student_membership_american_indian_count","label":"District 2025 Student Membership: American Indian Count","position":38},{"code":"DPETASIC","field":"district_2025_student_membership_asian_count","label":"District 2025 Student Membership: Asian Count","position":39},{"code":"DPETPCIC","field":"district_2025_student_membership_pacific_islander_count","label":"District 2025 Student Membership: Pacific Islander Count","position":40},{"code":"DPETTWOC","field":"district_2025_student_membership_two_or_more_races_count","label":"District 2025 Student Membership: Two or More Races Count","position":41},{"code":"DPETBLAC","field":"district_2025_student_membership_african_american_count","label":"District 2025 Student Membership: African American Count","position":42},{"code":"DPETHISC","field":"district_2025_student_membership_hispanic_count","label":"District 2025 Student Membership: Hispanic Count","position":43},{"code":"DPETWHIC","field":"district_2025_student_membership_white_count","label":"District 2025 Student Membership: White Count","position":44},{"code":"DPETMALC","field":"district_2025_student_membership_male_count","label":"District 2025 Student Membership: Male Count","position":45},{"code":"DPETFEMC","field":"district_2025_student_membership_female_count","label":"District 2025 Student Membership: Female Count","position":46},{"code":"DPETDSLC","field":"district_2025_student_membership_dyslexia_count","label":"District 2025 Student Membership: Dyslexia Count","position":47},{"code":"DPET504C","field":"district_2025_student_membership_section_504_count","label":"District 2025 Student Membership: Section 504 Count","position":48},{"code":"DPETTT1C","field":"district_2025_student_membership_title_i_count","label":"District 2025 Student Membership: Title I Count","position":49},{"code":"DPETHOMC","field":"district_2025_student_membership_homeless_count","label":"District 2025 Student Membership: Homeless Count","position":50},{"code":"DPETIMMC","field":"district_2025_student_membership_immigrant_count","label":"District 2025 Student Membership: Immigrant Count","position":51},{"code":"DPETMIGC","field":"district_2025_student_membership_migrant_count","label":"District 2025 Student Membership: Migrant Count","position":52},{"code":"DPETMLCC","field":"district_2025_student_membership_military_connected_count","label":"District 2025 Student Membership: Military-Connected Count","position":53},{"code":"DPETFOSC","field":"district_2025_student_membership_foster_care_count","label":"District 2025 Student Membership: Foster Care Count","position":54},{"code":"DPETGP3C","field":"district_2025_student_membership_pk_count_ages_3_and_under_count","label":"District 2025 Student Membership: PK Count Ages 3 and Under Count","position":55},{"code":"DPETGP4C","field":"district_2025_student_membership_pk_count_ages_4_and_over_count","label":"District 2025 Student Membership: PK Count Ages 4 and Over Count","position":56},{"code":"DPETDISC","field":"district_2024_daep_count","label":"District 2024 DAEP: Count","position":57},{"code":"DPETDISP","field":"district_2024_daep_percent","label":"District 2024 DAEP: Percent","position":58},{"code":"DPETATTC","field":"district_2025_student_membership_2023_24_attrition_all_students_count","label":"District 2025 Student Membership: 2023-24 Attrition All Students Count","position":59},{"code":"DPETATTP","field":"district_2025_student_membership_2023_24_attrition_all_students_percent","label":"District 2025 Student Membership: 2023-24 Attrition All Students Percent","position":60},{"code":"DPETSIMC","field":"district_2025_student_membership_total_students_with_disabilities_count","label":"District 2025 Student Membership: Total Students with Disabilities Count","position":61},{"code":"DPETSINC","field":"district_2025_student_membership_intellectual_disabilities_count","label":"District 2025 Student Membership: Intellectual Disabilities Count","position":62},{"code":"DPETSPHC","field":"district_2025_student_membership_physical_disabilities_count","label":"District 2025 Student Membership: Physical Disabilities Count","position":63},{"code":"DPETSBHC","field":"district_2025_student_membership_behavioral_disabilities_count","label":"District 2025 Student Membership: Behavioral Disabilities Count","position":64},{"code":"DPETSAUC","field":"district_2025_student_membership_autism_count","label":"District 2025 Student Membership: Autism Count","position":65},{"code":"DPETSNOC","field":"district_2025_student_membership_non_categorical_early_childhood_count","label":"District 2025 Student Membership: Non-Categorical Early Childhood Count","position":66},{"code":"DPETSINP","field":"district_2025_student_membership_intellectual_disabilities_percent","label":"District 2025 Student Membership: Intellectual Disabilities Percent","position":67},{"code":"DPETSPHP","field":"district_2025_student_membership_physical_disabilities_percent","label":"District 2025 Student Membership: Physical Disabilities Percent","position":68},{"code":"DPETSBHP","field":"district_2025_student_membership_behavioral_disabilities_percent","label":"District 2025 Student Membership: Behavioral Disabilities Percent","position":69},{"code":"DPETSAUP","field":"district_2025_student_membership_autism_percent","label":"District 2025 Student Membership: Autism Percent","position":70},{"code":"DPETSNOP","field":"district_2025_student_membership_non_categorical_early_childhood_percent","label":"District 2025 Student Membership: Non-Categorical Early Childhood Percent","position":71},{"code":"DPERRAKR","field":"district_2024_retention_regular_ed_kg_rate","label":"District 2024 Retention: Regular Ed KG Rate","position":72},{"code":"DPERRA1R","field":"district_2024_retention_regular_ed_01_rate","label":"District 2024 Retention: Regular Ed 01 Rate","position":73},{"code":"DPERRA2R","field":"district_2024_retention_regular_ed_02_rate","label":"District 2024 Retention: Regular Ed 02 Rate","position":74},{"code":"DPERRA3R","field":"district_2024_retention_regular_ed_03_rate","label":"District 2024 Retention: Regular Ed 03 Rate","position":75},{"code":"DPERRA4R","field":"district_2024_retention_regular_ed_04_rate","label":"District 2024 Retention: Regular Ed 04 Rate","position":76},{"code":"DPERRA5R","field":"district_2024_retention_regular_ed_05_rate","label":"District 2024 Retention: Regular Ed 05 Rate","position":77},{"code":"DPERRA6R","field":"district_2024_retention_regular_ed_06_rate","label":"District 2024 Retention: Regular Ed 06 Rate","position":78},{"code":"DPERRA7R","field":"district_2024_retention_regular_ed_07_rate","label":"District 2024 Retention: Regular Ed 07 Rate","position":79},{"code":"DPERRA8R","field":"district_2024_retention_regular_ed_08_rate","label":"District 2024 Retention: Regular Ed 08 Rate","position":80},{"code":"DPERRA9R","field":"district_2024_retention_regular_ed_09_rate","label":"District 2024 Retention: Regular Ed 09 Rate","position":81},{"code":"DPERSAKR","field":"district_2024_retention_special_ed_kg_rate","label":"District 2024 Retention: Special Ed KG Rate","position":82},{"code":"DPERSA1R","field":"district_2024_retention_special_ed_01_rate","label":"District 2024 Retention: Special Ed 01 Rate","position":83},{"code":"DPERSA2R","field":"district_2024_retention_special_ed_02_rate","label":"District 2024 Retention: Special Ed 02 Rate","position":84},{"code":"DPERSA3R","field":"district_2024_retention_special_ed_03_rate","label":"District 2024 Retention: Special Ed 03 Rate","position":85},{"code":"DPERSA4R","field":"district_2024_retention_special_ed_04_rate","label":"District 2024 Retention: Special Ed 04 Rate","position":86},{"code":"DPERSA5R","field":"district_2024_retention_special_ed_05_rate","label":"District 2024 Retention: Special Ed 05 Rate","position":87},{"code":"DPERSA6R","field":"district_2024_retention_special_ed_06_rate","label":"District 2024 Retention: Special Ed 06 Rate","position":88},{"code":"DPERSA7R","field":"district_2024_retention_special_ed_07_rate","label":"District 2024 Retention: Special Ed 07 Rate","position":89},{"code":"DPERSA8R","field":"district_2024_retention_special_ed_08_rate","label":"District 2024 Retention: Special Ed 08 Rate","position":90},{"code":"DPERSA9R","field":"district_2024_retention_special_ed_09_rate","label":"District 2024 Retention: Special Ed 09 Rate","position":91},{"code":"DAUND24C","field":"district_2024_underreported_students_count","label":"District 2024 Underreported Students: Count","position":92},{"code":"DPETWHIP","field":"district_2025_student_membership_white_percent","label":"District 2025 Student Membership: White Percent","position":93},{"code":"DPETBLAP","field":"district_2025_student_membership_african_american_percent","label":"District 2025 Student Membership: African American Percent","position":94},{"code":"DPETHISP","field":"district_2025_student_membership_hispanic_percent","label":"District 2025 Student Membership: Hispanic Percent","position":95},{"code":"DPETINDP","field":"district_2025_student_membership_american_indian_percent","label":"District 2025 Student Membership: American Indian Percent","position":96},{"code":"DPETASIP","field":"district_2025_student_membership_asian_percent","label":"District 2025 Student Membership: Asian Percent","position":97},{"code":"DPETPCIP","field":"district_2025_student_membership_pacific_islander_percent","label":"District 2025 Student Membership: Pacific Islander Percent","position":98},{"code":"DPETTWOP","field":"district_2025_student_membership_two_or_more_races_percent","label":"District 2025 Student Membership: Two or More Races Percent","position":99},{"code":"DPETECOP","field":"district_2025_student_membership_econ_disadv_percent","label":"District 2025 Student Membership: Econ Disadv Percent","position":100},{"code":"DPETNEDP","field":"district_2025_student_membership_non_educationally_disadv_percent","label":"District 2025 Student Membership: Non-Educationally Disadv Percent","position":101},{"code":"DPETRSKP","field":"district_2025_student_membership_at_risk_percent","label":"District 2025 Student Membership: At Risk Percent","position":102},{"code":"DPETLEPP","field":"district_2025_student_membership_eb_el_percent","label":"District 2025 Student Membership: EB/EL Percent","position":103},{"code":"DPETSPEP","field":"district_2025_student_membership_special_ed_percent","label":"District 2025 Student Membership: Special Ed Percent","position":104},{"code":"DPETBILP","field":"district_2025_student_membership_bilingual_esl_percent","label":"District 2025 Student Membership: Bilingual/ESL Percent","position":105},{"code":"DPETGIFP","field":"district_2025_student_membership_gifted_and_talented_percent","label":"District 2025 Student Membership: Gifted & Talented Percent","position":106},{"code":"DPET504P","field":"district_2025_student_membership_section_504_percent","label":"District 2025 Student Membership: Section 504 Percent","position":107},{"code":"DPETDSLP","field":"district_2025_student_membership_dyslexia_percent","label":"District 2025 Student Membership: Dyslexia Percent","position":108},{"code":"DPETTT1P","field":"district_2025_student_membership_title_i_percent","label":"District 2025 Student Membership: Title I Percent","position":109},{"code":"DPETHOMP","field":"district_2025_student_membership_homeless_percent","label":"District 2025 Student Membership: Homeless Percent","position":110},{"code":"DPETIMMP","field":"district_2025_student_membership_immigrant_percent","label":"District 2025 Student Membership: Immigrant Percent","position":111},{"code":"DPETMIGP","field":"district_2025_student_membership_migrant_percent","label":"District 2025 Student Membership: Migrant Percent","position":112},{"code":"DPETMLCP","field":"district_2025_student_membership_military_connected_percent","label":"District 2025 Student Membership: Military-Connected Percent","position":113},{"code":"DPETFOSP","field":"district_2025_student_membership_foster_care_percent","label":"District 2025 Student Membership: Foster Care Percent","position":114},{"code":"DPETGEEP","field":"district_2025_student_membership_ee_percent","label":"District 2025 Student Membership: EE Percent","position":115},{"code":"DPETGPKP","field":"district_2025_student_membership_pk_percent","label":"District 2025 Student Membership: PK Percent","position":116},{"code":"DPETGP3P","field":"district_2025_student_membership_pk_count_ages_3_and_under_percent","label":"District 2025 Student Membership: PK Count Ages 3 and Under Percent","position":117},{"code":"DPETGP4P","field":"district_2025_student_membership_pk_count_ages_4_and_over_percent","label":"District 2025 Student Membership: PK Count Ages 4 and Over Percent","position":118},{"code":"DPETGKNP","field":"district_2025_student_membership_kg_percent","label":"District 2025 Student Membership: KG Percent","position":119},{"code":"DPETG01P","field":"district_2025_student_membership_01_percent","label":"District 2025 Student Membership: 01 Percent","position":120},{"code":"DPETG02P","field":"district_2025_student_membership_02_percent","label":"District 2025 Student Membership: 02 Percent","position":121},{"code":"DPETG03P","field":"district_2025_student_membership_03_percent","label":"District 2025 Student Membership: 03 Percent","position":122},{"code":"DPETG04P","field":"district_2025_student_membership_04_percent","label":"District 2025 Student Membership: 04 Percent","position":123},{"code":"DPETG05P","field":"district_2025_student_membership_05_percent","label":"District 2025 Student Membership: 05 Percent","position":124},{"code":"DPETG06P","field":"district_2025_student_membership_06_percent","label":"District 2025 Student Membership: 06 Percent","position":125},{"code":"DPETG07P","field":"district_2025_student_membership_07_percent","label":"District 2025 Student Membership: 07 Percent","position":126},{"code":"DPETG08P","field":"district_2025_student_membership_08_percent","label":"District 2025 Student Membership: 08 Percent","position":127},{"code":"DPETG09P","field":"district_2025_student_membership_09_percent","label":"District 2025 Student Membership: 09 Percent","position":128},{"code":"DPETG10P","field":"district_2025_student_membership_10_percent","label":"District 2025 Student Membership: 10 Percent","position":129},{"code":"DPETG11P","field":"district_2025_student_membership_11_percent","label":"District 2025 Student Membership: 11 Percent","position":130},{"code":"DPETG12P","field":"district_2025_student_membership_12_percent","label":"District 2025 Student Membership: 12 Percent","position":131},{"code":"DPETMALP","field":"district_2025_student_membership_male_percent","label":"District 2025 Student Membership: Male Percent","position":132},{"code":"DPETFEMP","field":"district_2025_student_membership_female_percent","label":"District 2025 Student Membership: Female Percent","position":133},{"code":"DPETVOCC","field":"district_2025_student_membership_career_and_technical_education_count","label":"District 2025 Student Membership: Career & Technical Education Count","position":134},{"code":"DPETVHSC","field":"district_2025_student_membership_career_and_technical_9_12_education_count","label":"District 2025 Student Membership: Career & Technical (9-12) Education Count","position":135},{"code":"DPETVOCP","field":"district_2025_student_membership_career_and_technical_education_percent","label":"District 2025 Student Membership: Career & Technical Education Percent","position":136},{"code":"DPETVHSP","field":"district_2025_student_membership_career_and_technical_9_12_education_percent","label":"District 2025 Student Membership: Career & Technical (9-12) Education Percent","position":137},{"code":"DPNTALLC","field":"district_2025_student_enrollment_all_students_count","label":"District 2025 Student Enrollment: All Students Count","position":138},{"code":"DPNTGEEC","field":"district_2025_student_enrollment_early_childhood_education_count","label":"District 2025 Student Enrollment: Early Childhood Education Count","position":139},{"code":"DPNTGEEP","field":"district_2025_student_enrollment_early_childhood_education_percent","label":"District 2025 Student Enrollment: Early Childhood Education Percent","position":140},{"code":"DPNTGPKC","field":"district_2025_student_enrollment_pre_kindergarten_count","label":"District 2025 Student Enrollment: Pre-Kindergarten Count","position":141},{"code":"DPNTGPKP","field":"district_2025_student_enrollment_pre_kindergarten_percent","label":"District 2025 Student Enrollment: Pre-Kindergarten Percent","position":142},{"code":"DPNTGP3C","field":"district_2025_student_enrollment_pre_kindergarten_3_year_old_count","label":"District 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Count","position":143},{"code":"DPNTGP3P","field":"district_2025_student_enrollment_pre_kindergarten_3_year_old_percent","label":"District 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Percent","position":144},{"code":"DPNTGP4C","field":"district_2025_student_enrollment_pre_kindergarten_4_year_old_count","label":"District 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Count","position":145},{"code":"DPNTGP4P","field":"district_2025_student_enrollment_pre_kindergarten_4_year_old_percent","label":"District 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Percent","position":146},{"code":"DPNTGKNC","field":"district_2025_student_enrollment_kindergarten_count","label":"District 2025 Student Enrollment: Kindergarten Count","position":147},{"code":"DPNTGKNP","field":"district_2025_student_enrollment_kindergarten_percent","label":"District 2025 Student Enrollment: Kindergarten Percent","position":148},{"code":"DPNTG01C","field":"district_2025_student_enrollment_grade_1_count","label":"District 2025 Student Enrollment: Grade 1 Count","position":149},{"code":"DPNTG01P","field":"district_2025_student_enrollment_grade_1_percent","label":"District 2025 Student Enrollment: Grade 1 Percent","position":150},{"code":"DPNTG02C","field":"district_2025_student_enrollment_grade_2_count","label":"District 2025 Student Enrollment: Grade 2 Count","position":151},{"code":"DPNTG02P","field":"district_2025_student_enrollment_grade_2_percent","label":"District 2025 Student Enrollment: Grade 2 Percent","position":152},{"code":"DPNTG03C","field":"district_2025_student_enrollment_grade_3_count","label":"District 2025 Student Enrollment: Grade 3 Count","position":153},{"code":"DPNTG03P","field":"district_2025_student_enrollment_grade_3_percent","label":"District 2025 Student Enrollment: Grade 3 Percent","position":154},{"code":"DPNTG04C","field":"district_2025_student_enrollment_grade_4_count","label":"District 2025 Student Enrollment: Grade 4 Count","position":155},{"code":"DPNTG04P","field":"district_2025_student_enrollment_grade_4_percent","label":"District 2025 Student Enrollment: Grade 4 Percent","position":156},{"code":"DPNTG05C","field":"district_2025_student_enrollment_grade_5_count","label":"District 2025 Student Enrollment: Grade 5 Count","position":157},{"code":"DPNTG05P","field":"district_2025_student_enrollment_grade_5_percent","label":"District 2025 Student Enrollment: Grade 5 Percent","position":158},{"code":"DPNTG06C","field":"district_2025_student_enrollment_grade_6_count","label":"District 2025 Student Enrollment: Grade 6 Count","position":159},{"code":"DPNTG06P","field":"district_2025_student_enrollment_grade_6_percent","label":"District 2025 Student Enrollment: Grade 6 Percent","position":160},{"code":"DPNTG07C","field":"district_2025_student_enrollment_grade_7_count","label":"District 2025 Student Enrollment: Grade 7 Count","position":161},{"code":"DPNTG07P","field":"district_2025_student_enrollment_grade_7_percent","label":"District 2025 Student Enrollment: Grade 7 Percent","position":162},{"code":"DPNTG08C","field":"district_2025_student_enrollment_grade_8_count","label":"District 2025 Student Enrollment: Grade 8 Count","position":163},{"code":"DPNTG08P","field":"district_2025_student_enrollment_grade_8_percent","label":"District 2025 Student Enrollment: Grade 8 Percent","position":164},{"code":"DPNTG09C","field":"district_2025_student_enrollment_grade_9_count","label":"District 2025 Student Enrollment: Grade 9 Count","position":165},{"code":"DPNTG09P","field":"district_2025_student_enrollment_grade_9_percent","label":"District 2025 Student Enrollment: Grade 9 Percent","position":166},{"code":"DPNTG10C","field":"district_2025_student_enrollment_grade_10_count","label":"District 2025 Student Enrollment: Grade 10 Count","position":167},{"code":"DPNTG10P","field":"district_2025_student_enrollment_grade_10_percent","label":"District 2025 Student Enrollment: Grade 10 Percent","position":168},{"code":"DPNTG11C","field":"district_2025_student_enrollment_grade_11_count","label":"District 2025 Student Enrollment: Grade 11 Count","position":169},{"code":"DPNTG11P","field":"district_2025_student_enrollment_grade_11_percent","label":"District 2025 Student Enrollment: Grade 11 Percent","position":170},{"code":"DPNTG12C","field":"district_2025_student_enrollment_grade_12_count","label":"District 2025 Student Enrollment: Grade 12 Count","position":171},{"code":"DPNTG12P","field":"district_2025_student_enrollment_grade_12_percent","label":"District 2025 Student Enrollment: Grade 12 Percent","position":172},{"code":"DPNTBLAC","field":"district_2025_student_enrollment_african_american_count","label":"District 2025 Student Enrollment: African American Count","position":173},{"code":"DPNTBLAP","field":"district_2025_student_enrollment_african_american_percent","label":"District 2025 Student Enrollment: African American Percent","position":174},{"code":"DPNTHISC","field":"district_2025_student_enrollment_hispanic_count","label":"District 2025 Student Enrollment: Hispanic Count","position":175},{"code":"DPNTHISP","field":"district_2025_student_enrollment_hispanic_percent","label":"District 2025 Student Enrollment: Hispanic Percent","position":176},{"code":"DPNTWHIC","field":"district_2025_student_enrollment_white_count","label":"District 2025 Student Enrollment: White Count","position":177},{"code":"DPNTWHIP","field":"district_2025_student_enrollment_white_percent","label":"District 2025 Student Enrollment: White Percent","position":178},{"code":"DPNTINDC","field":"district_2025_student_enrollment_asian_count","label":"District 2025 Student Enrollment: Asian Count","position":179},{"code":"DPNTINDP","field":"district_2025_student_enrollment_asian_percent","label":"District 2025 Student Enrollment: Asian Percent","position":180},{"code":"DPNTASIC","field":"district_2024_25_asian_students_count","label":"District 2024-25 Asian Students Count","position":181},{"code":"DPNTASIP","field":"district_2024_25_asian_students_percent","label":"District 2024-25 Asian Students Percent","position":182},{"code":"DPNTPCIC","field":"district_2025_student_enrollment_pacific_islander_count","label":"District 2025 Student Enrollment: Pacific Islander Count","position":183},{"code":"DPNTPCIP","field":"district_2025_student_enrollment_pacific_islander_percent","label":"District 2025 Student Enrollment: Pacific Islander Percent","position":184},{"code":"DPNTTWOC","field":"district_2025_student_enrollment_two_or_more_races_count","label":"District 2025 Student Enrollment: Two or More Races Count","position":185},{"code":"DPNTTWOP","field":"district_2025_student_enrollment_two_or_more_races_percent","label":"District 2025 Student Enrollment: Two or More Races Percent","position":186},{"code":"DPNTFEMC","field":"district_2025_student_enrollment_female_count","label":"District 2025 Student Enrollment: Female~ Count","position":187},{"code":"DPNTFEMP","field":"district_2025_student_enrollment_female_percent","label":"District 2025 Student Enrollment: Female~ Percent","position":188},{"code":"DPNTMALC","field":"district_2025_student_enrollment_male_count","label":"District 2025 Student Enrollment: Male Count","position":189},{"code":"DPNTMALP","field":"district_2025_student_enrollment_male_percent","label":"District 2025 Student Enrollment: Male Percent","position":190},{"code":"DPNTECOC","field":"district_2025_student_enrollment_economically_disadvantaged_count","label":"District 2025 Student Enrollment: Economically Disadvantaged Count","position":191},{"code":"DPNTECOP","field":"district_2025_student_enrollment_economically_disadvantaged_percent","label":"District 2025 Student Enrollment: Economically Disadvantaged Percent","position":192},{"code":"DPNTNEDC","field":"district_2025_student_enrollment_non_educationally_disadv_count","label":"District 2025 Student Enrollment: Non-Educationally Disadv Count","position":193},{"code":"DPNTNEDP","field":"district_2025_student_enrollment_non_educationally_disadv_percent","label":"District 2025 Student Enrollment: Non-Educationally Disadv Percent","position":194},{"code":"DPNT504C","field":"district_2025_student_enrollment_section_504_count","label":"District 2025 Student Enrollment: Section 504 Count","position":195},{"code":"DPNT504P","field":"district_2025_student_enrollment_section_504_percent","label":"District 2025 Student Enrollment: Section 504 Percent","position":196},{"code":"DPNTLEPC","field":"district_2025_student_enrollment_english_learner_count","label":"District 2025 Student Enrollment: English Learner Count","position":197},{"code":"DPNTLEPP","field":"district_2025_student_enrollment_english_learner_percent","label":"District 2025 Student Enrollment: English Learner Percent","position":198},{"code":"DPNTDSLC","field":"district_2025_student_enrollment_dyslexia_count","label":"District 2025 Student Enrollment: Dyslexia Count","position":199},{"code":"DPNTDSLP","field":"district_2025_student_enrollment_dyslexia_percent","label":"District 2025 Student Enrollment: Dyslexia Percent","position":200},{"code":"DPNTFOSC","field":"district_2025_student_enrollment_foster_care_count","label":"District 2025 Student Enrollment: Foster Care Count","position":201},{"code":"DPNTFOSP","field":"district_2025_student_enrollment_foster_care_percent","label":"District 2025 Student Enrollment: Foster Care Percent","position":202},{"code":"DPNTHOMC","field":"district_2025_student_enrollment_homeless_count","label":"District 2025 Student Enrollment: Homeless Count","position":203},{"code":"DPNTHOMP","field":"district_2025_student_enrollment_homeless_percent","label":"District 2025 Student Enrollment: Homeless Percent","position":204},{"code":"DPNTIMMC","field":"district_2025_student_enrollment_immigrant_count","label":"District 2025 Student Enrollment: Immigrant Count","position":205},{"code":"DPNTIMMP","field":"district_2025_student_enrollment_immigrant_percent","label":"District 2025 Student Enrollment: Immigrant Percent","position":206},{"code":"DPNTMIGC","field":"district_2025_student_enrollment_migrant_count","label":"District 2025 Student Enrollment: Migrant Count","position":207},{"code":"DPNTMIGP","field":"district_2025_student_enrollment_migrant_percent","label":"District 2025 Student Enrollment: Migrant Percent","position":208},{"code":"DPNTTT1C","field":"district_2025_student_enrollment_title_i_count","label":"District 2025 Student Enrollment: Title I Count","position":209},{"code":"DPNTTT1P","field":"district_2025_student_enrollment_title_i_percent","label":"District 2025 Student Enrollment: Title I Percent","position":210},{"code":"DPNTMLCC","field":"district_2025_student_enrollment_military_connected_count","label":"District 2025 Student Enrollment: Military-Connected Count","position":211},{"code":"DPNTMLCP","field":"district_2025_student_enrollment_military_connected_percent","label":"District 2025 Student Enrollment: Military-Connected Percent","position":212},{"code":"DPNTRSKC","field":"district_2025_student_enrollment_at_risk_count","label":"District 2025 Student Enrollment: At Risk Count","position":213},{"code":"DPNTRSKP","field":"district_2025_student_enrollment_at_risk_percent","label":"District 2025 Student Enrollment: At Risk Percent","position":214},{"code":"DPNTBILC","field":"district_2025_student_enrollment_bilingual_esl_count","label":"District 2025 Student Enrollment: Bilingual/ESL Count","position":215},{"code":"DPNTBILP","field":"district_2025_student_enrollment_bilingual_esl_percent","label":"District 2025 Student Enrollment: Bilingual/ESL Percent","position":216},{"code":"DPNTGIFC","field":"district_2025_student_enrollment_gifted_and_talented_count","label":"District 2025 Student Enrollment: Gifted and Talented Count","position":217},{"code":"DPNTGIFP","field":"district_2025_student_enrollment_gifted_and_talented_percent","label":"District 2025 Student Enrollment: Gifted and Talented Percent","position":218},{"code":"DPNTSPEC","field":"district_2025_student_enrollment_special_ed_count","label":"District 2025 Student Enrollment: Special Ed Count","position":219},{"code":"DPNTSPEP","field":"district_2025_student_enrollment_special_ed_percent","label":"District 2025 Student Enrollment: Special Ed Percent","position":220},{"code":"DPEMALLC","field":"district_2025_student_membership_2024_mobility_all_students_count","label":"District 2025 Student Membership: 2024 Mobility All Students Count","position":221},{"code":"DPEMINDC","field":"district_2025_student_membership_2024_mobility_american_indian_count","label":"District 2025 Student Membership: 2024 Mobility American Indian Count","position":222},{"code":"DPEMPCIC","field":"district_2025_student_membership_2024_mobility_pacific_islander_count","label":"District 2025 Student Membership: 2024 Mobility Pacific Islander Count","position":223},{"code":"DPEMASIC","field":"district_2025_student_membership_2024_mobility_asian_count","label":"District 2025 Student Membership: 2024 Mobility Asian Count","position":224},{"code":"DPEMBLAC","field":"district_2025_student_membership_2024_mobility_african_american_count","label":"District 2025 Student Membership: 2024 Mobility African American Count","position":225},{"code":"DPEMHISC","field":"district_2025_student_membership_2024_mobility_hispanic_count","label":"District 2025 Student Membership: 2024 Mobility Hispanic Count","position":226},{"code":"DPEMWHIC","field":"district_2025_student_membership_2024_mobility_white_count","label":"District 2025 Student Membership: 2024 Mobility White Count","position":227},{"code":"DPEMTWOC","field":"district_2025_student_membership_2024_mobility_two_or_more_races_count","label":"District 2025 Student Membership: 2024 Mobility Two or More Races Count","position":228},{"code":"DPEMECOC","field":"district_2025_student_membership_2024_mobility_econ_disadv_count","label":"District 2025 Student Membership: 2024 Mobility Econ Disadv Count","position":229},{"code":"DPEMLEPC","field":"district_2025_student_membership_2024_mobility_eb_el_count","label":"District 2025 Student Membership: 2024 Mobility EB/EL Count","position":230},{"code":"DPEMSPEC","field":"district_2025_student_membership_2024_mobility_special_ed_count","label":"District 2025 Student Membership: 2024 Mobility Special Ed Count","position":231},{"code":"DPEMALLP","field":"district_2025_student_membership_2024_mobility_all_students_percent","label":"District 2025 Student Membership: 2024 Mobility All Students Percent","position":232},{"code":"DPEMINDP","field":"district_2025_student_membership_2024_mobility_american_indian_percent","label":"District 2025 Student Membership: 2024 Mobility American Indian Percent","position":233},{"code":"DPEMASIP","field":"district_2025_student_membership_2024_mobility_asian_percent","label":"District 2025 Student Membership: 2024 Mobility Asian Percent","position":234},{"code":"DPEMPCIP","field":"district_2025_student_membership_2024_mobility_pacific_islander_percent","label":"District 2025 Student Membership: 2024 Mobility Pacific Islander Percent","position":235},{"code":"DPEMTWOP","field":"district_2025_student_membership_2024_mobility_two_or_more_races_percent","label":"District 2025 Student Membership: 2024 Mobility Two or More Races Percent","position":236},{"code":"DPEMBLAP","field":"district_2025_student_membership_2024_mobility_african_american_percent","label":"District 2025 Student Membership: 2024 Mobility African American Percent","position":237},{"code":"DPEMHISP","field":"district_2025_student_membership_2024_mobility_hispanic_percent","label":"District 2025 Student Membership: 2024 Mobility Hispanic Percent","position":238},{"code":"DPEMWHIP","field":"district_2025_student_membership_2024_mobility_white_percent","label":"District 2025 Student Membership: 2024 Mobility White Percent","position":239},{"code":"DPEMECOP","field":"district_2025_student_membership_2024_mobility_econ_disadv_percent","label":"District 2025 Student Membership: 2024 Mobility Econ Disadv Percent","position":240},{"code":"DPEMLEPP","field":"district_2025_student_membership_2024_mobility_eb_el_percent","label":"District 2025 Student Membership: 2024 Mobility EB/EL Percent","position":241},{"code":"DPEMSPEP","field":"district_2025_student_membership_2024_mobility_special_ed_percent","label":"District 2025 Student Membership: 2024 Mobility Special Ed Percent","position":242}],"input_sha256":"8ccd14fb2eaff8c73d94960950cc359d44bf4b81edb721975edf6795b8995811","source_schema_sha256":"a5b1c27f6499d17f59d00c1fb38ce013631db138bc09ad372b6d895df57a674e","table":"student"},{"fields":[{"code":"DISTRICT","field":"district_number","label":"6 Digit County District Number","position":1},{"code":"DISTNAME","field":"district_name","label":"District Name","position":2},{"code":"DPSTTOFC","field":"district_2025_staff_teacher_total_full_time_equiv_count","label":"District 2025 Staff: Teacher Total Full Time Equiv Count","position":3},{"code":"DPSUTOFC","field":"district_2025_staff_support_total_full_time_equiv_count","label":"District 2025 Staff: Support Total Full Time Equiv Count","position":4},{"code":"DPSSTOFC","field":"district_2025_staff_school_admin_total_full_time_equiv_count","label":"District 2025 Staff: School Admin Total Full Time Equiv Count","position":5},{"code":"DPSCTOFC","field":"district_2025_staff_central_admin_total_full_time_equiv_count","label":"District 2025 Staff: Central Admin Total Full Time Equiv Count","position":6},{"code":"DPSETOFC","field":"district_2025_staff_educ_aide_total_full_time_equiv_count","label":"District 2025 Staff: Educ Aide Total Full Time Equiv Count","position":7},{"code":"DPST00FC","field":"district_2025_staff_teacher_beginning_full_time_equiv_count","label":"District 2025 Staff: Teacher Beginning Full Time Equiv Count","position":8},{"code":"DPST01FC","field":"district_2025_staff_teacher_1_5_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 1-5 Years Full Time Equiv Count","position":9},{"code":"DPST06FC","field":"district_2025_staff_teacher_6_10_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 6-10 Years Full Time Equiv Count","position":10},{"code":"DPST11FC","field":"district_2025_staff_teacher_11_20_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 11-20 Years Full Time Equiv Count","position":11},{"code":"DPST21FC","field":"district_2025_staff_teacher_21_30_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 21-30 Years Full Time Equiv Count","position":12},{"code":"DPST30FC","field":"district_2025_staff_teacher_gt_30_years_full_time_equiv_count","label":"District 2025 Staff: Teacher > 30 Years Full Time Equiv Count","position":13},{"code":"DPSTNOFC","field":"district_2025_staff_teacher_no_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher No Degree Full Time Equiv Count","position":14},{"code":"DPSTBAFC","field":"district_2025_staff_teacher_ba_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher BA Degree Full Time Equiv Count","position":15},{"code":"DPSTMSFC","field":"district_2025_staff_teacher_ms_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher MS Degree Full Time Equiv Count","position":16},{"code":"DPSTPHFC","field":"district_2025_staff_teacher_ph_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher PH Degree Full Time Equiv Count","position":17},{"code":"DPSECOFC","field":"district_2025_staff_ssa_educational_aides_full_time_equiv_count","label":"District 2025 Staff: SSA Educational Aides Full Time Equiv Count","position":18},{"code":"DPSPTOFC","field":"district_2025_staff_professional_total_full_time_equiv_count","label":"District 2025 Staff: Professional Total Full Time Equiv Count","position":19},{"code":"DPSRTOPC","field":"district_2025_staff_counselor_total_part_time_equiv_count","label":"District 2025 Staff: Counselor Total Part Time Equiv Count","position":20},{"code":"DPSRTOFC","field":"district_2025_staff_counselor_total_full_time_equiv_count","label":"District 2025 Staff: Counselor Total Full Time Equiv Count","position":21},{"code":"DPSBTOPC","field":"district_2025_staff_librarian_total_part_time_equiv_count","label":"District 2025 Staff: Librarian Total Part Time Equiv Count","position":22},{"code":"DPSBTOFC","field":"district_2025_staff_librarian_total_full_time_equiv_count","label":"District 2025 Staff: Librarian Total Full Time Equiv Count","position":23},{"code":"DPSXTOFC","field":"district_2025_staff_auxiliary_total_full_time_equiv_count","label":"District 2025 Staff: Auxiliary Total Full Time Equiv Count","position":24},{"code":"DPSATOFC","field":"district_2025_staff_all_staff_total_full_time_equiv_count","label":"District 2025 Staff: All Staff Total Full Time Equiv Count","position":25},{"code":"DPSOTOFC","field":"district_2025_staff_contract_serv_total_full_time_equiv_count","label":"District 2025 Staff: Contract Serv Total Full Time Equiv Count","position":26},{"code":"DPSTINFC","field":"district_2025_staff_teacher_american_indian_full_time_equiv_count","label":"District 2025 Staff: Teacher American Indian Full Time Equiv Count","position":27},{"code":"DPSTPIFC","field":"district_2025_staff_teacher_pacific_islander_full_time_equiv_count","label":"District 2025 Staff: Teacher Pacific Islander Full Time Equiv Count","position":28},{"code":"DPSTASFC","field":"district_2025_staff_teacher_asian_full_time_equiv_count","label":"District 2025 Staff: Teacher Asian Full Time Equiv Count","position":29},{"code":"DPSTBLFC","field":"district_2025_staff_teacher_african_american_full_time_equiv_count","label":"District 2025 Staff: Teacher African American Full Time Equiv Count","position":30},{"code":"DPSTHIFC","field":"district_2025_staff_teacher_hispanic_full_time_equiv_count","label":"District 2025 Staff: Teacher Hispanic Full Time Equiv Count","position":31},{"code":"DPSTWHFC","field":"district_2025_staff_teacher_white_full_time_equiv_count","label":"District 2025 Staff: Teacher White Full Time Equiv Count","position":32},{"code":"DPSTTWFC","field":"district_2025_staff_teacher_two_or_more_races_full_time_equiv_count","label":"District 2025 Staff: Teacher Two or more races Full Time Equiv Count","position":33},{"code":"DPSTMAFC","field":"district_2025_staff_teacher_male_full_time_equiv_count","label":"District 2025 Staff: Teacher Male Full Time Equiv Count","position":34},{"code":"DPSTFEFC","field":"district_2025_staff_teacher_female_full_time_equiv_count","label":"District 2025 Staff: Teacher Female Full Time Equiv Count","position":35},{"code":"DPSTREFC","field":"district_2025_staff_teacher_regular_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Regular Program Full Time Equiv Count","position":36},{"code":"DPSTVOFC","field":"district_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"District 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":37},{"code":"DPSTBIFC","field":"district_2025_staff_teacher_bilingual_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Bilingual Program Full Time Equiv Count","position":38},{"code":"DPSTCOFC","field":"district_2025_staff_teacher_compensatory_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Compensatory Program Full Time Equiv Count","position":39},{"code":"DPSTGIFC","field":"district_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":40},{"code":"DPSTSPFC","field":"district_2025_staff_teacher_special_education_full_time_equiv_count","label":"District 2025 Staff: Teacher Special Education Full Time Equiv Count","position":41},{"code":"DPSTOPFC","field":"district_2025_staff_teacher_other_full_time_equiv_count","label":"District 2025 Staff: Teacher Other Full Time Equiv Count","position":42},{"code":"DPSTURNR","field":"district_2025_staff_teacher_turnover_ratio","label":"District 2025 Staff: Teacher Turnover Ratio","position":43},{"code":"DPSTTENA","field":"district_2025_staff_average_years_experience_of_teachers_with_district","label":"District 2025 Staff: Average Years Experience of Teachers with District","position":44},{"code":"DPSTEXPA","field":"district_2025_staff_teacher_experience_average","label":"District 2025 Staff: Teacher Experience Average","position":45},{"code":"DPSHEXPA","field":"district_2025_staff_principal_experience_average","label":"District 2025 Staff: Principal Experience Average","position":46},{"code":"DPSHTENA","field":"district_2025_staff_average_years_experience_of_principals_with_district","label":"District 2025 Staff: Average Years Experience of Principals with District","position":47},{"code":"DPSLEXPA","field":"district_2025_staff_assistant_principal_experience_average","label":"District 2025 Staff: Assistant Principal Experience Average","position":48},{"code":"DPSLTENA","field":"district_2025_staff_average_years_experience_of_assistant_principals_with_district","label":"District 2025 Staff: Average Years Experience of Assistant Principals with District","position":49},{"code":"DPSAMIFC","field":"district_2025_staff_all_staff_minority_full_time_equiv_count","label":"District 2025 Staff: All Staff Minority Full Time Equiv Count","position":50},{"code":"DPSPTOFP","field":"district_2025_staff_professional_total_full_time_equiv_percent","label":"District 2025 Staff: Professional Total Full Time Equiv Percent","position":51},{"code":"DPSTTOFP","field":"district_2025_staff_teacher_total_full_time_equiv_percent","label":"District 2025 Staff: Teacher Total Full Time Equiv Percent","position":52},{"code":"DPSUTOFP","field":"district_2025_staff_support_total_full_time_equiv_percent","label":"District 2025 Staff: Support Total Full Time Equiv Percent","position":53},{"code":"DPSSTOFP","field":"district_2025_staff_school_admin_total_full_time_equiv_percent","label":"District 2025 Staff: School Admin Total Full Time Equiv Percent","position":54},{"code":"DPSCTOFP","field":"district_2025_staff_central_admin_total_full_time_equiv_percent","label":"District 2025 Staff: Central Admin Total Full Time Equiv Percent","position":55},{"code":"DPSETOFP","field":"district_2025_staff_educ_aide_total_full_time_equiv_percent","label":"District 2025 Staff: Educ Aide Total Full Time Equiv Percent","position":56},{"code":"DPSXTOFP","field":"district_2025_staff_auxiliary_total_full_time_equiv_percent","label":"District 2025 Staff: Auxiliary Total Full Time Equiv Percent","position":57},{"code":"DPSAMIFP","field":"district_2025_staff_all_staff_minority_full_time_equiv_percent","label":"District 2025 Staff: All Staff Minority Full Time Equiv Percent","position":58},{"code":"DPSTNOFP","field":"district_2025_staff_teacher_no_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher No Degree Full Time Equiv Percent","position":59},{"code":"DPSTBAFP","field":"district_2025_staff_teacher_ba_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher BA Degree Full Time Equiv Percent","position":60},{"code":"DPSTMSFP","field":"district_2025_staff_teacher_ms_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher MS Degree Full Time Equiv Percent","position":61},{"code":"DPSTPHFP","field":"district_2025_staff_teacher_ph_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher PH Degree Full Time Equiv Percent","position":62},{"code":"DPST00FP","field":"district_2025_staff_teacher_beginning_full_time_equiv_percent","label":"District 2025 Staff: Teacher Beginning Full Time Equiv Percent","position":63},{"code":"DPST01FP","field":"district_2025_staff_teacher_1_5_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":64},{"code":"DPST06FP","field":"district_2025_staff_teacher_6_10_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":65},{"code":"DPST11FP","field":"district_2025_staff_teacher_11_20_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":66},{"code":"DPST21FP","field":"district_2025_staff_teacher_21_30_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":67},{"code":"DPST30FP","field":"district_2025_staff_teacher_gt_30_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher > 30 Years Full Time Equiv Percent","position":68},{"code":"DPSTREFP","field":"district_2025_staff_teacher_regular_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Regular Program Full Time Equiv Percent","position":69},{"code":"DPSTVOFP","field":"district_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"District 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":70},{"code":"DPSTBIFP","field":"district_2025_staff_teacher_bilingual_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":71},{"code":"DPSTCOFP","field":"district_2025_staff_teacher_compensatory_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":72},{"code":"DPSTGIFP","field":"district_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":73},{"code":"DPSTSPFP","field":"district_2025_staff_teacher_special_education_full_time_equiv_percent","label":"District 2025 Staff: Teacher Special Education Full Time Equiv Percent","position":74},{"code":"DPSTOPFP","field":"district_2025_staff_teacher_other_full_time_equiv_percent","label":"District 2025 Staff: Teacher Other Full Time Equiv Percent","position":75},{"code":"DPSTBLFP","field":"district_2025_staff_teacher_african_american_full_time_equiv_percent","label":"District 2025 Staff: Teacher African American Full Time Equiv Percent","position":76},{"code":"DPSTWHFP","field":"district_2025_staff_teacher_white_full_time_equiv_percent","label":"District 2025 Staff: Teacher White Full Time Equiv Percent","position":77},{"code":"DPSTHIFP","field":"district_2025_staff_teacher_hispanic_full_time_equiv_percent","label":"District 2025 Staff: Teacher Hispanic Full Time Equiv Percent","position":78},{"code":"DPSTPIFP","field":"district_2025_staff_teacher_pacific_islander_full_time_equiv_percent","label":"District 2025 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":79},{"code":"DPSTINFP","field":"district_2025_staff_teacher_american_indian_full_time_equiv_percent","label":"District 2025 Staff: Teacher American Indian Full Time Equiv Percent","position":80},{"code":"DPSTASFP","field":"district_2025_staff_teacher_asian_full_time_equiv_percent","label":"District 2025 Staff: Teacher Asian Full Time Equiv Percent","position":81},{"code":"DPSTTWFP","field":"district_2025_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"District 2025 Staff: Teacher Two or more races Full Time Equiv Percent","position":82},{"code":"DPSTMAFP","field":"district_2025_staff_teacher_male_full_time_equiv_percent","label":"District 2025 Staff: Teacher Male Full Time Equiv Percent","position":83},{"code":"DPSTFEFP","field":"district_2025_staff_teacher_female_full_time_equiv_percent","label":"District 2025 Staff: Teacher Female Full Time Equiv Percent","position":84},{"code":"DPSTKIDR","field":"district_2025_staff_teacher_student_ratio","label":"District 2025 Staff: Teacher Student Ratio","position":85},{"code":"DPST00SA","field":"district_2025_staff_teacher_beginning_base_salary_average","label":"District 2025 Staff: Teacher Beginning Base Salary Average","position":86},{"code":"DPST01SA","field":"district_2025_staff_teacher_1_5_years_base_salary_average","label":"District 2025 Staff: Teacher 1-5 Years Base Salary Average","position":87},{"code":"DPST06SA","field":"district_2025_staff_teacher_6_10_years_base_salary_average","label":"District 2025 Staff: Teacher 6-10 Years Base Salary Average","position":88},{"code":"DPST11SA","field":"district_2025_staff_teacher_11_20_years_base_salary_average","label":"District 2025 Staff: Teacher 11-20 Years Base Salary Average","position":89},{"code":"DPST21SA","field":"district_2025_staff_teacher_21_30_years_base_salary_average","label":"District 2025 Staff: Teacher 21-30 Years Base Salary Average","position":90},{"code":"DPST30SA","field":"district_2025_staff_teacher_gt_30_years_base_salary_average","label":"District 2025 Staff: Teacher > 30 Years Base Salary Average","position":91},{"code":"DPSTTOSA","field":"district_2025_staff_teacher_total_base_salary_average","label":"District 2025 Staff: Teacher Total Base Salary Average","position":92},{"code":"DPSUTOSA","field":"district_2025_staff_support_total_base_salary_average","label":"District 2025 Staff: Support Total Base Salary Average","position":93},{"code":"DPSSTOSA","field":"district_2025_staff_school_admin_total_base_salary_average","label":"District 2025 Staff: School Admin Total Base Salary Average","position":94},{"code":"DPSCTOSA","field":"district_2025_staff_central_admin_total_base_salary_average","label":"District 2025 Staff: Central Admin Total Base Salary Average","position":95},{"code":"DMSTHCNT","field":"district_2025_staff_teacher_incentive_allotment_master_head_count","label":"District 2025 Staff: Teacher Incentive Allotment Master Head Count","position":96},{"code":"DEXPHCNT","field":"district_2025_staff_teacher_incentive_allotment_exemplary_head_count","label":"District 2025 Staff: Teacher Incentive Allotment Exemplary Head Count","position":97},{"code":"DRECHCNT","field":"district_2025_staff_teacher_incentive_allotment_recognized_head_count","label":"District 2025 Staff: Teacher Incentive Allotment Recognized Head Count","position":98},{"code":"DRECAVGP","field":"district_2025_staff_teacher_incentive_allotment_recognized_payout_average","label":"District 2025 Staff: Teacher Incentive Allotment Recognized Payout Average","position":99},{"code":"DEXPAVGP","field":"district_2025_staff_teacher_incentive_allotment_exemplary_payout_average","label":"District 2025 Staff: Teacher Incentive Allotment Exemplary Payout Average","position":100},{"code":"DMSTAVGP","field":"district_2025_staff_teacher_incentive_allotment_master_payout_average","label":"District 2025 Staff: Teacher Incentive Allotment Master Payout Average","position":101}],"input_sha256":"fbb3f7ce013d5b676a546e4a22a1a9e8e13bc95f5740f0151541a970f31784a3","source_schema_sha256":"c26c02d9e7189ccc570da4815fc63254a55088d43abeab549f7dbeea20272274","table":"staff"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/scripts/build_tapr_2025_profiles.py b/teadata/scripts/build_tapr_2025_profiles.py index 7fce539..0c98034 100644 --- a/teadata/scripts/build_tapr_2025_profiles.py +++ b/teadata/scripts/build_tapr_2025_profiles.py @@ -3,9 +3,11 @@ import argparse import csv import math +import os import re +from itertools import chain from pathlib import Path -from typing import Iterable +from typing import Any, Iterable from openpyxl import Workbook # type: ignore[import-untyped] from openpyxl.styles import Alignment, Font, PatternFill # type: ignore[import-untyped] @@ -13,94 +15,110 @@ from openpyxl.worksheet.table import Table, TableStyleInfo # type: ignore[import-untyped] from teadata.scripts.paths import data_path - - -def sanitize_header(s: str) -> str: - """Convert a column header to a Python-safe identifier.""" - s = str(s) - s = s.lower() - s = s.replace(":", "").replace("(", "").replace(")", "") - s = s.replace("&", " and ") - s = s.replace("%", " percent ") - s = s.replace("#", " number ") - s = s.replace(">", " gt ") - s = s.replace("<", " lt ") - s = re.sub(r"[\\/–—\-]+", "_", s) - s = re.sub(r"[.]", "_", s) - s = re.sub(r"\s+", "_", s) - s = re.sub(r"[^a-z0-9_]+", "_", s) - s = re.sub(r"__+", "_", s) - return s.strip("_") - - -def _dedupe_headers(headers: list[str]) -> list[str]: - seen: dict[str, int] = {} - out: list[str] = [] - for header in headers: - if header not in seen: - seen[header] = 1 - out.append(header) - continue - seen[header] += 1 - out.append(f"{header}_{seen[header]}") - return out - - -def _normalize_row(row: list[str], width: int) -> list[str]: - if len(row) < width: - row = row + [""] * (width - len(row)) - elif len(row) > width: - row = row[:width] - return row +from teadata.identifiers import canonical_source_identifier +from teadata.column_schema import parse_column_schema, crosswalk_dataset, validate_header_table +from teadata.manifest import file_identity +from teadata.teadata_config import load_config def _read_tapr_csv( - path: Path, *, rename_map: dict[str, str], key_field: str -): + path: Path, *, mapping: dict[str, Any], key_field: str +) -> tuple[list[str], dict[str, dict[str, str]], list[dict[str, str]]]: + """Read this two-header layout without repairing ambiguous source records. + + Human labels and publisher codes are returned verbatim as metadata. Body + tokens retain the existing whitespace normalization; masking is interpreted + elsewhere by the dataset's value policy. + """ + widths = {"campus_number": 9, "district_number": 6} + if key_field not in widths: + raise ValueError(f"Unsupported TAPR key field: {key_field}") + try: + validate_header_table(mapping) + except ValueError as error: + raise ValueError(f"{path}: invalid header crosswalk: {error}") from error + if file_identity(path)["sha256"] != mapping["input_sha256"]: + raise ValueError(f"{path}: input differs from the reviewed header crosswalk") + fields = mapping["fields"] + headers = [field["field"] for field in fields] with path.open(newline="", encoding="utf-8-sig") as fh: - reader = csv.reader(fh) - labels = next(reader) - codes = next(reader) - - headers = [ - rename_map.get(sanitize_header(label), sanitize_header(label)) - for label in labels - ] - headers = _dedupe_headers(headers) + reader = csv.reader(fh, strict=True) + try: + labels = next(reader) + codes = next(reader) + except (StopIteration, csv.Error) as error: + raise ValueError(f"{path}: expected human-label and source-code header records") from error + if not labels or len(labels) != len(codes): + raise ValueError(f"{path}: header width mismatch: {len(labels)} labels, {len(codes)} codes") + + if key_field not in headers: + raise ValueError(f"{path}: missing key header {key_field!r}") + if len(codes) != len(fields): + raise ValueError(f"{path}: human-label/code headers differ from the reviewed crosswalk") + key_code = "CAMPUS" if key_field == "campus_number" else "DISTRICT" + key_column = headers.index(key_field) + if codes[key_column].strip() != key_code: + raise ValueError(f"{path}: expected source-code header {key_code!r} in record 2, column {key_column + 1}") + if labels != [field["label"] for field in fields] or codes != [field["code"] for field in fields]: + raise ValueError(f"{path}: human-label/code headers differ from the reviewed crosswalk") elements = [] - for code, label, header in zip(codes, labels, headers): - code_text = str(code).strip() - label_text = str(label).strip() + for code, label, header in zip(codes, labels, headers, strict=True): elements.append( { - "code": code_text, - "label": label_text, + "code": code, + "label": label, "sanitized_label": header, } ) rows: dict[str, dict[str, str]] = {} + seen_keys: dict[str, int] = {} header_len = len(headers) - for row in reader: - if not row or not any(cell.strip() for cell in row): - continue - row = _normalize_row(row, header_len) - record = { - header: (value.strip() if isinstance(value, str) else value) - for header, value in zip(headers, row) - } - key = record.get(key_field) - if key is None: - continue - key = str(key).strip() - if not key: - continue - rows[key] = record + try: + for number, row in enumerate(reader, 3): + if len(row) != header_len: + raise ValueError(f"{path}: record {number} has {len(row)} fields; expected {header_len}") + record = {header: value.strip() for header, value in zip(headers, row, strict=True)} + key = record[key_field] + try: + identity = canonical_source_identifier(key, width=widths[key_field]) + if identity is None: + raise ValueError("missing source identifier") + if key_field == "campus_number" and "district_number" in record: + district = canonical_source_identifier(record["district_number"], width=6) + if district is None or identity[1:7] != district[1:]: + raise ValueError("campus and district identifiers disagree") + except ValueError as error: + raise ValueError(f"{path}: record {number} has invalid {key_field}: {key!r} ({error})") from error + if identity in seen_keys: + raise ValueError(f"{path}: duplicate {key_field} at records {seen_keys[identity]} and {number}: {key!r}") + seen_keys[identity] = number + rows[key] = record + except csv.Error as error: + raise ValueError(f"{path}: invalid CSV near physical line {reader.line_num}: {error}") from error + if not rows: + raise ValueError(f"{path}: no TAPR data records") + if file_identity(path)["sha256"] != mapping["input_sha256"]: + raise ValueError(f"{path}: input changed while reading the reviewed header crosswalk") return headers, rows, elements +def _header_tables(cfg, dataset: str) -> dict[str, dict[str, Any]]: + source = cfg.resolve_dataset(dataset, 2025) + if source.resolved_year != 2025 or source.metadata.version != "2025": + raise ValueError(f"No selected 2025 header crosswalk for {dataset}") + contract = cfg.column_contract(dataset, 2025) + if contract is None: + raise ValueError(f"Header crosswalk unavailable for {dataset}") + selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, "2025") + tables = {table["table"]: table for table in selected["tables"]} + if set(tables) != {"student", "staff"}: + raise ValueError(f"Student/staff header crosswalk required for {dataset}") + return tables + + def _merge_tables( primary_headers: list[str], primary_rows: dict[str, dict[str, str]], @@ -110,6 +128,21 @@ def _merge_tables( key_field: str, preferred_cols: Iterable[str], ): + """Outer-merge available sources, retaining the existing blank-fill policy. + + One-sided entities are retained, and a blank primary token may be filled + from the secondary source. Two nonblank tokens for a shared field must + agree; this does not assert complete or identical source coverage. + """ + width = {"campus_number": 9, "district_number": 6}[key_field] + representations: dict[str, str] = {} + for key in chain(primary_rows, secondary_rows): + identity = canonical_source_identifier(key, width=width) + if identity is None: + raise ValueError(f"Missing TAPR {key_field}") + previous = representations.setdefault(identity, key) + if previous != key: + raise ValueError(f"Inconsistent TAPR {key_field} representations: {previous!r}, {key!r}") keys = sorted(set(primary_rows) | set(secondary_rows)) merged_rows: list[dict[str, str]] = [] for key in keys: @@ -117,22 +150,18 @@ def _merge_tables( record.update(primary_rows.get(key, {})) for k, v in secondary_rows.get(key, {}).items(): if k in record and record[k] not in (None, ""): + if v not in (None, "") and record[k] != v: + raise ValueError(f"Conflicting TAPR values for {key_field} {key!r}, field {k!r}: {record[k]!r} and {v!r}") continue record[k] = v merged_rows.append(record) - ordered_headers: list[str] = [] - for col in preferred_cols: - if col in primary_headers or col in secondary_headers: - if col not in ordered_headers: - ordered_headers.append(col) - - for col in primary_headers: - if col not in ordered_headers: - ordered_headers.append(col) - for col in secondary_headers: - if col not in ordered_headers: - ordered_headers.append(col) + present = set(primary_headers) | set(secondary_headers) + ordered_headers = list(dict.fromkeys([ + *(col for col in preferred_cols if col in present), + *primary_headers, + *secondary_headers, + ])) if key_field not in ordered_headers: ordered_headers.insert(0, key_field) @@ -358,25 +387,24 @@ def main(argv: list[str] | None = None) -> None: district_out = args.output_dir / "DISTPROF_2024-2025_FINAL.xlsx" campus_elements_out = args.output_dir / "CAMPPROF_2024-2025_data_elements.xlsx" district_elements_out = args.output_dir / "DISTPROF_2024-2025_data_elements.xlsx" - rename_map = { - "6_digit_county_district_number": "district_number", - "9_digit_campus_number": "campus_number", - } + cfg = load_config(os.environ.get("TEADATA_CONFIG") or Path(__file__).resolve().parents[1] / "teadata_sources.yaml") + campus_mappings = _header_tables(cfg, "campus_tapr_student_staff_profile") + district_mappings = _header_tables(cfg, "district_tapr_student_staff_profile") campus_student_headers, campus_student_rows, campus_student_elements = ( - _read_tapr_csv(campus_student, rename_map=rename_map, key_field="campus_number") + _read_tapr_csv(campus_student, mapping=campus_mappings["student"], key_field="campus_number") ) campus_staff_headers, campus_staff_rows, campus_staff_elements = _read_tapr_csv( - campus_staff, rename_map=rename_map, key_field="campus_number" + campus_staff, mapping=campus_mappings["staff"], key_field="campus_number" ) district_student_headers, district_student_rows, district_student_elements = ( _read_tapr_csv( - district_student, rename_map=rename_map, key_field="district_number" + district_student, mapping=district_mappings["student"], key_field="district_number" ) ) district_staff_headers, district_staff_rows, district_staff_elements = ( _read_tapr_csv( - district_staff, rename_map=rename_map, key_field="district_number" + district_staff, mapping=district_mappings["staff"], key_field="district_number" ) ) diff --git a/teadata/teadata_config.py b/teadata/teadata_config.py index 6165255..cda612b 100644 --- a/teadata/teadata_config.py +++ b/teadata/teadata_config.py @@ -685,16 +685,16 @@ def _load_table( f"Unsupported file extension for loader: {ext} (from '{base}')" ) - def column_schema( + def column_contract( self, dataset: str, year: int | None = None, *, section: str = "data_sources", reader_profile: str | None = None, - ) -> list[str] | None: - """Return the reviewed ordered reader columns without loading source rows.""" - from .column_schema import load_column_schema, reader_options + ) -> dict[str, str] | None: + """Load the exact reviewed reader resource without source-row I/O.""" + from .column_schema import load_column_contract, reader_options from .manifest import ContractError source = self.resolve_dataset(dataset, year, section=section) @@ -718,12 +718,69 @@ def column_schema( ) if self.base_dir is None: raise ValueError("Column schema requires a source contract directory") - return load_column_schema( + return load_column_contract( self.base_dir, resource, references[0].reviewed_sha256 ) except (OSError, ValueError) as error: raise ContractError(f"Invalid column schema for {dataset}: {error}") from error + def column_schema( + self, dataset: str, year: int | None = None, *, section: str = "data_sources", + reader_profile: str | None = None, + ) -> list[str] | None: + """Derive ordered reader columns from the same reviewed resource.""" + from .column_schema import parse_column_schema, schema_columns + from .manifest import ContractError + + contract = self.column_contract(dataset, year, section=section, reader_profile=reader_profile) + if contract is None: + return None + source = self.resolve_dataset(dataset, year, section=section) + try: + return schema_columns(parse_column_schema(contract["text"].encode()), + dataset=source.dataset, edition=source.metadata.version) + except ValueError as error: + raise ContractError(f"Invalid column schema for {dataset}: {error}") from error + + def header_records(self, dataset: str, *, edition: str, + table: str | None = None) -> list[dict[str, Any]]: + """Return reviewed source-contract mappings without any dataset reads. + + This explicitly selects this configuration's contract, independently of + a data release. Editions are exact metadata versions, never prior-year + fallbacks or guesses from filenames. + """ + from .column_schema import parse_column_schema, header_records + from .manifest import ContractError + + choices = [(section, year) for section in ("data_sources", "spatial") + for name, versions in getattr(self, section).items() if name == dataset + for year, definition in versions.entries.items() if definition.metadata.version == edition] + if len(choices) != 1: + raise ContractError(f"Source-contract header crosswalk edition unavailable or ambiguous: {dataset!r}, {edition!r}") + section, year = choices[0] + contract = self.column_contract(dataset, year, section=section) + if contract is None: + raise ContractError(f"Source-contract header crosswalk unavailable: {dataset!r}") + try: + return header_records(parse_column_schema(contract["text"].encode()), + dataset=dataset, edition=edition, table=table) + except ValueError as error: + raise ContractError(str(error)) from error + + def header_mapping(self, dataset: str, *, edition: str, table: str, + from_: str = "code", to: str = "field", + columns: Iterable[str] | None = None) -> dict[str, str]: + """Return an ordinary rename map from this explicit source contract.""" + from .column_schema import header_rename_map + from .manifest import ContractError + + try: + return header_rename_map(self.header_records(dataset, edition=edition, table=table), + from_=from_, to=to, columns=columns) + except ValueError as error: + raise ContractError(str(error)) from error + def load_df( self, dataset: str, @@ -1212,8 +1269,13 @@ def save_duckdb(df, db_path: str, *, table: str = "teadata_year"): # ------------------------------ -def load_config(path: str | Path) -> Config: - p = Path(path) +def load_config(path: str | Path | None = None) -> Config: + """Load an explicit source contract, defaulting to the packaged metadata. + + This never selects or fetches a data release. Source files need not exist + for schema/crosswalk discovery; rows are read only by load_df. + """ + p = Path(path) if path is not None else Path(__file__).with_name("teadata_sources.yaml") if not p.exists(): raise FileNotFoundError(p) raw = _detect_and_load(p) diff --git a/teadata/teadata_sources.yaml b/teadata/teadata_sources.yaml index 8b6372b..4b337bc 100644 --- a/teadata/teadata_sources.yaml +++ b/teadata/teadata_sources.yaml @@ -422,6 +422,7 @@ data_sources: provenance_ids: - e372be5cf18af4f445c6e39bdf14a1cb01a14052509ba5f33dd8b98892c1b6ee - 32986a342b0c30566defbbccc99e5e22c36a179c21f049431630e83c6680751c + - a4fd3db96bc747077ec46c3b6a3b90596606cbfa71aeaaf540cc82c29d2a0639 references: - reference_id: glossary role: glossary @@ -444,13 +445,13 @@ data_sources: reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 - reference_id: columns_default role: schema - path: schemas/data_sources--campus_tapr_student_staff_profile--2025--default.json - title: TEA Data campus_tapr_student_staff_profile 2025 default reader column - baseline; not a publisher dictionary + path: schemas/tapr--2025--header-crosswalk.json + title: TEA Data 2025 TAPR audited source-code, human-label and canonical-field + crosswalk; not a publisher dictionary or historical processing receipt status: available provenance_ids: - - 809d6a6f53f9d02b10919410385789a21cb2d8564d555c6427d9a71b0b3fbbc8 - reviewed_sha256: 24be6c5ea593c030744987b9ee9651d9f9cb1aaab593e6652d592eaccf1c46a5 + - bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f + reviewed_sha256: fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339 field_year: 2025 value_policy: tapr_profile metrics: @@ -474,7 +475,7 @@ data_sources: reader: dtype: str keep_default_na: false - column_schema: schemas/data_sources--campus_tapr_student_staff_profile--2025--default.json + column_schema: schemas/tapr--2025--header-crosswalk.json campus_tapr_historical_enrollment: 2015: path: data/tapr/CAMPPROF_2014-2015_FINAL.xlsx @@ -613,6 +614,7 @@ data_sources: provenance_ids: - 15f0551abeda2ffc4c4e6f26c2ab3a4d7092516cdffb383d363068a56cedec2d - 10cd059048171993c80e9b81fe42870f43b18e8bd5ae1fd8cc015b81a48db69d + - 819e8d1701c1e74b9419a62b9ae1b37fc9957eaadcc3ac936d49180bddac5ba6 references: - reference_id: glossary role: glossary @@ -635,13 +637,13 @@ data_sources: reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 - reference_id: columns_default role: schema - path: schemas/data_sources--district_tapr_student_staff_profile--2025--default.json - title: TEA Data district_tapr_student_staff_profile 2025 default reader - column baseline; not a publisher dictionary + path: schemas/tapr--2025--header-crosswalk.json + title: TEA Data 2025 TAPR audited source-code, human-label and canonical-field + crosswalk; not a publisher dictionary or historical processing receipt status: available provenance_ids: - - c9dc1305eabcb7e036ceac3f70aefdbb9b472794ef4ada70d2c8acdfb1d8dea6 - reviewed_sha256: 24942c016ba6559a67761248c35b3da56dde23daca0cb83a19f301ebecfb72a9 + - bbd46b5ce3dcfb521ae7b2156e9340accc45accf084e940fef3de3d30123a63f + reviewed_sha256: fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339 field_year: 2025 value_policy: tapr_profile metrics: @@ -665,7 +667,7 @@ data_sources: reader: dtype: str keep_default_na: false - column_schema: schemas/data_sources--district_tapr_student_staff_profile--2025--default.json + column_schema: schemas/tapr--2025--header-crosswalk.json campus_planned_closures: 2025: path: data/closures/Planned School Closures_10.03.2025.xlsx diff --git a/tests/test_column_schema.py b/tests/test_column_schema.py index 53cd8b0..90eca62 100644 --- a/tests/test_column_schema.py +++ b/tests/test_column_schema.py @@ -288,7 +288,7 @@ def test_every_packaged_version_and_declared_profile_has_an_offline_schema(monke path = config_path.parent / options["column_schema"] document = json.loads(path.read_bytes()) assert path.read_text() == canonical_json(document) + "\n" - assert set(document) == {"schema_version", "columns"} + assert document["schema_version"] in {1, 2} paths.add(path) count += 1 assert count > 0 diff --git a/tests/test_header_crosswalk.py b/tests/test_header_crosswalk.py new file mode 100644 index 0000000..48bc741 --- /dev/null +++ b/tests/test_header_crosswalk.py @@ -0,0 +1,335 @@ +from copy import deepcopy +from hashlib import sha256 +from importlib.resources import files +import json +from pathlib import Path +import subprocess +import sys + +import pytest + +from teadata.column_schema import ( + header_records, header_rename_map, parse_column_schema, schema_columns, + source_schema_fingerprint, validate_selected_crosswalk, +) +from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset +from teadata.manifest import BuildRecorder, ContractError, DatasetCatalog, canonical_json +from teadata.provenance import ProvenanceStore +from teadata.teadata_config import Config + + +ROOT = Path(__file__).resolve().parents[1] +RESOURCE = "schemas/tapr--2025--header-crosswalk.json" + + +def crosswalk_document(input_sha, *, dataset="sample", label="Example Value"): + labels, codes = ["9 Digit Campus Number", label], ["CAMPUS", "VALUE"] + return {"schema_version": 2, "mapping_version": 1, "datasets": [{ + "dataset": dataset, "edition": "2025", "prepared_input_sha256": input_sha, + "tables": [{"table": "student", "input_sha256": "1" * 64, + "source_schema_sha256": source_schema_fingerprint(labels, codes), + "fields": [{"position": i, "code": code, "label": human, "field": name} + for i, (code, human, name) in enumerate(zip(codes, labels, ["campus_number", "example_value"], strict=True), 1)]}], + }]} + + +def build_bound_catalog(tmp_path, *, edition="2025", profile=None): + source = tmp_path / "prepared.csv" + source.write_text("campus_number,example_value\n001902001,-3\n") + document = crosswalk_document(sha256(source.read_bytes()).hexdigest()) + document["datasets"][0]["edition"] = edition + schema = tmp_path / "schemas/crosswalk.json" + schema.parent.mkdir() + schema.write_text(canonical_json(document) + "\n") + digest = sha256(schema.read_bytes()).hexdigest() + store = ProvenanceStore(tmp_path / "provenance") + reference_id = store.record_acquisition(schema, ResolvedDataset( + "reference:columns", "reference", None, 2025, str(schema), DatasetMetadata(title="Test crosswalk"), + )) + raw = {"data_sources": {"sample": {2025: { + "path": str(source), "metadata": {"version": edition, "references": [{ + "reference_id": "columns", "role": "schema", "path": "schemas/crosswalk.json", + "title": "Test crosswalk", "status": "available", "reviewed_sha256": digest, + "provenance_ids": [reference_id], + }]}, "reader": {"column_schema": "schemas/crosswalk.json", "dtype": "str", "keep_default_na": False}, + }}}} + if profile is not None: + definition = raw["data_sources"]["sample"][2025] + definition["reader"] = {"profiles": {profile: definition["reader"]}} + cfg = Config.from_dict(raw) + cfg.base_dir = tmp_path + acquisition = store.record_acquisition(source, cfg.resolve_dataset("sample", 2025)) + raw["data_sources"]["sample"][2025]["metadata"]["provenance_ids"] = [acquisition] + cfg = Config.from_dict(raw) + cfg.base_dir = tmp_path + with BuildRecorder(cfg, store) as build: + cfg.load_df("sample", 2025, reader_profile=profile) + catalog = build.catalog() + return catalog, cfg, schema, source + + +@pytest.fixture +def bound_catalog(tmp_path): + return build_bound_catalog(tmp_path) + + +@pytest.mark.parametrize("edition", ["2025", "publisher-release-A"]) +@pytest.mark.parametrize("profile", [None, "named"]) +def test_catalog_binds_selected_reader_and_opaque_edition(tmp_path, edition, profile): + catalog, cfg, _, _ = build_bound_catalog(tmp_path, edition=edition, profile=profile) + assert cfg.column_schema("sample", 2025, reader_profile=profile) == ["campus_number", "example_value"] + source = catalog.datasets["sample"] + assert source["resolved_year"] == 2025 + assert source["reads"][0]["profile"] == profile + assert catalog.header_records("sample", edition=edition)[0]["edition"] == edition + assert DatasetCatalog(catalog.to_dict()).header_mapping("sample", table="student")["VALUE"] == "example_value" + + +def test_catalog_persists_exact_resource_and_returns_detached_records(bound_catalog): + catalog, cfg, schema, _ = bound_catalog + digest = sha256(schema.read_bytes()).hexdigest() + assert catalog.to_dict()["column_schemas"] == {digest: schema.read_text()} + assert catalog.datasets["sample"]["column_schema_sha256"] == digest + assert cfg.column_schema("sample", 2025) == ["campus_number", "example_value"] + records = catalog.header_records("sample", edition="2025", table="student") + assert records[0] == {"dataset": "sample", "edition": "2025", "table": "student", "mapping_version": 1, + "position": 1, "code": "CAMPUS", "label": "9 Digit Campus Number", "field": "campus_number", + "input_sha256": "1" * 64, "source_schema_sha256": source_schema_fingerprint( + ["9 Digit Campus Number", "Example Value"], ["CAMPUS", "VALUE"])} + records[0]["field"] = "changed" + assert catalog.header_mapping("sample", table="student") == {"CAMPUS": "campus_number", "VALUE": "example_value"} + + +def test_query_uses_only_catalog_bound_bytes_after_files_are_gone(bound_catalog, monkeypatch): + catalog, _, schema, source = bound_catalog + schema.unlink() + source.unlink() + monkeypatch.setattr(Path, "read_bytes", lambda *_: pytest.fail("Query read external resource")) + monkeypatch.setattr(Config, "column_contract", lambda *_args, **_kw: pytest.fail("Query read mutable config")) + loaded = DatasetCatalog(catalog.to_dict()) + assert loaded.header_mapping("sample", edition="2025", table="student", from_="field", to="code") == { + "campus_number": "CAMPUS", "example_value": "VALUE", + } + + +def test_selected_edition_and_unknown_table_are_explicit(bound_catalog): + catalog = bound_catalog[0] + with pytest.raises(ContractError, match="edition unavailable"): + catalog.header_records("sample", edition="2024") + with pytest.raises(ContractError, match="table unavailable"): + catalog.header_mapping("sample", table="staff") + + +def test_older_catalog_does_not_borrow_package_or_current_yaml(bound_catalog): + document = bound_catalog[0].to_dict() + document.pop("column_schemas") + document["datasets"]["sample"].pop("column_schema_sha256") + document["build_id"] = sha256(canonical_json({k: v for k, v in document.items() if k != "build_id"}).encode()).hexdigest() + catalog = DatasetCatalog(document) + with pytest.raises(ContractError, match="crosswalk unavailable"): + catalog.header_records("sample") + + +def test_rename_maps_detect_reverse_ambiguity_and_external_collisions(bound_catalog): + catalog = bound_catalog[0] + with pytest.raises(ContractError, match="external destination"): + catalog.header_mapping("sample", table="student", columns=["CAMPUS", "campus_number"]) + with pytest.raises(ContractError, match="duplicate"): + catalog.header_mapping("sample", table="student", columns=["CAMPUS", "CAMPUS"]) + assert catalog.header_mapping("sample", table="student", columns=["VALUE", "external"]) == { + "VALUE": "example_value", + } + document = crosswalk_document("0" * 64, label="9 Digit Campus Number") + records = header_records(parse_column_schema(canonical_json(document).encode()), dataset="sample", edition="2025", table="student") + with pytest.raises(ValueError, match="Ambiguous"): + header_rename_map(records, from_="label", to="field") + with pytest.raises(ValueError, match="Ambiguous"): + header_rename_map(records, from_="code", to="label") + + +def test_partial_rename_mapping_is_usable_by_pandas_polars_and_arrow(bound_catalog): + import pandas as pd + import pyarrow as pa + pl = pytest.importorskip("polars") + values = {"VALUE": ["-3"], "external": ["unchanged"]} + rename = bound_catalog[0].header_mapping("sample", table="student", columns=values.keys()) + assert list(pd.DataFrame(values).rename(columns=rename).columns) == ["example_value", "external"] + assert pl.DataFrame(values).rename(rename).columns == ["example_value", "external"] + table = pa.table(values) + renamed = table.rename_columns([rename.get(name, name) for name in table.column_names]) + assert renamed.column_names == ["example_value", "external"] + assert renamed.column("example_value").to_pylist() == ["-3"] + + +@pytest.mark.parametrize("change", ["position", "empty_code", "duplicate_code", "field_collision", "schema_hash", "dataset_edition"]) +def test_resource_rejects_ambiguous_or_misbound_mapping_records(change): + original = crosswalk_document("0" * 64) + document = deepcopy(original) + table = document["datasets"][0]["tables"][0] + if change == "position": + table["fields"][1]["position"] = 1 + elif change == "empty_code": + table["fields"][1]["code"] = "" + elif change == "duplicate_code": + table["fields"][1]["code"] = " CAMPUS " + elif change == "field_collision": + table["fields"][1]["field"] = "campus_number" + elif change == "schema_hash": + table["fields"][1]["label"] = "Changed publisher label" + else: + document["datasets"].append(deepcopy(document["datasets"][0])) + with pytest.raises(ValueError): + parse_column_schema(canonical_json(document).encode()) + assert original["datasets"][0]["tables"][0]["fields"][1]["code"] == "VALUE" + + +@pytest.mark.parametrize("change", ["checksum", "reference", "columns", "input", "edition", "profile", "profile_schema"]) +def test_embedded_crosswalk_is_bound_to_source_and_schema(bound_catalog, change): + document = bound_catalog[0].to_dict() + source = document["datasets"]["sample"] + if change == "checksum": + key = source["column_schema_sha256"] + document["column_schemas"][key] += " " + elif change == "reference": + source["column_schema_sha256"] = "0" * 64 + elif change == "columns": + source["reads"][0]["columns"].reverse() + elif change == "edition": + source["resolved_year"] = 2024 + elif change == "profile": + source["reads"][0]["profile"] = "undeclared" + elif change == "profile_schema": + source["reader"]["profiles"] = {"other": {"column_schema": "schemas/unreviewed.json"}} + source["reads"][0]["profile"] = "other" + else: + digest = source["column_schema_sha256"] + mapping = json.loads(document["column_schemas"][digest]) + mapping["datasets"][0]["prepared_input_sha256"] = "0" * 64 + with pytest.raises(ValueError, match="different prepared input"): + validate_selected_crosswalk(mapping, dataset="sample", edition="2025", + input_sha256=source["artifact"]["sha256"], columns=source["reads"][0]["columns"]) + return + document["build_id"] = sha256(canonical_json({k: v for k, v in document.items() if k != "build_id"}).encode()).hexdigest() + with pytest.raises(ContractError, match="(?i)(crosswalk|schema)"): + DatasetCatalog(document) + + +def test_packaged_crosswalk_preserves_qualified_publisher_headers_and_current_fields(): + data = files("teadata").joinpath(RESOURCE).read_bytes() + assert sha256(data).hexdigest() == "fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339" + document = parse_column_schema(data) + campus = header_records(document, dataset="campus_tapr_student_staff_profile", edition="2025", table="student") + assert campus[0]["code"] == "CAMPUS" and campus[0]["label"] == "9 Digit Campus Number" + assert campus[0]["field"] == "campus_number" and campus[0]["position"] == 1 + assert campus[0]["input_sha256"] == "7e0e762a8f2ba50687fd8c6a59e8052d5740ba57abbedecddfca064bbd77548e" + assert next(r for r in campus if r["code"] == "CPNTALLC")["field"] == "campus_2025_student_enrollment_all_students_count" + for dataset, size, legacy_schema_sha in ( + ("campus_tapr_student_staff_profile", 330, "24be6c5ea593c030744987b9ee9651d9f9cb1aaab593e6652d592eaccf1c46a5"), + ("district_tapr_student_staff_profile", 341, "24942c016ba6559a67761248c35b3da56dde23daca0cb83a19f301ebecfb72a9"), + ): + columns = schema_columns(document, dataset=dataset, edition="2025") + assert len(columns) == size + # Exact previously reviewed names/order, without maintaining a second list. + assert sha256((canonical_json({"schema_version": 1, "columns": columns}) + "\n").encode()).hexdigest() == legacy_schema_sha + with pytest.raises(ValueError, match="unavailable"): + header_records(document, dataset="campus_tapr_student_staff_profile", edition="2024") + + +def test_current_published_catalog_does_not_infer_new_package_crosswalk(): + from teadata.release import DataRelease + catalog = DataRelease(ROOT / "teadata/.cache/release.json").catalog + with pytest.raises(ContractError, match="crosswalk unavailable"): + catalog.header_records("campus_tapr_student_staff_profile", edition="2025") + + +def test_explicit_packaged_source_contract_is_usable_without_a_data_release(monkeypatch): + from teadata import load_config + monkeypatch.delenv("TEADATA_RELEASE", raising=False) + monkeypatch.delenv("TEADATA_RELEASE_URL", raising=False) + cfg = load_config() + campus = cfg.header_records("campus_tapr_student_staff_profile", edition="2025") + district = cfg.header_records("district_tapr_student_staff_profile", edition="2025") + assert len(campus) == 334 and len(district) == 343 + assert len({r["field"] for r in campus}) == 330 and len({r["field"] for r in district}) == 341 + assert cfg.header_mapping("district_tapr_student_staff_profile", edition="2025", table="student")["DISTRICT"] == "district_number" + with pytest.raises(ContractError, match="unavailable"): + cfg.header_records("campus_tapr_student_staff_profile", edition="2026") + with pytest.raises(ContractError, match="unavailable"): + cfg.header_records("campus_tapr_student_staff_profile", edition="2024") + with pytest.raises(ContractError, match="external destination"): + cfg.header_mapping("campus_tapr_student_staff_profile", edition="2025", table="student", columns=["CAMPUS", "campus_number"]) + + +def test_packaged_source_contract_import_and_discovery_open_metadata_only(): + code = ''' +import builtins, importlib.abc, os, pathlib, socket, sqlite3, sys, urllib.request +heavy = ('teadata.classes', 'teadata.engine', 'teadata.entities', 'teadata.geometry', 'pyarrow', 'duckdb', 'sqlalchemy', 'pandas', 'numpy', 'geopandas', 'shapely') +class Trap(importlib.abc.MetaPathFinder): + def find_spec(self, fullname, path=None, target=None): + if any(fullname == p or fullname.startswith(p + '.') for p in heavy): raise AssertionError('Heavy import: ' + fullname) +sys.meta_path.insert(0, Trap()) +from teadata import load_config, DatasetCatalog +import teadata.teadata_config as config_module +root = pathlib.Path(config_module.__file__).parent +allowed = {(root / 'teadata_sources.yaml').resolve(), (root / 'schemas/tapr--2025--header-crosswalk.json').resolve()} +original = pathlib.Path.open +def guarded(self, *args, **kwargs): + if self.resolve() not in allowed: raise AssertionError('Non-metadata open: ' + str(self)) + return original(self, *args, **kwargs) +pathlib.Path.open = guarded +def forbidden(*args, **kwargs): raise AssertionError('Data/network/database I/O') +socket.create_connection = forbidden +sqlite3.connect = forbidden +urllib.request.urlopen = forbidden +os.environ.pop('TEADATA_RELEASE', None) +os.environ.pop('TEADATA_RELEASE_URL', None) +os.environ.pop('TEADATA_DATA_DIR', None) +cfg = load_config() +campus = cfg.header_records('campus_tapr_student_staff_profile', edition='2025') +district = cfg.header_records('district_tapr_student_staff_profile', edition='2025') +assert len(campus) + len(district) == 677 +assert len({r['field'] for r in campus}) == 330 +assert len({r['field'] for r in district}) == 341 +assert cfg.header_mapping('campus_tapr_student_staff_profile', edition='2025', table='student')['CAMPUS'] == 'campus_number' +assert not any(n == p or n.startswith(p + '.') for n in sys.modules for p in heavy) +''' + result = subprocess.run([sys.executable, "-B", "-c", code], cwd=ROOT, capture_output=True, text=True) + assert result.returncode == 0, result.stdout + result.stderr + + +def test_metadata_public_import_and_discovery_do_not_load_heavy_modules(bound_catalog, tmp_path): + catalog_path = tmp_path / "catalog.json" + catalog_path.write_text(canonical_json(bound_catalog[0].to_dict())) + code = ''' +import builtins, importlib.abc, json, pathlib, socket, sqlite3, sys, urllib.request +heavy = ('teadata.classes', 'teadata.engine', 'teadata.entities', 'teadata.geometry', 'pyarrow', 'duckdb', 'sqlalchemy', 'pandas', 'numpy', 'geopandas', 'shapely') +class Trap(importlib.abc.MetaPathFinder): + def find_spec(self, fullname, path=None, target=None): + if any(fullname == p or fullname.startswith(p + '.') for p in heavy): raise AssertionError('Heavy import: ' + fullname) +sys.meta_path.insert(0, Trap()) +from teadata import DatasetCatalog, DataPeriod +import teadata +document = json.loads(pathlib.Path(sys.argv[1]).read_text()) +def forbidden(*args, **kwargs): raise AssertionError('Query performed I/O') +builtins.open = forbidden +pathlib.Path.open = forbidden +pathlib.Path.read_bytes = forbidden +pathlib.Path.read_text = forbidden +socket.create_connection = forbidden +sqlite3.connect = forbidden +urllib.request.urlopen = forbidden +catalog = DatasetCatalog(document) +assert catalog.header_mapping('sample', table='student')['CAMPUS'] == 'campus_number' +assert catalog.header_records('sample')[0]['edition'] == '2025' +assert 'DataEngine' in dir(teadata) +assert not any(n == p or n.startswith(p + '.') for n in sys.modules for p in heavy) +''' + result = subprocess.run([sys.executable, "-B", "-c", code, str(catalog_path)], cwd=ROOT, capture_output=True, text=True) + assert result.returncode == 0, result.stdout + result.stderr + + +def test_lazy_heavy_exports_preserve_existing_snapshot_class_paths(): + from teadata import DataEngine, Campus, District + from teadata import classes + assert DataEngine is classes.DataEngine and Campus is classes.Campus and District is classes.District + assert all(cls.__module__ == "teadata.classes" for cls in (DataEngine, Campus, District)) diff --git a/tests/test_script_paths.py b/tests/test_script_paths.py index a37f5e9..fe81036 100644 --- a/tests/test_script_paths.py +++ b/tests/test_script_paths.py @@ -204,8 +204,10 @@ async def results(addresses): assert result.loc[0, "Best Lat"] == 30.0 -def test_tapr_builder_accepts_external_input_and_output_dirs(tmp_path): - from teadata.scripts.build_tapr_2025_profiles import main +def test_tapr_builder_accepts_external_input_and_output_dirs(tmp_path, monkeypatch): + from hashlib import sha256 + from teadata.column_schema import source_schema_fingerprint + from teadata.scripts import build_tapr_2025_profiles as script raw = tmp_path / "raw" raw.mkdir() @@ -214,11 +216,25 @@ def test_tapr_builder_accepts_external_input_and_output_dirs(tmp_path): ("District", "000456", "6 Digit County District Number"), ]: for group in ("Student", "Staff"): + code = "CAMPUS" if kind == "Campus" else "DISTRICT" (raw / f"2025 {kind} {group} Information.csv").write_text( - f"{label},Example Value\nNUMBER,VALUE\n{number},42\n" + f"{label},Example Value\n{code},VALUE\n{number},42\n" ) + def mappings(_cfg, dataset): + campus = dataset.startswith("campus_") + kind = "Campus" if campus else "District" + labels = ["9 Digit Campus Number" if campus else "6 Digit County District Number", "Example Value"] + codes = ["CAMPUS" if campus else "DISTRICT", "VALUE"] + fields = ["campus_number" if campus else "district_number", "example_value"] + return {group.lower(): {"table": group.lower(), + "input_sha256": sha256((raw / f"2025 {kind} {group} Information.csv").read_bytes()).hexdigest(), + "source_schema_sha256": source_schema_fingerprint(labels, codes), + "fields": [{"position": i, "code": code, "label": label, "field": field} + for i, (code, label, field) in enumerate(zip(codes, labels, fields, strict=True), 1)]} + for group in ("Student", "Staff")} + monkeypatch.setattr(script, "_header_tables", mappings) output_dir = tmp_path / "output" - main(["--input-dir", str(raw), "--output-dir", str(output_dir)]) + script.main(["--input-dir", str(raw), "--output-dir", str(output_dir)]) campus = pd.read_excel(output_dir / "CAMPPROF_2024-2025_FINAL.xlsx") district = pd.read_excel(output_dir / "DISTPROF_2024-2025_FINAL.xlsx") diff --git a/tests/test_tapr_profile_reader.py b/tests/test_tapr_profile_reader.py new file mode 100644 index 0000000..f47d65e --- /dev/null +++ b/tests/test_tapr_profile_reader.py @@ -0,0 +1,224 @@ +import csv +from hashlib import sha256 + +import pytest + +from teadata.scripts import build_tapr_2025_profiles as script +from teadata.column_schema import source_schema_fingerprint + + +LABELS = ["9 Digit Campus Number", "Example Value"] +CODES = ["CAMPUS", "VALUE"] + + +def write_source(tmp_path, records): + path = tmp_path / "source.csv" + with path.open("w", newline="", encoding="utf-8") as stream: + csv.writer(stream).writerows(records) + return path + + +def mapping_for(path, *, labels=LABELS, codes=CODES, fields=("campus_number", "example_value")): + return {"table": "student", "input_sha256": sha256(path.read_bytes()).hexdigest(), + "source_schema_sha256": source_schema_fingerprint(labels, codes), + "fields": [{"position": i, "code": code, "label": label, "field": field} + for i, (code, label, field) in enumerate(zip(codes, labels, fields, strict=True), 1)]} + + +def read_source(path, *, mapping=None): + return script._read_tapr_csv(path, mapping=mapping_for(path) if mapping is None else mapping, key_field="campus_number") + + +@pytest.mark.parametrize("token", ["-1", "-3", "-2", ".", "•", "n/a", "0", "0.0", "9007199254740993", ""]) +def test_reader_preserves_source_tokens_without_interpreting_masking(tmp_path, token): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", token]]) + before = path.read_bytes() + headers, rows, elements = read_source(path) + assert headers == ["campus_number", "example_value"] + assert rows == {"001902001": {"campus_number": "001902001", "example_value": token}} + assert elements == [ + {"code": "CAMPUS", "label": LABELS[0], "sanitized_label": "campus_number"}, + {"code": "VALUE", "label": LABELS[1], "sanitized_label": "example_value"}, + ] + assert path.read_bytes() == before + + +def test_metadata_retains_exact_human_labels_and_codes(tmp_path): + labels = [LABELS[0], " Campus 2025: Example (Value) "] + codes = ["CAMPUS", " VALUE "] + path = write_source(tmp_path, [labels, codes, ["001902001", " -3 "]]) + headers, rows, elements = read_source(path, mapping=mapping_for(path, labels=labels, codes=codes, + fields=("campus_number", "campus_2025_example_value"))) + assert headers == ["campus_number", "campus_2025_example_value"] + assert elements[1] == {"code": " VALUE ", "label": labels[1], "sanitized_label": headers[1]} + assert rows["001902001"][headers[1]] == "-3" # Existing body whitespace behavior. + + +@pytest.mark.parametrize("override", ["CamelCase", "naïve", "2025_name", "class", ""]) +def test_explicit_header_overrides_must_be_python_safe_ascii_snake_case(tmp_path, override): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) + with pytest.raises(ValueError, match="(?i)invalid canonical header.*ASCII snake_case"): + read_source(path, mapping=mapping_for(path, fields=("campus_number", override))) + + +def test_explicit_header_override_collision_names_the_column(tmp_path): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) + with pytest.raises(ValueError, match="(?i)canonical header collision in column 2: 'campus_number'"): + read_source(path, mapping=mapping_for(path, fields=("campus_number", "campus_number"))) + + +@pytest.mark.parametrize("records, message", [ + ([], "header records"), + ([LABELS], "header records"), + ([LABELS, ["CAMPUS"]], "header width mismatch"), + ([LABELS, CODES + ["EXTRA"]], "header width mismatch"), + ([LABELS, ["001902001", "42"], ["001902041", "99"]], "expected source-code header 'CAMPUS'"), + ([LABELS, ["CAMPUS", ""]], "headers differ"), + ([LABELS, ["CAMPUS", "CAMPUS"]], "headers differ"), + ([[LABELS[0], "Class"], CODES], "headers differ"), + ([[LABELS[0], "2025 Value"], CODES], "headers differ"), + ([[LABELS[0], "???"], CODES], "headers differ"), + ([[LABELS[0], "Example-Value", "Example Value"], ["CAMPUS", "A", "B"]], "headers differ"), + ([["Not The Campus Key", "Example"], CODES], "headers differ"), + ([LABELS, CODES], "no TAPR data records"), +]) +def test_ambiguous_or_incomplete_headers_fail_closed(tmp_path, records, message): + path = write_source(tmp_path, records) + with pytest.raises(ValueError, match=message) as error: + read_source(path) + assert str(path) in str(error.value) + + +@pytest.mark.parametrize("codes", [["CAMPUS", ""], ["CAMPUS", " CAMPUS "]]) +def test_crosswalk_rejects_empty_or_duplicate_source_codes(tmp_path, codes): + path = write_source(tmp_path, [LABELS, codes, ["001902001", "42"]]) + with pytest.raises(ValueError, match="(?i)(invalid header crosswalk column|duplicate source code)"): + read_source(path, mapping=mapping_for(path, codes=codes)) + + +def test_reader_rejects_input_bytes_outside_the_reviewed_edition(tmp_path): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) + mapping = mapping_for(path) + path.write_text(path.read_text().replace("42", "99")) + with pytest.raises(ValueError, match="input differs"): + read_source(path, mapping=mapping) + + +@pytest.mark.parametrize("row", [["001902001"], ["001902001", "42", "EXTRA"], []]) +def test_reader_rejects_bad_width_instead_of_padding_truncating_or_skipping(tmp_path, row): + path = write_source(tmp_path, [LABELS, CODES, row]) + with pytest.raises(ValueError, match=r"record 3 has .* fields; expected 2"): + read_source(path) + + +@pytest.mark.parametrize("key", ["", "000000000", "-1", "True", "001902001.5", "1001902001", "1e3", "999999999", "Notes: suppression applies"]) +def test_invalid_identifiers_and_footer_text_are_not_data(tmp_path, key): + path = write_source(tmp_path, [LABELS, CODES, [key, "42"]]) + with pytest.raises(ValueError, match="record 3 has invalid campus_number"): + read_source(path) + + +@pytest.mark.parametrize("later", ["001902001", "1902001", "'001902001"]) +def test_duplicate_entity_identity_is_never_overwritten(tmp_path, later): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"], [later, "99"]]) + with pytest.raises(ValueError, match="duplicate campus_number at records 3 and 4"): + read_source(path) + + +def test_campus_district_claim_is_checked_when_present(tmp_path): + labels, codes = [LABELS[0], "6 Digit County District Number"], ["CAMPUS", "DISTRICT"] + path = write_source(tmp_path, [ + labels, codes, + ["001902001", "227901"], + ]) + with pytest.raises(ValueError, match="campus and district identifiers disagree"): + read_source(path, mapping=mapping_for(path, labels=labels, codes=codes, + fields=("campus_number", "district_number"))) + + +def test_district_reader_uses_six_digit_identity_and_preserves_metadata(tmp_path): + labels, codes = ["6 Digit County District Number", "District Name"], ["DISTRICT", "DISTNAME"] + path = write_source(tmp_path, [ + labels, codes, + ["001902", "CAYUGA ISD"], + ]) + headers, rows, elements = script._read_tapr_csv(path, mapping=mapping_for(path, labels=labels, codes=codes, + fields=("district_number", "district_name")), key_field="district_number") + assert headers == ["district_number", "district_name"] + assert rows["001902"]["district_name"] == "CAYUGA ISD" + assert elements[0]["code"] == "DISTRICT" + + +def test_district_reader_refuses_a_data_record_as_the_code_header(tmp_path): + path = write_source(tmp_path, [ + ["6 Digit County District Number", "District Name"], + ["001902", "CAYUGA ISD"], ["001903", "FRANKSTON ISD"], + ]) + with pytest.raises(ValueError, match="expected source-code header 'DISTRICT'"): + script._read_tapr_csv(path, mapping=mapping_for(path, + labels=["6 Digit County District Number", "District Name"], codes=["DISTRICT", "DISTNAME"], + fields=("district_number", "district_name")), key_field="district_number") + + +def test_csv_quoting_error_is_not_silently_accepted(tmp_path): + path = tmp_path / "source.csv" + path.write_text('9 Digit Campus Number,Example Value\nCAMPUS,VALUE\n001902001,"unfinished\n') + with pytest.raises(ValueError, match="invalid CSV near physical line"): + read_source(path) + + +def merge(primary, secondary): + return script._merge_tables( + list(next(iter(primary.values()))), primary, + list(next(iter(secondary.values()))), secondary, + key_field="campus_number", preferred_cols=("campus_number", "campus_name"), + ) + + +def test_merge_rejects_conflicting_shared_values_without_masking_assumptions(): + primary = {"001902001": {"campus_number": "001902001", "example": "."}} + secondary = {"001902001": {"campus_number": "001902001", "example": "42"}} + with pytest.raises(ValueError, match="Conflicting TAPR values.*example"): + merge(primary, secondary) + assert primary["001902001"]["example"] == "." + + +def test_merge_preserves_blank_fill_behavior_order_and_nonconflicting_tokens(): + primary = {"001902001": {"campus_number": "001902001", "empty": "", "student": "-1"}} + secondary = {"001902001": {"campus_number": "001902001", "empty": "filled", "staff": "-3"}} + headers, records = merge(primary, secondary) + assert headers == ["campus_number", "empty", "student", "staff"] + assert records == [{"campus_number": "001902001", "empty": "filled", "student": "-1", "staff": "-3"}] + + +def test_merge_retains_one_sided_entities_without_claiming_complete_coverage(): + primary = {"001902001": {"campus_number": "001902001", "student": "-1"}} + secondary = {"001902041": {"campus_number": "001902041", "staff": "-3"}} + headers, records = merge(primary, secondary) + assert headers == ["campus_number", "student", "staff"] + assert records == [primary["001902001"], secondary["001902041"]] + assert script._rows_for_headers(headers, records) == [["001902001", "-1", ""], ["001902041", "", "-3"]] + + +def test_merge_refuses_two_spellings_of_the_same_source_identity(): + primary = {"001902001": {"campus_number": "001902001"}} + secondary = {"1902001": {"campus_number": "1902001"}} + with pytest.raises(ValueError, match="Inconsistent TAPR campus_number representations"): + merge(primary, secondary) + + +def test_bad_input_prevents_cli_from_invoking_a_writer(tmp_path, monkeypatch): + raw = tmp_path / "raw" + raw.mkdir() + (raw / "2025 Campus Student Information.csv").write_text( + "9 Digit Campus Number,Example Value\nCAMPUS,VALUE\n001902001,42,EXTRA\n" + ) + def forbidden(*args, **kwargs): + raise AssertionError("Writer must not run for invalid input") + monkeypatch.setattr(script, "_write_workbook", forbidden) + monkeypatch.setattr(script, "load_config", lambda *_: object()) + mapping = mapping_for(raw / "2025 Campus Student Information.csv") + monkeypatch.setattr(script, "_header_tables", lambda *_: {"student": mapping, "staff": mapping}) + with pytest.raises(ValueError, match="record 3 has 3 fields"): + script.main(["--input-dir", str(raw), "--output-dir", str(tmp_path / "output")]) + assert not (tmp_path / "output").exists() From 3e3c5d0d8c28b508c93be73280396b3897eda886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 09:04:38 -0500 Subject: [PATCH 02/11] Preserve deterministic reader lifetimes in the TAPR migration --- AGENTS.md | 1 + teadata/boundary_store.py | 3 +- teadata/map_store.py | 7 +- tests/test_store_connection_lifetimes.py | 139 +++++++++++++++++++++++ 4 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 tests/test_store_connection_lifetimes.py diff --git a/AGENTS.md b/AGENTS.md index 32a422d..fde7db7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,6 +7,7 @@ - Tests reside in `tests/` (e.g., `tests/test_snapshot_loading.py`), and example notebooks/scripts are in `examples/`. Packaging artifacts land in `build/` and `teadata.egg-info/`. ## Build, Test, and Development Commands +- Code-only clones and worktrees must set `GIT_LFS_SKIP_SMUDGE=1` during checkout. Hydrate only explicitly selected retained-release artifacts when an artifact check requires them. - Install for iterative work: `uv sync --all-extras` (this handles dev, database, and notebook extras automatically). - Always run Python commands through `uv run` and manage packages with `uv`; avoid bare `python` or `pip` to keep environments consistent. - `.python-version` is the default development and `scripts/check` interpreter authority; `TEADATA_CHECK_PYTHON` selects a compatibility-check override. diff --git a/teadata/boundary_store.py b/teadata/boundary_store.py index 815274a..3fea89e 100644 --- a/teadata/boundary_store.py +++ b/teadata/boundary_store.py @@ -1,5 +1,6 @@ from __future__ import annotations +from contextlib import closing import logging import sqlite3 from collections import OrderedDict @@ -61,7 +62,7 @@ def load_boundary( if not path: return None try: - with sqlite3.connect(path) as conn: + with closing(sqlite3.connect(path)) as conn: for key in _district_lookup_keys(district_number): row = conn.execute( "SELECT wkb FROM boundaries WHERE district_number = ?", diff --git a/teadata/map_store.py b/teadata/map_store.py index 83e3948..1766447 100644 --- a/teadata/map_store.py +++ b/teadata/map_store.py @@ -1,3 +1,4 @@ +from contextlib import closing import gzip import json import logging @@ -23,7 +24,7 @@ def map_store_path_for_snapshot(snapshot_path: Path) -> Path: def discover_map_store(explicit: str | Path | None = None) -> Path: path = Path(explicit) if explicit is not None else current_release().artifact("maps") read_sqlite_catalog(path) - with sqlite3.connect(path.resolve().as_uri() + "?mode=ro", uri=True) as connection: + with closing(sqlite3.connect(path.resolve().as_uri() + "?mode=ro", uri=True)) as connection: columns = {row[1] for row in connection.execute("PRAGMA table_info(campus_profile)")} if "lookup_key" not in columns: raise ContractError("Legacy map campus identity schema requires a source-bound rebuild") @@ -83,7 +84,7 @@ def load_map_payload_parts( return None, None try: - with sqlite3.connect(path) as conn: + with closing(sqlite3.connect(path)) as conn: for key in _district_lookup_keys(district_number): row = conn.execute( "SELECT payload_base, payload_transfers FROM closures_map WHERE district_number = ?", @@ -112,7 +113,7 @@ def load_campus_profile_payload( return None path = discover_map_store(store_path) try: - with sqlite3.connect(path) as conn: + with closing(sqlite3.connect(path)) as conn: row = conn.execute("SELECT payload FROM campus_profile WHERE lookup_key = ?", (key,)).fetchone() return _decode_payload(row[0]) if row else None except sqlite3.OperationalError as error: diff --git a/tests/test_store_connection_lifetimes.py b/tests/test_store_connection_lifetimes.py new file mode 100644 index 0000000..8407883 --- /dev/null +++ b/tests/test_store_connection_lifetimes.py @@ -0,0 +1,139 @@ +"""Owned SQLite readers close even when callers retain their connections.""" + +from contextlib import closing +import sqlite3 + +import pytest +from shapely.geometry import Point + +from teadata import boundary_store, map_store +from teadata.manifest import ContractError, write_sqlite_catalog + + +@pytest.fixture +def stores(tmp_path, catalog): + maps = tmp_path / "maps.sqlite" + boundaries = tmp_path / "boundaries.sqlite" + for path in (maps, boundaries): + with closing(sqlite3.connect(path)) as connection: + write_sqlite_catalog(connection, catalog) + if path == maps: + connection.execute("CREATE TABLE campus_profile(lookup_key TEXT,payload BLOB)") + connection.execute("CREATE TABLE closures_map(district_number TEXT,payload_base BLOB,payload_transfers BLOB)") + connection.execute("INSERT INTO campus_profile VALUES (?,?)", ("123456789", '{"campus":true}')) + connection.execute("INSERT INTO closures_map VALUES (?,?,?)", ("123456", '{"district":true}', '{"transfers":true}')) + else: + connection.execute("CREATE TABLE boundaries(district_number TEXT,wkb BLOB)") + connection.execute("INSERT INTO boundaries VALUES (?,?)", ("123456", Point(0, 0).wkb)) + connection.commit() + return maps, boundaries + + +@pytest.fixture +def connections(monkeypatch): + connect = sqlite3.connect + retained = [] + + def tracked(*args, **kwargs): + connection = connect(*args, **kwargs) + retained.append(connection) + return connection + + monkeypatch.setattr(sqlite3, "connect", tracked) + try: + yield retained + finally: + # Keep regressions hygienic even when an assertion discovers an open reader. + for connection in retained: + connection.close() + + +def assert_closed(connections): + assert connections + for connection in connections: + with pytest.raises(sqlite3.ProgrammingError, match="closed"): + connection.execute("SELECT 1") + + +@pytest.mark.parametrize("reader", ["campus", "district", "boundary"]) +@pytest.mark.parametrize("found", [True, False]) +def test_payload_readers_close_owned_connections_on_hit_and_miss(stores, connections, reader, found): + maps, boundaries = stores + if reader == "campus": + result = map_store.load_campus_profile_payload("123456789" if found else "987654321", store_path=maps) + assert result == ({"campus": True} if found else None) + elif reader == "district": + result = map_store.load_map_payload_parts("123456" if found else "987654", store_path=maps) + assert result == (({"district": True}, {"transfers": True}) if found else (None, None)) + else: + result = boundary_store.load_boundary("123456" if found else "987654", store_path=boundaries) + assert result.equals(Point(0, 0)) if found else result is None + assert_closed(connections) + + +@pytest.mark.parametrize("reader", ["campus", "district", "boundary"]) +def test_payload_decode_errors_preserve_policy_and_close_owned_connections(stores, connections, reader): + maps, boundaries = stores + with closing(sqlite3.connect(boundaries if reader == "boundary" else maps)) as connection: + if reader == "campus": + connection.execute("UPDATE campus_profile SET payload='invalid json'") + elif reader == "district": + connection.execute("UPDATE closures_map SET payload_base='invalid json'") + else: + connection.execute("UPDATE boundaries SET wkb=x'00'") + connection.commit() + if reader == "campus": + with pytest.raises(ValueError): + map_store.load_campus_profile_payload("123456789", store_path=maps) + elif reader == "district": + assert map_store.load_map_payload_parts("123456", store_path=maps) == (None, None) + else: + assert boundary_store.load_boundary("123456", store_path=boundaries) is None + assert_closed(connections) + + +@pytest.mark.parametrize("failure", ["schema", "sqlite"]) +def test_map_discovery_failure_closes_owned_connections(stores, connections, failure, monkeypatch): + maps, _ = stores + with closing(sqlite3.connect(maps)) as connection: + connection.execute("DROP TABLE campus_profile") + if failure == "schema": + connection.execute("CREATE TABLE campus_profile(campus_number TEXT,payload BLOB)") + connection.commit() + class BrokenProbe(sqlite3.Connection): + def execute(self, sql, *args, **kwargs): + if sql == "PRAGMA table_info(campus_profile)": + raise sqlite3.OperationalError("fixture schema query failed") + return super().execute(sql, *args, **kwargs) + + if failure == "schema": + with pytest.raises(ContractError, match="rebuild"): + map_store.discover_map_store(maps) + else: + tracked = sqlite3.connect + monkeypatch.setattr(sqlite3, "connect", lambda *args, **kwargs: tracked(*args, **kwargs, factory=BrokenProbe)) + with pytest.raises(sqlite3.OperationalError, match="fixture schema query"): + map_store.discover_map_store(maps) + assert_closed(connections) + + +@pytest.mark.parametrize("reader", ["campus", "district", "boundary"]) +def test_payload_sqlite_errors_preserve_policy_and_close_owned_connections(stores, connections, monkeypatch, reader): + maps, boundaries = stores + + class BrokenRead(sqlite3.Connection): + def execute(self, sql, *args, **kwargs): + if sql.startswith(("SELECT payload", "SELECT wkb")): + raise sqlite3.OperationalError("fixture payload query failed") + return super().execute(sql, *args, **kwargs) + + tracked = sqlite3.connect + monkeypatch.setattr(sqlite3, "connect", lambda *args, **kwargs: tracked(*args, **kwargs, factory=BrokenRead)) + if reader == "campus": + with pytest.raises(ContractError, match="rebuild"): + map_store.load_campus_profile_payload("123456789", store_path=maps) + elif reader == "district": + assert map_store.load_map_payload_parts("123456", store_path=maps) == (None, None) + else: + assert boundary_store.load_boundary("123456", store_path=boundaries) is None + assert_closed(connections) From a1c2e59313460364c69ee92b776080bfa407a9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 10:57:44 -0500 Subject: [PATCH 03/11] Prepare complete TAPR profiles with portable provenance --- docs/config.md | 50 +- teadata/column_schema.py | 63 ++- teadata/identifiers.py | 38 ++ teadata/manifest.py | 7 +- teadata/provenance.py | 59 ++- .../schemas/tapr--2024--header-crosswalk.json | 1 + teadata/scripts/build_tapr_2025_profiles.py | 475 ------------------ teadata/scripts/build_tapr_profiles.py | 163 ++++++ .../scripts/rename_tapr_district_headers.py | 234 --------- teadata/tapr.py | 241 +++++++++ teadata/teadata_config.py | 114 ++++- teadata/teadata_sources.yaml | 90 ++++ tests/test_column_schema.py | 65 ++- tests/test_provenance.py | 65 +++ tests/test_script_paths.py | 101 ++-- tests/test_tapr_profile_reader.py | 358 +++++++------ 16 files changed, 1200 insertions(+), 924 deletions(-) create mode 100644 teadata/schemas/tapr--2024--header-crosswalk.json delete mode 100644 teadata/scripts/build_tapr_2025_profiles.py create mode 100644 teadata/scripts/build_tapr_profiles.py delete mode 100644 teadata/scripts/rename_tapr_district_headers.py create mode 100644 teadata/tapr.py diff --git a/docs/config.md b/docs/config.md index b06af0c..9e1da76 100644 --- a/docs/config.md +++ b/docs/config.md @@ -266,7 +266,8 @@ Set `TEADATA_DATA_DIR` to point the scripts at an existing source-data tree: ```bash export TEADATA_DATA_DIR="$HOME/datasets/teadata" uv run python -m teadata.scripts.rename_tepsac_headers -uv run python -m teadata.scripts.build_tapr_2025_profiles +uv run python -m teadata.scripts.build_tapr_profiles \ + --edition 2024 --reference-store provenance --output-dir prepared/tapr-2024 ``` The variable names the directory containing `tapr/`, `shapes/`, `tepsac/`, and @@ -290,10 +291,53 @@ uv run python -m teadata.scripts.geocode_tepsac_data \ --input raw/schools.xlsx --output output/geocoded.csv uv run python -m teadata.scripts.flatten_districts_geojson \ --input districts.geojson --output districts_flat.geojson -uv run python -m teadata.scripts.build_tapr_2025_profiles \ - --input-dir raw/ --output-dir output/ +uv run python -m teadata.scripts.build_tapr_profiles \ + --edition 2025 --input-dir raw/ --reference-store provenance --output-dir prepared/tapr-2025 ``` +The TAPR command prepares every declared publisher column for both scopes into +a **new** directory, validating all inputs before staging any output. Its +Parquet files retain raw strings, source crosswalks, annotation records and +immutable acquisition/processing receipts. Existing directories and retained +reference workbooks are never replaced. These outputs are source preparations, +not an activated release or typed scientific measurements. The old year-specific +builder and the 75-column district renamer are retired; 2024 and 2025 use this +same explicit preparation path. + +`--reference-store` supplies the canonical acquisition receipts and exact bytes +for established reference links. The producer retains only their selected +immutable closure, preserving record IDs and observation dates. A missing +claimed receipt or artifact fails preparation. Newly observed crosswalks bind +their own receipts; unreviewed link-only documents remain explicitly not +acquired. Portable raw-source locators remain unchanged in public reader +metadata and resolve against the configured data directory only when selected. + +Coverage refers to the declared inputs: 2024 `PROF` contains 407 campus and 420 +district columns, including 34 lagged annual-graduate fields in each scope. +The current 2025 inputs are `STUD` and `STAF` only. They contain no graduate +fields; the separate publisher `GRAD` Graduation Profile needs its own audited +input/header contract before claiming equivalent annual-profile coverage. + +The `source` reader profile exposes complete header contracts without reading +source rows, for example +`cfg.header_records("district_tapr_student_staff_profile", edition="2024", reader_profile="source")`. +`cfg.load_df(..., reader_profile="source")` explicitly reads the full raw edition; +the default reader continues to use its exact retained prepared workbook. +Raw source preparation cannot run inside a retained-format release build. +Source identities and historical names are lossless period-specific attributes, +not additional metric keys or automatic `.meta` hydration. No current geometry +roster limits source coverage. Unknown field units and reference periods remain +unknown; the existing qualified metric bindings retain their lagged periods. + +One-header 2024 inputs use their complete Name/Type/Length/Label dictionaries; +2025 inputs declare exact label and code header records. Any preamble, note, +blank gap or footer must have reviewed CSV-record coordinates and an exact +content hash in the source contract. Removed notes are retained as annotations. +Undeclared records, duplicate identities, changed dictionaries, header collisions +and conflicting shared fields fail. Shared-field merging is limited to the same +qualified TAPR dataset and edition; it does not choose between observations +from different datasets, editions or methodologies. + Use `--help` to inspect options without loading source files or contacting download/geocoding services. Importing the download and geocoding modules does not start processing. Explicit relative paths are resolved from the invoking diff --git a/teadata/column_schema.py b/teadata/column_schema.py index c5ded3d..fdac17d 100644 --- a/teadata/column_schema.py +++ b/teadata/column_schema.py @@ -73,19 +73,38 @@ def _checksum(value: Any) -> bool: def validate_header_table(table: Mapping[str, Any]) -> None: """Validate one explicit mapping; never synthesize or deduplicate names.""" if (not isinstance(table, dict) - or set(table) != {"table", "input_sha256", "source_schema_sha256", "fields"} + or not {"table", "input_sha256", "source_schema_sha256", "fields"} <= set(table) + or set(table) - {"table", "input_sha256", "source_schema_sha256", "fields", "layout", "dictionary"} or not isinstance(table["table"], str) or not table["table"].strip() or not _checksum(table["input_sha256"]) or not _checksum(table["source_schema_sha256"]) or not isinstance(table["fields"], list) or not table["fields"]): raise ValueError("Invalid header crosswalk table") + if "layout" in table: + validate_source_layout(table["layout"]) + if "dictionary" in table: + dictionary = table["dictionary"] + if (not isinstance(dictionary, dict) + or set(dictionary) != {"filename", "sha256", "sheet_name"} + or not _checksum(dictionary["sha256"]) + or not isinstance(dictionary["sheet_name"], str) or not dictionary["sheet_name"]): + raise ValueError("Invalid source dictionary reference") + _adjacent_filename(dictionary["filename"]) seen_codes, seen_fields = set(), set() for position, field in enumerate(table["fields"], 1): - if (not isinstance(field, dict) or set(field) != {"position", "code", "label", "field"} + if (not isinstance(field, dict) + or not {"position", "code", "label", "field"} <= set(field) + or set(field) - {"position", "code", "label", "field", "publisher_type", "publisher_length", "disposition"} or type(field["position"]) is not int or field["position"] != position or not isinstance(field["code"], str) or not field["code"].strip() or not isinstance(field["label"], str) or not field["label"].strip() or not isinstance(field["field"], str)): raise ValueError(f"Invalid header crosswalk column {position}") + if any(not isinstance(field[key], str) for key in ("publisher_type", "publisher_length") if key in field): + raise ValueError(f"Invalid publisher metadata in column {position}") + if field.get("disposition", "fact") not in {"identity", "fact"}: + raise ValueError(f"Unaccounted source column {position}; retain an identity or fact") + if "dictionary" in table and not {"publisher_type", "publisher_length", "disposition"} <= set(field): + raise ValueError(f"Missing publisher dictionary metadata in column {position}") name = field["field"] if re.fullmatch(r"[a-z_][a-z0-9_]*", name) is None or keyword.iskeyword(name): raise ValueError(f"Invalid canonical header in column {position}: {name!r}; ASCII snake_case is required") @@ -100,6 +119,46 @@ def validate_header_table(table: Mapping[str, Any]) -> None: raise ValueError("Header crosswalk source-schema checksum mismatch") +def _adjacent_filename(value: Any) -> None: + if (not isinstance(value, str) or not value or value in {".", ".."} + or "/" in value or "\\" in value or ":" in value): + raise ValueError("Source filename must be one adjacent portable filename") + + +def validate_source_layout(layout: Any) -> None: + """Require reviewed record coordinates; never guess where notes end.""" + if (not isinstance(layout, dict) + or set(layout) != {"code_record", "label_record", "first_data_record", "last_data_record", "annotations"} + or any(type(layout[key]) is not int or layout[key] < 1 + for key in ("code_record", "first_data_record", "last_data_record")) + or (layout["label_record"] is not None + and (type(layout["label_record"]) is not int or layout["label_record"] < 1)) + or layout["last_data_record"] < layout["first_data_record"] + or not isinstance(layout["annotations"], list)): + raise ValueError("Invalid source record layout") + headers = {layout["code_record"]} + if layout["label_record"] is not None: + if layout["label_record"] in headers: + raise ValueError("Source header records overlap") + headers.add(layout["label_record"]) + if any(layout["first_data_record"] <= number <= layout["last_data_record"] for number in headers): + raise ValueError("Source header and data records overlap") + covered: list[tuple[int, int]] = [] + for annotation in layout["annotations"]: + if (not isinstance(annotation, dict) + or set(annotation) != {"first_record", "last_record", "kind", "sha256"} + or annotation["kind"] not in {"preamble", "note", "footer", "blank"} + or any(type(annotation[key]) is not int or annotation[key] < 1 for key in ("first_record", "last_record")) + or annotation["last_record"] < annotation["first_record"] + or not _checksum(annotation["sha256"])): + raise ValueError("Invalid source annotation range") + first, last = annotation["first_record"], annotation["last_record"] + if (any(first <= number <= last for number in headers) + or any(first <= old_last and old_first <= last for old_first, old_last in covered)): + raise ValueError("Source annotation ranges overlap") + covered.append((first, last)) + + def parse_column_schema(data: bytes) -> dict[str, Any]: """Validate either retained flat columns or an explicit qualified crosswalk.""" document = json.loads(data, object_pairs_hook=_unique_object) diff --git a/teadata/identifiers.py b/teadata/identifiers.py index 453b08d..089518b 100644 --- a/teadata/identifiers.py +++ b/teadata/identifiers.py @@ -117,3 +117,41 @@ def canonical_source_identifier(value: Any, *, width: int) -> str | None: if len(text) > width or not text.isascii() or not text.isdigit() or int(text) == 0: raise ValueError("Source identifier has invalid width or value") return "'" + text.zfill(width) + + +def canonical_source_identifiers(values: Any, *, width: int): + """Vectorize the scalar source-string contract without changing raw tokens. + + This explicit native boundary accepts Arrow string arrays only. Missing + strings remain null; malformed nonblank identifiers fail rather than being + extracted from notes, rounded, or silently discarded. + """ + import pyarrow as pa + import pyarrow.compute as arrow_compute + + # Arrow registers most compute kernels dynamically at import time. + pc: Any = arrow_compute + + if type(width) is not int or width < 1: + raise ValueError("Identifier width must be a positive integer") + if not isinstance(values, (pa.Array, pa.ChunkedArray)) or not ( + pa.types.is_string(values.type) or pa.types.is_large_string(values.type) + ): + raise ValueError("Source identifier batches require Arrow strings") + # Exact characters accepted by Python's str.strip, shared with the scalar + # contract (including the four ASCII information separators). + whitespace = " \t\n\r\v\f\x1c\x1d\x1e\x1f\x85\xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000" + text = pc.utf8_trim(values, characters=whitespace) + missing = pc.or_(pc.is_null(text), pc.fill_null(pc.equal(text, ""), False)) + text = pc.replace_substring_regex(text, pattern="^'", replacement="") + text = pc.utf8_trim(text, characters=whitespace) + valid = pc.match_substring_regex(text, pattern=rf"^[0-9]{{1,{width}}}(?:\.0+)?$") + digits = pc.replace_substring_regex(text, pattern=r"\.0+$", replacement="") + valid = pc.and_(valid, pc.invert(pc.match_substring_regex(digits, pattern="^0+$"))) + bad = pc.and_(pc.invert(missing), pc.invert(pc.fill_null(valid, False))) + if pc.any(bad).as_py(): + position = pc.index(bad, True).as_py() + raise ValueError(f"Invalid source identifier at batch row {position + 1}: {values[position].as_py()!r}") + normalized = pc.binary_join_element_wise(pa.scalar("'", type=values.type), + pc.utf8_lpad(digits, width=width, padding="0"), pa.scalar("", type=values.type)) + return pc.if_else(missing, pa.scalar(None, type=values.type), normalized) diff --git a/teadata/manifest.py b/teadata/manifest.py index 97b510c..a3d7da0 100644 --- a/teadata/manifest.py +++ b/teadata/manifest.py @@ -832,11 +832,12 @@ def verify_source_receipts( def verify_reference_receipts( - source: ResolvedDataset, store: ProvenanceStore, *, reference_base: Path | None = None + source: ResolvedDataset, store: ProvenanceStore, *, reference_base: Path | None = None, + check_local_paths: bool = True, verify_all_claimed: bool = False, ) -> None: """Verify archived documentation without confounding it with source observations.""" for reference in source.metadata.references: - if reference.status != "available": + if reference.status != "available" and not (verify_all_claimed and reference.provenance_ids): continue if not reference.provenance_ids: raise ContractError( @@ -855,7 +856,7 @@ def verify_reference_receipts( }: raise ContractError("Reference receipt belongs to a different URL") store.verify_artifact(record["artifact"]["sha256"]) - if reference.path is not None: + if reference.path is not None and check_local_paths: if reference_base is None: raise ContractError( "Local reference needs a source contract directory" diff --git a/teadata/provenance.py b/teadata/provenance.py index 806d278..d627bfb 100644 --- a/teadata/provenance.py +++ b/teadata/provenance.py @@ -14,7 +14,7 @@ import tempfile from typing import Any, Mapping, Sequence -from .dataset_metadata import ResolvedDataset, validate_http_url +from .dataset_metadata import DatasetMetadata, ResolvedDataset, validate_http_url def _timestamp(value: datetime | None = None) -> str: @@ -241,3 +241,60 @@ def verify_artifact(self, content_hash: str) -> Path: if _file_digest(path) != content_hash: raise ValueError(f"Archived artifact checksum mismatch: {content_hash}") return path + + def verify_record_closure(self, record_ids: Sequence[str]) -> dict[str, dict[str, Any]]: + """Verify only the requested immutable graph, including reference links. + + Archived hashes own content identity; portable reference paths need not + exist outside the original configuration directory. Ordinary source + builds still validate their selected local paths separately. + """ + from .manifest import verify_reference_receipts + + records: dict[str, dict[str, Any]] = {} + pending: set[str] = set() + + def visit(identifier: str) -> None: + if identifier in records: + return + if identifier in pending: + raise ValueError("Provenance records contain a cycle") + pending.add(identifier) + record = self.read_record(identifier) + if record["kind"] == "acquisition": + artifacts = [record["artifact"]] + metadata = DatasetMetadata.from_dict(record["source_metadata"]) + dependencies = [*metadata.provenance_ids, + *(item for ref in metadata.references for item in ref.provenance_ids)] + else: + artifacts = list(record["outputs"].values()) + metadata = None + dependencies = record["inputs"] + for dependency in dependencies: + visit(dependency) + for artifact in artifacts: + path = self.verify_artifact(artifact["sha256"]) + if path.stat().st_size != artifact["size_bytes"]: + raise ValueError("Provenance artifact size differs from its receipt") + if metadata is not None: + verify_reference_receipts(ResolvedDataset(record["dataset"], record["section"], + record["requested_year"], record["resolved_year"], "", metadata), + self, check_local_paths=False, verify_all_claimed=True) + pending.remove(identifier) + records[identifier] = record + + for identifier in record_ids: + visit(identifier) + return records + + def copy_record_from(self, source: ProvenanceStore, record_id: str) -> None: + """Retain an exact selected receipt/object closure, preserving history.""" + records = source.verify_record_closure([record_id]) + for identifier, record in records.items(): + artifacts = [record["artifact"]] if record["kind"] == "acquisition" else record["outputs"].values() + for artifact in artifacts: + copied = self.retain_artifact(source.verify_artifact(artifact["sha256"])) + if copied["sha256"] != artifact["sha256"] or copied["size_bytes"] != artifact["size_bytes"]: + raise ValueError("Copied provenance artifact differs from its receipt") + if self._record(record) != identifier: + raise ValueError("Copied provenance receipt changed its identity") diff --git a/teadata/schemas/tapr--2024--header-crosswalk.json b/teadata/schemas/tapr--2024--header-crosswalk.json new file mode 100644 index 0000000..3553923 --- /dev/null +++ b/teadata/schemas/tapr--2024--header-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_student_staff_profile","edition":"2024","prepared_input_sha256":"2f815b308b2f4d112a0619643022cb7d2189b9f536c1eba851a4b586e16ad765","tables":[{"dictionary":{"filename":"CAMPPROF_2023-2024_data_elements.xlsx","sha256":"8bd603edd20b916c2d74f5a45fec49aced15a348aebcbb4ee862576a4f46fe7a","sheet_name":"Sheet1"},"fields":[{"code":"CAMPUS","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_length":"9","publisher_type":"Character"},{"code":"CAMPNAME","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_length":"75","publisher_type":"Character"},{"code":"DISTRICT","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_length":"6","publisher_type":"Character"},{"code":"DISTNAME","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_length":"75","publisher_type":"Character"},{"code":"CPERRAKR","disposition":"fact","field":"campus_2023_retention_regular_ed_kg_rate","label":"Campus 2023 Retention: Regular Ed KG Rate","position":5,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA1R","disposition":"fact","field":"campus_2023_retention_regular_ed_01_rate","label":"Campus 2023 Retention: Regular Ed 01 Rate","position":6,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA2R","disposition":"fact","field":"campus_2023_retention_regular_ed_02_rate","label":"Campus 2023 Retention: Regular Ed 02 Rate","position":7,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA3R","disposition":"fact","field":"campus_2023_retention_regular_ed_03_rate","label":"Campus 2023 Retention: Regular Ed 03 Rate","position":8,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA4R","disposition":"fact","field":"campus_2023_retention_regular_ed_04_rate","label":"Campus 2023 Retention: Regular Ed 04 Rate","position":9,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA5R","disposition":"fact","field":"campus_2023_retention_regular_ed_05_rate","label":"Campus 2023 Retention: Regular Ed 05 Rate","position":10,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA6R","disposition":"fact","field":"campus_2023_retention_regular_ed_06_rate","label":"Campus 2023 Retention: Regular Ed 06 Rate","position":11,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA7R","disposition":"fact","field":"campus_2023_retention_regular_ed_07_rate","label":"Campus 2023 Retention: Regular Ed 07 Rate","position":12,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA8R","disposition":"fact","field":"campus_2023_retention_regular_ed_08_rate","label":"Campus 2023 Retention: Regular Ed 08 Rate","position":13,"publisher_length":"","publisher_type":"Number"},{"code":"CPERRA9R","disposition":"fact","field":"campus_2023_retention_regular_ed_09_rate","label":"Campus 2023 Retention: Regular Ed 09 Rate","position":14,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSAKR","disposition":"fact","field":"campus_2023_retention_special_ed_kg_rate","label":"Campus 2023 Retention: Special Ed KG Rate","position":15,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA1R","disposition":"fact","field":"campus_2023_retention_special_ed_01_rate","label":"Campus 2023 Retention: Special Ed 01 Rate","position":16,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA2R","disposition":"fact","field":"campus_2023_retention_special_ed_02_rate","label":"Campus 2023 Retention: Special Ed 02 Rate","position":17,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA3R","disposition":"fact","field":"campus_2023_retention_special_ed_03_rate","label":"Campus 2023 Retention: Special Ed 03 Rate","position":18,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA4R","disposition":"fact","field":"campus_2023_retention_special_ed_04_rate","label":"Campus 2023 Retention: Special Ed 04 Rate","position":19,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA5R","disposition":"fact","field":"campus_2023_retention_special_ed_05_rate","label":"Campus 2023 Retention: Special Ed 05 Rate","position":20,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA6R","disposition":"fact","field":"campus_2023_retention_special_ed_06_rate","label":"Campus 2023 Retention: Special Ed 06 Rate","position":21,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA7R","disposition":"fact","field":"campus_2023_retention_special_ed_07_rate","label":"Campus 2023 Retention: Special Ed 07 Rate","position":22,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA8R","disposition":"fact","field":"campus_2023_retention_special_ed_08_rate","label":"Campus 2023 Retention: Special Ed 08 Rate","position":23,"publisher_length":"","publisher_type":"Number"},{"code":"CPERSA9R","disposition":"fact","field":"campus_2023_retention_special_ed_09_rate","label":"Campus 2023 Retention: Special Ed 09 Rate","position":24,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSIMC","disposition":"fact","field":"campus_2024_student_membership_total_students_with_disabilities_count","label":"Campus 2024 Student Membership: Total Students with Disabilities Count","position":25,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSINC","disposition":"fact","field":"campus_2024_student_membership_intellectual_disabilities_count","label":"Campus 2024 Student Membership: Intellectual Disabilities Count","position":26,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSPHC","disposition":"fact","field":"campus_2024_student_membership_physical_disabilities_count","label":"Campus 2024 Student Membership: Physical Disabilities Count","position":27,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSBHC","disposition":"fact","field":"campus_2024_student_membership_behavioral_disabilities_count","label":"Campus 2024 Student Membership: Behavioral Disabilities Count","position":28,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSAUC","disposition":"fact","field":"campus_2024_student_membership_autism_count","label":"Campus 2024 Student Membership: Autism Count","position":29,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSNOC","disposition":"fact","field":"campus_2024_student_membership_non_categorical_early_childhood_count","label":"Campus 2024 Student Membership: Non-Categorical Early Childhood Count","position":30,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSINP","disposition":"fact","field":"campus_2024_student_membership_intellectual_disabilities_percent","label":"Campus 2024 Student Membership: Intellectual Disabilities Percent","position":31,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSPHP","disposition":"fact","field":"campus_2024_student_membership_physical_disabilities_percent","label":"Campus 2024 Student Membership: Physical Disabilities Percent","position":32,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSBHP","disposition":"fact","field":"campus_2024_student_membership_behavioral_disabilities_percent","label":"Campus 2024 Student Membership: Behavioral Disabilities Percent","position":33,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSAUP","disposition":"fact","field":"campus_2024_student_membership_autism_percent","label":"Campus 2024 Student Membership: Autism Percent","position":34,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSNOP","disposition":"fact","field":"campus_2024_student_membership_non_categorical_early_childhood_percent","label":"Campus 2024 Student Membership: Non-Categorical Early Childhood Percent","position":35,"publisher_length":"","publisher_type":"Number"},{"code":"CPETDISD","disposition":"fact","field":"campus_2023_daep_denominator","label":"Campus 2023 DAEP: Denominator","position":36,"publisher_length":"","publisher_type":"Number"},{"code":"CPETDISC","disposition":"fact","field":"campus_2023_daep_count","label":"Campus 2023 DAEP: Count","position":37,"publisher_length":"","publisher_type":"Number"},{"code":"CPETDISP","disposition":"fact","field":"campus_2023_daep_percent","label":"Campus 2023 DAEP: Percent","position":38,"publisher_length":"","publisher_type":"Number"},{"code":"CPETATTC","disposition":"fact","field":"campus_2024_student_membership_2022_23_attrition_all_students_count","label":"Campus 2024 Student Membership: 2022-23 Attrition All Students Count","position":39,"publisher_length":"","publisher_type":"Number"},{"code":"CPETATTD","disposition":"fact","field":"campus_2024_student_membership_2022_23_attrition_all_students_denominator","label":"Campus 2024 Student Membership: 2022-23 Attrition All Students Denominator","position":40,"publisher_length":"","publisher_type":"Number"},{"code":"CPETATTP","disposition":"fact","field":"campus_2024_student_membership_2022_23_attrition_all_students_percent","label":"Campus 2024 Student Membership: 2022-23 Attrition All Students Percent","position":41,"publisher_length":"","publisher_type":"Number"},{"code":"CPETLEPP","disposition":"fact","field":"campus_2024_student_membership_eb_el_percent","label":"Campus 2024 Student Membership: EB/EL Percent","position":42,"publisher_length":"","publisher_type":"Number"},{"code":"CPETECOP","disposition":"fact","field":"campus_2024_student_membership_econ_disadv_percent","label":"Campus 2024 Student Membership: Econ Disadv Percent","position":43,"publisher_length":"","publisher_type":"Number"},{"code":"CPETRSKP","disposition":"fact","field":"campus_2024_student_membership_at_risk_percent","label":"Campus 2024 Student Membership: At Risk Percent","position":44,"publisher_length":"","publisher_type":"Number"},{"code":"CPETNEDP","disposition":"fact","field":"campus_2024_student_membership_non_educationally_disadv_percent","label":"Campus 2024 Student Membership: Non-Educationally Disadv Percent","position":45,"publisher_length":"","publisher_type":"Number"},{"code":"CPETECOC","disposition":"fact","field":"campus_2024_student_membership_econ_disadv_count","label":"Campus 2024 Student Membership: Econ Disadv Count","position":46,"publisher_length":"","publisher_type":"Number"},{"code":"CPETRSKC","disposition":"fact","field":"campus_2024_student_membership_at_risk_count","label":"Campus 2024 Student Membership: At Risk Count","position":47,"publisher_length":"","publisher_type":"Number"},{"code":"CPETLEPC","disposition":"fact","field":"campus_2024_student_membership_eb_el_count","label":"Campus 2024 Student Membership: EB/EL Count","position":48,"publisher_length":"","publisher_type":"Number"},{"code":"CPETNEDC","disposition":"fact","field":"campus_2024_student_membership_non_educationally_disadv_count","label":"Campus 2024 Student Membership: Non-Educationally Disadv Count","position":49,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSPEC","disposition":"fact","field":"campus_2024_student_membership_special_ed_count","label":"Campus 2024 Student Membership: Special Ed Count","position":50,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGIFC","disposition":"fact","field":"campus_2024_student_membership_gifted_and_talented_count","label":"Campus 2024 Student Membership: Gifted & Talented Count","position":51,"publisher_length":"","publisher_type":"Number"},{"code":"CPETALLC","disposition":"fact","field":"campus_2024_student_membership_all_students_count","label":"Campus 2024 Student Membership: All Students Count","position":52,"publisher_length":"","publisher_type":"Number"},{"code":"CPETTT1C","disposition":"fact","field":"campus_2024_student_membership_title_i_count","label":"Campus 2024 Student Membership: Title I Count","position":53,"publisher_length":"","publisher_type":"Number"},{"code":"CPETHOMC","disposition":"fact","field":"campus_2024_student_membership_homeless_count","label":"Campus 2024 Student Membership: Homeless Count","position":54,"publisher_length":"","publisher_type":"Number"},{"code":"CPETIMMC","disposition":"fact","field":"campus_2024_student_membership_immigrant_count","label":"Campus 2024 Student Membership: Immigrant Count","position":55,"publisher_length":"","publisher_type":"Number"},{"code":"CPET504C","disposition":"fact","field":"campus_2024_student_membership_section_504_count","label":"Campus 2024 Student Membership: Section 504 Count","position":56,"publisher_length":"","publisher_type":"Number"},{"code":"CPETDSLC","disposition":"fact","field":"campus_2024_student_membership_dyslexia_count","label":"Campus 2024 Student Membership: Dyslexia Count","position":57,"publisher_length":"","publisher_type":"Number"},{"code":"CPETMIGC","disposition":"fact","field":"campus_2024_student_membership_migrant_count","label":"Campus 2024 Student Membership: Migrant Count","position":58,"publisher_length":"","publisher_type":"Number"},{"code":"CPETMLCC","disposition":"fact","field":"campus_2024_student_membership_military_connected_count","label":"Campus 2024 Student Membership: Military-Connected Count","position":59,"publisher_length":"","publisher_type":"Number"},{"code":"CPETFOSC","disposition":"fact","field":"campus_2024_student_membership_foster_care_count","label":"Campus 2024 Student Membership: Foster Care Count","position":60,"publisher_length":"","publisher_type":"Number"},{"code":"CPETVOCC","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_education_count","label":"Campus 2024 Student Membership: Career & Technical Education Count","position":61,"publisher_length":"","publisher_type":"Number"},{"code":"CPETVHSC","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_9_12_education_count","label":"Campus 2024 Student Membership: Career & Technical (9-12) Education Count","position":62,"publisher_length":"","publisher_type":"Number"},{"code":"CPETBILC","disposition":"fact","field":"campus_2024_student_membership_bilingual_esl_count","label":"Campus 2024 Student Membership: Bilingual/ESL Count","position":63,"publisher_length":"","publisher_type":"Number"},{"code":"CPETINDC","disposition":"fact","field":"campus_2024_student_membership_american_indian_count","label":"Campus 2024 Student Membership: American Indian Count","position":64,"publisher_length":"","publisher_type":"Number"},{"code":"CPETASIC","disposition":"fact","field":"campus_2024_student_membership_asian_count","label":"Campus 2024 Student Membership: Asian Count","position":65,"publisher_length":"","publisher_type":"Number"},{"code":"CPETPCIC","disposition":"fact","field":"campus_2024_student_membership_pacific_islander_count","label":"Campus 2024 Student Membership: Pacific Islander Count","position":66,"publisher_length":"","publisher_type":"Number"},{"code":"CPETTWOC","disposition":"fact","field":"campus_2024_student_membership_two_or_more_races_count","label":"Campus 2024 Student Membership: Two or More Races Count","position":67,"publisher_length":"","publisher_type":"Number"},{"code":"CPETBLAC","disposition":"fact","field":"campus_2024_student_membership_african_american_count","label":"Campus 2024 Student Membership: African American Count","position":68,"publisher_length":"","publisher_type":"Number"},{"code":"CPETHISC","disposition":"fact","field":"campus_2024_student_membership_hispanic_count","label":"Campus 2024 Student Membership: Hispanic Count","position":69,"publisher_length":"","publisher_type":"Number"},{"code":"CPETWHIC","disposition":"fact","field":"campus_2024_student_membership_white_count","label":"Campus 2024 Student Membership: White Count","position":70,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGEEC","disposition":"fact","field":"campus_2024_student_membership_ee_count","label":"Campus 2024 Student Membership: EE Count","position":71,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGPKC","disposition":"fact","field":"campus_2024_student_membership_pk_count","label":"Campus 2024 Student Membership: PK Count","position":72,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGKNC","disposition":"fact","field":"campus_2024_student_membership_kg_count","label":"Campus 2024 Student Membership: KG Count","position":73,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG01C","disposition":"fact","field":"campus_2024_student_membership_01_count","label":"Campus 2024 Student Membership: 01 Count","position":74,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG02C","disposition":"fact","field":"campus_2024_student_membership_02_count","label":"Campus 2024 Student Membership: 02 Count","position":75,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG03C","disposition":"fact","field":"campus_2024_student_membership_03_count","label":"Campus 2024 Student Membership: 03 Count","position":76,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG04C","disposition":"fact","field":"campus_2024_student_membership_04_count","label":"Campus 2024 Student Membership: 04 Count","position":77,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG05C","disposition":"fact","field":"campus_2024_student_membership_05_count","label":"Campus 2024 Student Membership: 05 Count","position":78,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG06C","disposition":"fact","field":"campus_2024_student_membership_06_count","label":"Campus 2024 Student Membership: 06 Count","position":79,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG07C","disposition":"fact","field":"campus_2024_student_membership_07_count","label":"Campus 2024 Student Membership: 07 Count","position":80,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG08C","disposition":"fact","field":"campus_2024_student_membership_08_count","label":"Campus 2024 Student Membership: 08 Count","position":81,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG09C","disposition":"fact","field":"campus_2024_student_membership_09_count","label":"Campus 2024 Student Membership: 09 Count","position":82,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG10C","disposition":"fact","field":"campus_2024_student_membership_10_count","label":"Campus 2024 Student Membership: 10 Count","position":83,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG11C","disposition":"fact","field":"campus_2024_student_membership_11_count","label":"Campus 2024 Student Membership: 11 Count","position":84,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG12C","disposition":"fact","field":"campus_2024_student_membership_12_count","label":"Campus 2024 Student Membership: 12 Count","position":85,"publisher_length":"","publisher_type":"Number"},{"code":"CPETMALC","disposition":"fact","field":"campus_2024_student_membership_male_count","label":"Campus 2024 Student Membership: Male Count","position":86,"publisher_length":"","publisher_type":"Number"},{"code":"CPETFEMC","disposition":"fact","field":"campus_2024_student_membership_female_count","label":"Campus 2024 Student Membership: Female Count","position":87,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMALLC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_all_students_count","label":"Campus 2024 Student Membership: 2023 Mobility All Students Count","position":88,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMINDC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_american_indian_count","label":"Campus 2024 Student Membership: 2023 Mobility American Indian Count","position":89,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMASIC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_asian_count","label":"Campus 2024 Student Membership: 2023 Mobility Asian Count","position":90,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMPCIC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_pacific_islander_count","label":"Campus 2024 Student Membership: 2023 Mobility Pacific Islander Count","position":91,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMTWOC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_two_or_more_races_count","label":"Campus 2024 Student Membership: 2023 Mobility Two or More Races Count","position":92,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMBLAC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_african_american_count","label":"Campus 2024 Student Membership: 2023 Mobility African American Count","position":93,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMHISC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_hispanic_count","label":"Campus 2024 Student Membership: 2023 Mobility Hispanic Count","position":94,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMWHIC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_white_count","label":"Campus 2024 Student Membership: 2023 Mobility White Count","position":95,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMECOC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_econ_disadv_count","label":"Campus 2024 Student Membership: 2023 Mobility Econ Disadv Count","position":96,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMLEPC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_eb_el_count","label":"Campus 2024 Student Membership: 2023 Mobility EB/EL Count","position":97,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMSPEC","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_special_ed_count","label":"Campus 2024 Student Membership: 2023 Mobility Special Ed Count","position":98,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMALLT","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_all_students_denominator","label":"Campus 2024 Student Membership: 2023 Mobility All Students Denominator","position":99,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMECOT","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_econ_disadv_denominator","label":"Campus 2024 Student Membership: 2023 Mobility Econ Disadv Denominator","position":100,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMLEPT","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_eb_el_denominator","label":"Campus 2024 Student Membership: 2023 Mobility EB/EL Denominator","position":101,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMSPET","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_special_ed_denominator","label":"Campus 2024 Student Membership: 2023 Mobility Special Ed Denominator","position":102,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMALLP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_all_students_percent","label":"Campus 2024 Student Membership: 2023 Mobility All Students Percent","position":103,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMBLAP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_african_american_percent","label":"Campus 2024 Student Membership: 2023 Mobility African American Percent","position":104,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMHISP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_hispanic_percent","label":"Campus 2024 Student Membership: 2023 Mobility Hispanic Percent","position":105,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMINDP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_american_indian_percent","label":"Campus 2024 Student Membership: 2023 Mobility American Indian Percent","position":106,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMWHIP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_white_percent","label":"Campus 2024 Student Membership: 2023 Mobility White Percent","position":107,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMASIP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_asian_percent","label":"Campus 2024 Student Membership: 2023 Mobility Asian Percent","position":108,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMPCIP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_pacific_islander_percent","label":"Campus 2024 Student Membership: 2023 Mobility Pacific Islander Percent","position":109,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMTWOP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_two_or_more_races_percent","label":"Campus 2024 Student Membership: 2023 Mobility Two or More Races Percent","position":110,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMECOP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_econ_disadv_percent","label":"Campus 2024 Student Membership: 2023 Mobility Econ Disadv Percent","position":111,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMLEPP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_eb_el_percent","label":"Campus 2024 Student Membership: 2023 Mobility EB/EL Percent","position":112,"publisher_length":"","publisher_type":"Number"},{"code":"CPEMSPEP","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_special_ed_percent","label":"Campus 2024 Student Membership: 2023 Mobility Special Ed Percent","position":113,"publisher_length":"","publisher_type":"Number"},{"code":"CPETWHIP","disposition":"fact","field":"campus_2024_student_membership_white_percent","label":"Campus 2024 Student Membership: White Percent","position":114,"publisher_length":"","publisher_type":"Number"},{"code":"CPETBLAP","disposition":"fact","field":"campus_2024_student_membership_african_american_percent","label":"Campus 2024 Student Membership: African American Percent","position":115,"publisher_length":"","publisher_type":"Number"},{"code":"CPETHISP","disposition":"fact","field":"campus_2024_student_membership_hispanic_percent","label":"Campus 2024 Student Membership: Hispanic Percent","position":116,"publisher_length":"","publisher_type":"Number"},{"code":"CPETINDP","disposition":"fact","field":"campus_2024_student_membership_american_indian_percent","label":"Campus 2024 Student Membership: American Indian Percent","position":117,"publisher_length":"","publisher_type":"Number"},{"code":"CPETASIP","disposition":"fact","field":"campus_2024_student_membership_asian_percent","label":"Campus 2024 Student Membership: Asian Percent","position":118,"publisher_length":"","publisher_type":"Number"},{"code":"CPETPCIP","disposition":"fact","field":"campus_2024_student_membership_pacific_islander_percent","label":"Campus 2024 Student Membership: Pacific Islander Percent","position":119,"publisher_length":"","publisher_type":"Number"},{"code":"CPETTWOP","disposition":"fact","field":"campus_2024_student_membership_two_or_more_races_percent","label":"Campus 2024 Student Membership: Two or More Races Percent","position":120,"publisher_length":"","publisher_type":"Number"},{"code":"CPETSPEP","disposition":"fact","field":"campus_2024_student_membership_special_ed_percent","label":"Campus 2024 Student Membership: Special Ed Percent","position":121,"publisher_length":"","publisher_type":"Number"},{"code":"CPETVOCP","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_education_percent","label":"Campus 2024 Student Membership: Career & Technical Education Percent","position":122,"publisher_length":"","publisher_type":"Number"},{"code":"CPETBILP","disposition":"fact","field":"campus_2024_student_membership_bilingual_esl_percent","label":"Campus 2024 Student Membership: Bilingual/ESL Percent","position":123,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGIFP","disposition":"fact","field":"campus_2024_student_membership_gifted_and_talented_percent","label":"Campus 2024 Student Membership: Gifted & Talented Percent","position":124,"publisher_length":"","publisher_type":"Number"},{"code":"CPETDSLP","disposition":"fact","field":"campus_2024_student_membership_dyslexia_percent","label":"Campus 2024 Student Membership: Dyslexia Percent","position":125,"publisher_length":"","publisher_type":"Number"},{"code":"CPET504P","disposition":"fact","field":"campus_2024_student_membership_section_504_percent","label":"Campus 2024 Student Membership: Section 504 Percent","position":126,"publisher_length":"","publisher_type":"Number"},{"code":"CPETTT1P","disposition":"fact","field":"campus_2024_student_membership_title_i_percent","label":"Campus 2024 Student Membership: Title I Percent","position":127,"publisher_length":"","publisher_type":"Number"},{"code":"CPETHOMP","disposition":"fact","field":"campus_2024_student_membership_homeless_percent","label":"Campus 2024 Student Membership: Homeless Percent","position":128,"publisher_length":"","publisher_type":"Number"},{"code":"CPETIMMP","disposition":"fact","field":"campus_2024_student_membership_immigrant_percent","label":"Campus 2024 Student Membership: Immigrant Percent","position":129,"publisher_length":"","publisher_type":"Number"},{"code":"CPETFOSP","disposition":"fact","field":"campus_2024_student_membership_foster_care_percent","label":"Campus 2024 Student Membership: Foster Care Percent","position":130,"publisher_length":"","publisher_type":"Number"},{"code":"CPETMIGP","disposition":"fact","field":"campus_2024_student_membership_migrant_percent","label":"Campus 2024 Student Membership: Migrant Percent","position":131,"publisher_length":"","publisher_type":"Number"},{"code":"CPETMLCP","disposition":"fact","field":"campus_2024_student_membership_military_connected_percent","label":"Campus 2024 Student Membership: Military-Connected Percent","position":132,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGEEP","disposition":"fact","field":"campus_2024_student_membership_ee_percent","label":"Campus 2024 Student Membership: EE Percent","position":133,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGPKP","disposition":"fact","field":"campus_2024_student_membership_pk_percent","label":"Campus 2024 Student Membership: PK Percent","position":134,"publisher_length":"","publisher_type":"Number"},{"code":"CPETGKNP","disposition":"fact","field":"campus_2024_student_membership_kg_percent","label":"Campus 2024 Student Membership: KG Percent","position":135,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG01P","disposition":"fact","field":"campus_2024_student_membership_01_percent","label":"Campus 2024 Student Membership: 01 Percent","position":136,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG02P","disposition":"fact","field":"campus_2024_student_membership_02_percent","label":"Campus 2024 Student Membership: 02 Percent","position":137,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG03P","disposition":"fact","field":"campus_2024_student_membership_03_percent","label":"Campus 2024 Student Membership: 03 Percent","position":138,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG04P","disposition":"fact","field":"campus_2024_student_membership_04_percent","label":"Campus 2024 Student Membership: 04 Percent","position":139,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG05P","disposition":"fact","field":"campus_2024_student_membership_05_percent","label":"Campus 2024 Student Membership: 05 Percent","position":140,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG06P","disposition":"fact","field":"campus_2024_student_membership_06_percent","label":"Campus 2024 Student Membership: 06 Percent","position":141,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG07P","disposition":"fact","field":"campus_2024_student_membership_07_percent","label":"Campus 2024 Student Membership: 07 Percent","position":142,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG08P","disposition":"fact","field":"campus_2024_student_membership_08_percent","label":"Campus 2024 Student Membership: 08 Percent","position":143,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG09P","disposition":"fact","field":"campus_2024_student_membership_09_percent","label":"Campus 2024 Student Membership: 09 Percent","position":144,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG10P","disposition":"fact","field":"campus_2024_student_membership_10_percent","label":"Campus 2024 Student Membership: 10 Percent","position":145,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG11P","disposition":"fact","field":"campus_2024_student_membership_11_percent","label":"Campus 2024 Student Membership: 11 Percent","position":146,"publisher_length":"","publisher_type":"Number"},{"code":"CPETG12P","disposition":"fact","field":"campus_2024_student_membership_12_percent","label":"Campus 2024 Student Membership: 12 Percent","position":147,"publisher_length":"","publisher_type":"Number"},{"code":"CPETMALP","disposition":"fact","field":"campus_2024_student_membership_male_percent","label":"Campus 2024 Student Membership: Male Percent","position":148,"publisher_length":"","publisher_type":"Number"},{"code":"CPETFEMP","disposition":"fact","field":"campus_2024_student_membership_female_percent","label":"Campus 2024 Student Membership: Female Percent","position":149,"publisher_length":"","publisher_type":"Number"},{"code":"CPETVHSP","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_9_12_education_percent","label":"Campus 2024 Student Membership: Career & Technical (9-12) Education Percent","position":150,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTALLC","disposition":"fact","field":"campus_2024_student_enrollment_all_students_count","label":"Campus 2024 Student Enrollment: All Students Count","position":151,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTALLP","disposition":"fact","field":"campus_2024_student_enrollment_all_students_percent","label":"Campus 2024 Student Enrollment: All Students Percent","position":152,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGEEC","disposition":"fact","field":"campus_2024_student_enrollment_ee_count","label":"Campus 2024 Student Enrollment: EE Count","position":153,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGEEP","disposition":"fact","field":"campus_2024_student_enrollment_ee_percent","label":"Campus 2024 Student Enrollment: EE Percent","position":154,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGPKC","disposition":"fact","field":"campus_2024_student_enrollment_pk_count","label":"Campus 2024 Student Enrollment: PK Count","position":155,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGPKP","disposition":"fact","field":"campus_2024_student_enrollment_pk_percent","label":"Campus 2024 Student Enrollment: PK Percent","position":156,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGKNC","disposition":"fact","field":"campus_2024_student_enrollment_kg_count","label":"Campus 2024 Student Enrollment: KG Count","position":157,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGKNP","disposition":"fact","field":"campus_2024_student_enrollment_kg_percent","label":"Campus 2024 Student Enrollment: KG Percent","position":158,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG01C","disposition":"fact","field":"campus_2024_student_enrollment_01_count","label":"Campus 2024 Student Enrollment: 01 Count","position":159,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG01P","disposition":"fact","field":"campus_2024_student_enrollment_01_percent","label":"Campus 2024 Student Enrollment: 01 Percent","position":160,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG02C","disposition":"fact","field":"campus_2024_student_enrollment_02_count","label":"Campus 2024 Student Enrollment: 02 Count","position":161,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG02P","disposition":"fact","field":"campus_2024_student_enrollment_02_percent","label":"Campus 2024 Student Enrollment: 02 Percent","position":162,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG03C","disposition":"fact","field":"campus_2024_student_enrollment_03_count","label":"Campus 2024 Student Enrollment: 03 Count","position":163,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG03P","disposition":"fact","field":"campus_2024_student_enrollment_03_percent","label":"Campus 2024 Student Enrollment: 03 Percent","position":164,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG04C","disposition":"fact","field":"campus_2024_student_enrollment_04_count","label":"Campus 2024 Student Enrollment: 04 Count","position":165,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG04P","disposition":"fact","field":"campus_2024_student_enrollment_04_percent","label":"Campus 2024 Student Enrollment: 04 Percent","position":166,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG05C","disposition":"fact","field":"campus_2024_student_enrollment_05_count","label":"Campus 2024 Student Enrollment: 05 Count","position":167,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG05P","disposition":"fact","field":"campus_2024_student_enrollment_05_percent","label":"Campus 2024 Student Enrollment: 05 Percent","position":168,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG06C","disposition":"fact","field":"campus_2024_student_enrollment_06_count","label":"Campus 2024 Student Enrollment: 06 Count","position":169,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG06P","disposition":"fact","field":"campus_2024_student_enrollment_06_percent","label":"Campus 2024 Student Enrollment: 06 Percent","position":170,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG07C","disposition":"fact","field":"campus_2024_student_enrollment_07_count","label":"Campus 2024 Student Enrollment: 07 Count","position":171,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG07P","disposition":"fact","field":"campus_2024_student_enrollment_07_percent","label":"Campus 2024 Student Enrollment: 07 Percent","position":172,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG08C","disposition":"fact","field":"campus_2024_student_enrollment_08_count","label":"Campus 2024 Student Enrollment: 08 Count","position":173,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG08P","disposition":"fact","field":"campus_2024_student_enrollment_08_percent","label":"Campus 2024 Student Enrollment: 08 Percent","position":174,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG09C","disposition":"fact","field":"campus_2024_student_enrollment_09_count","label":"Campus 2024 Student Enrollment: 09 Count","position":175,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG09P","disposition":"fact","field":"campus_2024_student_enrollment_09_percent","label":"Campus 2024 Student Enrollment: 09 Percent","position":176,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG10C","disposition":"fact","field":"campus_2024_student_enrollment_10_count","label":"Campus 2024 Student Enrollment: 10 Count","position":177,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG10P","disposition":"fact","field":"campus_2024_student_enrollment_10_percent","label":"Campus 2024 Student Enrollment: 10 Percent","position":178,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG11C","disposition":"fact","field":"campus_2024_student_enrollment_11_count","label":"Campus 2024 Student Enrollment: 11 Count","position":179,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG11P","disposition":"fact","field":"campus_2024_student_enrollment_11_percent","label":"Campus 2024 Student Enrollment: 11 Percent","position":180,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG12C","disposition":"fact","field":"campus_2024_student_enrollment_12_count","label":"Campus 2024 Student Enrollment: 12 Count","position":181,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTG12P","disposition":"fact","field":"campus_2024_student_enrollment_12_percent","label":"Campus 2024 Student Enrollment: 12 Percent","position":182,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTBLAC","disposition":"fact","field":"campus_2024_student_enrollment_african_american_count","label":"Campus 2024 Student Enrollment: African American Count","position":183,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTBLAP","disposition":"fact","field":"campus_2024_student_enrollment_african_american_percent","label":"Campus 2024 Student Enrollment: African American Percent","position":184,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTHISC","disposition":"fact","field":"campus_2024_student_enrollment_hispanic_count","label":"Campus 2024 Student Enrollment: Hispanic Count","position":185,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTHISP","disposition":"fact","field":"campus_2024_student_enrollment_hispanic_percent","label":"Campus 2024 Student Enrollment: Hispanic Percent","position":186,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTWHIC","disposition":"fact","field":"campus_2024_student_enrollment_white_count","label":"Campus 2024 Student Enrollment: White Count","position":187,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTWHIP","disposition":"fact","field":"campus_2024_student_enrollment_white_percent","label":"Campus 2024 Student Enrollment: White Percent","position":188,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTINDC","disposition":"fact","field":"campus_2024_student_enrollment_american_indian_count","label":"Campus 2024 Student Enrollment: American Indian Count","position":189,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTINDP","disposition":"fact","field":"campus_2024_student_enrollment_american_indian_percent","label":"Campus 2024 Student Enrollment: American Indian Percent","position":190,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTASIC","disposition":"fact","field":"campus_2024_student_enrollment_asian_count","label":"Campus 2024 Student Enrollment: Asian Count","position":191,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTASIP","disposition":"fact","field":"campus_2024_student_enrollment_asian_percent","label":"Campus 2024 Student Enrollment: Asian Percent","position":192,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTPCIC","disposition":"fact","field":"campus_2024_student_enrollment_pacific_islander_count","label":"Campus 2024 Student Enrollment: Pacific Islander Count","position":193,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTPCIP","disposition":"fact","field":"campus_2024_student_enrollment_pacific_islander_percent","label":"Campus 2024 Student Enrollment: Pacific Islander Percent","position":194,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTTWOC","disposition":"fact","field":"campus_2024_student_enrollment_two_or_more_races_count","label":"Campus 2024 Student Enrollment: Two or More Races Count","position":195,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTTWOP","disposition":"fact","field":"campus_2024_student_enrollment_two_or_more_races_percent","label":"Campus 2024 Student Enrollment: Two or More Races Percent","position":196,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTFEMC","disposition":"fact","field":"campus_2024_student_enrollment_female_count","label":"Campus 2024 Student Enrollment: Female Count","position":197,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTFEMP","disposition":"fact","field":"campus_2024_student_enrollment_female_percent","label":"Campus 2024 Student Enrollment: Female Percent","position":198,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTMALC","disposition":"fact","field":"campus_2024_student_enrollment_male_count","label":"Campus 2024 Student Enrollment: Male Count","position":199,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTMALP","disposition":"fact","field":"campus_2024_student_enrollment_male_percent","label":"Campus 2024 Student Enrollment: Male Percent","position":200,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTECOC","disposition":"fact","field":"campus_2024_student_enrollment_econ_disadv_count","label":"Campus 2024 Student Enrollment: Econ Disadv Count","position":201,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTECOP","disposition":"fact","field":"campus_2024_student_enrollment_econ_disadv_percent","label":"Campus 2024 Student Enrollment: Econ Disadv Percent","position":202,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTNEDC","disposition":"fact","field":"campus_2024_student_enrollment_non_educationally_disadv_count","label":"Campus 2024 Student Enrollment: Non-Educationally Disadv Count","position":203,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTNEDP","disposition":"fact","field":"campus_2024_student_enrollment_non_educationally_disadv_percent","label":"Campus 2024 Student Enrollment: Non-Educationally Disadv Percent","position":204,"publisher_length":"","publisher_type":"Number"},{"code":"CPNT504C","disposition":"fact","field":"campus_2024_student_enrollment_section_504_count","label":"Campus 2024 Student Enrollment: Section 504 Count","position":205,"publisher_length":"","publisher_type":"Number"},{"code":"CPNT504P","disposition":"fact","field":"campus_2024_student_enrollment_section_504_percent","label":"Campus 2024 Student Enrollment: Section 504 Percent","position":206,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTLEPC","disposition":"fact","field":"campus_2024_student_enrollment_el_count","label":"Campus 2024 Student Enrollment: EL Count","position":207,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTLEPP","disposition":"fact","field":"campus_2024_student_enrollment_el_percent","label":"Campus 2024 Student Enrollment: EL Percent","position":208,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTDSLC","disposition":"fact","field":"campus_2024_student_enrollment_dyslexia_count","label":"Campus 2024 Student Enrollment: Dyslexia Count","position":209,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTDSLP","disposition":"fact","field":"campus_2024_student_enrollment_dyslexia_percent","label":"Campus 2024 Student Enrollment: Dyslexia Percent","position":210,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTFOSC","disposition":"fact","field":"campus_2024_student_enrollment_foster_care_count","label":"Campus 2024 Student Enrollment: Foster Care Count","position":211,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTFOSP","disposition":"fact","field":"campus_2024_student_enrollment_foster_care_percent","label":"Campus 2024 Student Enrollment: Foster Care Percent","position":212,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTHOMC","disposition":"fact","field":"campus_2024_student_enrollment_homeless_count","label":"Campus 2024 Student Enrollment: Homeless Count","position":213,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTHOMP","disposition":"fact","field":"campus_2024_student_enrollment_homeless_percent","label":"Campus 2024 Student Enrollment: Homeless Percent","position":214,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTIMMC","disposition":"fact","field":"campus_2024_student_enrollment_immigrant_count","label":"Campus 2024 Student Enrollment: Immigrant Count","position":215,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTIMMP","disposition":"fact","field":"campus_2024_student_enrollment_immigrant_percent","label":"Campus 2024 Student Enrollment: Immigrant Percent","position":216,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTMIGC","disposition":"fact","field":"campus_2024_student_enrollment_migrant_count","label":"Campus 2024 Student Enrollment: Migrant Count","position":217,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTMIGP","disposition":"fact","field":"campus_2024_student_enrollment_migrant_percent","label":"Campus 2024 Student Enrollment: Migrant Percent","position":218,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTTT1C","disposition":"fact","field":"campus_2024_student_enrollment_title_i_count","label":"Campus 2024 Student Enrollment: Title I Count","position":219,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTTT1P","disposition":"fact","field":"campus_2024_student_enrollment_title_i_percent","label":"Campus 2024 Student Enrollment: Title I Percent","position":220,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTMLCC","disposition":"fact","field":"campus_2024_student_enrollment_military_connected_count","label":"Campus 2024 Student Enrollment: Military-Connected Count","position":221,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTMLCP","disposition":"fact","field":"campus_2024_student_enrollment_military_connected_percent","label":"Campus 2024 Student Enrollment: Military-Connected Percent","position":222,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTRSKC","disposition":"fact","field":"campus_2024_student_enrollment_at_risk_count","label":"Campus 2024 Student Enrollment: At Risk Count","position":223,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTRSKP","disposition":"fact","field":"campus_2024_student_enrollment_at_risk_percent","label":"Campus 2024 Student Enrollment: At Risk Percent","position":224,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTBILC","disposition":"fact","field":"campus_2024_student_enrollment_bilingual_esl_count","label":"Campus 2024 Student Enrollment: Bilingual/ESL Count","position":225,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTBILP","disposition":"fact","field":"campus_2024_student_enrollment_bilingual_esl_percent","label":"Campus 2024 Student Enrollment: Bilingual/ESL Percent","position":226,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGIFC","disposition":"fact","field":"campus_2024_student_enrollment_gifted_and_talented_count","label":"Campus 2024 Student Enrollment: Gifted & Talented Count","position":227,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTGIFP","disposition":"fact","field":"campus_2024_student_enrollment_gifted_and_talented_percent","label":"Campus 2024 Student Enrollment: Gifted & Talented Percent","position":228,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTSPEC","disposition":"fact","field":"campus_2024_student_enrollment_special_ed_count","label":"Campus 2024 Student Enrollment: Special Ed Count","position":229,"publisher_length":"","publisher_type":"Number"},{"code":"CPNTSPEP","disposition":"fact","field":"campus_2024_student_enrollment_special_ed_percent","label":"Campus 2024 Student Enrollment: Special Ed Percent","position":230,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTENGS","disposition":"fact","field":"campus_2024_class_size_sec_english_number_students","label":"Campus 2024 Class Size: Sec English - # Students","position":231,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTMATS","disposition":"fact","field":"campus_2024_class_size_sec_math_number_students","label":"Campus 2024 Class Size: Sec Math - # Students","position":232,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTSCIS","disposition":"fact","field":"campus_2024_class_size_sec_sci_number_students","label":"Campus 2024 Class Size: Sec Sci - # Students","position":233,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTSOCS","disposition":"fact","field":"campus_2024_class_size_sec_soc_stud_number_students","label":"Campus 2024 Class Size: Sec Soc Stud- # Students","position":234,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTFLAS","disposition":"fact","field":"campus_2024_class_size_sec_for_lng_number_students","label":"Campus 2024 Class Size: Sec For Lng - # Students","position":235,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTGKGS","disposition":"fact","field":"campus_2024_class_size_kindergarten_number_students","label":"Campus 2024 Class Size: Kindergarten- # Students","position":236,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG01S","disposition":"fact","field":"campus_2024_class_size_grade_1_number_students","label":"Campus 2024 Class Size: Grade 1 - # Students","position":237,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG02S","disposition":"fact","field":"campus_2024_class_size_grade_2_number_students","label":"Campus 2024 Class Size: Grade 2 - # Students","position":238,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG03S","disposition":"fact","field":"campus_2024_class_size_grade_3_number_students","label":"Campus 2024 Class Size: Grade 3 - # Students","position":239,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG04S","disposition":"fact","field":"campus_2024_class_size_grade_4_number_students","label":"Campus 2024 Class Size: Grade 4 - # Students","position":240,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG05S","disposition":"fact","field":"campus_2024_class_size_grade_5_number_students","label":"Campus 2024 Class Size: Grade 5 - # Students","position":241,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG06S","disposition":"fact","field":"campus_2024_class_size_grade_6_number_students","label":"Campus 2024 Class Size: Grade 6 - # Students","position":242,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTGMES","disposition":"fact","field":"campus_2024_class_size_mixed_elem_number_students","label":"Campus 2024 Class Size: Mixed Elem. - # Students","position":243,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTENGC","disposition":"fact","field":"campus_2024_class_size_sec_english_number_classes","label":"Campus 2024 Class Size: Sec English - # Classes","position":244,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTMATC","disposition":"fact","field":"campus_2024_class_size_sec_math_number_classes","label":"Campus 2024 Class Size: Sec Math - # Classes","position":245,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTSCIC","disposition":"fact","field":"campus_2024_class_size_sec_sci_number_classes","label":"Campus 2024 Class Size: Sec Sci - # Classes","position":246,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTSOCC","disposition":"fact","field":"campus_2024_class_size_sec_soc_stud_number_classes","label":"Campus 2024 Class Size: Sec Soc Stud- # Classes","position":247,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTFLAC","disposition":"fact","field":"campus_2024_class_size_sec_for_lng_number_classes","label":"Campus 2024 Class Size: Sec For Lng - # Classes","position":248,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTGKGC","disposition":"fact","field":"campus_2024_class_size_kindergarten_number_classes","label":"Campus 2024 Class Size: Kindergarten- # Classes","position":249,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG01C","disposition":"fact","field":"campus_2024_class_size_grade_1_number_classes","label":"Campus 2024 Class Size: Grade 1 - # Classes","position":250,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG02C","disposition":"fact","field":"campus_2024_class_size_grade_2_number_classes","label":"Campus 2024 Class Size: Grade 2 - # Classes","position":251,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG03C","disposition":"fact","field":"campus_2024_class_size_grade_3_number_classes","label":"Campus 2024 Class Size: Grade 3 - # Classes","position":252,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG04C","disposition":"fact","field":"campus_2024_class_size_grade_4_number_classes","label":"Campus 2024 Class Size: Grade 4 - # Classes","position":253,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG05C","disposition":"fact","field":"campus_2024_class_size_grade_5_number_classes","label":"Campus 2024 Class Size: Grade 5 - # Classes","position":254,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG06C","disposition":"fact","field":"campus_2024_class_size_grade_6_number_classes","label":"Campus 2024 Class Size: Grade 6 - # Classes","position":255,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTGMEC","disposition":"fact","field":"campus_2024_class_size_mixed_elem_number_classes","label":"Campus 2024 Class Size: Mixed Elem. - # Classes","position":256,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTENGA","disposition":"fact","field":"campus_2024_class_size_sec_english_avg_size","label":"Campus 2024 Class Size: Sec English - Avg Size","position":257,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTMATA","disposition":"fact","field":"campus_2024_class_size_sec_math_avg_size","label":"Campus 2024 Class Size: Sec Math - Avg Size","position":258,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTSCIA","disposition":"fact","field":"campus_2024_class_size_sec_sci_avg_size","label":"Campus 2024 Class Size: Sec Sci - Avg Size","position":259,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTSOCA","disposition":"fact","field":"campus_2024_class_size_sec_soc_stud_avg_size","label":"Campus 2024 Class Size: Sec Soc Stud- Avg Size","position":260,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTFLAA","disposition":"fact","field":"campus_2024_class_size_sec_for_lng_avg_size","label":"Campus 2024 Class Size: Sec For Lng - Avg Size","position":261,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTGKGA","disposition":"fact","field":"campus_2024_class_size_kindergarten_avg_size","label":"Campus 2024 Class Size: Kindergarten- Avg Size","position":262,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG01A","disposition":"fact","field":"campus_2024_class_size_grade_1_avg_size","label":"Campus 2024 Class Size: Grade 1 - Avg Size","position":263,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG02A","disposition":"fact","field":"campus_2024_class_size_grade_2_avg_size","label":"Campus 2024 Class Size: Grade 2 - Avg Size","position":264,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG03A","disposition":"fact","field":"campus_2024_class_size_grade_3_avg_size","label":"Campus 2024 Class Size: Grade 3 - Avg Size","position":265,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG04A","disposition":"fact","field":"campus_2024_class_size_grade_4_avg_size","label":"Campus 2024 Class Size: Grade 4 - Avg Size","position":266,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG05A","disposition":"fact","field":"campus_2024_class_size_grade_5_avg_size","label":"Campus 2024 Class Size: Grade 5 - Avg Size","position":267,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTG06A","disposition":"fact","field":"campus_2024_class_size_grade_6_avg_size","label":"Campus 2024 Class Size: Grade 6 - Avg Size","position":268,"publisher_length":"","publisher_type":"Number"},{"code":"CPCTGMEA","disposition":"fact","field":"campus_2024_class_size_mixed_elem_avg_size","label":"Campus 2024 Class Size: Mixed Elem. - Avg Size","position":269,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTOFC","disposition":"fact","field":"campus_2024_staff_teacher_total_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Total Full Time Equiv Count","position":270,"publisher_length":"","publisher_type":"Number"},{"code":"CPSUTOFC","disposition":"fact","field":"campus_2024_staff_support_total_full_time_equiv_count","label":"Campus 2024 Staff: Support Total Full Time Equiv Count","position":271,"publisher_length":"","publisher_type":"Number"},{"code":"CPSSTOFC","disposition":"fact","field":"campus_2024_staff_school_admin_total_full_time_equiv_count","label":"Campus 2024 Staff: School Admin Total Full Time Equiv Count","position":272,"publisher_length":"","publisher_type":"Number"},{"code":"CPSETOFC","disposition":"fact","field":"campus_2024_staff_educ_aide_total_full_time_equiv_count","label":"Campus 2024 Staff: Educ Aide Total Full Time Equiv Count","position":273,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTOST","disposition":"fact","field":"campus_2024_staff_teacher_total_base_salary_total","label":"Campus 2024 Staff: Teacher Total Base Salary Total","position":274,"publisher_length":"","publisher_type":"Number"},{"code":"CPSUTOST","disposition":"fact","field":"campus_2024_staff_support_total_base_salary_total","label":"Campus 2024 Staff: Support Total Base Salary Total","position":275,"publisher_length":"","publisher_type":"Number"},{"code":"CPSSTOST","disposition":"fact","field":"campus_2024_staff_school_admin_total_base_salary_total","label":"Campus 2024 Staff: School Admin Total Base Salary Total","position":276,"publisher_length":"","publisher_type":"Number"},{"code":"CPST00FC","disposition":"fact","field":"campus_2024_staff_teacher_beginning_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Beginning Full Time Equiv Count","position":277,"publisher_length":"","publisher_type":"Number"},{"code":"CPST01FC","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 1-5 Years Full Time Equiv Count","position":278,"publisher_length":"","publisher_type":"Number"},{"code":"CPST06FC","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 6-10 Years Full Time Equiv Count","position":279,"publisher_length":"","publisher_type":"Number"},{"code":"CPST11FC","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 11-20 Years Full Time Equiv Count","position":280,"publisher_length":"","publisher_type":"Number"},{"code":"CPST21FC","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 21-30 Years Full Time Equiv Count","position":281,"publisher_length":"","publisher_type":"Number"},{"code":"CPST30FC","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher > 30 Years Full Time Equiv Count","position":282,"publisher_length":"","publisher_type":"Number"},{"code":"CPST00ST","disposition":"fact","field":"campus_2024_staff_teacher_beginning_base_salary_total","label":"Campus 2024 Staff: Teacher Beginning Base Salary Total","position":283,"publisher_length":"","publisher_type":"Number"},{"code":"CPST01ST","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_base_salary_total","label":"Campus 2024 Staff: Teacher 1-5 Years Base Salary Total","position":284,"publisher_length":"","publisher_type":"Number"},{"code":"CPST06ST","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_base_salary_total","label":"Campus 2024 Staff: Teacher 6-10 Years Base Salary Total","position":285,"publisher_length":"","publisher_type":"Number"},{"code":"CPST11ST","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_base_salary_total","label":"Campus 2024 Staff: Teacher 11-20 Years Base Salary Total","position":286,"publisher_length":"","publisher_type":"Number"},{"code":"CPST21ST","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_base_salary_total","label":"Campus 2024 Staff: Teacher 21-30 Years Base Salary Total","position":287,"publisher_length":"","publisher_type":"Number"},{"code":"CPST30ST","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_base_salary_total","label":"Campus 2024 Staff: Teacher > 30 Years Base Salary Total","position":288,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTNOFC","disposition":"fact","field":"campus_2024_staff_teacher_no_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher No Degree Full Time Equiv Count","position":289,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTBAFC","disposition":"fact","field":"campus_2024_staff_teacher_ba_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher BA Degree Full Time Equiv Count","position":290,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTMSFC","disposition":"fact","field":"campus_2024_staff_teacher_ms_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher MS Degree Full Time Equiv Count","position":291,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTPHFC","disposition":"fact","field":"campus_2024_staff_teacher_ph_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher PH Degree Full Time Equiv Count","position":292,"publisher_length":"","publisher_type":"Number"},{"code":"CPSPTOFC","disposition":"fact","field":"campus_2024_staff_professional_total_full_time_equiv_count","label":"Campus 2024 Staff: Professional Total Full Time Equiv Count","position":293,"publisher_length":"","publisher_type":"Number"},{"code":"CPSATOFC","disposition":"fact","field":"campus_2024_staff_all_staff_total_full_time_equiv_count","label":"Campus 2024 Staff: All Staff Total Full Time Equiv Count","position":294,"publisher_length":"","publisher_type":"Number"},{"code":"CPSRTOPC","disposition":"fact","field":"campus_2024_staff_counselor_total_part_time_equiv_count","label":"Campus 2024 Staff: Counselor Total Part Time Equiv Count","position":295,"publisher_length":"","publisher_type":"Number"},{"code":"CPSRTOFC","disposition":"fact","field":"campus_2024_staff_counselor_total_full_time_equiv_count","label":"Campus 2024 Staff: Counselor Total Full Time Equiv Count","position":296,"publisher_length":"","publisher_type":"Number"},{"code":"CPSBTOPC","disposition":"fact","field":"campus_2024_staff_librarian_total_part_time_equiv_count","label":"Campus 2024 Staff: Librarian Total Part Time Equiv Count","position":297,"publisher_length":"","publisher_type":"Number"},{"code":"CPSBTOFC","disposition":"fact","field":"campus_2024_staff_librarian_total_full_time_equiv_count","label":"Campus 2024 Staff: Librarian Total Full Time Equiv Count","position":298,"publisher_length":"","publisher_type":"Number"},{"code":"CPSUTOSA","disposition":"fact","field":"campus_2024_staff_support_total_base_salary_average","label":"Campus 2024 Staff: Support Total Base Salary Average","position":299,"publisher_length":"","publisher_type":"Number"},{"code":"CPSSTOSA","disposition":"fact","field":"campus_2024_staff_school_admin_total_base_salary_average","label":"Campus 2024 Staff: School Admin Total Base Salary Average","position":300,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTOSA","disposition":"fact","field":"campus_2024_staff_teacher_total_base_salary_average","label":"Campus 2024 Staff: Teacher Total Base Salary Average","position":301,"publisher_length":"","publisher_type":"Number"},{"code":"CPST00SA","disposition":"fact","field":"campus_2024_staff_teacher_beginning_base_salary_average","label":"Campus 2024 Staff: Teacher Beginning Base Salary Average","position":302,"publisher_length":"","publisher_type":"Number"},{"code":"CPST01SA","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_base_salary_average","label":"Campus 2024 Staff: Teacher 1-5 Years Base Salary Average","position":303,"publisher_length":"","publisher_type":"Number"},{"code":"CPST06SA","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_base_salary_average","label":"Campus 2024 Staff: Teacher 6-10 Years Base Salary Average","position":304,"publisher_length":"","publisher_type":"Number"},{"code":"CPST11SA","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_base_salary_average","label":"Campus 2024 Staff: Teacher 11-20 Years Base Salary Average","position":305,"publisher_length":"","publisher_type":"Number"},{"code":"CPST21SA","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_base_salary_average","label":"Campus 2024 Staff: Teacher 21-30 Years Base Salary Average","position":306,"publisher_length":"","publisher_type":"Number"},{"code":"CPST30SA","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_base_salary_average","label":"Campus 2024 Staff: Teacher > 30 Years Base Salary Average","position":307,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTINFC","disposition":"fact","field":"campus_2024_staff_teacher_american_indian_full_time_equiv_count","label":"Campus 2024 Staff: Teacher American Indian Full Time Equiv Count","position":308,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTPIFC","disposition":"fact","field":"campus_2024_staff_teacher_pacific_islander_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Pacific Islander Full Time Equiv Count","position":309,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTASFC","disposition":"fact","field":"campus_2024_staff_teacher_asian_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Asian Full Time Equiv Count","position":310,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTBLFC","disposition":"fact","field":"campus_2024_staff_teacher_african_american_full_time_equiv_count","label":"Campus 2024 Staff: Teacher African American Full Time Equiv Count","position":311,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTHIFC","disposition":"fact","field":"campus_2024_staff_teacher_hispanic_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Hispanic Full Time Equiv Count","position":312,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTWHFC","disposition":"fact","field":"campus_2024_staff_teacher_white_full_time_equiv_count","label":"Campus 2024 Staff: Teacher White Full Time Equiv Count","position":313,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTWFC","disposition":"fact","field":"campus_2024_staff_teacher_two_or_more_races_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Two or more races Full Time Equiv Count","position":314,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTMAFC","disposition":"fact","field":"campus_2024_staff_teacher_male_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Male Full Time Equiv Count","position":315,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTFEFC","disposition":"fact","field":"campus_2024_staff_teacher_female_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Female Full Time Equiv Count","position":316,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTFTEC","disposition":"fact","field":"campus_2024_staff_teacher_total_full_time_equiv_experience_calculation","label":"Campus 2024 Staff: Teacher Total Full Time Equiv - Experience Calculation","position":317,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTENA","disposition":"fact","field":"campus_2024_staff_teacher_tenure_average","label":"Campus 2024 Staff: Teacher Tenure Average","position":318,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTEXPA","disposition":"fact","field":"campus_2024_staff_teacher_experience_average","label":"Campus 2024 Staff: Teacher Experience Average","position":319,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTREFC","disposition":"fact","field":"campus_2024_staff_teacher_regular_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Regular Program Full Time Equiv Count","position":320,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTVOFC","disposition":"fact","field":"campus_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":321,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTBIFC","disposition":"fact","field":"campus_2024_staff_teacher_bilingual_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Bilingual Program Full Time Equiv Count","position":322,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTCOFC","disposition":"fact","field":"campus_2024_staff_teacher_compensatory_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Compensatory Program Full Time Equiv Count","position":323,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTGIFC","disposition":"fact","field":"campus_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":324,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTSPFC","disposition":"fact","field":"campus_2024_staff_teacher_special_education_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Special Education Full Time Equiv Count","position":325,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTOPFC","disposition":"fact","field":"campus_2024_staff_teacher_other_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Other Full Time Equiv Count","position":326,"publisher_length":"","publisher_type":"Number"},{"code":"CPSOTOFC","disposition":"fact","field":"campus_2024_staff_contract_serv_total_full_time_equiv_count","label":"Campus 2024 Staff: Contract Serv Total Full Time Equiv Count","position":327,"publisher_length":"","publisher_type":"Number"},{"code":"CPSHEXPA","disposition":"fact","field":"campus_2024_staff_principal_experience_average","label":"Campus 2024 Staff: Principal Experience Average","position":328,"publisher_length":"","publisher_type":"Number"},{"code":"CPSHTENA","disposition":"fact","field":"campus_2024_staff_principal_tenure_average","label":"Campus 2024 Staff: Principal Tenure Average","position":329,"publisher_length":"","publisher_type":"Number"},{"code":"CPSLEXPA","disposition":"fact","field":"campus_2024_staff_assistant_principal_experience_average","label":"Campus 2024 Staff: Assistant Principal Experience Average","position":330,"publisher_length":"","publisher_type":"Number"},{"code":"CPSLTENA","disposition":"fact","field":"campus_2024_staff_assistant_principal_tenure_average","label":"Campus 2024 Staff: Assistant Principal Tenure Average","position":331,"publisher_length":"","publisher_type":"Number"},{"code":"CPSHEXPT","disposition":"fact","field":"campus_2024_staff_principal_experience_total","label":"Campus 2024 Staff: Principal Experience Total","position":332,"publisher_length":"","publisher_type":"Number"},{"code":"CPSHTENT","disposition":"fact","field":"campus_2024_staff_principal_tenure_total","label":"Campus 2024 Staff: Principal Tenure Total","position":333,"publisher_length":"","publisher_type":"Number"},{"code":"CPSLEXPT","disposition":"fact","field":"campus_2024_staff_assistant_principal_experience_total","label":"Campus 2024 Staff: Assistant Principal Experience Total","position":334,"publisher_length":"","publisher_type":"Number"},{"code":"CPSLTENT","disposition":"fact","field":"campus_2024_staff_assistant_principal_tenure_total","label":"Campus 2024 Staff: Assistant Principal Tenure Total","position":335,"publisher_length":"","publisher_type":"Number"},{"code":"CPSHFTEC","disposition":"fact","field":"campus_2024_staff_principal_count","label":"Campus 2024 Staff: Principal Count","position":336,"publisher_length":"","publisher_type":"Number"},{"code":"CPSLFTEC","disposition":"fact","field":"campus_2024_staff_assistant_principal_count","label":"Campus 2024 Staff: Assistant Principal Count","position":337,"publisher_length":"","publisher_type":"Number"},{"code":"CPSAMIFC","disposition":"fact","field":"campus_2024_staff_all_staff_minority_full_time_equiv_count","label":"Campus 2024 Staff: All Staff Minority Full Time Equiv Count","position":338,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTEXPT","disposition":"fact","field":"campus_2024_staff_teacher_experience_total","label":"Campus 2024 Staff: Teacher Experience Total","position":339,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTENT","disposition":"fact","field":"campus_2024_staff_teacher_tenure_total","label":"Campus 2024 Staff: Teacher Tenure Total","position":340,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTOFP","disposition":"fact","field":"campus_2024_staff_teacher_total_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Total Full Time Equiv Percent","position":341,"publisher_length":"","publisher_type":"Number"},{"code":"CPSUTOFP","disposition":"fact","field":"campus_2024_staff_support_total_full_time_equiv_percent","label":"Campus 2024 Staff: Support Total Full Time Equiv Percent","position":342,"publisher_length":"","publisher_type":"Number"},{"code":"CPSSTOFP","disposition":"fact","field":"campus_2024_staff_school_admin_total_full_time_equiv_percent","label":"Campus 2024 Staff: School Admin Total Full Time Equiv Percent","position":343,"publisher_length":"","publisher_type":"Number"},{"code":"CPSETOFP","disposition":"fact","field":"campus_2024_staff_educ_aide_total_full_time_equiv_percent","label":"Campus 2024 Staff: Educ Aide Total Full Time Equiv Percent","position":344,"publisher_length":"","publisher_type":"Number"},{"code":"CPSPTOFP","disposition":"fact","field":"campus_2024_staff_professional_total_full_time_equiv_percent","label":"Campus 2024 Staff: Professional Total Full Time Equiv Percent","position":345,"publisher_length":"","publisher_type":"Number"},{"code":"CPSAMIFP","disposition":"fact","field":"campus_2024_staff_all_staff_minority_full_time_equiv_percent","label":"Campus 2024 Staff: All Staff Minority Full Time Equiv Percent","position":346,"publisher_length":"","publisher_type":"Number"},{"code":"CPST00FP","disposition":"fact","field":"campus_2024_staff_teacher_beginning_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Beginning Full Time Equiv Percent","position":347,"publisher_length":"","publisher_type":"Number"},{"code":"CPST01FP","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":348,"publisher_length":"","publisher_type":"Number"},{"code":"CPST06FP","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":349,"publisher_length":"","publisher_type":"Number"},{"code":"CPST11FP","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":350,"publisher_length":"","publisher_type":"Number"},{"code":"CPST21FP","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":351,"publisher_length":"","publisher_type":"Number"},{"code":"CPST30FP","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher > 30 Years Full Time Equiv Percent","position":352,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTREFP","disposition":"fact","field":"campus_2024_staff_teacher_regular_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Regular Program Full Time Equiv Percent","position":353,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTVOFP","disposition":"fact","field":"campus_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":354,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTBIFP","disposition":"fact","field":"campus_2024_staff_teacher_bilingual_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":355,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTCOFP","disposition":"fact","field":"campus_2024_staff_teacher_compensatory_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":356,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTGIFP","disposition":"fact","field":"campus_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":357,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTSPFP","disposition":"fact","field":"campus_2024_staff_teacher_special_education_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Special Education Full Time Equiv Percent","position":358,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTOPFP","disposition":"fact","field":"campus_2024_staff_teacher_other_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Other Full Time Equiv Percent","position":359,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTNOFP","disposition":"fact","field":"campus_2024_staff_teacher_no_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher No Degree Full Time Equiv Percent","position":360,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTBAFP","disposition":"fact","field":"campus_2024_staff_teacher_ba_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher BA Degree Full Time Equiv Percent","position":361,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTMSFP","disposition":"fact","field":"campus_2024_staff_teacher_ms_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher MS Degree Full Time Equiv Percent","position":362,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTPHFP","disposition":"fact","field":"campus_2024_staff_teacher_ph_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher PH Degree Full Time Equiv Percent","position":363,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTWHFP","disposition":"fact","field":"campus_2024_staff_teacher_white_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher White Full Time Equiv Percent","position":364,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTBLFP","disposition":"fact","field":"campus_2024_staff_teacher_african_american_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher African American Full Time Equiv Percent","position":365,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTHIFP","disposition":"fact","field":"campus_2024_staff_teacher_hispanic_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Hispanic Full Time Equiv Percent","position":366,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTPIFP","disposition":"fact","field":"campus_2024_staff_teacher_pacific_islander_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":367,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTINFP","disposition":"fact","field":"campus_2024_staff_teacher_american_indian_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher American Indian Full Time Equiv Percent","position":368,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTASFP","disposition":"fact","field":"campus_2024_staff_teacher_asian_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Asian Full Time Equiv Percent","position":369,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTTWFP","disposition":"fact","field":"campus_2024_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Two or more races Full Time Equiv Percent","position":370,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTMAFP","disposition":"fact","field":"campus_2024_staff_teacher_male_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Male Full Time Equiv Percent","position":371,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTFEFP","disposition":"fact","field":"campus_2024_staff_teacher_female_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Female Full Time Equiv Percent","position":372,"publisher_length":"","publisher_type":"Number"},{"code":"CPSTKIDR","disposition":"fact","field":"campus_2024_staff_teacher_student_ratio","label":"Campus 2024 Staff: Teacher Student Ratio","position":373,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GR23N","disposition":"fact","field":"campus_2023_graduates_all_students_count_including_fhsp","label":"Campus 2023 Graduates: All Students Count (including FHSP)","position":374,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GM23N","disposition":"fact","field":"campus_2023_graduates_minimum_hs_pgm_all_students_count","label":"Campus 2023 Graduates: Minimum HS PGM All Students Count","position":375,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GH23N","disposition":"fact","field":"campus_2023_graduates_rhsp_dap_all_students_count","label":"Campus 2023 Graduates: RHSP/DAP All Students Count","position":376,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GN23N","disposition":"fact","field":"campus_2023_graduates_fhsp_no_endorsement_all_students_count","label":"Campus 2023 Graduates: FHSP No Endorsement All Students Count","position":377,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GE23N","disposition":"fact","field":"campus_2023_graduates_fhsp_e_all_students_count","label":"Campus 2023 Graduates: FHSP-E All Students Count","position":378,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GA23N","disposition":"fact","field":"campus_2023_graduates_fhsp_dla_all_students_count","label":"Campus 2023 Graduates: FHSP-DLA All Students Count","position":379,"publisher_length":"","publisher_type":"Number"},{"code":"CB0GR23N","disposition":"fact","field":"campus_2023_graduates_african_american_count","label":"Campus 2023 Graduates: African American Count","position":380,"publisher_length":"","publisher_type":"Number"},{"code":"CH0GR23N","disposition":"fact","field":"campus_2023_graduates_hispanic_count","label":"Campus 2023 Graduates: Hispanic Count","position":381,"publisher_length":"","publisher_type":"Number"},{"code":"CW0GR23N","disposition":"fact","field":"campus_2023_graduates_white_count","label":"Campus 2023 Graduates: White Count","position":382,"publisher_length":"","publisher_type":"Number"},{"code":"CI0GR23N","disposition":"fact","field":"campus_2023_graduates_american_indian_count","label":"Campus 2023 Graduates: American Indian Count","position":383,"publisher_length":"","publisher_type":"Number"},{"code":"C30GR23N","disposition":"fact","field":"campus_2023_graduates_asian_count","label":"Campus 2023 Graduates: Asian Count","position":384,"publisher_length":"","publisher_type":"Number"},{"code":"C40GR23N","disposition":"fact","field":"campus_2023_graduates_pacific_islander_count","label":"Campus 2023 Graduates: Pacific Islander Count","position":385,"publisher_length":"","publisher_type":"Number"},{"code":"C20GR23N","disposition":"fact","field":"campus_2023_graduates_two_or_more_races_count","label":"Campus 2023 Graduates: Two or More Races Count","position":386,"publisher_length":"","publisher_type":"Number"},{"code":"CE0GR23N","disposition":"fact","field":"campus_2023_graduates_econ_disadv_count","label":"Campus 2023 Graduates: Econ Disadv Count","position":387,"publisher_length":"","publisher_type":"Number"},{"code":"CS0GR23N","disposition":"fact","field":"campus_2023_graduates_special_ed_count","label":"Campus 2023 Graduates: Special Ed Count","position":388,"publisher_length":"","publisher_type":"Number"},{"code":"CL0GR23N","disposition":"fact","field":"campus_2023_graduates_eb_el_count","label":"Campus 2023 Graduates: EB/EL Count","position":389,"publisher_length":"","publisher_type":"Number"},{"code":"CR0GR23N","disposition":"fact","field":"campus_2023_graduates_at_risk_count","label":"Campus 2023 Graduates: At Risk Count","position":390,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GH23P","disposition":"fact","field":"campus_2023_graduates_rhsp_dap_all_students_percent_profile_only","label":"Campus 2023 Graduates: RHSP/DAP All Students % (Profile Only)","position":391,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GN23P","disposition":"fact","field":"campus_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only","label":"Campus 2023 Graduates: FHSP No Endorsement All Students % (Profile Only)","position":392,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GE23P","disposition":"fact","field":"campus_2023_graduates_fhsp_e_all_students_percent_profile_only","label":"Campus 2023 Graduates: FHSP-E All Students % (Profile Only)","position":393,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GA23P","disposition":"fact","field":"campus_2023_graduates_fhsp_dla_all_students_percent_profile_only","label":"Campus 2023 Graduates: FHSP-DLA All Students % (Profile Only)","position":394,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GR23R","disposition":"fact","field":"campus_2023_graduates_all_students_group_percent","label":"Campus 2023 Graduates: All Students Group %","position":395,"publisher_length":"","publisher_type":"Number"},{"code":"CB0GR23R","disposition":"fact","field":"campus_2023_graduates_african_american_student_group_percent","label":"Campus 2023 Graduates: African American Student Group %","position":396,"publisher_length":"","publisher_type":"Number"},{"code":"CH0GR23R","disposition":"fact","field":"campus_2023_graduates_hispanic_student_group_percent","label":"Campus 2023 Graduates: Hispanic Student Group %","position":397,"publisher_length":"","publisher_type":"Number"},{"code":"CW0GR23R","disposition":"fact","field":"campus_2023_graduates_white_student_group_percent","label":"Campus 2023 Graduates: White Student Group %","position":398,"publisher_length":"","publisher_type":"Number"},{"code":"CI0GR23R","disposition":"fact","field":"campus_2023_graduates_american_indian_student_group_percent","label":"Campus 2023 Graduates: American Indian Student Group %","position":399,"publisher_length":"","publisher_type":"Number"},{"code":"C30GR23R","disposition":"fact","field":"campus_2023_graduates_asian_student_group_percent","label":"Campus 2023 Graduates: Asian Student Group %","position":400,"publisher_length":"","publisher_type":"Number"},{"code":"C40GR23R","disposition":"fact","field":"campus_2023_graduates_pacific_islander_student_group_percent","label":"Campus 2023 Graduates: Pacific Islander Student Group %","position":401,"publisher_length":"","publisher_type":"Number"},{"code":"C20GR23R","disposition":"fact","field":"campus_2023_graduates_two_or_more_races_student_group_percent","label":"Campus 2023 Graduates: Two or More Races Student Group %","position":402,"publisher_length":"","publisher_type":"Number"},{"code":"CE0GR23R","disposition":"fact","field":"campus_2023_graduates_econ_disadv_student_group_percent","label":"Campus 2023 Graduates: Econ Disadv Student Group %","position":403,"publisher_length":"","publisher_type":"Number"},{"code":"CS0GR23R","disposition":"fact","field":"campus_2023_graduates_special_ed_student_group_percent","label":"Campus 2023 Graduates: Special Ed Student Group %","position":404,"publisher_length":"","publisher_type":"Number"},{"code":"CL0GR23R","disposition":"fact","field":"campus_2023_graduates_eb_el_student_group_percent","label":"Campus 2023 Graduates: EB/EL Student Group %","position":405,"publisher_length":"","publisher_type":"Number"},{"code":"CR0GR23R","disposition":"fact","field":"campus_2023_graduates_at_risk_student_group_percent","label":"Campus 2023 Graduates: At Risk Student Group %","position":406,"publisher_length":"","publisher_type":"Number"},{"code":"CA0GM23P","disposition":"fact","field":"campus_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only","label":"Campus 2023 Graduates: Minimum HS PGM All Students % (Profile Only)","position":407,"publisher_length":"","publisher_type":"Number"}],"input_sha256":"36649862475a49e69d739cb938fceaef14de581d146f7862c13dfc95229fd7fa","layout":{"annotations":[],"code_record":1,"first_data_record":2,"label_record":null,"last_data_record":9083},"source_schema_sha256":"d82583397b271ef0d6ea023e8e849818ae65639a851906d2fc64021800fb7b04","table":"profile"}]},{"dataset":"district_tapr_student_staff_profile","edition":"2024","prepared_input_sha256":"3afc6cacad5ebdaeb3f55f874da505c3368b7a708cb647484ed436d49c8526a9","tables":[{"dictionary":{"filename":"DISTPROF_2023-2024_data_elements.xlsx","sha256":"5c36279aea77e3d3b3e9655e1ed2218d74f935c24e2809a0809649d96fa84efa","sheet_name":"Sheet1"},"fields":[{"code":"DISTRICT","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_length":"6","publisher_type":"Character"},{"code":"DISTNAME","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_length":"75","publisher_type":"Character"},{"code":"DPETGEEC","disposition":"fact","field":"district_2024_student_membership_ee_count","label":"District 2024 Student Membership: EE Count","position":3,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGPKC","disposition":"fact","field":"district_2024_student_membership_pk_count","label":"District 2024 Student Membership: PK Count","position":4,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGKNC","disposition":"fact","field":"district_2024_student_membership_kg_count","label":"District 2024 Student Membership: KG Count","position":5,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG01C","disposition":"fact","field":"district_2024_student_membership_01_count","label":"District 2024 Student Membership: 01 Count","position":6,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG02C","disposition":"fact","field":"district_2024_student_membership_02_count","label":"District 2024 Student Membership: 02 Count","position":7,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG03C","disposition":"fact","field":"district_2024_student_membership_03_count","label":"District 2024 Student Membership: 03 Count","position":8,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG04C","disposition":"fact","field":"district_2024_student_membership_04_count","label":"District 2024 Student Membership: 04 Count","position":9,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG05C","disposition":"fact","field":"district_2024_student_membership_05_count","label":"District 2024 Student Membership: 05 Count","position":10,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG06C","disposition":"fact","field":"district_2024_student_membership_06_count","label":"District 2024 Student Membership: 06 Count","position":11,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG07C","disposition":"fact","field":"district_2024_student_membership_07_count","label":"District 2024 Student Membership: 07 Count","position":12,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG08C","disposition":"fact","field":"district_2024_student_membership_08_count","label":"District 2024 Student Membership: 08 Count","position":13,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG09C","disposition":"fact","field":"district_2024_student_membership_09_count","label":"District 2024 Student Membership: 09 Count","position":14,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG10C","disposition":"fact","field":"district_2024_student_membership_10_count","label":"District 2024 Student Membership: 10 Count","position":15,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG11C","disposition":"fact","field":"district_2024_student_membership_11_count","label":"District 2024 Student Membership: 11 Count","position":16,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG12C","disposition":"fact","field":"district_2024_student_membership_12_count","label":"District 2024 Student Membership: 12 Count","position":17,"publisher_length":"","publisher_type":"Number"},{"code":"DPETALLC","disposition":"fact","field":"district_2024_student_membership_all_students_count","label":"District 2024 Student Membership: All Students Count","position":18,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSPEC","disposition":"fact","field":"district_2024_student_membership_special_ed_count","label":"District 2024 Student Membership: Special Ed Count","position":19,"publisher_length":"","publisher_type":"Number"},{"code":"DPETBILC","disposition":"fact","field":"district_2024_student_membership_bilingual_esl_count","label":"District 2024 Student Membership: Bilingual/ESL Count","position":20,"publisher_length":"","publisher_type":"Number"},{"code":"DPETVOCC","disposition":"fact","field":"district_2024_student_membership_career_and_technical_education_count","label":"District 2024 Student Membership: Career & Technical Education Count","position":21,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGIFC","disposition":"fact","field":"district_2024_student_membership_gifted_and_talented_count","label":"District 2024 Student Membership: Gifted & Talented Count","position":22,"publisher_length":"","publisher_type":"Number"},{"code":"DPETLEPC","disposition":"fact","field":"district_2024_student_membership_eb_el_count","label":"District 2024 Student Membership: EB/EL Count","position":23,"publisher_length":"","publisher_type":"Number"},{"code":"DPETECOC","disposition":"fact","field":"district_2024_student_membership_econ_disadv_count","label":"District 2024 Student Membership: Econ Disadv Count","position":24,"publisher_length":"","publisher_type":"Number"},{"code":"DPETNEDC","disposition":"fact","field":"district_2024_student_membership_non_educationally_disadv_count","label":"District 2024 Student Membership: Non-Educationally Disadv Count","position":25,"publisher_length":"","publisher_type":"Number"},{"code":"DPETRSKC","disposition":"fact","field":"district_2024_student_membership_at_risk_count","label":"District 2024 Student Membership: At Risk Count","position":26,"publisher_length":"","publisher_type":"Number"},{"code":"DPETINDC","disposition":"fact","field":"district_2024_student_membership_american_indian_count","label":"District 2024 Student Membership: American Indian Count","position":27,"publisher_length":"","publisher_type":"Number"},{"code":"DPETASIC","disposition":"fact","field":"district_2024_student_membership_asian_count","label":"District 2024 Student Membership: Asian Count","position":28,"publisher_length":"","publisher_type":"Number"},{"code":"DPETPCIC","disposition":"fact","field":"district_2024_student_membership_pacific_islander_count","label":"District 2024 Student Membership: Pacific Islander Count","position":29,"publisher_length":"","publisher_type":"Number"},{"code":"DPETTWOC","disposition":"fact","field":"district_2024_student_membership_two_or_more_races_count","label":"District 2024 Student Membership: Two or More Races Count","position":30,"publisher_length":"","publisher_type":"Number"},{"code":"DPETBLAC","disposition":"fact","field":"district_2024_student_membership_african_american_count","label":"District 2024 Student Membership: African American Count","position":31,"publisher_length":"","publisher_type":"Number"},{"code":"DPETHISC","disposition":"fact","field":"district_2024_student_membership_hispanic_count","label":"District 2024 Student Membership: Hispanic Count","position":32,"publisher_length":"","publisher_type":"Number"},{"code":"DPETWHIC","disposition":"fact","field":"district_2024_student_membership_white_count","label":"District 2024 Student Membership: White Count","position":33,"publisher_length":"","publisher_type":"Number"},{"code":"DPETMALC","disposition":"fact","field":"district_2024_student_membership_male_count","label":"District 2024 Student Membership: Male Count","position":34,"publisher_length":"","publisher_type":"Number"},{"code":"DPETFEMC","disposition":"fact","field":"district_2024_student_membership_female_count","label":"District 2024 Student Membership: Female Count","position":35,"publisher_length":"","publisher_type":"Number"},{"code":"DPETDSLC","disposition":"fact","field":"district_2024_student_membership_dyslexia_count","label":"District 2024 Student Membership: Dyslexia Count","position":36,"publisher_length":"","publisher_type":"Number"},{"code":"DPET504C","disposition":"fact","field":"district_2024_student_membership_section_504_count","label":"District 2024 Student Membership: Section 504 Count","position":37,"publisher_length":"","publisher_type":"Number"},{"code":"DPETTT1C","disposition":"fact","field":"district_2024_student_membership_title_i_count","label":"District 2024 Student Membership: Title I Count","position":38,"publisher_length":"","publisher_type":"Number"},{"code":"DPETHOMC","disposition":"fact","field":"district_2024_student_membership_homeless_count","label":"District 2024 Student Membership: Homeless Count","position":39,"publisher_length":"","publisher_type":"Number"},{"code":"DPETIMMC","disposition":"fact","field":"district_2024_student_membership_immigrant_count","label":"District 2024 Student Membership: Immigrant Count","position":40,"publisher_length":"","publisher_type":"Number"},{"code":"DPETMIGC","disposition":"fact","field":"district_2024_student_membership_migrant_count","label":"District 2024 Student Membership: Migrant Count","position":41,"publisher_length":"","publisher_type":"Number"},{"code":"DPETMLCC","disposition":"fact","field":"district_2024_student_membership_military_connected_count","label":"District 2024 Student Membership: Military-Connected Count","position":42,"publisher_length":"","publisher_type":"Number"},{"code":"DPETFOSC","disposition":"fact","field":"district_2024_student_membership_foster_care_count","label":"District 2024 Student Membership: Foster Care Count","position":43,"publisher_length":"","publisher_type":"Number"},{"code":"DPETVHSC","disposition":"fact","field":"district_2024_student_membership_career_and_technical_9_12_education_count","label":"District 2024 Student Membership: Career & Technical (9-12) Education Count","position":44,"publisher_length":"","publisher_type":"Number"},{"code":"DPETDISD","disposition":"fact","field":"district_2023_daep_denominator","label":"District 2023 DAEP: Denominator","position":45,"publisher_length":"","publisher_type":"Number"},{"code":"DPETDISC","disposition":"fact","field":"district_2023_daep_count","label":"District 2023 DAEP: Count","position":46,"publisher_length":"","publisher_type":"Number"},{"code":"DPETDISP","disposition":"fact","field":"district_2023_daep_percent","label":"District 2023 DAEP: Percent","position":47,"publisher_length":"","publisher_type":"Number"},{"code":"DPETATTC","disposition":"fact","field":"district_2024_student_membership_2022_23_attrition_all_students_count","label":"District 2024 Student Membership: 2022-23 Attrition All Students Count","position":48,"publisher_length":"","publisher_type":"Number"},{"code":"DPETATTD","disposition":"fact","field":"district_2024_student_membership_2022_23_attrition_all_students_denominator","label":"District 2024 Student Membership: 2022-23 Attrition All Students Denominator","position":49,"publisher_length":"","publisher_type":"Number"},{"code":"DPETATTP","disposition":"fact","field":"district_2024_student_membership_2022_23_attrition_all_students_percent","label":"District 2024 Student Membership: 2022-23 Attrition All Students Percent","position":50,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSIMC","disposition":"fact","field":"district_2024_student_membership_total_students_with_disabilities_count","label":"District 2024 Student Membership: Total Students with Disabilities Count","position":51,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSINC","disposition":"fact","field":"district_2024_student_membership_intellectual_disabilities_count","label":"District 2024 Student Membership: Intellectual Disabilities Count","position":52,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSPHC","disposition":"fact","field":"district_2024_student_membership_physical_disabilities_count","label":"District 2024 Student Membership: Physical Disabilities Count","position":53,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSBHC","disposition":"fact","field":"district_2024_student_membership_behavioral_disabilities_count","label":"District 2024 Student Membership: Behavioral Disabilities Count","position":54,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSAUC","disposition":"fact","field":"district_2024_student_membership_autism_count","label":"District 2024 Student Membership: Autism Count","position":55,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSNOC","disposition":"fact","field":"district_2024_student_membership_non_categorical_early_childhood_count","label":"District 2024 Student Membership: Non-Categorical Early Childhood Count","position":56,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSINP","disposition":"fact","field":"district_2024_student_membership_intellectual_disabilities_percent","label":"District 2024 Student Membership: Intellectual Disabilities Percent","position":57,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSPHP","disposition":"fact","field":"district_2024_student_membership_physical_disabilities_percent","label":"District 2024 Student Membership: Physical Disabilities Percent","position":58,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSBHP","disposition":"fact","field":"district_2024_student_membership_behavioral_disabilities_percent","label":"District 2024 Student Membership: Behavioral Disabilities Percent","position":59,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSAUP","disposition":"fact","field":"district_2024_student_membership_autism_percent","label":"District 2024 Student Membership: Autism Percent","position":60,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSNOP","disposition":"fact","field":"district_2024_student_membership_non_categorical_early_childhood_percent","label":"District 2024 Student Membership: Non-Categorical Early Childhood Percent","position":61,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRAKR","disposition":"fact","field":"district_2023_retention_regular_ed_kg_rate","label":"District 2023 Retention: Regular Ed KG Rate","position":62,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA1R","disposition":"fact","field":"district_2023_retention_regular_ed_01_rate","label":"District 2023 Retention: Regular Ed 01 Rate","position":63,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA2R","disposition":"fact","field":"district_2023_retention_regular_ed_02_rate","label":"District 2023 Retention: Regular Ed 02 Rate","position":64,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA3R","disposition":"fact","field":"district_2023_retention_regular_ed_03_rate","label":"District 2023 Retention: Regular Ed 03 Rate","position":65,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA4R","disposition":"fact","field":"district_2023_retention_regular_ed_04_rate","label":"District 2023 Retention: Regular Ed 04 Rate","position":66,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA5R","disposition":"fact","field":"district_2023_retention_regular_ed_05_rate","label":"District 2023 Retention: Regular Ed 05 Rate","position":67,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA6R","disposition":"fact","field":"district_2023_retention_regular_ed_06_rate","label":"District 2023 Retention: Regular Ed 06 Rate","position":68,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA7R","disposition":"fact","field":"district_2023_retention_regular_ed_07_rate","label":"District 2023 Retention: Regular Ed 07 Rate","position":69,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA8R","disposition":"fact","field":"district_2023_retention_regular_ed_08_rate","label":"District 2023 Retention: Regular Ed 08 Rate","position":70,"publisher_length":"","publisher_type":"Number"},{"code":"DPERRA9R","disposition":"fact","field":"district_2023_retention_regular_ed_09_rate","label":"District 2023 Retention: Regular Ed 09 Rate","position":71,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSAKR","disposition":"fact","field":"district_2023_retention_special_ed_kg_rate","label":"District 2023 Retention: Special Ed KG Rate","position":72,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA1R","disposition":"fact","field":"district_2023_retention_special_ed_01_rate","label":"District 2023 Retention: Special Ed 01 Rate","position":73,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA2R","disposition":"fact","field":"district_2023_retention_special_ed_02_rate","label":"District 2023 Retention: Special Ed 02 Rate","position":74,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA3R","disposition":"fact","field":"district_2023_retention_special_ed_03_rate","label":"District 2023 Retention: Special Ed 03 Rate","position":75,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA4R","disposition":"fact","field":"district_2023_retention_special_ed_04_rate","label":"District 2023 Retention: Special Ed 04 Rate","position":76,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA5R","disposition":"fact","field":"district_2023_retention_special_ed_05_rate","label":"District 2023 Retention: Special Ed 05 Rate","position":77,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA6R","disposition":"fact","field":"district_2023_retention_special_ed_06_rate","label":"District 2023 Retention: Special Ed 06 Rate","position":78,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA7R","disposition":"fact","field":"district_2023_retention_special_ed_07_rate","label":"District 2023 Retention: Special Ed 07 Rate","position":79,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA8R","disposition":"fact","field":"district_2023_retention_special_ed_08_rate","label":"District 2023 Retention: Special Ed 08 Rate","position":80,"publisher_length":"","publisher_type":"Number"},{"code":"DPERSA9R","disposition":"fact","field":"district_2023_retention_special_ed_09_rate","label":"District 2023 Retention: Special Ed 09 Rate","position":81,"publisher_length":"","publisher_type":"Number"},{"code":"DAUND23C","disposition":"fact","field":"district_2023_underreported_students_count","label":"District 2023 Underreported Students: Count","position":82,"publisher_length":"","publisher_type":"Number"},{"code":"DAUND23D","disposition":"fact","field":"district_2023_underreported_students_gr_7_12_total","label":"District 2023 Underreported Students: Gr. 7-12 Total","position":83,"publisher_length":"","publisher_type":"Number"},{"code":"DAUND23R","disposition":"fact","field":"district_2023_underreported_students_rate","label":"District 2023 Underreported Students: Rate","position":84,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMALLC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_all_students_count","label":"District 2024 Student Membership: 2023 Mobility All Students Count","position":85,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMALLT","disposition":"fact","field":"district_2024_student_membership_2023_mobility_all_students_denominator","label":"District 2024 Student Membership: 2023 Mobility All Students Denominator","position":86,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMALLP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_all_students_percent","label":"District 2024 Student Membership: 2023 Mobility All Students Percent","position":87,"publisher_length":"","publisher_type":"Number"},{"code":"DPETWHIP","disposition":"fact","field":"district_2024_student_membership_white_percent","label":"District 2024 Student Membership: White Percent","position":88,"publisher_length":"","publisher_type":"Number"},{"code":"DPETBLAP","disposition":"fact","field":"district_2024_student_membership_african_american_percent","label":"District 2024 Student Membership: African American Percent","position":89,"publisher_length":"","publisher_type":"Number"},{"code":"DPETHISP","disposition":"fact","field":"district_2024_student_membership_hispanic_percent","label":"District 2024 Student Membership: Hispanic Percent","position":90,"publisher_length":"","publisher_type":"Number"},{"code":"DPETINDP","disposition":"fact","field":"district_2024_student_membership_american_indian_percent","label":"District 2024 Student Membership: American Indian Percent","position":91,"publisher_length":"","publisher_type":"Number"},{"code":"DPETASIP","disposition":"fact","field":"district_2024_student_membership_asian_percent","label":"District 2024 Student Membership: Asian Percent","position":92,"publisher_length":"","publisher_type":"Number"},{"code":"DPETPCIP","disposition":"fact","field":"district_2024_student_membership_pacific_islander_percent","label":"District 2024 Student Membership: Pacific Islander Percent","position":93,"publisher_length":"","publisher_type":"Number"},{"code":"DPETTWOP","disposition":"fact","field":"district_2024_student_membership_two_or_more_races_percent","label":"District 2024 Student Membership: Two or More Races Percent","position":94,"publisher_length":"","publisher_type":"Number"},{"code":"DPETECOP","disposition":"fact","field":"district_2024_student_membership_econ_disadv_percent","label":"District 2024 Student Membership: Econ Disadv Percent","position":95,"publisher_length":"","publisher_type":"Number"},{"code":"DPETNEDP","disposition":"fact","field":"district_2024_student_membership_non_educationally_disadv_percent","label":"District 2024 Student Membership: Non-Educationally Disadv Percent","position":96,"publisher_length":"","publisher_type":"Number"},{"code":"DPETRSKP","disposition":"fact","field":"district_2024_student_membership_at_risk_percent","label":"District 2024 Student Membership: At Risk Percent","position":97,"publisher_length":"","publisher_type":"Number"},{"code":"DPETLEPP","disposition":"fact","field":"district_2024_student_membership_eb_el_percent","label":"District 2024 Student Membership: EB/EL Percent","position":98,"publisher_length":"","publisher_type":"Number"},{"code":"DPETSPEP","disposition":"fact","field":"district_2024_student_membership_special_ed_percent","label":"District 2024 Student Membership: Special Ed Percent","position":99,"publisher_length":"","publisher_type":"Number"},{"code":"DPETVOCP","disposition":"fact","field":"district_2024_student_membership_career_and_technical_education_percent","label":"District 2024 Student Membership: Career & Technical Education Percent","position":100,"publisher_length":"","publisher_type":"Number"},{"code":"DPETBILP","disposition":"fact","field":"district_2024_student_membership_bilingual_esl_percent","label":"District 2024 Student Membership: Bilingual/ESL Percent","position":101,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGIFP","disposition":"fact","field":"district_2024_student_membership_gifted_and_talented_percent","label":"District 2024 Student Membership: Gifted & Talented Percent","position":102,"publisher_length":"","publisher_type":"Number"},{"code":"DPET504P","disposition":"fact","field":"district_2024_student_membership_section_504_percent","label":"District 2024 Student Membership: Section 504 Percent","position":103,"publisher_length":"","publisher_type":"Number"},{"code":"DPETDSLP","disposition":"fact","field":"district_2024_student_membership_dyslexia_percent","label":"District 2024 Student Membership: Dyslexia Percent","position":104,"publisher_length":"","publisher_type":"Number"},{"code":"DPETTT1P","disposition":"fact","field":"district_2024_student_membership_title_i_percent","label":"District 2024 Student Membership: Title I Percent","position":105,"publisher_length":"","publisher_type":"Number"},{"code":"DPETHOMP","disposition":"fact","field":"district_2024_student_membership_homeless_percent","label":"District 2024 Student Membership: Homeless Percent","position":106,"publisher_length":"","publisher_type":"Number"},{"code":"DPETIMMP","disposition":"fact","field":"district_2024_student_membership_immigrant_percent","label":"District 2024 Student Membership: Immigrant Percent","position":107,"publisher_length":"","publisher_type":"Number"},{"code":"DPETMIGP","disposition":"fact","field":"district_2024_student_membership_migrant_percent","label":"District 2024 Student Membership: Migrant Percent","position":108,"publisher_length":"","publisher_type":"Number"},{"code":"DPETMLCP","disposition":"fact","field":"district_2024_student_membership_military_connected_percent","label":"District 2024 Student Membership: Military-Connected Percent","position":109,"publisher_length":"","publisher_type":"Number"},{"code":"DPETFOSP","disposition":"fact","field":"district_2024_student_membership_foster_care_percent","label":"District 2024 Student Membership: Foster Care Percent","position":110,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGEEP","disposition":"fact","field":"district_2024_student_membership_ee_percent","label":"District 2024 Student Membership: EE Percent","position":111,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGPKP","disposition":"fact","field":"district_2024_student_membership_pk_percent","label":"District 2024 Student Membership: PK Percent","position":112,"publisher_length":"","publisher_type":"Number"},{"code":"DPETGKNP","disposition":"fact","field":"district_2024_student_membership_kg_percent","label":"District 2024 Student Membership: KG Percent","position":113,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG01P","disposition":"fact","field":"district_2024_student_membership_01_percent","label":"District 2024 Student Membership: 01 Percent","position":114,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG02P","disposition":"fact","field":"district_2024_student_membership_02_percent","label":"District 2024 Student Membership: 02 Percent","position":115,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG03P","disposition":"fact","field":"district_2024_student_membership_03_percent","label":"District 2024 Student Membership: 03 Percent","position":116,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG04P","disposition":"fact","field":"district_2024_student_membership_04_percent","label":"District 2024 Student Membership: 04 Percent","position":117,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG05P","disposition":"fact","field":"district_2024_student_membership_05_percent","label":"District 2024 Student Membership: 05 Percent","position":118,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG06P","disposition":"fact","field":"district_2024_student_membership_06_percent","label":"District 2024 Student Membership: 06 Percent","position":119,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG07P","disposition":"fact","field":"district_2024_student_membership_07_percent","label":"District 2024 Student Membership: 07 Percent","position":120,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG08P","disposition":"fact","field":"district_2024_student_membership_08_percent","label":"District 2024 Student Membership: 08 Percent","position":121,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG09P","disposition":"fact","field":"district_2024_student_membership_09_percent","label":"District 2024 Student Membership: 09 Percent","position":122,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG10P","disposition":"fact","field":"district_2024_student_membership_10_percent","label":"District 2024 Student Membership: 10 Percent","position":123,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG11P","disposition":"fact","field":"district_2024_student_membership_11_percent","label":"District 2024 Student Membership: 11 Percent","position":124,"publisher_length":"","publisher_type":"Number"},{"code":"DPETG12P","disposition":"fact","field":"district_2024_student_membership_12_percent","label":"District 2024 Student Membership: 12 Percent","position":125,"publisher_length":"","publisher_type":"Number"},{"code":"DPETMALP","disposition":"fact","field":"district_2024_student_membership_male_percent","label":"District 2024 Student Membership: Male Percent","position":126,"publisher_length":"","publisher_type":"Number"},{"code":"DPETFEMP","disposition":"fact","field":"district_2024_student_membership_female_percent","label":"District 2024 Student Membership: Female Percent","position":127,"publisher_length":"","publisher_type":"Number"},{"code":"DPETVHSP","disposition":"fact","field":"district_2024_student_membership_career_and_technical_9_12_education_percent","label":"District 2024 Student Membership: Career & Technical (9-12) Education Percent","position":128,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTALLC","disposition":"fact","field":"district_2024_student_enrollment_all_students_count","label":"District 2024 Student Enrollment: All Students Count","position":129,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTALLP","disposition":"fact","field":"district_2024_student_enrollment_all_students_percent","label":"District 2024 Student Enrollment: All Students Percent","position":130,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGEEC","disposition":"fact","field":"district_2024_student_enrollment_ee_count","label":"District 2024 Student Enrollment: EE Count","position":131,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGEEP","disposition":"fact","field":"district_2024_student_enrollment_ee_percent","label":"District 2024 Student Enrollment: EE Percent","position":132,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGPKC","disposition":"fact","field":"district_2024_student_enrollment_pk_count","label":"District 2024 Student Enrollment: PK Count","position":133,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGPKP","disposition":"fact","field":"district_2024_student_enrollment_pk_percent","label":"District 2024 Student Enrollment: PK Percent","position":134,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGKNC","disposition":"fact","field":"district_2024_student_enrollment_kg_count","label":"District 2024 Student Enrollment: KG Count","position":135,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGKNP","disposition":"fact","field":"district_2024_student_enrollment_kg_percent","label":"District 2024 Student Enrollment: KG Percent","position":136,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG01C","disposition":"fact","field":"district_2024_student_enrollment_01_count","label":"District 2024 Student Enrollment: 01 Count","position":137,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG01P","disposition":"fact","field":"district_2024_student_enrollment_01_percent","label":"District 2024 Student Enrollment: 01 Percent","position":138,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG02C","disposition":"fact","field":"district_2024_student_enrollment_02_count","label":"District 2024 Student Enrollment: 02 Count","position":139,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG02P","disposition":"fact","field":"district_2024_student_enrollment_02_percent","label":"District 2024 Student Enrollment: 02 Percent","position":140,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG03C","disposition":"fact","field":"district_2024_student_enrollment_03_count","label":"District 2024 Student Enrollment: 03 Count","position":141,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG03P","disposition":"fact","field":"district_2024_student_enrollment_03_percent","label":"District 2024 Student Enrollment: 03 Percent","position":142,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG04C","disposition":"fact","field":"district_2024_student_enrollment_04_count","label":"District 2024 Student Enrollment: 04 Count","position":143,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG04P","disposition":"fact","field":"district_2024_student_enrollment_04_percent","label":"District 2024 Student Enrollment: 04 Percent","position":144,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG05C","disposition":"fact","field":"district_2024_student_enrollment_05_count","label":"District 2024 Student Enrollment: 05 Count","position":145,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG05P","disposition":"fact","field":"district_2024_student_enrollment_05_percent","label":"District 2024 Student Enrollment: 05 Percent","position":146,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG06C","disposition":"fact","field":"district_2024_student_enrollment_06_count","label":"District 2024 Student Enrollment: 06 Count","position":147,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG06P","disposition":"fact","field":"district_2024_student_enrollment_06_percent","label":"District 2024 Student Enrollment: 06 Percent","position":148,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG07C","disposition":"fact","field":"district_2024_student_enrollment_07_count","label":"District 2024 Student Enrollment: 07 Count","position":149,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG07P","disposition":"fact","field":"district_2024_student_enrollment_07_percent","label":"District 2024 Student Enrollment: 07 Percent","position":150,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG08C","disposition":"fact","field":"district_2024_student_enrollment_08_count","label":"District 2024 Student Enrollment: 08 Count","position":151,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG08P","disposition":"fact","field":"district_2024_student_enrollment_08_percent","label":"District 2024 Student Enrollment: 08 Percent","position":152,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG09C","disposition":"fact","field":"district_2024_student_enrollment_09_count","label":"District 2024 Student Enrollment: 09 Count","position":153,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG09P","disposition":"fact","field":"district_2024_student_enrollment_09_percent","label":"District 2024 Student Enrollment: 09 Percent","position":154,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG10C","disposition":"fact","field":"district_2024_student_enrollment_10_count","label":"District 2024 Student Enrollment: 10 Count","position":155,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG10P","disposition":"fact","field":"district_2024_student_enrollment_10_percent","label":"District 2024 Student Enrollment: 10 Percent","position":156,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG11C","disposition":"fact","field":"district_2024_student_enrollment_11_count","label":"District 2024 Student Enrollment: 11 Count","position":157,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG11P","disposition":"fact","field":"district_2024_student_enrollment_11_percent","label":"District 2024 Student Enrollment: 11 Percent","position":158,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG12C","disposition":"fact","field":"district_2024_student_enrollment_12_count","label":"District 2024 Student Enrollment: 12 Count","position":159,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTG12P","disposition":"fact","field":"district_2024_student_enrollment_12_percent","label":"District 2024 Student Enrollment: 12 Percent","position":160,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTBLAC","disposition":"fact","field":"district_2024_student_enrollment_african_american_count","label":"District 2024 Student Enrollment: African American Count","position":161,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTBLAP","disposition":"fact","field":"district_2024_student_enrollment_african_american_percent","label":"District 2024 Student Enrollment: African American Percent","position":162,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTHISC","disposition":"fact","field":"district_2024_student_enrollment_hispanic_count","label":"District 2024 Student Enrollment: Hispanic Count","position":163,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTHISP","disposition":"fact","field":"district_2024_student_enrollment_hispanic_percent","label":"District 2024 Student Enrollment: Hispanic Percent","position":164,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTWHIC","disposition":"fact","field":"district_2024_student_enrollment_white_count","label":"District 2024 Student Enrollment: White Count","position":165,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTWHIP","disposition":"fact","field":"district_2024_student_enrollment_white_percent","label":"District 2024 Student Enrollment: White Percent","position":166,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTINDC","disposition":"fact","field":"district_2024_student_enrollment_american_indian_count","label":"District 2024 Student Enrollment: American Indian Count","position":167,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTINDP","disposition":"fact","field":"district_2024_student_enrollment_american_indian_percent","label":"District 2024 Student Enrollment: American Indian Percent","position":168,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTASIC","disposition":"fact","field":"district_2024_student_enrollment_asian_count","label":"District 2024 Student Enrollment: Asian Count","position":169,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTASIP","disposition":"fact","field":"district_2024_student_enrollment_asian_percent","label":"District 2024 Student Enrollment: Asian Percent","position":170,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTPCIC","disposition":"fact","field":"district_2024_student_enrollment_pacific_islander_count","label":"District 2024 Student Enrollment: Pacific Islander Count","position":171,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTPCIP","disposition":"fact","field":"district_2024_student_enrollment_pacific_islander_percent","label":"District 2024 Student Enrollment: Pacific Islander Percent","position":172,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTTWOC","disposition":"fact","field":"district_2024_student_enrollment_two_or_more_races_count","label":"District 2024 Student Enrollment: Two or More Races Count","position":173,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTTWOP","disposition":"fact","field":"district_2024_student_enrollment_two_or_more_races_percent","label":"District 2024 Student Enrollment: Two or More Races Percent","position":174,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTFEMC","disposition":"fact","field":"district_2024_student_enrollment_female_count","label":"District 2024 Student Enrollment: Female Count","position":175,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTFEMP","disposition":"fact","field":"district_2024_student_enrollment_female_percent","label":"District 2024 Student Enrollment: Female Percent","position":176,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTMALC","disposition":"fact","field":"district_2024_student_enrollment_male_count","label":"District 2024 Student Enrollment: Male Count","position":177,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTMALP","disposition":"fact","field":"district_2024_student_enrollment_male_percent","label":"District 2024 Student Enrollment: Male Percent","position":178,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTECOC","disposition":"fact","field":"district_2024_student_enrollment_econ_disadv_count","label":"District 2024 Student Enrollment: Econ Disadv Count","position":179,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTECOP","disposition":"fact","field":"district_2024_student_enrollment_econ_disadv_percent","label":"District 2024 Student Enrollment: Econ Disadv Percent","position":180,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTNEDC","disposition":"fact","field":"district_2024_student_enrollment_non_educationally_disadv_count","label":"District 2024 Student Enrollment: Non-Educationally Disadv Count","position":181,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTNEDP","disposition":"fact","field":"district_2024_student_enrollment_non_educationally_disadv_percent","label":"District 2024 Student Enrollment: Non-Educationally Disadv Percent","position":182,"publisher_length":"","publisher_type":"Number"},{"code":"DPNT504C","disposition":"fact","field":"district_2024_student_enrollment_section_504_count","label":"District 2024 Student Enrollment: Section 504 Count","position":183,"publisher_length":"","publisher_type":"Number"},{"code":"DPNT504P","disposition":"fact","field":"district_2024_student_enrollment_section_504_percent","label":"District 2024 Student Enrollment: Section 504 Percent","position":184,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTLEPC","disposition":"fact","field":"district_2024_student_enrollment_el_count","label":"District 2024 Student Enrollment: EL Count","position":185,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTLEPP","disposition":"fact","field":"district_2024_student_enrollment_el_percent","label":"District 2024 Student Enrollment: EL Percent","position":186,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTDSLC","disposition":"fact","field":"district_2024_student_enrollment_dyslexia_count","label":"District 2024 Student Enrollment: Dyslexia Count","position":187,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTDSLP","disposition":"fact","field":"district_2024_student_enrollment_dyslexia_percent","label":"District 2024 Student Enrollment: Dyslexia Percent","position":188,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTFOSC","disposition":"fact","field":"district_2024_student_enrollment_foster_care_count","label":"District 2024 Student Enrollment: Foster Care Count","position":189,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTFOSP","disposition":"fact","field":"district_2024_student_enrollment_foster_care_percent","label":"District 2024 Student Enrollment: Foster Care Percent","position":190,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTHOMC","disposition":"fact","field":"district_2024_student_enrollment_homeless_count","label":"District 2024 Student Enrollment: Homeless Count","position":191,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTHOMP","disposition":"fact","field":"district_2024_student_enrollment_homeless_percent","label":"District 2024 Student Enrollment: Homeless Percent","position":192,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTIMMC","disposition":"fact","field":"district_2024_student_enrollment_immigrant_count","label":"District 2024 Student Enrollment: Immigrant Count","position":193,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTIMMP","disposition":"fact","field":"district_2024_student_enrollment_immigrant_percent","label":"District 2024 Student Enrollment: Immigrant Percent","position":194,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTMIGC","disposition":"fact","field":"district_2024_student_enrollment_migrant_count","label":"District 2024 Student Enrollment: Migrant Count","position":195,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTMIGP","disposition":"fact","field":"district_2024_student_enrollment_migrant_percent","label":"District 2024 Student Enrollment: Migrant Percent","position":196,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTTT1C","disposition":"fact","field":"district_2024_student_enrollment_title_i_count","label":"District 2024 Student Enrollment: Title I Count","position":197,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTTT1P","disposition":"fact","field":"district_2024_student_enrollment_title_i_percent","label":"District 2024 Student Enrollment: Title I Percent","position":198,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTMLCC","disposition":"fact","field":"district_2024_student_enrollment_military_connected_count","label":"District 2024 Student Enrollment: Military-Connected Count","position":199,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTMLCP","disposition":"fact","field":"district_2024_student_enrollment_military_connected_percent","label":"District 2024 Student Enrollment: Military-Connected Percent","position":200,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTRSKC","disposition":"fact","field":"district_2024_student_enrollment_at_risk_count","label":"District 2024 Student Enrollment: At Risk Count","position":201,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTRSKP","disposition":"fact","field":"district_2024_student_enrollment_at_risk_percent","label":"District 2024 Student Enrollment: At Risk Percent","position":202,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTBILC","disposition":"fact","field":"district_2024_student_enrollment_bilingual_esl_count","label":"District 2024 Student Enrollment: Bilingual/ESL Count","position":203,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTBILP","disposition":"fact","field":"district_2024_student_enrollment_bilingual_esl_percent","label":"District 2024 Student Enrollment: Bilingual/ESL Percent","position":204,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGIFC","disposition":"fact","field":"district_2024_student_enrollment_gifted_and_talented_count","label":"District 2024 Student Enrollment: Gifted & Talented Count","position":205,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTGIFP","disposition":"fact","field":"district_2024_student_enrollment_gifted_and_talented_percent","label":"District 2024 Student Enrollment: Gifted & Talented Percent","position":206,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTSPEC","disposition":"fact","field":"district_2024_student_enrollment_special_ed_count","label":"District 2024 Student Enrollment: Special Ed Count","position":207,"publisher_length":"","publisher_type":"Number"},{"code":"DPNTSPEP","disposition":"fact","field":"district_2024_student_enrollment_special_ed_percent","label":"District 2024 Student Enrollment: Special Ed Percent","position":208,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTSOCS","disposition":"fact","field":"district_2024_class_size_sec_soc_stud_number_students","label":"District 2024 Class Size: Sec Soc Stud- # Students","position":209,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTSOCC","disposition":"fact","field":"district_2024_class_size_sec_soc_stud_number_classes","label":"District 2024 Class Size: Sec Soc Stud- # Classes","position":210,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTSOCA","disposition":"fact","field":"district_2024_class_size_sec_soc_stud_avg_size","label":"District 2024 Class Size: Sec Soc Stud- Avg Size","position":211,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTSCIS","disposition":"fact","field":"district_2024_class_size_sec_sci_number_students","label":"District 2024 Class Size: Sec Sci - # Students","position":212,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTSCIC","disposition":"fact","field":"district_2024_class_size_sec_sci_number_classes","label":"District 2024 Class Size: Sec Sci - # Classes","position":213,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTSCIA","disposition":"fact","field":"district_2024_class_size_sec_sci_avg_size","label":"District 2024 Class Size: Sec Sci - Avg Size","position":214,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTMATS","disposition":"fact","field":"district_2024_class_size_sec_math_number_students","label":"District 2024 Class Size: Sec Math - # Students","position":215,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTMATC","disposition":"fact","field":"district_2024_class_size_sec_math_number_classes","label":"District 2024 Class Size: Sec Math - # Classes","position":216,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTMATA","disposition":"fact","field":"district_2024_class_size_sec_math_avg_size","label":"District 2024 Class Size: Sec Math - Avg Size","position":217,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTGMES","disposition":"fact","field":"district_2024_class_size_mixed_elem_number_students","label":"District 2024 Class Size: Mixed Elem. - # Students","position":218,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTGMEC","disposition":"fact","field":"district_2024_class_size_mixed_elem_number_classes","label":"District 2024 Class Size: Mixed Elem. - # Classes","position":219,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTGMEA","disposition":"fact","field":"district_2024_class_size_mixed_elem_avg_size","label":"District 2024 Class Size: Mixed Elem. - Avg Size","position":220,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTGKGS","disposition":"fact","field":"district_2024_class_size_kindergarten_number_students","label":"District 2024 Class Size: Kindergarten- # Students","position":221,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTGKGC","disposition":"fact","field":"district_2024_class_size_kindergarten_number_classes","label":"District 2024 Class Size: Kindergarten- # Classes","position":222,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTGKGA","disposition":"fact","field":"district_2024_class_size_kindergarten_avg_size","label":"District 2024 Class Size: Kindergarten- Avg Size","position":223,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG06S","disposition":"fact","field":"district_2024_class_size_grade_6_number_students","label":"District 2024 Class Size: Grade 6 - # Students","position":224,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG06C","disposition":"fact","field":"district_2024_class_size_grade_6_number_classes","label":"District 2024 Class Size: Grade 6 - # Classes","position":225,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG06A","disposition":"fact","field":"district_2024_class_size_grade_6_avg_size","label":"District 2024 Class Size: Grade 6 - Avg Size","position":226,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG05S","disposition":"fact","field":"district_2024_class_size_grade_5_number_students","label":"District 2024 Class Size: Grade 5 - # Students","position":227,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG05C","disposition":"fact","field":"district_2024_class_size_grade_5_number_classes","label":"District 2024 Class Size: Grade 5 - # Classes","position":228,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG05A","disposition":"fact","field":"district_2024_class_size_grade_5_avg_size","label":"District 2024 Class Size: Grade 5 - Avg Size","position":229,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG04S","disposition":"fact","field":"district_2024_class_size_grade_4_number_students","label":"District 2024 Class Size: Grade 4 - # Students","position":230,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG04C","disposition":"fact","field":"district_2024_class_size_grade_4_number_classes","label":"District 2024 Class Size: Grade 4 - # Classes","position":231,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG04A","disposition":"fact","field":"district_2024_class_size_grade_4_avg_size","label":"District 2024 Class Size: Grade 4 - Avg Size","position":232,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG03S","disposition":"fact","field":"district_2024_class_size_grade_3_number_students","label":"District 2024 Class Size: Grade 3 - # Students","position":233,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG03C","disposition":"fact","field":"district_2024_class_size_grade_3_number_classes","label":"District 2024 Class Size: Grade 3 - # Classes","position":234,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG03A","disposition":"fact","field":"district_2024_class_size_grade_3_avg_size","label":"District 2024 Class Size: Grade 3 - Avg Size","position":235,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG02S","disposition":"fact","field":"district_2024_class_size_grade_2_number_students","label":"District 2024 Class Size: Grade 2 - # Students","position":236,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG02C","disposition":"fact","field":"district_2024_class_size_grade_2_number_classes","label":"District 2024 Class Size: Grade 2 - # Classes","position":237,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG02A","disposition":"fact","field":"district_2024_class_size_grade_2_avg_size","label":"District 2024 Class Size: Grade 2 - Avg Size","position":238,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG01S","disposition":"fact","field":"district_2024_class_size_grade_1_number_students","label":"District 2024 Class Size: Grade 1 - # Students","position":239,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG01C","disposition":"fact","field":"district_2024_class_size_grade_1_number_classes","label":"District 2024 Class Size: Grade 1 - # Classes","position":240,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTG01A","disposition":"fact","field":"district_2024_class_size_grade_1_avg_size","label":"District 2024 Class Size: Grade 1 - Avg Size","position":241,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTFLAS","disposition":"fact","field":"district_2024_class_size_sec_for_lng_number_students","label":"District 2024 Class Size: Sec For Lng - # Students","position":242,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTFLAC","disposition":"fact","field":"district_2024_class_size_sec_for_lng_number_classes","label":"District 2024 Class Size: Sec For Lng - # Classes","position":243,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTFLAA","disposition":"fact","field":"district_2024_class_size_sec_for_lng_avg_size","label":"District 2024 Class Size: Sec For Lng - Avg Size","position":244,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTENGS","disposition":"fact","field":"district_2024_class_size_sec_english_number_students","label":"District 2024 Class Size: Sec English - # Students","position":245,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTENGC","disposition":"fact","field":"district_2024_class_size_sec_english_number_classes","label":"District 2024 Class Size: Sec English - # Classes","position":246,"publisher_length":"","publisher_type":"Number"},{"code":"DPCTENGA","disposition":"fact","field":"district_2024_class_size_sec_english_avg_size","label":"District 2024 Class Size: Sec English - Avg Size","position":247,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMECOT","disposition":"fact","field":"district_2024_student_membership_2023_mobility_econ_disadv_denominator","label":"District 2024 Student Membership: 2023 Mobility Econ Disadv Denominator","position":248,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMLEPT","disposition":"fact","field":"district_2024_student_membership_2023_mobility_eb_el_denominator","label":"District 2024 Student Membership: 2023 Mobility EB/EL Denominator","position":249,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMSPET","disposition":"fact","field":"district_2024_student_membership_2023_mobility_special_ed_denominator","label":"District 2024 Student Membership: 2023 Mobility Special Ed Denominator","position":250,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMINDC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_american_indian_count","label":"District 2024 Student Membership: 2023 Mobility American Indian Count","position":251,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMPCIC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_pacific_islander_count","label":"District 2024 Student Membership: 2023 Mobility Pacific Islander Count","position":252,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMASIC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_asian_count","label":"District 2024 Student Membership: 2023 Mobility Asian Count","position":253,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMBLAC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_african_american_count","label":"District 2024 Student Membership: 2023 Mobility African American Count","position":254,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMHISC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_hispanic_count","label":"District 2024 Student Membership: 2023 Mobility Hispanic Count","position":255,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMWHIC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_white_count","label":"District 2024 Student Membership: 2023 Mobility White Count","position":256,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMTWOC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_two_or_more_races_count","label":"District 2024 Student Membership: 2023 Mobility Two or More Races Count","position":257,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMECOC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_econ_disadv_count","label":"District 2024 Student Membership: 2023 Mobility Econ Disadv Count","position":258,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMLEPC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_eb_el_count","label":"District 2024 Student Membership: 2023 Mobility EB/EL Count","position":259,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMSPEC","disposition":"fact","field":"district_2024_student_membership_2023_mobility_special_ed_count","label":"District 2024 Student Membership: 2023 Mobility Special Ed Count","position":260,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMINDP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_american_indian_percent","label":"District 2024 Student Membership: 2023 Mobility American Indian Percent","position":261,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMASIP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_asian_percent","label":"District 2024 Student Membership: 2023 Mobility Asian Percent","position":262,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMPCIP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_pacific_islander_percent","label":"District 2024 Student Membership: 2023 Mobility Pacific Islander Percent","position":263,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMTWOP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_two_or_more_races_percent","label":"District 2024 Student Membership: 2023 Mobility Two or More Races Percent","position":264,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMBLAP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_african_american_percent","label":"District 2024 Student Membership: 2023 Mobility African American Percent","position":265,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMHISP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_hispanic_percent","label":"District 2024 Student Membership: 2023 Mobility Hispanic Percent","position":266,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMWHIP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_white_percent","label":"District 2024 Student Membership: 2023 Mobility White Percent","position":267,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMECOP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_econ_disadv_percent","label":"District 2024 Student Membership: 2023 Mobility Econ Disadv Percent","position":268,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMLEPP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_eb_el_percent","label":"District 2024 Student Membership: 2023 Mobility EB/EL Percent","position":269,"publisher_length":"","publisher_type":"Number"},{"code":"DPEMSPEP","disposition":"fact","field":"district_2024_student_membership_2023_mobility_special_ed_percent","label":"District 2024 Student Membership: 2023 Mobility Special Ed Percent","position":270,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTOFC","disposition":"fact","field":"district_2024_staff_teacher_total_full_time_equiv_count","label":"District 2024 Staff: Teacher Total Full Time Equiv Count","position":271,"publisher_length":"","publisher_type":"Number"},{"code":"DPSUTOFC","disposition":"fact","field":"district_2024_staff_support_total_full_time_equiv_count","label":"District 2024 Staff: Support Total Full Time Equiv Count","position":272,"publisher_length":"","publisher_type":"Number"},{"code":"DPSSTOFC","disposition":"fact","field":"district_2024_staff_school_admin_total_full_time_equiv_count","label":"District 2024 Staff: School Admin Total Full Time Equiv Count","position":273,"publisher_length":"","publisher_type":"Number"},{"code":"DPSCTOFC","disposition":"fact","field":"district_2024_staff_central_admin_total_full_time_equiv_count","label":"District 2024 Staff: Central Admin Total Full Time Equiv Count","position":274,"publisher_length":"","publisher_type":"Number"},{"code":"DPSETOFC","disposition":"fact","field":"district_2024_staff_educ_aide_total_full_time_equiv_count","label":"District 2024 Staff: Educ Aide Total Full Time Equiv Count","position":275,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTOST","disposition":"fact","field":"district_2024_staff_teacher_total_base_salary_total","label":"District 2024 Staff: Teacher Total Base Salary Total","position":276,"publisher_length":"","publisher_type":"Number"},{"code":"DPSUTOST","disposition":"fact","field":"district_2024_staff_support_total_base_salary_total","label":"District 2024 Staff: Support Total Base Salary Total","position":277,"publisher_length":"","publisher_type":"Number"},{"code":"DPSSTOST","disposition":"fact","field":"district_2024_staff_school_admin_total_base_salary_total","label":"District 2024 Staff: School Admin Total Base Salary Total","position":278,"publisher_length":"","publisher_type":"Number"},{"code":"DPSCTOST","disposition":"fact","field":"district_2024_staff_central_admin_total_base_salary_total","label":"District 2024 Staff: Central Admin Total Base Salary Total","position":279,"publisher_length":"","publisher_type":"Number"},{"code":"DPST00FC","disposition":"fact","field":"district_2024_staff_teacher_beginning_full_time_equiv_count","label":"District 2024 Staff: Teacher Beginning Full Time Equiv Count","position":280,"publisher_length":"","publisher_type":"Number"},{"code":"DPST01FC","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 1-5 Years Full Time Equiv Count","position":281,"publisher_length":"","publisher_type":"Number"},{"code":"DPST06FC","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 6-10 Years Full Time Equiv Count","position":282,"publisher_length":"","publisher_type":"Number"},{"code":"DPST11FC","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 11-20 Years Full Time Equiv Count","position":283,"publisher_length":"","publisher_type":"Number"},{"code":"DPST21FC","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 21-30 Years Full Time Equiv Count","position":284,"publisher_length":"","publisher_type":"Number"},{"code":"DPST30FC","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_full_time_equiv_count","label":"District 2024 Staff: Teacher > 30 Years Full Time Equiv Count","position":285,"publisher_length":"","publisher_type":"Number"},{"code":"DPST00ST","disposition":"fact","field":"district_2024_staff_teacher_beginning_base_salary_total","label":"District 2024 Staff: Teacher Beginning Base Salary Total","position":286,"publisher_length":"","publisher_type":"Number"},{"code":"DPST01ST","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_base_salary_total","label":"District 2024 Staff: Teacher 1-5 Years Base Salary Total","position":287,"publisher_length":"","publisher_type":"Number"},{"code":"DPST06ST","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_base_salary_total","label":"District 2024 Staff: Teacher 6-10 Years Base Salary Total","position":288,"publisher_length":"","publisher_type":"Number"},{"code":"DPST11ST","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_base_salary_total","label":"District 2024 Staff: Teacher 11-20 Years Base Salary Total","position":289,"publisher_length":"","publisher_type":"Number"},{"code":"DPST21ST","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_base_salary_total","label":"District 2024 Staff: Teacher 21-30 Years Base Salary Total","position":290,"publisher_length":"","publisher_type":"Number"},{"code":"DPST30ST","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_base_salary_total","label":"District 2024 Staff: Teacher > 30 Years Base Salary Total","position":291,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTNOFC","disposition":"fact","field":"district_2024_staff_teacher_no_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher No Degree Full Time Equiv Count","position":292,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTBAFC","disposition":"fact","field":"district_2024_staff_teacher_ba_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher BA Degree Full Time Equiv Count","position":293,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTMSFC","disposition":"fact","field":"district_2024_staff_teacher_ms_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher MS Degree Full Time Equiv Count","position":294,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTPHFC","disposition":"fact","field":"district_2024_staff_teacher_ph_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher PH Degree Full Time Equiv Count","position":295,"publisher_length":"","publisher_type":"Number"},{"code":"DPSPCOFC","disposition":"fact","field":"district_2024_staff_ssa_professional_staff_full_time_equiv_count","label":"District 2024 Staff: SSA Professional Staff Full Time Equiv Count","position":296,"publisher_length":"","publisher_type":"Number"},{"code":"DPSECOFC","disposition":"fact","field":"district_2024_staff_ssa_educational_aides_full_time_equiv_count","label":"District 2024 Staff: SSA Educational Aides Full Time Equiv Count","position":297,"publisher_length":"","publisher_type":"Number"},{"code":"DPSPTOFC","disposition":"fact","field":"district_2024_staff_professional_total_full_time_equiv_count","label":"District 2024 Staff: Professional Total Full Time Equiv Count","position":298,"publisher_length":"","publisher_type":"Number"},{"code":"DPSRTOPC","disposition":"fact","field":"district_2024_staff_counselor_total_part_time_equiv_count","label":"District 2024 Staff: Counselor Total Part Time Equiv Count","position":299,"publisher_length":"","publisher_type":"Number"},{"code":"DPSRTOFC","disposition":"fact","field":"district_2024_staff_counselor_total_full_time_equiv_count","label":"District 2024 Staff: Counselor Total Full Time Equiv Count","position":300,"publisher_length":"","publisher_type":"Number"},{"code":"DPSBTOPC","disposition":"fact","field":"district_2024_staff_librarian_total_part_time_equiv_count","label":"District 2024 Staff: Librarian Total Part Time Equiv Count","position":301,"publisher_length":"","publisher_type":"Number"},{"code":"DPSBTOFC","disposition":"fact","field":"district_2024_staff_librarian_total_full_time_equiv_count","label":"District 2024 Staff: Librarian Total Full Time Equiv Count","position":302,"publisher_length":"","publisher_type":"Number"},{"code":"DPSXTOFC","disposition":"fact","field":"district_2024_staff_auxiliary_total_full_time_equiv_count","label":"District 2024 Staff: Auxiliary Total Full Time Equiv Count","position":303,"publisher_length":"","publisher_type":"Number"},{"code":"DPSATOFC","disposition":"fact","field":"district_2024_staff_all_staff_total_full_time_equiv_count","label":"District 2024 Staff: All Staff Total Full Time Equiv Count","position":304,"publisher_length":"","publisher_type":"Number"},{"code":"DPSOTOFC","disposition":"fact","field":"district_2024_staff_contract_serv_total_full_time_equiv_count","label":"District 2024 Staff: Contract Serv Total Full Time Equiv Count","position":305,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTINFC","disposition":"fact","field":"district_2024_staff_teacher_american_indian_full_time_equiv_count","label":"District 2024 Staff: Teacher American Indian Full Time Equiv Count","position":306,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTPIFC","disposition":"fact","field":"district_2024_staff_teacher_pacific_islander_full_time_equiv_count","label":"District 2024 Staff: Teacher Pacific Islander Full Time Equiv Count","position":307,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTASFC","disposition":"fact","field":"district_2024_staff_teacher_asian_full_time_equiv_count","label":"District 2024 Staff: Teacher Asian Full Time Equiv Count","position":308,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTBLFC","disposition":"fact","field":"district_2024_staff_teacher_african_american_full_time_equiv_count","label":"District 2024 Staff: Teacher African American Full Time Equiv Count","position":309,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTHIFC","disposition":"fact","field":"district_2024_staff_teacher_hispanic_full_time_equiv_count","label":"District 2024 Staff: Teacher Hispanic Full Time Equiv Count","position":310,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTWHFC","disposition":"fact","field":"district_2024_staff_teacher_white_full_time_equiv_count","label":"District 2024 Staff: Teacher White Full Time Equiv Count","position":311,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTWFC","disposition":"fact","field":"district_2024_staff_teacher_two_or_more_races_full_time_equiv_count","label":"District 2024 Staff: Teacher Two or more races Full Time Equiv Count","position":312,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTMAFC","disposition":"fact","field":"district_2024_staff_teacher_male_full_time_equiv_count","label":"District 2024 Staff: Teacher Male Full Time Equiv Count","position":313,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTFEFC","disposition":"fact","field":"district_2024_staff_teacher_female_full_time_equiv_count","label":"District 2024 Staff: Teacher Female Full Time Equiv Count","position":314,"publisher_length":"","publisher_type":"Number"},{"code":"DPSXCOFC","disposition":"fact","field":"district_2024_staff_ssa_auxiliary_staff_full_time_equiv_count","label":"District 2024 Staff: SSA Auxiliary Staff Full Time Equiv Count","position":315,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTREFC","disposition":"fact","field":"district_2024_staff_teacher_regular_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Regular Program Full Time Equiv Count","position":316,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTVOFC","disposition":"fact","field":"district_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"District 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":317,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTBIFC","disposition":"fact","field":"district_2024_staff_teacher_bilingual_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Bilingual Program Full Time Equiv Count","position":318,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTCOFC","disposition":"fact","field":"district_2024_staff_teacher_compensatory_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Compensatory Program Full Time Equiv Count","position":319,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTGIFC","disposition":"fact","field":"district_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":320,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTSPFC","disposition":"fact","field":"district_2024_staff_teacher_special_education_full_time_equiv_count","label":"District 2024 Staff: Teacher Special Education Full Time Equiv Count","position":321,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTOPFC","disposition":"fact","field":"district_2024_staff_teacher_other_full_time_equiv_count","label":"District 2024 Staff: Teacher Other Full Time Equiv Count","position":322,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTURNN","disposition":"fact","field":"district_2024_staff_teacher_turnover_numerator","label":"District 2024 Staff: Teacher Turnover Numerator","position":323,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTURND","disposition":"fact","field":"district_2024_staff_teacher_turnover_denominator","label":"District 2024 Staff: Teacher Turnover Denominator","position":324,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTURNR","disposition":"fact","field":"district_2024_staff_teacher_turnover_ratio","label":"District 2024 Staff: Teacher Turnover Ratio","position":325,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTFTEC","disposition":"fact","field":"district_2024_staff_teacher_total_full_time_equiv_experience_calculation","label":"District 2024 Staff: Teacher Total Full Time Equiv - Experience Calculation","position":326,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTENA","disposition":"fact","field":"district_2024_staff_teacher_tenure_average","label":"District 2024 Staff: Teacher Tenure Average","position":327,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTEXPA","disposition":"fact","field":"district_2024_staff_teacher_experience_average","label":"District 2024 Staff: Teacher Experience Average","position":328,"publisher_length":"","publisher_type":"Number"},{"code":"DPSHEXPA","disposition":"fact","field":"district_2024_staff_principal_experience_average","label":"District 2024 Staff: Principal Experience Average","position":329,"publisher_length":"","publisher_type":"Number"},{"code":"DPSHTENA","disposition":"fact","field":"district_2024_staff_principal_tenure_average","label":"District 2024 Staff: Principal Tenure Average","position":330,"publisher_length":"","publisher_type":"Number"},{"code":"DPSLEXPA","disposition":"fact","field":"district_2024_staff_assistant_principal_experience_average","label":"District 2024 Staff: Assistant Principal Experience Average","position":331,"publisher_length":"","publisher_type":"Number"},{"code":"DPSLTENA","disposition":"fact","field":"district_2024_staff_assistant_principal_tenure_average","label":"District 2024 Staff: Assistant Principal Tenure Average","position":332,"publisher_length":"","publisher_type":"Number"},{"code":"DPSHEXPT","disposition":"fact","field":"district_2024_staff_principal_experience_total","label":"District 2024 Staff: Principal Experience Total","position":333,"publisher_length":"","publisher_type":"Number"},{"code":"DPSHTENT","disposition":"fact","field":"district_2024_staff_principal_tenure_total","label":"District 2024 Staff: Principal Tenure Total","position":334,"publisher_length":"","publisher_type":"Number"},{"code":"DPSLEXPT","disposition":"fact","field":"district_2024_staff_assistant_principal_experience_total","label":"District 2024 Staff: Assistant Principal Experience Total","position":335,"publisher_length":"","publisher_type":"Number"},{"code":"DPSLTENT","disposition":"fact","field":"district_2024_staff_assistant_principal_tenure_total","label":"District 2024 Staff: Assistant Principal Tenure Total","position":336,"publisher_length":"","publisher_type":"Number"},{"code":"DPSHFTEC","disposition":"fact","field":"district_2024_staff_principal_count","label":"District 2024 Staff: Principal Count","position":337,"publisher_length":"","publisher_type":"Number"},{"code":"DPSLFTEC","disposition":"fact","field":"district_2024_staff_assistant_principal_count","label":"District 2024 Staff: Assistant Principal Count","position":338,"publisher_length":"","publisher_type":"Number"},{"code":"DPSAMIFC","disposition":"fact","field":"district_2024_staff_all_staff_minority_full_time_equiv_count","label":"District 2024 Staff: All Staff Minority Full Time Equiv Count","position":339,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTEXPT","disposition":"fact","field":"district_2024_staff_teacher_experience_total","label":"District 2024 Staff: Teacher Experience Total","position":340,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTENT","disposition":"fact","field":"district_2024_staff_teacher_tenure_total","label":"District 2024 Staff: Teacher Tenure Total","position":341,"publisher_length":"","publisher_type":"Number"},{"code":"DPSPTOFP","disposition":"fact","field":"district_2024_staff_professional_total_full_time_equiv_percent","label":"District 2024 Staff: Professional Total Full Time Equiv Percent","position":342,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTOFP","disposition":"fact","field":"district_2024_staff_teacher_total_full_time_equiv_percent","label":"District 2024 Staff: Teacher Total Full Time Equiv Percent","position":343,"publisher_length":"","publisher_type":"Number"},{"code":"DPSUTOFP","disposition":"fact","field":"district_2024_staff_support_total_full_time_equiv_percent","label":"District 2024 Staff: Support Total Full Time Equiv Percent","position":344,"publisher_length":"","publisher_type":"Number"},{"code":"DPSSTOFP","disposition":"fact","field":"district_2024_staff_school_admin_total_full_time_equiv_percent","label":"District 2024 Staff: School Admin Total Full Time Equiv Percent","position":345,"publisher_length":"","publisher_type":"Number"},{"code":"DPSCTOFP","disposition":"fact","field":"district_2024_staff_central_admin_total_full_time_equiv_percent","label":"District 2024 Staff: Central Admin Total Full Time Equiv Percent","position":346,"publisher_length":"","publisher_type":"Number"},{"code":"DPSETOFP","disposition":"fact","field":"district_2024_staff_educ_aide_total_full_time_equiv_percent","label":"District 2024 Staff: Educ Aide Total Full Time Equiv Percent","position":347,"publisher_length":"","publisher_type":"Number"},{"code":"DPSXTOFP","disposition":"fact","field":"district_2024_staff_auxiliary_total_full_time_equiv_percent","label":"District 2024 Staff: Auxiliary Total Full Time Equiv Percent","position":348,"publisher_length":"","publisher_type":"Number"},{"code":"DPSAMIFP","disposition":"fact","field":"district_2024_staff_all_staff_minority_full_time_equiv_percent","label":"District 2024 Staff: All Staff Minority Full Time Equiv Percent","position":349,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTNOFP","disposition":"fact","field":"district_2024_staff_teacher_no_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher No Degree Full Time Equiv Percent","position":350,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTBAFP","disposition":"fact","field":"district_2024_staff_teacher_ba_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher BA Degree Full Time Equiv Percent","position":351,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTMSFP","disposition":"fact","field":"district_2024_staff_teacher_ms_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher MS Degree Full Time Equiv Percent","position":352,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTPHFP","disposition":"fact","field":"district_2024_staff_teacher_ph_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher PH Degree Full Time Equiv Percent","position":353,"publisher_length":"","publisher_type":"Number"},{"code":"DPST00FP","disposition":"fact","field":"district_2024_staff_teacher_beginning_full_time_equiv_percent","label":"District 2024 Staff: Teacher Beginning Full Time Equiv Percent","position":354,"publisher_length":"","publisher_type":"Number"},{"code":"DPST01FP","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":355,"publisher_length":"","publisher_type":"Number"},{"code":"DPST06FP","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":356,"publisher_length":"","publisher_type":"Number"},{"code":"DPST11FP","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":357,"publisher_length":"","publisher_type":"Number"},{"code":"DPST21FP","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":358,"publisher_length":"","publisher_type":"Number"},{"code":"DPST30FP","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher > 30 Years Full Time Equiv Percent","position":359,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTREFP","disposition":"fact","field":"district_2024_staff_teacher_regular_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Regular Program Full Time Equiv Percent","position":360,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTVOFP","disposition":"fact","field":"district_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"District 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":361,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTBIFP","disposition":"fact","field":"district_2024_staff_teacher_bilingual_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":362,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTCOFP","disposition":"fact","field":"district_2024_staff_teacher_compensatory_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":363,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTGIFP","disposition":"fact","field":"district_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":364,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTSPFP","disposition":"fact","field":"district_2024_staff_teacher_special_education_full_time_equiv_percent","label":"District 2024 Staff: Teacher Special Education Full Time Equiv Percent","position":365,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTOPFP","disposition":"fact","field":"district_2024_staff_teacher_other_full_time_equiv_percent","label":"District 2024 Staff: Teacher Other Full Time Equiv Percent","position":366,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTBLFP","disposition":"fact","field":"district_2024_staff_teacher_african_american_full_time_equiv_percent","label":"District 2024 Staff: Teacher African American Full Time Equiv Percent","position":367,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTWHFP","disposition":"fact","field":"district_2024_staff_teacher_white_full_time_equiv_percent","label":"District 2024 Staff: Teacher White Full Time Equiv Percent","position":368,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTHIFP","disposition":"fact","field":"district_2024_staff_teacher_hispanic_full_time_equiv_percent","label":"District 2024 Staff: Teacher Hispanic Full Time Equiv Percent","position":369,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTPIFP","disposition":"fact","field":"district_2024_staff_teacher_pacific_islander_full_time_equiv_percent","label":"District 2024 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":370,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTINFP","disposition":"fact","field":"district_2024_staff_teacher_american_indian_full_time_equiv_percent","label":"District 2024 Staff: Teacher American Indian Full Time Equiv Percent","position":371,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTASFP","disposition":"fact","field":"district_2024_staff_teacher_asian_full_time_equiv_percent","label":"District 2024 Staff: Teacher Asian Full Time Equiv Percent","position":372,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTWFP","disposition":"fact","field":"district_2024_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"District 2024 Staff: Teacher Two or more races Full Time Equiv Percent","position":373,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTMAFP","disposition":"fact","field":"district_2024_staff_teacher_male_full_time_equiv_percent","label":"District 2024 Staff: Teacher Male Full Time Equiv Percent","position":374,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTFEFP","disposition":"fact","field":"district_2024_staff_teacher_female_full_time_equiv_percent","label":"District 2024 Staff: Teacher Female Full Time Equiv Percent","position":375,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTKIDR","disposition":"fact","field":"district_2024_staff_teacher_student_ratio","label":"District 2024 Staff: Teacher Student Ratio","position":376,"publisher_length":"","publisher_type":"Number"},{"code":"DPST00SA","disposition":"fact","field":"district_2024_staff_teacher_beginning_base_salary_average","label":"District 2024 Staff: Teacher Beginning Base Salary Average","position":377,"publisher_length":"","publisher_type":"Number"},{"code":"DPST01SA","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_base_salary_average","label":"District 2024 Staff: Teacher 1-5 Years Base Salary Average","position":378,"publisher_length":"","publisher_type":"Number"},{"code":"DPST06SA","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_base_salary_average","label":"District 2024 Staff: Teacher 6-10 Years Base Salary Average","position":379,"publisher_length":"","publisher_type":"Number"},{"code":"DPST11SA","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_base_salary_average","label":"District 2024 Staff: Teacher 11-20 Years Base Salary Average","position":380,"publisher_length":"","publisher_type":"Number"},{"code":"DPST21SA","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_base_salary_average","label":"District 2024 Staff: Teacher 21-30 Years Base Salary Average","position":381,"publisher_length":"","publisher_type":"Number"},{"code":"DPST30SA","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_base_salary_average","label":"District 2024 Staff: Teacher > 30 Years Base Salary Average","position":382,"publisher_length":"","publisher_type":"Number"},{"code":"DPSTTOSA","disposition":"fact","field":"district_2024_staff_teacher_total_base_salary_average","label":"District 2024 Staff: Teacher Total Base Salary Average","position":383,"publisher_length":"","publisher_type":"Number"},{"code":"DPSUTOSA","disposition":"fact","field":"district_2024_staff_support_total_base_salary_average","label":"District 2024 Staff: Support Total Base Salary Average","position":384,"publisher_length":"","publisher_type":"Number"},{"code":"DPSSTOSA","disposition":"fact","field":"district_2024_staff_school_admin_total_base_salary_average","label":"District 2024 Staff: School Admin Total Base Salary Average","position":385,"publisher_length":"","publisher_type":"Number"},{"code":"DPSCTOSA","disposition":"fact","field":"district_2024_staff_central_admin_total_base_salary_average","label":"District 2024 Staff: Central Admin Total Base Salary Average","position":386,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GR23N","disposition":"fact","field":"district_2023_graduates_all_students_count_including_fhsp","label":"District 2023 Graduates: All Students Count (including FHSP)","position":387,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GM23N","disposition":"fact","field":"district_2023_graduates_minimum_hs_pgm_all_students_count","label":"District 2023 Graduates: Minimum HS PGM All Students Count","position":388,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GH23N","disposition":"fact","field":"district_2023_graduates_rhsp_dap_all_students_count","label":"District 2023 Graduates: RHSP/DAP All Students Count","position":389,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GN23N","disposition":"fact","field":"district_2023_graduates_fhsp_no_endorsement_all_students_count","label":"District 2023 Graduates: FHSP No Endorsement All Students Count","position":390,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GE23N","disposition":"fact","field":"district_2023_graduates_fhsp_e_all_students_count","label":"District 2023 Graduates: FHSP-E All Students Count","position":391,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GA23N","disposition":"fact","field":"district_2023_graduates_fhsp_dla_all_students_count","label":"District 2023 Graduates: FHSP-DLA All Students Count","position":392,"publisher_length":"","publisher_type":"Number"},{"code":"DB0GR23N","disposition":"fact","field":"district_2023_graduates_african_american_count","label":"District 2023 Graduates: African American Count","position":393,"publisher_length":"","publisher_type":"Number"},{"code":"DH0GR23N","disposition":"fact","field":"district_2023_graduates_hispanic_count","label":"District 2023 Graduates: Hispanic Count","position":394,"publisher_length":"","publisher_type":"Number"},{"code":"DW0GR23N","disposition":"fact","field":"district_2023_graduates_white_count","label":"District 2023 Graduates: White Count","position":395,"publisher_length":"","publisher_type":"Number"},{"code":"DI0GR23N","disposition":"fact","field":"district_2023_graduates_american_indian_count","label":"District 2023 Graduates: American Indian Count","position":396,"publisher_length":"","publisher_type":"Number"},{"code":"D30GR23N","disposition":"fact","field":"district_2023_graduates_asian_count","label":"District 2023 Graduates: Asian Count","position":397,"publisher_length":"","publisher_type":"Number"},{"code":"D40GR23N","disposition":"fact","field":"district_2023_graduates_pacific_islander_count","label":"District 2023 Graduates: Pacific Islander Count","position":398,"publisher_length":"","publisher_type":"Number"},{"code":"D20GR23N","disposition":"fact","field":"district_2023_graduates_two_or_more_races_count","label":"District 2023 Graduates: Two or More Races Count","position":399,"publisher_length":"","publisher_type":"Number"},{"code":"DE0GR23N","disposition":"fact","field":"district_2023_graduates_econ_disadv_count","label":"District 2023 Graduates: Econ Disadv Count","position":400,"publisher_length":"","publisher_type":"Number"},{"code":"DS0GR23N","disposition":"fact","field":"district_2023_graduates_special_ed_count","label":"District 2023 Graduates: Special Ed Count","position":401,"publisher_length":"","publisher_type":"Number"},{"code":"DL0GR23N","disposition":"fact","field":"district_2023_graduates_eb_el_count","label":"District 2023 Graduates: EB/EL Count","position":402,"publisher_length":"","publisher_type":"Number"},{"code":"DR0GR23N","disposition":"fact","field":"district_2023_graduates_at_risk_count","label":"District 2023 Graduates: At Risk Count","position":403,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GH23P","disposition":"fact","field":"district_2023_graduates_rhsp_dap_all_students_percent_profile_only","label":"District 2023 Graduates: RHSP/DAP All Students % (Profile Only)","position":404,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GN23P","disposition":"fact","field":"district_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only","label":"District 2023 Graduates: FHSP No Endorsement All Students % (Profile Only)","position":405,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GE23P","disposition":"fact","field":"district_2023_graduates_fhsp_e_all_students_percent_profile_only","label":"District 2023 Graduates: FHSP-E All Students % (Profile Only)","position":406,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GA23P","disposition":"fact","field":"district_2023_graduates_fhsp_dla_all_students_percent_profile_only","label":"District 2023 Graduates: FHSP-DLA All Students % (Profile Only)","position":407,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GR23R","disposition":"fact","field":"district_2023_graduates_all_students_group_percent","label":"District 2023 Graduates: All Students Group %","position":408,"publisher_length":"","publisher_type":"Number"},{"code":"DB0GR23R","disposition":"fact","field":"district_2023_graduates_african_american_student_group_percent","label":"District 2023 Graduates: African American Student Group %","position":409,"publisher_length":"","publisher_type":"Number"},{"code":"DH0GR23R","disposition":"fact","field":"district_2023_graduates_hispanic_student_group_percent","label":"District 2023 Graduates: Hispanic Student Group %","position":410,"publisher_length":"","publisher_type":"Number"},{"code":"DW0GR23R","disposition":"fact","field":"district_2023_graduates_white_student_group_percent","label":"District 2023 Graduates: White Student Group %","position":411,"publisher_length":"","publisher_type":"Number"},{"code":"DI0GR23R","disposition":"fact","field":"district_2023_graduates_american_indian_student_group_percent","label":"District 2023 Graduates: American Indian Student Group %","position":412,"publisher_length":"","publisher_type":"Number"},{"code":"D30GR23R","disposition":"fact","field":"district_2023_graduates_asian_student_group_percent","label":"District 2023 Graduates: Asian Student Group %","position":413,"publisher_length":"","publisher_type":"Number"},{"code":"D40GR23R","disposition":"fact","field":"district_2023_graduates_pacific_islander_student_group_percent","label":"District 2023 Graduates: Pacific Islander Student Group %","position":414,"publisher_length":"","publisher_type":"Number"},{"code":"D20GR23R","disposition":"fact","field":"district_2023_graduates_two_or_more_races_student_group_percent","label":"District 2023 Graduates: Two or More Races Student Group %","position":415,"publisher_length":"","publisher_type":"Number"},{"code":"DE0GR23R","disposition":"fact","field":"district_2023_graduates_econ_disadv_student_group_percent","label":"District 2023 Graduates: Econ Disadv Student Group %","position":416,"publisher_length":"","publisher_type":"Number"},{"code":"DS0GR23R","disposition":"fact","field":"district_2023_graduates_special_ed_student_group_percent","label":"District 2023 Graduates: Special Ed Student Group %","position":417,"publisher_length":"","publisher_type":"Number"},{"code":"DL0GR23R","disposition":"fact","field":"district_2023_graduates_eb_el_student_group_percent","label":"District 2023 Graduates: EB/EL Student Group %","position":418,"publisher_length":"","publisher_type":"Number"},{"code":"DR0GR23R","disposition":"fact","field":"district_2023_graduates_at_risk_student_group_percent","label":"District 2023 Graduates: At Risk Student Group %","position":419,"publisher_length":"","publisher_type":"Number"},{"code":"DA0GM23P","disposition":"fact","field":"district_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only","label":"District 2023 Graduates: Minimum HS PGM All Students % (Profile Only)","position":420,"publisher_length":"","publisher_type":"Number"}],"input_sha256":"dc0b51f65f5a311df77798b0091b7d66830f4e43b6b28d7dad635e47e2b01e0d","layout":{"annotations":[],"code_record":1,"first_data_record":2,"label_record":null,"last_data_record":1208},"source_schema_sha256":"681074371ad568ac6ff0518509863f3efa0e464a7648e4e67570a9545c72987c","table":"profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/scripts/build_tapr_2025_profiles.py b/teadata/scripts/build_tapr_2025_profiles.py deleted file mode 100644 index 0c98034..0000000 --- a/teadata/scripts/build_tapr_2025_profiles.py +++ /dev/null @@ -1,475 +0,0 @@ -from __future__ import annotations - -import argparse -import csv -import math -import os -import re -from itertools import chain -from pathlib import Path -from typing import Any, Iterable - -from openpyxl import Workbook # type: ignore[import-untyped] -from openpyxl.styles import Alignment, Font, PatternFill # type: ignore[import-untyped] -from openpyxl.utils import get_column_letter # type: ignore[import-untyped] -from openpyxl.worksheet.table import Table, TableStyleInfo # type: ignore[import-untyped] - -from teadata.scripts.paths import data_path -from teadata.identifiers import canonical_source_identifier -from teadata.column_schema import parse_column_schema, crosswalk_dataset, validate_header_table -from teadata.manifest import file_identity -from teadata.teadata_config import load_config - - -def _read_tapr_csv( - path: Path, *, mapping: dict[str, Any], key_field: str -) -> tuple[list[str], dict[str, dict[str, str]], list[dict[str, str]]]: - """Read this two-header layout without repairing ambiguous source records. - - Human labels and publisher codes are returned verbatim as metadata. Body - tokens retain the existing whitespace normalization; masking is interpreted - elsewhere by the dataset's value policy. - """ - widths = {"campus_number": 9, "district_number": 6} - if key_field not in widths: - raise ValueError(f"Unsupported TAPR key field: {key_field}") - try: - validate_header_table(mapping) - except ValueError as error: - raise ValueError(f"{path}: invalid header crosswalk: {error}") from error - if file_identity(path)["sha256"] != mapping["input_sha256"]: - raise ValueError(f"{path}: input differs from the reviewed header crosswalk") - fields = mapping["fields"] - headers = [field["field"] for field in fields] - with path.open(newline="", encoding="utf-8-sig") as fh: - reader = csv.reader(fh, strict=True) - try: - labels = next(reader) - codes = next(reader) - except (StopIteration, csv.Error) as error: - raise ValueError(f"{path}: expected human-label and source-code header records") from error - if not labels or len(labels) != len(codes): - raise ValueError(f"{path}: header width mismatch: {len(labels)} labels, {len(codes)} codes") - - if key_field not in headers: - raise ValueError(f"{path}: missing key header {key_field!r}") - if len(codes) != len(fields): - raise ValueError(f"{path}: human-label/code headers differ from the reviewed crosswalk") - key_code = "CAMPUS" if key_field == "campus_number" else "DISTRICT" - key_column = headers.index(key_field) - if codes[key_column].strip() != key_code: - raise ValueError(f"{path}: expected source-code header {key_code!r} in record 2, column {key_column + 1}") - if labels != [field["label"] for field in fields] or codes != [field["code"] for field in fields]: - raise ValueError(f"{path}: human-label/code headers differ from the reviewed crosswalk") - - elements = [] - for code, label, header in zip(codes, labels, headers, strict=True): - elements.append( - { - "code": code, - "label": label, - "sanitized_label": header, - } - ) - - rows: dict[str, dict[str, str]] = {} - seen_keys: dict[str, int] = {} - header_len = len(headers) - try: - for number, row in enumerate(reader, 3): - if len(row) != header_len: - raise ValueError(f"{path}: record {number} has {len(row)} fields; expected {header_len}") - record = {header: value.strip() for header, value in zip(headers, row, strict=True)} - key = record[key_field] - try: - identity = canonical_source_identifier(key, width=widths[key_field]) - if identity is None: - raise ValueError("missing source identifier") - if key_field == "campus_number" and "district_number" in record: - district = canonical_source_identifier(record["district_number"], width=6) - if district is None or identity[1:7] != district[1:]: - raise ValueError("campus and district identifiers disagree") - except ValueError as error: - raise ValueError(f"{path}: record {number} has invalid {key_field}: {key!r} ({error})") from error - if identity in seen_keys: - raise ValueError(f"{path}: duplicate {key_field} at records {seen_keys[identity]} and {number}: {key!r}") - seen_keys[identity] = number - rows[key] = record - except csv.Error as error: - raise ValueError(f"{path}: invalid CSV near physical line {reader.line_num}: {error}") from error - if not rows: - raise ValueError(f"{path}: no TAPR data records") - if file_identity(path)["sha256"] != mapping["input_sha256"]: - raise ValueError(f"{path}: input changed while reading the reviewed header crosswalk") - - return headers, rows, elements - - -def _header_tables(cfg, dataset: str) -> dict[str, dict[str, Any]]: - source = cfg.resolve_dataset(dataset, 2025) - if source.resolved_year != 2025 or source.metadata.version != "2025": - raise ValueError(f"No selected 2025 header crosswalk for {dataset}") - contract = cfg.column_contract(dataset, 2025) - if contract is None: - raise ValueError(f"Header crosswalk unavailable for {dataset}") - selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, "2025") - tables = {table["table"]: table for table in selected["tables"]} - if set(tables) != {"student", "staff"}: - raise ValueError(f"Student/staff header crosswalk required for {dataset}") - return tables - - -def _merge_tables( - primary_headers: list[str], - primary_rows: dict[str, dict[str, str]], - secondary_headers: list[str], - secondary_rows: dict[str, dict[str, str]], - *, - key_field: str, - preferred_cols: Iterable[str], -): - """Outer-merge available sources, retaining the existing blank-fill policy. - - One-sided entities are retained, and a blank primary token may be filled - from the secondary source. Two nonblank tokens for a shared field must - agree; this does not assert complete or identical source coverage. - """ - width = {"campus_number": 9, "district_number": 6}[key_field] - representations: dict[str, str] = {} - for key in chain(primary_rows, secondary_rows): - identity = canonical_source_identifier(key, width=width) - if identity is None: - raise ValueError(f"Missing TAPR {key_field}") - previous = representations.setdefault(identity, key) - if previous != key: - raise ValueError(f"Inconsistent TAPR {key_field} representations: {previous!r}, {key!r}") - keys = sorted(set(primary_rows) | set(secondary_rows)) - merged_rows: list[dict[str, str]] = [] - for key in keys: - record: dict[str, str] = {} - record.update(primary_rows.get(key, {})) - for k, v in secondary_rows.get(key, {}).items(): - if k in record and record[k] not in (None, ""): - if v not in (None, "") and record[k] != v: - raise ValueError(f"Conflicting TAPR values for {key_field} {key!r}, field {k!r}: {record[k]!r} and {v!r}") - continue - record[k] = v - merged_rows.append(record) - - present = set(primary_headers) | set(secondary_headers) - ordered_headers = list(dict.fromkeys([ - *(col for col in preferred_cols if col in present), - *primary_headers, - *secondary_headers, - ])) - - if key_field not in ordered_headers: - ordered_headers.insert(0, key_field) - - return ordered_headers, merged_rows - - -def _rows_for_headers(headers: list[str], records: list[dict[str, str]]) -> list[list[str]]: - return [[record.get(h, "") for h in headers] for record in records] - - -_TABLE_STYLE_NAME = "TableStyleMedium16" -_TABLE_NAME_SANITIZER = re.compile(r"[^A-Za-z0-9_]") -_COLUMN_PADDING = 1 -_DEFAULT_COLUMN_WIDTH = 12 -_MAX_COLUMN_WIDTH = 255 -_MIN_CHAR_WIDTH = 4 -_MAX_HEADER_LINES = 4 -_HEADER_FONT_COLOR = "00FFFFFF" -_HEADER_FILL_COLOR = "FF1F3864" -_HEADER_ALIGNMENT = Alignment(horizontal="center", vertical="center", wrapText=True) - - -def format_worksheet_as_table(worksheet, *, table_name: str | None = None) -> None: - if worksheet.max_row < 1 or worksheet.max_column < 1: - return - - worksheet.freeze_panes = "A2" - _wrap_header_row(worksheet) - _autofit_columns(worksheet) - _apply_table_style(worksheet, requested_name=table_name) - - -def _wrap_header_row(worksheet) -> None: - header_rows = worksheet.iter_rows(min_row=1, max_row=1) - try: - header = next(header_rows) - except StopIteration: - return - - for cell in header: - cell.alignment = (cell.alignment or Alignment()).copy( - horizontal=_HEADER_ALIGNMENT.horizontal, - vertical=_HEADER_ALIGNMENT.vertical, - wrapText=_HEADER_ALIGNMENT.wrapText, - ) - cell.font = (cell.font or Font()).copy(color=_HEADER_FONT_COLOR) - cell.fill = PatternFill( - fill_type="solid", - fgColor=_HEADER_FILL_COLOR, - bgColor=_HEADER_FILL_COLOR, - ) - - -def _autofit_columns(worksheet) -> None: - max_row = worksheet.max_row - max_col = worksheet.max_column - if max_col == 0: - return - - for column_cells in worksheet.iter_cols( - min_row=1, - max_row=max_row, - min_col=1, - max_col=max_col, - ): - header_cell = column_cells[0] - data_cells = column_cells[1:] - - data_width = max( - (_cell_display_length(cell.value) for cell in data_cells), - default=0, - ) - header_text = _cell_text(header_cell.value) - header_total_length = _cell_display_length(header_text) - header_longest_word = _longest_word_length(header_text) - - adjusted_width = data_width + _COLUMN_PADDING if data_width else 0 - adjusted_width = max(adjusted_width, header_longest_word) - - if header_total_length and adjusted_width: - estimated_lines = math.ceil(header_total_length / adjusted_width) - if estimated_lines > _MAX_HEADER_LINES: - widened_for_header = math.ceil( - header_total_length / _MAX_HEADER_LINES - ) - adjusted_width = max(adjusted_width, widened_for_header) - - if adjusted_width == 0: - adjusted_width = _DEFAULT_COLUMN_WIDTH - - adjusted_width = max(adjusted_width, _MIN_CHAR_WIDTH) - adjusted_width = min(adjusted_width, _MAX_COLUMN_WIDTH) - column_letter = get_column_letter(header_cell.column) - worksheet.column_dimensions[column_letter].width = adjusted_width - - -def _apply_table_style(worksheet, requested_name: str | None) -> None: - min_row = worksheet.min_row or 1 - max_row = worksheet.max_row or 1 - min_col = worksheet.min_column or 1 - max_col = worksheet.max_column or 1 - if max_row < min_row or max_col < min_col: - return - - start = f"{get_column_letter(min_col)}{min_row}" - end = f"{get_column_letter(max_col)}{max_row}" - table_range = f"{start}:{end}" - table_name = _generate_table_name(worksheet, requested_name) - - table = Table(displayName=table_name, ref=table_range) - table.tableStyleInfo = TableStyleInfo( - name=_TABLE_STYLE_NAME, - showFirstColumn=False, - showLastColumn=False, - showRowStripes=True, - showColumnStripes=False, - ) - worksheet.add_table(table) - - -def _cell_display_length(value: object) -> int: - if value in (None, ""): - return 0 - text = value.decode("utf-8", errors="replace") if isinstance(value, bytes) else str(value) - if not text: - return 0 - return max(len(part) for part in text.splitlines()) or 0 - - -def _cell_text(value: object) -> str: - if value in (None, ""): - return "" - return value.decode("utf-8", errors="replace") if isinstance(value, bytes) else str(value) - - -def _longest_word_length(text: str) -> int: - return max((len(word) for word in re.split(r"\s+", text) if word), default=0) - - -def _generate_table_name(worksheet, requested_name: str | None) -> str: - base_name = requested_name or f"{worksheet.title}_table" - base_name = _TABLE_NAME_SANITIZER.sub("_", base_name).strip("_") or "Table" - if not base_name[0].isalpha() and base_name[0] != "_": - base_name = f"_{base_name}" - base_name = base_name[:250] - - existing_names = _collect_table_names(worksheet) - candidate = base_name - suffix = 1 - while candidate in existing_names: - candidate = f"{base_name}_{suffix}" - suffix += 1 - return candidate - - -def _collect_table_names(worksheet) -> set[str]: - workbook = getattr(worksheet, "parent", None) - tables: set[str] = set() - worksheets = getattr(workbook, "worksheets", []) if workbook is not None else [worksheet] - - for ws in worksheets: - ws_tables = getattr(ws, "tables", None) - if not ws_tables: - continue - if isinstance(ws_tables, dict): - tables.update(ws_tables.keys()) - else: - tables.update(getattr(tbl, "displayName", "") for tbl in ws_tables) - - return {name for name in tables if name} - - -def _write_workbook( - output_path: Path, - *, - sheet_name: str, - headers: list[str], - rows: list[list[str]], - table_name: str, -) -> None: - wb = Workbook() - ws = wb.active - ws.title = sheet_name - ws.append(headers) - for row in rows: - ws.append(row) - format_worksheet_as_table(ws, table_name=table_name) - output_path.parent.mkdir(parents=True, exist_ok=True) - wb.save(output_path) - - -def _write_elements_workbook( - output_path: Path, - *, - sheet_name: str, - elements: list[dict[str, str]], - table_name: str, -) -> None: - headers = ["code", "label", "sanitized_label", "source"] - rows = [[el.get(h, "") for h in headers] for el in elements] - _write_workbook( - output_path, - sheet_name=sheet_name, - headers=headers, - rows=rows, - table_name=table_name, - ) - - -def main(argv: list[str] | None = None) -> None: - parser = argparse.ArgumentParser( - description="Build 2025 TAPR campus and district profiles." - ) - parser.add_argument("--input-dir", type=Path, default=data_path("tapr", "raw")) - parser.add_argument("--output-dir", type=Path, default=data_path("tapr")) - args = parser.parse_args(argv) - campus_student = args.input_dir / "2025 Campus Student Information.csv" - campus_staff = args.input_dir / "2025 Campus Staff Information.csv" - district_student = args.input_dir / "2025 District Student Information.csv" - district_staff = args.input_dir / "2025 District Staff Information.csv" - campus_out = args.output_dir / "CAMPPROF_2024-2025_FINAL.xlsx" - district_out = args.output_dir / "DISTPROF_2024-2025_FINAL.xlsx" - campus_elements_out = args.output_dir / "CAMPPROF_2024-2025_data_elements.xlsx" - district_elements_out = args.output_dir / "DISTPROF_2024-2025_data_elements.xlsx" - cfg = load_config(os.environ.get("TEADATA_CONFIG") or Path(__file__).resolve().parents[1] / "teadata_sources.yaml") - campus_mappings = _header_tables(cfg, "campus_tapr_student_staff_profile") - district_mappings = _header_tables(cfg, "district_tapr_student_staff_profile") - - campus_student_headers, campus_student_rows, campus_student_elements = ( - _read_tapr_csv(campus_student, mapping=campus_mappings["student"], key_field="campus_number") - ) - campus_staff_headers, campus_staff_rows, campus_staff_elements = _read_tapr_csv( - campus_staff, mapping=campus_mappings["staff"], key_field="campus_number" - ) - district_student_headers, district_student_rows, district_student_elements = ( - _read_tapr_csv( - district_student, mapping=district_mappings["student"], key_field="district_number" - ) - ) - district_staff_headers, district_staff_rows, district_staff_elements = ( - _read_tapr_csv( - district_staff, mapping=district_mappings["staff"], key_field="district_number" - ) - ) - - campus_headers, campus_records = _merge_tables( - campus_student_headers, - campus_student_rows, - campus_staff_headers, - campus_staff_rows, - key_field="campus_number", - preferred_cols=( - "campus_number", - "campus_name", - "district_number", - "district_name", - ), - ) - district_headers, district_records = _merge_tables( - district_student_headers, - district_student_rows, - district_staff_headers, - district_staff_rows, - key_field="district_number", - preferred_cols=("district_number", "district_name"), - ) - - campus_rows = _rows_for_headers(campus_headers, campus_records) - district_rows = _rows_for_headers(district_headers, district_records) - - _write_workbook( - campus_out, - sheet_name="campus_tapr_2025", - headers=campus_headers, - rows=campus_rows, - table_name="campus_tapr_2025", - ) - _write_workbook( - district_out, - sheet_name="district_tapr_2025", - headers=district_headers, - rows=district_rows, - table_name="district_tapr_2025", - ) - - for el in campus_student_elements: - el["source"] = "campus_student" - for el in campus_staff_elements: - el["source"] = "campus_staff" - for el in district_student_elements: - el["source"] = "district_student" - for el in district_staff_elements: - el["source"] = "district_staff" - - _write_elements_workbook( - campus_elements_out, - sheet_name="campus_tapr_elements_2025", - elements=campus_student_elements + campus_staff_elements, - table_name="campus_tapr_elements_2025", - ) - _write_elements_workbook( - district_elements_out, - sheet_name="district_tapr_elements_2025", - elements=district_student_elements + district_staff_elements, - table_name="district_tapr_elements_2025", - ) - - -if __name__ == "__main__": - main() diff --git a/teadata/scripts/build_tapr_profiles.py b/teadata/scripts/build_tapr_profiles.py new file mode 100644 index 0000000..546a1a7 --- /dev/null +++ b/teadata/scripts/build_tapr_profiles.py @@ -0,0 +1,163 @@ +"""Prepare complete declared TAPR editions into a new, unpublished directory. + +This source-preparation target never runs the entity engine, rewrites retained +workbooks, changes release pointers, or assigns scientific units from labels. +""" + +from __future__ import annotations + +import argparse +from dataclasses import replace +from hashlib import sha256 +from importlib.metadata import version +import json +import os +from pathlib import Path +import shutil +import sys +import tempfile + +from teadata.dataset_metadata import DatasetMetadata +from teadata.manifest import processor_identity, verify_reference_receipts +from teadata.provenance import ProvenanceStore +from teadata.scripts.paths import data_path +from teadata.tapr import merge_tapr_tables +from teadata.teadata_config import load_config + + +def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | None, + output_dir: Path, reference_store: ProvenanceStore | None = None) -> dict: + """Validate all selected inputs, then publish one complete new generation.""" + import pyarrow.parquet as pq + + if edition not in {"2024", "2025"} or not scopes or len(scopes) != len(set(scopes)) or set(scopes) - {"campus", "district"}: + raise ValueError("Select a declared 2024/2025 edition and distinct campus/district scopes") + output_dir = Path(output_dir) + if output_dir.exists() or output_dir.is_symlink(): + raise FileExistsError(f"Preparation output already exists: {output_dir}") + prepared = [] + for scope in scopes: + dataset = scope + "_tapr_student_staff_profile" + sources = cfg.read_tapr_sources(dataset, int(edition), input_dir=input_dir) + table = merge_tapr_tables(sources, key_field=scope + "_number") + if table.column_names != cfg.column_schema(dataset, int(edition), reader_profile="source"): + raise ValueError("Full TAPR preparation does not account for its complete field contract") + prepared.append((scope, dataset, sources, table)) + # No writer or provenance archive runs until every selected input validates. + output_dir.parent.mkdir(parents=True, exist_ok=True) + stage = Path(tempfile.mkdtemp(prefix=".tapr-preparation-", dir=output_dir.parent)) + stage.chmod(0o700) + try: + store = ProvenanceStore(stage / "provenance") + receipt = {"schema_version": 1, "edition": edition, "status": "validated_source_preparation", + "release_activation": False, + "toolchain": {"python": sys.version, "packages": {name: version(name) for name in ("pyarrow", "duckdb", "pandas", "openpyxl")}}, + "processor_sha256": processor_identity(), + "preparation_code_sha256": sha256(Path(__file__).read_bytes()).hexdigest(), + "scopes": {}} + for scope, dataset, sources, table in prepared: + source = cfg.resolve_dataset(dataset, int(edition)) + contract = cfg.column_contract(dataset, int(edition), reader_profile="source") + assert contract is not None + crosswalk_path = stage / (scope + "-crosswalk.json") + crosswalk_path.write_text(contract["text"]) + contract_observation = store.record_acquisition(crosswalk_path, + replace(source, path=str(crosswalk_path), dataset=dataset + ":schema", section="reference", + metadata=DatasetMetadata(title="TEA Data full TAPR source/header contract"))) + inputs = [contract_observation] + references = [] + for reference in cfg.reader_references(dataset, int(edition), reader_profile="source"): + for identifier in reference.provenance_ids: + if reference_store is None: + raise ValueError("Claimed source references require an explicit reference_store / --reference-store") + store.copy_record_from(reference_store, identifier) + inputs.append(identifier) + if reference.role == "schema" and reference.path == contract["path"]: + reference = replace(reference, provenance_ids=tuple(dict.fromkeys([ + *reference.provenance_ids, contract_observation]))) + references.append(reference) + bound_metadata = replace(source.metadata, provenance_ids=(), references=tuple(references)) + verify_reference_receipts(replace(source, metadata=bound_metadata), store, + reference_base=cfg.base_dir, verify_all_claimed=True) + annotations = [] + for item in sources: + acquisition = store.record_acquisition(item.path, replace(source, path=str(item.path), + metadata=bound_metadata), + parameters={"observation": "retained local raw source; original acquisition time remains unknown", + "table": item.mapping["table"]}) + if store.read_record(acquisition)["artifact"]["sha256"] != item.input_sha256: + raise ValueError("TAPR input changed before provenance binding") + inputs.append(acquisition) + if "dictionary" in item.mapping: + descriptor = item.mapping["dictionary"] + path = item.path.with_name(descriptor["filename"]) + observation = store.record_acquisition(path, replace(source, path=str(path), + dataset=dataset + ":dictionary", section="reference", + metadata=DatasetMetadata(title="Retained publisher TAPR Name/Type/Length/Label dictionary"))) + if store.read_record(observation)["artifact"]["sha256"] != descriptor["sha256"]: + raise ValueError("Publisher dictionary changed before provenance binding") + inputs.append(observation) + annotations.append({"table": item.mapping["table"], "source_sha256": item.input_sha256, + "annotations": list(item.annotations)}) + note_path = stage / (scope + "-annotations.json") + note_path.write_text(json.dumps(annotations, ensure_ascii=True, sort_keys=True) + "\n") + parquet_path = stage / (scope + ".parquet") + pq.write_table(table, parquet_path, compression="zstd", row_group_size=4096) + reopened = pq.read_table(parquet_path) + if not reopened.equals(table, check_metadata=True): + raise ValueError("TAPR prepared source artifact differs from validated raw strings") + validation = {"rows": table.num_rows, "fields": table.num_columns, + "source_columns_accounted": sum(len(item.mapping["fields"]) for item in sources), + "raw_string_readback_equal": True, "all_historical_source_rows_retained": True} + processing = store.record_processing(dataset=dataset, inputs=list(dict.fromkeys(inputs)), + outputs={"prepared_source": parquet_path, "crosswalk": crosswalk_path, "annotations": note_path}, + processor="teadata.scripts.build_tapr_profiles", code_version=receipt["processor_sha256"], + parameters={"edition": edition, "column_schema_sha256": contract["sha256"], + "preparation_code_sha256": receipt["preparation_code_sha256"], + "toolchain": receipt["toolchain"], "whitespace": "preserve", "geospatial_filter": False}, + validation=validation) + store.verify_record_closure([processing]) + receipt["scopes"][scope] = {**validation, "dataset": dataset, "processing_record_id": processing, + "column_schema_sha256": contract["sha256"], + "local_reference_closure_verified": True, + "reference_states": [{"reference_id": ref.reference_id, "availability": ref.status, + "acquisition_state": "retained" if ref.provenance_ids else "not_acquired", + "provenance_ids": list(ref.provenance_ids)} for ref in references], + "source_tables": [{"table": item.mapping["table"], "source_revision_sha256": item.input_sha256, + "publisher_columns": len(item.mapping["fields"]), "rows": item.table.num_rows} + for item in sources], + "coverage_scope": "Complete columns of the explicitly declared source tables; not all annual TAPR download families.", + "qualified_metrics": {key: value.to_dict() for key, value in source.metadata.metrics.items()}, + "other_field_semantics": "Unit/reference period unknown unless explicitly bound by qualified_metrics; edition is not a field reference period.", + "identity_fields": [name for name in table.column_names if name in {"campus_number", "campus_name", "district_number", "district_name"}], + "identity_storage": "Lossless source/history attributes; not additional metric keys or entity.meta hydration."} + (stage / "preparation.json").write_text(json.dumps(receipt, ensure_ascii=True, sort_keys=True, indent=2) + "\n") + if output_dir.exists() or output_dir.is_symlink(): + raise FileExistsError(f"Preparation output appeared during staging: {output_dir}") + os.rename(stage, output_dir) + return receipt + finally: + if stage.exists(): + shutil.rmtree(stage) + + +def main(argv: list[str] | None = None) -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--edition", required=True, choices=("2024", "2025")) + parser.add_argument("--scope", action="append", choices=("campus", "district")) + parser.add_argument("--config", type=Path) + parser.add_argument("--reference-store", type=Path, + help="Canonical store containing the exact claimed reference receipts and bytes") + parser.add_argument("--input-dir", type=Path, default=data_path("tapr", "raw")) + parser.add_argument("--output-dir", required=True, type=Path) + args = parser.parse_args(argv) + result = prepare_profiles(load_config(args.config), edition=args.edition, + scopes=args.scope or ["campus", "district"], input_dir=args.input_dir, output_dir=args.output_dir, + reference_store=ProvenanceStore(args.reference_store) if args.reference_store is not None else None) + print(json.dumps({"edition": args.edition, "output_dir": str(args.output_dir), + "scopes": {key: {"rows": value["rows"], "fields": value["fields"]} + for key, value in result["scopes"].items()}})) + + +if __name__ == "__main__": + main() diff --git a/teadata/scripts/rename_tapr_district_headers.py b/teadata/scripts/rename_tapr_district_headers.py deleted file mode 100644 index e4f84b2..0000000 --- a/teadata/scripts/rename_tapr_district_headers.py +++ /dev/null @@ -1,234 +0,0 @@ -from pprint import pprint -import argparse -from pathlib import Path - -import pandas as pd # type: ignore[import-untyped] -import re - -from teadata.scripts.paths import data_path - - -def sanitize_header(s: str) -> str: - """Convert a column header to a Python-safe identifier, mirroring the - normalization applied to TAPR columns in this script. - """ - s = str(s) - s = s.lower() - # remove punctuation we don't want to translate - s = s.replace(":", "").replace("(", "").replace(")", "") - # translate some symbols to words - s = s.replace("&", " and ") - s = s.replace("%", " percent ") - s = s.replace("#", " number ") - s = s.replace(">", " gt ") - s = s.replace("<", " lt ") - # unify dashes and slashes to underscores (includes en/em dashes) - s = re.sub(r"[\\/–—\-]+", "_", s) - # replace dots and whitespace with underscores - s = re.sub(r"[.]", "_", s) - s = re.sub(r"\s+", "_", s) - # remove any remaining disallowed chars - s = re.sub(r"[^a-z0-9_]+", "_", s) - # squeeze repeats and trim - s = re.sub(r"__+", "_", s) - return s.strip("_") - - -def restore_labels_from_reference( - cols: list[str], reference_df: pd.DataFrame -) -> list[str]: - """Given sanitized column names and the TAPR data elements dataframe, - return the original, human-friendly Labels with capitalization/punctuation - when possible. Columns that do not match a known Label are left as-is. - - This uses the *sanitized Label* as the lookup key to reverse the mapping. - If multiple Labels sanitize to the same key, the first occurrence wins. - """ - # Build lookup: sanitized label -> original label - lookup: dict[str, str] = {} - for lbl in reference_df["Label"].astype(str).tolist(): - key = sanitize_header(lbl) - if key not in lookup: - lookup[key] = lbl - # if there is a collision, keep the first-seen label deterministically - # Map provided columns back to labels when we have a match - return [lookup.get(c, c) for c in cols] - - -def main(argv: list[str] | None = None): - parser = argparse.ArgumentParser( - description="Normalize district TAPR column headers." - ) - parser.add_argument( - "--input", type=Path, default=data_path("tapr", "raw", "DISTPROF_2023-2024.csv") - ) - parser.add_argument( - "--reference", - type=Path, - default=data_path("tapr", "raw", "DISTPROF_2023-2024_data_elements.xlsx"), - ) - parser.add_argument( - "--output", - type=Path, - default=data_path("tapr", "DISTPROF_2023-2024_FINAL.xlsx"), - ) - args = parser.parse_args(argv) - # Options to control workflow - DO_SANITIZE = True - DO_RESTORE = False - FILTER = True - - tapr_df = pd.read_csv(args.input) - tapr_reference_df = pd.read_excel(args.reference) - args.output.parent.mkdir(parents=True, exist_ok=True) - - rename_dict = { - "DISTRICT": "district_number", - "CPETALLC": "campus_2015_student_enrollment_all_students_count", - # "CAMPNAME": "campus_name", - # "DISTRICT": "district_number", - # "DISTNAME": "district_name", - } - - try: - auto_rename_dict = dict( - zip(tapr_reference_df["Name"], tapr_reference_df["Label"]) - ) - except Exception: - auto_rename_dict = dict( - zip(tapr_reference_df["NAME"], tapr_reference_df["LABEL"]) - ) - - tapr_df = tapr_df.rename(columns=rename_dict) - tapr_df = tapr_df.rename(columns=auto_rename_dict) - - # Desired columns (sanitized identifiers) - cols_sanitized = [ - "district_number", - "district_2024_student_enrollment_all_students_count", - "district_2024_student_enrollment_african_american_percent", - "district_2024_student_enrollment_hispanic_percent", - "district_2024_student_enrollment_white_percent", - "district_2024_student_enrollment_american_indian_percent", - "district_2024_student_enrollment_asian_percent", - "district_2024_student_enrollment_pacific_islander_percent", - "district_2024_student_enrollment_two_or_more_races_percent", - "district_2024_student_enrollment_econ_disadv_percent", - "district_2024_student_enrollment_non_educationally_disadv_percent", - "district_2024_student_enrollment_section_504_percent", - "district_2024_student_enrollment_el_percent", - "district_2024_student_enrollment_dyslexia_percent", - "district_2024_student_enrollment_foster_care_percent", - "district_2024_student_enrollment_homeless_percent", - "district_2024_student_enrollment_immigrant_percent", - "district_2024_student_enrollment_migrant_percent", - "district_2024_student_enrollment_title_i_percent", - "district_2024_student_enrollment_at_risk_percent", - "district_2024_student_enrollment_bilingual_esl_percent", - "district_2024_student_enrollment_gifted_and_talented_percent", - "district_2024_student_enrollment_special_ed_percent", - "district_2023_daep_percent", - "district_2024_student_membership_2022_23_attrition_all_students_percent", - "district_2024_student_membership_2023_mobility_all_students_percent", - "district_2024_staff_teacher_total_full_time_equiv_count", - "district_2024_staff_support_total_full_time_equiv_count", - "district_2024_staff_school_admin_total_full_time_equiv_count", - "district_2024_staff_central_admin_total_full_time_equiv_count", - "district_2024_staff_educ_aide_total_full_time_equiv_count", - "district_2024_staff_ssa_educational_aides_full_time_equiv_count", - "district_2024_staff_counselor_total_part_time_equiv_count", - "district_2024_staff_counselor_total_full_time_equiv_count", - "district_2024_staff_librarian_total_part_time_equiv_count", - "district_2024_staff_librarian_total_full_time_equiv_count", - "district_2024_staff_teacher_regular_program_full_time_equiv_count", - "district_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_count", - "district_2024_staff_teacher_bilingual_program_full_time_equiv_count", - "district_2024_staff_teacher_special_education_full_time_equiv_count", - "district_2024_staff_teacher_turnover_ratio", - "district_2024_staff_teacher_tenure_average", - "district_2024_staff_teacher_experience_average", - "district_2024_staff_teacher_student_ratio", - "district_2024_staff_professional_total_full_time_equiv_percent", - "district_2024_staff_teacher_total_full_time_equiv_percent", - "district_2024_staff_support_total_full_time_equiv_percent", - "district_2024_staff_school_admin_total_full_time_equiv_percent", - "district_2024_staff_central_admin_total_full_time_equiv_percent", - "district_2024_staff_educ_aide_total_full_time_equiv_percent", - "district_2024_staff_auxiliary_total_full_time_equiv_percent", - "district_2024_staff_teacher_no_degree_full_time_equiv_percent", - "district_2024_staff_teacher_ba_degree_full_time_equiv_percent", - "district_2024_staff_teacher_ms_degree_full_time_equiv_percent", - "district_2024_staff_teacher_ph_degree_full_time_equiv_percent", - "district_2024_staff_teacher_beginning_full_time_equiv_percent", - "district_2024_staff_teacher_1_5_years_full_time_equiv_percent", - "district_2024_staff_teacher_6_10_years_full_time_equiv_percent", - "district_2024_staff_teacher_11_20_years_full_time_equiv_percent", - "district_2024_staff_teacher_21_30_years_full_time_equiv_percent", - "district_2024_staff_teacher_gt_30_years_full_time_equiv_percent", - "district_2024_staff_teacher_regular_program_full_time_equiv_percent", - "district_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_percent", - "district_2024_staff_teacher_bilingual_program_full_time_equiv_percent", - "district_2024_staff_teacher_special_education_full_time_equiv_percent", - "district_2024_staff_teacher_beginning_base_salary_average", - "district_2024_staff_teacher_1_5_years_base_salary_average", - "district_2024_staff_teacher_6_10_years_base_salary_average", - "district_2024_staff_teacher_11_20_years_base_salary_average", - "district_2024_staff_teacher_21_30_years_base_salary_average", - "district_2024_staff_teacher_gt_30_years_base_salary_average", - "district_2024_staff_teacher_total_base_salary_average", - "district_2024_staff_support_total_base_salary_average", - "district_2024_staff_school_admin_total_base_salary_average", - "district_2024_staff_central_admin_total_base_salary_average", - ] - # Map desired sanitized names to human Labels using the reference file - cols_labels = restore_labels_from_reference(cols_sanitized, tapr_reference_df) - - def _are_cols_sanitized(colnames: list[str]) -> bool: - return all(c == sanitize_header(c) for c in colnames) - - if DO_SANITIZE: - # 1) Sanitize current headers - tapr_df.columns = [sanitize_header(c) for c in tapr_df.columns] - # 2) Filter using sanitized names (to avoid KeyError before sanitize) - if FILTER: - missing = [c for c in cols_sanitized if c not in tapr_df.columns] - if missing: - print("Warning: missing expected columns (sanitized):", missing) - tapr_df = tapr_df[[c for c in cols_sanitized if c in tapr_df.columns]] - pprint(list(tapr_df.columns)) - tapr_df.to_excel(args.output, index=False) - - elif DO_RESTORE: - # If we want labels, filter with labels when headers are not sanitized, - # otherwise filter with sanitized and then restore. - if FILTER: - if _are_cols_sanitized(list(tapr_df.columns)): - desired = [c for c in cols_sanitized if c in tapr_df.columns] - else: - desired = [c for c in cols_labels if c in tapr_df.columns] - missing = [ - c - for c in ( - cols_labels - if not _are_cols_sanitized(list(tapr_df.columns)) - else cols_sanitized - ) - if c not in tapr_df.columns - ] - if missing: - print("Warning: missing expected columns:", missing) - tapr_df = tapr_df[desired] - # Finally, restore human-friendly Labels if headers are sanitized - if _are_cols_sanitized(list(tapr_df.columns)): - tapr_df.columns = restore_labels_from_reference( - list(tapr_df.columns), tapr_reference_df - ) - pprint(list(tapr_df.columns)) - tapr_df.to_excel(args.output, index=False) - - # pprint(tapr_df.columns.tolist()) - # exit() - - -if __name__ == "__main__": - main() diff --git a/teadata/tapr.py b/teadata/tapr.py new file mode 100644 index 0000000..f6a902e --- /dev/null +++ b/teadata/tapr.py @@ -0,0 +1,241 @@ +"""Lossless TAPR source preparation from reviewed edition/header resources. + +CSV record classification is structural. Arrow decodes fact columns and +merges whole native tables; scientific token interpretation stays in values.py. +""" + +from __future__ import annotations + +import csv +from dataclasses import dataclass +from hashlib import sha256 +import io +from pathlib import Path +import re +from typing import Any, Mapping + +from .column_schema import validate_header_table +from .identifiers import canonical_source_identifiers + + +@dataclass(frozen=True) +class TaprSourceTable: + table: Any + path: Path + input_sha256: str + dataset: str + edition: str + annotations: tuple[dict[str, Any], ...] + mapping: Mapping[str, Any] + + +def _extract_records(raw: bytes, mapping: Mapping[str, Any], path: Path): + """Extract only explicitly reviewed data/annotation record ranges. + + The standard CSV decoder handles quoted multiline records. This scan never + converts fact cells, pads widths, strips tokens or infers notes from IDs. + """ + fields = mapping["fields"] + width = len(fields) + layout = mapping.get("layout") + code_record = layout["code_record"] if layout else 2 + label_record = layout["label_record"] if layout else 1 + first = layout["first_data_record"] if layout else 3 + last = layout["last_data_record"] if layout else None + annotations = layout["annotations"] if layout else [] + text = raw.decode("utf-8-sig") + stream = io.StringIO(text, newline="") + reader = csv.reader(stream, strict=True) + headers: dict[int, list[str]] = {} + spans: list[tuple[int, int]] = [] + observed: list[dict[str, Any]] = [] + annotation_records: dict[int, list[list[str]]] = {} + annotation_text: dict[int, list[str]] = {} + data_records: list[int] = [] + count = 0 + try: + while True: + start = stream.tell() + try: + row = next(reader) + except StopIteration: + break + end = stream.tell() + count += 1 + note = next((i for i, item in enumerate(annotations) + if item["first_record"] <= count <= item["last_record"]), None) + if note is not None: + annotation_records.setdefault(note, []).append(row) + segment = text[start:end] + if count == 1 and raw.startswith(b"\xef\xbb\xbf"): + segment = "\ufeff" + segment + annotation_text.setdefault(note, []).append(segment) + elif count in {code_record, label_record}: + headers[count] = row + elif count >= first and (last is None or count <= last): + if len(row) != width: + raise ValueError(f"{path}: record {count} has {len(row)} fields; expected {width}") + data_records.append(count) + if spans and spans[-1][1] == start: + spans[-1] = (spans[-1][0], end) + else: + spans.append((start, end)) + else: + raise ValueError(f"{path}: unaccounted record {count}; review its layout/annotation provenance") + except csv.Error as error: + raise ValueError(f"{path}: invalid CSV near physical line {reader.line_num}: {error}") from error + if last is not None and count < last: + raise ValueError(f"{path}: missing reviewed data records through {last}") + if headers.get(code_record) != [field["code"] for field in fields]: + raise ValueError(f"{path}: source-code header differs from reviewed record {code_record}") + if label_record is not None and headers.get(label_record) != [field["label"] for field in fields]: + raise ValueError(f"{path}: human-label header differs from reviewed record {label_record}") + for index, note in enumerate(annotations): + records = annotation_records.get(index, []) + content = "".join(annotation_text.get(index, [])).encode("utf-8") + if (len(records) != note["last_record"] - note["first_record"] + 1 + or sha256(content).hexdigest() != note["sha256"]): + raise ValueError(f"{path}: annotation range {note['first_record']}–{note['last_record']} differs from reviewed notes") + if note["kind"] == "blank" and any(any(cell for cell in row) for row in records): + raise ValueError(f"{path}: declared blank annotation contains nonblank source text") + observed.append({**note, "records": records}) + if not spans: + raise ValueError(f"{path}: no TAPR data records") + return "".join(text[start:end] for start, end in spans).encode("utf-8"), observed, data_records + + +def _verify_dictionary(path: Path, mapping: Mapping[str, Any]) -> None: + import pandas as pd + + descriptor = mapping["dictionary"] + raw = path.read_bytes() + if sha256(raw).hexdigest() != descriptor["sha256"]: + raise ValueError(f"{path}: publisher dictionary bytes differ from reviewed edition") + dictionary = pd.read_excel(io.BytesIO(raw), sheet_name=descriptor["sheet_name"], + dtype=str, keep_default_na=False, na_filter=False, engine="openpyxl") + if list(dictionary.columns) != ["Name", "Type", "Length", "Label"]: + raise ValueError(f"{path}: unexpected publisher dictionary layout") + expected = pd.DataFrame([{"Name": field["code"], "Type": field["publisher_type"], + "Length": field["publisher_length"], "Label": field["label"]} + for field in mapping["fields"]]) + if not dictionary.equals(expected): + raise ValueError(f"{path}: publisher dictionary does not match the complete reviewed crosswalk") + + +def read_tapr_table(path: str | Path, *, mapping: Mapping[str, Any], key_field: str, + dataset: str, edition: str, + dictionary_path: str | Path | None = None) -> TaprSourceTable: + """Read all publisher fields as exact strings, validating strict identities.""" + import pyarrow as pa + import pyarrow.compute as arrow_compute + import pyarrow.csv as pacsv + + pc: Any = arrow_compute # Arrow registers compute kernels dynamically. + path = Path(path) + if (key_field not in {"campus_number", "district_number"} + or dataset != key_field.removesuffix("_number") + "_tapr_student_staff_profile" + or not isinstance(edition, str) or not edition.strip()): + raise ValueError("TAPR preparation requires an explicit qualified dataset and source edition") + validate_header_table(mapping) + raw = path.read_bytes() + if sha256(raw).hexdigest() != mapping["input_sha256"]: + raise ValueError(f"{path}: input differs from the reviewed header crosswalk") + if "dictionary" in mapping: + _verify_dictionary(Path(dictionary_path) if dictionary_path is not None + else path.with_name(mapping["dictionary"]["filename"]), mapping) + fields = mapping["fields"] + headers = [field["field"] for field in fields] + if key_field not in {"campus_number", "district_number"} or key_field not in headers: + raise ValueError(f"{path}: missing or unsupported source key {key_field!r}") + expected_code = "CAMPUS" if key_field == "campus_number" else "DISTRICT" + if fields[headers.index(key_field)]["code"] != expected_code: + raise ValueError(f"{path}: source key must bind publisher code {expected_code!r}") + body, annotations, data_records = _extract_records(raw, mapping, path) + codes = [field["code"] for field in fields] + table = pacsv.read_csv(pa.BufferReader(body), + read_options=pacsv.ReadOptions(column_names=codes, use_threads=False), + parse_options=pacsv.ParseOptions(newlines_in_values=True, ignore_empty_lines=False), + convert_options=pacsv.ConvertOptions(column_types=dict.fromkeys(codes, pa.string()), + null_values=[], strings_can_be_null=False, quoted_strings_can_be_null=False)).rename_columns(headers) + try: + identity = canonical_source_identifiers(table[key_field], width=9 if key_field == "campus_number" else 6) + if pc.any(pc.is_null(identity)).as_py(): + position = pc.index(pc.is_null(identity), True).as_py() + raise ValueError(f"record {data_records[position]} has a missing source identifier") + if pc.count_distinct(identity).as_py() != table.num_rows: + counts = pc.value_counts(identity) + duplicate = pc.filter(counts.field("values"), pc.greater(counts.field("counts"), 1))[0] + positions = pc.indices_nonzero(pc.equal(identity, duplicate)).to_pylist() + raise ValueError(f"duplicate {key_field} at records {[data_records[index] for index in positions]}") + if key_field == "campus_number" and "district_number" in headers: + district = canonical_source_identifiers(table["district_number"], width=6) + parent = pc.utf8_slice_codeunits(identity, start=1, stop=7) + if pc.any(pc.or_(pc.is_null(district), pc.fill_null(pc.not_equal(parent, pc.utf8_slice_codeunits(district, start=1)), True))).as_py(): + raise ValueError("campus and district identifiers disagree") + except ValueError as error: + message = str(error) + if match := re.search(r"batch row ([0-9]+)", message): + message += f" (source record {data_records[int(match[1]) - 1]})" + raise ValueError(f"{path}: invalid {key_field}: {message}") from error + if sha256(path.read_bytes()).hexdigest() != mapping["input_sha256"]: + raise ValueError(f"{path}: input changed during source preparation") + return TaprSourceTable(table, path, mapping["input_sha256"], dataset, edition, tuple(annotations), mapping) + + +def merge_tapr_tables(sources: list[TaprSourceTable], *, key_field: str): + """Outer-merge this edition's native tables, retaining historical entities. + + Shared identity/header definitions must agree. This is deliberately not a + cross-dataset metric arbitration rule or a comparison between periods. + """ + import pyarrow as pa + import pyarrow.compute as arrow_compute + + pc: Any = arrow_compute + + if not sources: + raise ValueError("At least one source table is required") + if key_field not in {"campus_number", "district_number"}: + raise ValueError("Unsupported TAPR merge identity") + width = 9 if key_field == "campus_number" else 6 + if len({(source.dataset, source.edition) for source in sources}) != 1: + raise ValueError("TAPR tables from different qualified datasets or editions must remain independent") + if len({source.mapping["table"] for source in sources}) != len(sources): + raise ValueError("Different revisions or repeated observations of one TAPR table must remain independent") + for source in sources: + validate_header_table(source.mapping) + if source.table.column_names != [field["field"] for field in source.mapping["fields"]] or key_field not in source.table.column_names: + raise ValueError("TAPR native table differs from its reviewed field mapping") + identity = canonical_source_identifiers(source.table[key_field], width=width) + if pc.any(pc.is_null(identity)).as_py() or pc.count_distinct(identity).as_py() != source.table.num_rows: + raise ValueError("TAPR source table has missing or duplicate identities") + result = sources[0].table + definitions = {f["field"]: (f["code"], f["label"]) for f in sources[0].mapping["fields"]} + for source in sources[1:]: + for field in source.mapping["fields"]: + if definitions.setdefault(field["field"], (field["code"], field["label"])) != (field["code"], field["label"]): + raise ValueError(f"Conflicting shared header definition: {field['field']!r}") + left_names = {name: f"a{index}" for index, name in enumerate(result.column_names)} + right_names = {name: f"b{index}" for index, name in enumerate(source.table.column_names)} + left = result.rename_columns(list(left_names.values())).append_column( + "identity", canonical_source_identifiers(result[key_field], width=width)) + right = source.table.rename_columns(list(right_names.values())).append_column( + "identity", canonical_source_identifiers(source.table[key_field], width=width)) + joined = left.join(right, keys="identity", join_type="full outer") + columns = list(dict.fromkeys([*result.column_names, *source.table.column_names])) + arrays = [] + for name in columns: + if name in left_names and name in right_names: + a, b = joined[left_names[name]], joined[right_names[name]] + conflict = pc.fill_null(pc.and_(pc.and_(pc.not_equal(a, ""), pc.not_equal(b, "")), pc.not_equal(a, b)), False) + if pc.any(conflict).as_py(): + if name == key_field: + raise ValueError(f"Inconsistent TAPR {key_field} representations across source tables") + raise ValueError(f"Conflicting TAPR values for shared field {name!r}") + arrays.append(pc.coalesce(pc.if_else(pc.fill_null(pc.equal(a, ""), False), + pa.scalar(None, type=a.type), a), b, a)) + else: + arrays.append(joined[left_names[name]] if name in left_names else joined[right_names[name]]) + result = pa.Table.from_arrays(arrays, names=columns) + result = result.take(pc.sort_indices(result, sort_keys=[(key_field, "ascending")])) + return result diff --git a/teadata/teadata_config.py b/teadata/teadata_config.py index cda612b..792b777 100644 --- a/teadata/teadata_config.py +++ b/teadata/teadata_config.py @@ -98,6 +98,18 @@ def _expand_path(value: str) -> str: return value +def _resolve_source_path(value: str, base_dir: Path) -> str: + """Resolve one runtime locator without mutating portable reader metadata.""" + if value.strip().isdigit() or "://" in value: + return value + path = Path(_expand_path(value)) + if path.is_absolute(): + return str(path) + if path.parts and path.parts[0] == "data" and os.environ.get("TEADATA_DATA_DIR"): + return str(Path(_expand_path(os.environ["TEADATA_DATA_DIR"])).resolve().joinpath(*path.parts[1:])) + return str(base_dir / path) + + def _rewrite_relative_paths(raw: dict, base_dir: Path) -> dict: """Rewrite relative file paths in data_sources/spatial to be relative to base_dir.""" @@ -109,24 +121,7 @@ def rewrite_value(val: Any) -> Any: return updated if not isinstance(val, str): return val - stripped = val.strip() - if stripped.isdigit() or "://" in stripped: - return val - expanded = _expand_path(val) - path = Path(expanded) - if path.is_absolute(): - return str(path) - if ( - path.parts - and path.parts[0] == "data" - and os.environ.get("TEADATA_DATA_DIR") - ): - return str( - Path(_expand_path(os.environ["TEADATA_DATA_DIR"])) - .resolve() - .joinpath(*path.parts[1:]) - ) - return str(base_dir / path) + return _resolve_source_path(val, base_dir) def rewrite_section(section: dict) -> dict: out: dict = {} @@ -705,7 +700,7 @@ def column_contract( return None references = [ reference - for reference in source.metadata.references + for reference in self.reader_references(dataset, year, section=section, reader_profile=reader_profile) if reference.role == "schema" and reference.path == resource ] if ( @@ -724,6 +719,22 @@ def column_contract( except (OSError, ValueError) as error: raise ContractError(f"Invalid column schema for {dataset}: {error}") from error + def reader_references(self, dataset: str, year: int | None = None, *, + section: str = "data_sources", reader_profile: str | None = None): + """Describe selected source-profile references without changing retained metadata.""" + from .column_schema import reader_options + from .dataset_metadata import ReferenceDocument + + source = self.resolve_dataset(dataset, year, section=section) + options = reader_options(source.reader, reader_profile) + extra = options.get("references", []) + if not isinstance(extra, list) or any(not isinstance(item, dict) for item in extra): + raise ValueError("Reader references must be reference-document records") + selected = [*source.metadata.references, *(ReferenceDocument.from_dict(item) for item in extra)] + if len({item.reference_id for item in selected}) != len(selected): + raise ValueError("Reader reference identifiers must be unique") + return selected + def column_schema( self, dataset: str, year: int | None = None, *, section: str = "data_sources", reader_profile: str | None = None, @@ -743,7 +754,7 @@ def column_schema( raise ContractError(f"Invalid column schema for {dataset}: {error}") from error def header_records(self, dataset: str, *, edition: str, - table: str | None = None) -> list[dict[str, Any]]: + table: str | None = None, reader_profile: str | None = None) -> list[dict[str, Any]]: """Return reviewed source-contract mappings without any dataset reads. This explicitly selects this configuration's contract, independently of @@ -759,7 +770,7 @@ def header_records(self, dataset: str, *, edition: str, if len(choices) != 1: raise ContractError(f"Source-contract header crosswalk edition unavailable or ambiguous: {dataset!r}, {edition!r}") section, year = choices[0] - contract = self.column_contract(dataset, year, section=section) + contract = self.column_contract(dataset, year, section=section, reader_profile=reader_profile) if contract is None: raise ContractError(f"Source-contract header crosswalk unavailable: {dataset!r}") try: @@ -770,17 +781,59 @@ def header_records(self, dataset: str, *, edition: str, def header_mapping(self, dataset: str, *, edition: str, table: str, from_: str = "code", to: str = "field", - columns: Iterable[str] | None = None) -> dict[str, str]: + columns: Iterable[str] | None = None, reader_profile: str | None = None) -> dict[str, str]: """Return an ordinary rename map from this explicit source contract.""" from .column_schema import header_rename_map from .manifest import ContractError try: - return header_rename_map(self.header_records(dataset, edition=edition, table=table), + return header_rename_map(self.header_records(dataset, edition=edition, table=table, reader_profile=reader_profile), from_=from_, to=to, columns=columns) except ValueError as error: raise ContractError(str(error)) from error + def read_tapr_sources(self, dataset: str, year: int, *, input_dir: str | Path | None = None): + """Explicit full-edition raw preparation, independent of released facts. + + The retained release recorder deliberately continues reading its exact + prepared inputs. Raw preparation has its own real processing receipt; + it cannot masquerade as a schema2 release build or replace those bytes. + """ + from .column_schema import crosswalk_dataset, parse_column_schema, reader_options + from .manifest import ACTIVE_BUILD, ContractError + from .tapr import read_tapr_table + + if ACTIVE_BUILD.get() is not None: + raise ContractError("Prepare full TAPR sources explicitly before a retained-format release build") + source = self.resolve_dataset(dataset, year) + if source.resolved_year != year or source.metadata.version != str(year): + raise ContractError("Full TAPR source preparation requires an exact declared edition") + options = reader_options(source.reader, "source") + selection = options.get("tapr_source") + if (not isinstance(selection, dict) or set(selection) != {"scope", "tables"} + or selection["scope"] not in {"campus", "district"} + or not isinstance(selection["tables"], dict) + or not selection["tables"] + or any(not isinstance(value, str) or not value or "://" in value + for value in selection["tables"].values())): + raise ContractError("Full TAPR source profile requires an explicit scope and local table paths") + contract = self.column_contract(dataset, year, reader_profile="source") + if contract is None: + raise ContractError("Full TAPR source preparation requires a reviewed crosswalk") + selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, source.metadata.version) + if set(selection["tables"]) != {table["table"] for table in selected["tables"]}: + raise ContractError("Full TAPR source paths do not account for every reviewed table") + result = [] + for table in selected["tables"]: + path = Path(selection["tables"][table["table"]]) + if input_dir is not None: + path = Path(input_dir) / path.name + else: + path = Path(_resolve_source_path(str(path), self.base_dir or Path.cwd())) + result.append(read_tapr_table(path, mapping=table, key_field=selection["scope"] + "_number", + dataset=dataset, edition=source.metadata.version)) + return result + def load_df( self, dataset: str, @@ -814,6 +867,21 @@ def load_df( f"Reader profile is required for {dataset}; no default column schema is declared" ) options.pop("column_schema", None) + options.pop("references", None) + raw_tapr = options.pop("tapr_source", None) + if raw_tapr is not None: + from .tapr import merge_tapr_tables + + if reader_profile != "source" or reader_kwargs: + raise ContractError("Full TAPR preparation uses its exact source profile without reader overrides") + selected_year = year if year is not None else source.resolved_year + if selected_year is None: + raise ContractError("Full TAPR source preparation requires an exact declared edition") + tables = self.read_tapr_sources(dataset, selected_year) + frame = merge_tapr_tables(tables, key_field=raw_tapr["scope"] + "_number").to_pandas() + if list(frame.columns) != expected_schema: + raise ContractError("Full TAPR source preparation differs from its complete crosswalk") + return source.resolved_year, frame columns = options.pop("columns", {}) required = options.pop("required_columns", []) options.update(reader_kwargs) diff --git a/teadata/teadata_sources.yaml b/teadata/teadata_sources.yaml index 4b337bc..1cba957 100644 --- a/teadata/teadata_sources.yaml +++ b/teadata/teadata_sources.yaml @@ -405,6 +405,29 @@ data_sources: dtype: str keep_default_na: false column_schema: schemas/data_sources--campus_tapr_student_staff_profile--2024--default.json + profiles: + source: + column_schema: schemas/tapr--2024--header-crosswalk.json + tapr_source: + scope: campus + tables: + profile: data/tapr/raw/CAMPPROF_2023-2024.csv + references: + - reference_id: source_dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&prgopt=2024%2Ftapr%2FAdvanced+Download%2Fgetdata_2024.sas&sumlev=C&setpick=PROF&ddic=Y + title: 2024 Campus Profile publisher Data Elements; current reference + link, not original acquisition URL + status: unreviewed + provenance_ids: [] + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--header-crosswalk.json + title: Complete retained 2024 publisher code-label-field and source + layout contract; not released facts + status: available + provenance_ids: [] + reviewed_sha256: 54cc99ffc8ce29f7ea9b80f88d03c0a4c7c2b345846707e81bb897c5a02c4de0 2025: path: data/tapr/CAMPPROF_2024-2025_FINAL.xlsx metadata: @@ -476,6 +499,28 @@ data_sources: dtype: str keep_default_na: false column_schema: schemas/tapr--2025--header-crosswalk.json + profiles: + source: + tapr_source: + scope: campus + tables: + student: data/tapr/raw/2025 Campus Student Information.csv + staff: data/tapr/raw/2025 Campus Staff Information.csv + references: + - reference_id: dictionary_student + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=STUD&dd=student&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas + title: 2025 Campus Student Information publisher dictionary; current + reference link + status: unreviewed + provenance_ids: [] + - reference_id: dictionary_staff + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=STAF&dd=staff&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas + title: 2025 Campus Staff Information publisher dictionary; current reference + link + status: unreviewed + provenance_ids: [] campus_tapr_historical_enrollment: 2015: path: data/tapr/CAMPPROF_2014-2015_FINAL.xlsx @@ -597,6 +642,29 @@ data_sources: dtype: str keep_default_na: false column_schema: schemas/data_sources--district_tapr_student_staff_profile--2024--default.json + profiles: + source: + column_schema: schemas/tapr--2024--header-crosswalk.json + tapr_source: + scope: district + tables: + profile: data/tapr/raw/DISTPROF_2023-2024.csv + references: + - reference_id: source_dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&prgopt=2024%2Ftapr%2FAdvanced+Download%2Fgetdata_2024.sas&sumlev=D&setpick=PROF&ddic=Y + title: 2024 District Profile publisher Data Elements; current reference + link, not original acquisition URL + status: unreviewed + provenance_ids: [] + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--header-crosswalk.json + title: Complete retained 2024 publisher code-label-field and source + layout contract; not released facts + status: available + provenance_ids: [] + reviewed_sha256: 54cc99ffc8ce29f7ea9b80f88d03c0a4c7c2b345846707e81bb897c5a02c4de0 2025: path: data/tapr/DISTPROF_2024-2025_FINAL.xlsx metadata: @@ -668,6 +736,28 @@ data_sources: dtype: str keep_default_na: false column_schema: schemas/tapr--2025--header-crosswalk.json + profiles: + source: + tapr_source: + scope: district + tables: + student: data/tapr/raw/2025 District Student Information.csv + staff: data/tapr/raw/2025 District Staff Information.csv + references: + - reference_id: dictionary_student + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=STUD&dd=student&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas + title: 2025 District Student Information publisher dictionary; current + reference link + status: unreviewed + provenance_ids: [] + - reference_id: dictionary_staff + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=STAF&dd=staff&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas + title: 2025 District Staff Information publisher dictionary; current + reference link + status: unreviewed + provenance_ids: [] campus_planned_closures: 2025: path: data/closures/Planned School Closures_10.03.2025.xlsx diff --git a/tests/test_column_schema.py b/tests/test_column_schema.py index 90eca62..77b873c 100644 --- a/tests/test_column_schema.py +++ b/tests/test_column_schema.py @@ -14,6 +14,66 @@ ROOT = Path(__file__).resolve().parents[1] +def test_complete_2024_source_crosswalk_is_offline_and_keeps_legacy_projection(monkeypatch): + cfg = load_config(ROOT / "teadata" / "teadata_sources.yaml") + def forbidden(*args, **kwargs): + pytest.fail("Header discovery read source facts") + monkeypatch.setattr(cfg, "_load_table", forbidden) + monkeypatch.setattr(cfg, "read_tapr_sources", forbidden) + for scope, count, retained in [("campus", 407, 404), ("district", 420, 75)]: + dataset = scope + "_tapr_student_staff_profile" + records = cfg.header_records(dataset, edition="2024", reader_profile="source") + assert len(records) == count + assert len(cfg.column_schema(dataset, 2024)) == retained + assert set(cfg.column_schema(dataset, 2024)) <= {record["field"] for record in records} + identities = {record["field"] for record in records if record["disposition"] == "identity"} + expected = {"district_number", "district_name"} + if scope == "campus": + expected |= {"campus_number", "campus_name"} + assert identities == expected + assert len(cfg.header_mapping(dataset, edition="2024", table="profile", reader_profile="source")) == count + + +def test_default_build_keeps_unselected_source_locators_portable_across_data_roots(tmp_path, monkeypatch): + import yaml + from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset + from teadata.manifest import BuildRecorder + from teadata.provenance import ProvenanceStore + + _, raw, schema, _ = schema_config(tmp_path, reader={"profiles": {"source": { + "tapr_source": {"scope": "campus", "tables": {"profile": "data/tapr/raw/original.csv"}}}}}) + raw["data_sources"]["sample"][2025]["path"] = "data/source.csv" + store = ProvenanceStore(tmp_path / "provenance") + schema_id = store.record_acquisition(schema, ResolvedDataset("reference:columns", "reference", None, None, + str(schema), DatasetMetadata(title="Test columns"))) + raw["data_sources"]["sample"][2025]["metadata"]["references"][0]["provenance_ids"] = [schema_id] + config = tmp_path / "config.yaml" + config.write_text(yaml.safe_dump(raw)) + roots = [tmp_path / "root-a", tmp_path / "root-b"] + for root in roots: + root.mkdir() + (root / "source.csv").write_text("alpha,beta\n1,2\n") + monkeypatch.setenv("TEADATA_DATA_DIR", str(roots[0])) + cfg = load_config(config) + observed = cfg.resolve_dataset("sample", 2025) + source_id = store.record_acquisition(observed.path, observed) + raw["data_sources"]["sample"][2025]["metadata"]["provenance_ids"] = [source_id] + config.write_text(yaml.safe_dump(raw)) + build_ids = [] + readers = [] + for root in roots: + monkeypatch.setenv("TEADATA_DATA_DIR", str(root)) + cfg = load_config(config) + with BuildRecorder(cfg, store) as recorder: + cfg.load_df("sample", 2025) + readers.append(recorder.datasets["sample"]["reader"]) + build_ids.append(recorder.catalog().build_id) + assert build_ids[0] == build_ids[1] + assert readers[0] == readers[1] + assert readers[0]["profiles"]["source"]["tapr_source"]["tables"] == {"profile": "data/tapr/raw/original.csv"} + assert not any(str(root) in canonical_json(readers[0]) for root in roots) + + def schema_config(tmp_path, *, document=None, reader=None): directory = tmp_path / "schemas" directory.mkdir(exist_ok=True) @@ -275,7 +335,10 @@ def test_every_packaged_version_and_declared_profile_has_an_offline_schema(monke for section in ("data_sources", "spatial"): for dataset, year_map in getattr(cfg, section).items(): for year, entry in year_map.entries.items(): - for profile in list(entry.reader.get("profiles", {})) or [None]: + profiles = list(entry.reader.get("profiles", {})) + if entry.reader.get("column_schema") or not profiles: + profiles.insert(0, None) + for profile in profiles: columns = cfg.column_schema( dataset, year, section=section, reader_profile=profile ) diff --git a/tests/test_provenance.py b/tests/test_provenance.py index 8818a7c..64fd810 100644 --- a/tests/test_provenance.py +++ b/tests/test_provenance.py @@ -12,6 +12,71 @@ NOW = datetime(2026, 1, 1, 12, tzinfo=timezone.utc) +def test_copy_selected_record_closure_retains_nested_reference_history_only(tmp_path): + from dataclasses import replace + from teadata.manifest import verify_reference_receipts + + source = ProvenanceStore(tmp_path / "original-store") + document = tmp_path / "definitions.md" + document.write_text("Publisher definitions") + doc_id = source.record_acquisition(document, source_definition(document), recorded_at=NOW) + reference = {"reference_id": "definitions", "role": "data_dictionary", "status": "available", + "path": "portable/original-definitions.md", "reviewed_sha256": sha256(document.read_bytes()).hexdigest(), + "provenance_ids": [doc_id]} + raw = tmp_path / "raw.csv" + raw.write_text("value\n42\n") + observed = replace(source_definition(raw), metadata=DatasetMetadata.from_dict({"references": [reference]})) + raw_id = source.record_acquisition(raw, observed, recorded_at=NOW + timedelta(seconds=1)) + output = tmp_path / "prepared.csv" + output.write_text("value\n42\n") + processing = source.record_processing(dataset="example", inputs=[raw_id], outputs={"prepared": output}, + processor="test", code_version="test", recorded_at=NOW + timedelta(seconds=2)) + unrelated = tmp_path / "unrelated.txt" + unrelated.write_text("Not part of the selected provenance graph") + unrelated_id = source.record_acquisition(unrelated, source_definition(unrelated), recorded_at=NOW) + target = ProvenanceStore(tmp_path / "standalone") + target.copy_record_from(source, processing) + closure = target.verify_record_closure([processing]) + assert set(closure) == {processing, raw_id, doc_id} + assert unrelated_id not in closure + assert target.read_record(doc_id) == source.read_record(doc_id) + assert target.read_record(raw_id)["recorded_at"] == (NOW + timedelta(seconds=1)).isoformat() + assert not (target.root / "objects" / sha256(unrelated.read_bytes()).hexdigest()).exists() + with pytest.raises(FileNotFoundError): + verify_reference_receipts(observed, target, reference_base=tmp_path) + + +def test_claimed_unreviewed_reference_sha_mismatch_is_not_hidden_by_status(tmp_path): + from dataclasses import replace + from teadata.manifest import ContractError + + store = ProvenanceStore(tmp_path / "store") + document = tmp_path / "reference.md" + document.write_text("Exact reference bytes") + document_id = store.record_acquisition(document, source_definition(document)) + source = tmp_path / "source.csv" + source.write_text("value\n42\n") + definition = replace(source_definition(source), metadata=DatasetMetadata.from_dict({"references": [{ + "reference_id": "draft", "role": "methodology", "status": "unreviewed", + "provenance_ids": [document_id], "reviewed_sha256": "0" * 64}]})) + source_id = store.record_acquisition(source, definition) + with pytest.raises(ContractError, match="Reference bytes differ"): + store.verify_record_closure([source_id]) + + +def test_link_only_unreviewed_reference_does_not_claim_an_acquired_record(tmp_path): + from dataclasses import replace + + store = ProvenanceStore(tmp_path / "store") + raw = tmp_path / "source.csv" + raw.write_text("value\n42\n") + definition = replace(source_definition(raw), metadata=DatasetMetadata.from_dict({"references": [{ + "reference_id": "link", "role": "data_dictionary", "status": "unreviewed", + "url": "https://example.org/dictionary", "provenance_ids": []}]})) + record_id = store.record_acquisition(raw, definition) + assert set(store.verify_record_closure([record_id])) == {record_id} + + def source_definition(path: Path) -> ResolvedDataset: return ResolvedDataset( dataset="example", diff --git a/tests/test_script_paths.py b/tests/test_script_paths.py index fe81036..fa9fd09 100644 --- a/tests/test_script_paths.py +++ b/tests/test_script_paths.py @@ -16,12 +16,11 @@ SCRIPT_MODULES = [ "build_campus_peims_financials_statewide_data", - "build_tapr_2025_profiles", + "build_tapr_profiles", "download_campus_peims_financials", "flatten_districts_geojson", "geocode_tepsac_data", "rename_tapr_campus_headers", - "rename_tapr_district_headers", "rename_tepsac_headers", ] @@ -204,43 +203,81 @@ async def results(addresses): assert result.loc[0, "Best Lat"] == 30.0 -def test_tapr_builder_accepts_external_input_and_output_dirs(tmp_path, monkeypatch): +@pytest.mark.parametrize("write_failure", [False, True, "missing_reference_store"]) +def test_tapr_builder_accepts_external_input_and_new_output_dirs(tmp_path, monkeypatch, write_failure): from hashlib import sha256 + import json + import pyarrow.parquet as pq from teadata.column_schema import source_schema_fingerprint - from teadata.scripts import build_tapr_2025_profiles as script + from teadata.manifest import canonical_json + from teadata.scripts import build_tapr_profiles as script + from teadata.teadata_config import Config raw = tmp_path / "raw" raw.mkdir() - for kind, number, label in [ - ("Campus", "000000123", "9 Digit Campus Number"), - ("District", "000456", "6 Digit County District Number"), + datasets, entries = [], {} + for scope, kind, number, code, label in [ + ("campus", "Campus", "000000123", "CAMPUS", "9 Digit Campus Number"), + ("district", "District", "000456", "DISTRICT", "6 Digit County District Number"), ]: - for group in ("Student", "Staff"): - code = "CAMPUS" if kind == "Campus" else "DISTRICT" - (raw / f"2025 {kind} {group} Information.csv").write_text( - f"{label},Example Value\n{code},VALUE\n{number},42\n" - ) - def mappings(_cfg, dataset): - campus = dataset.startswith("campus_") - kind = "Campus" if campus else "District" - labels = ["9 Digit Campus Number" if campus else "6 Digit County District Number", "Example Value"] - codes = ["CAMPUS" if campus else "DISTRICT", "VALUE"] - fields = ["campus_number" if campus else "district_number", "example_value"] - return {group.lower(): {"table": group.lower(), - "input_sha256": sha256((raw / f"2025 {kind} {group} Information.csv").read_bytes()).hexdigest(), + dataset = scope + "_tapr_student_staff_profile" + labels, codes, fields = [label, "Example Value"], [code, "VALUE"], [scope + "_number", "example_value"] + tables, paths = [], {} + for group in ["Student", "Staff"]: + path = raw / f"2025 {kind} {group} Information.csv" + path.write_text(f"{label},Example Value\n{code},VALUE\n{number},42\n") + paths[group.lower()] = str(path) + tables.append({"table": group.lower(), "input_sha256": sha256(path.read_bytes()).hexdigest(), "source_schema_sha256": source_schema_fingerprint(labels, codes), - "fields": [{"position": i, "code": code, "label": label, "field": field} - for i, (code, label, field) in enumerate(zip(codes, labels, fields, strict=True), 1)]} - for group in ("Student", "Staff")} - monkeypatch.setattr(script, "_header_tables", mappings) - output_dir = tmp_path / "output" - script.main(["--input-dir", str(raw), "--output-dir", str(output_dir)]) - - campus = pd.read_excel(output_dir / "CAMPPROF_2024-2025_FINAL.xlsx") - district = pd.read_excel(output_dir / "DISTPROF_2024-2025_FINAL.xlsx") - assert campus.loc[0, "campus_number"] == 123 - assert district.loc[0, "district_number"] == 456 - assert len(list(output_dir.glob("*.xlsx"))) == 4 + "fields": [{"position": i, "code": c, "label": text, "field": name} + for i, (c, text, name) in enumerate(zip(codes, labels, fields, strict=True), 1)]}) + datasets.append({"dataset": dataset, "edition": "2025", "prepared_input_sha256": "0" * 64, "tables": tables}) + entries[dataset] = {2025: {"path": str(tmp_path / (scope + "-retained-reference.xlsx")), + "metadata": {"version": "2025"}, + "reader": {"column_schema": "headers.json", "profiles": {"source": {"tapr_source": {"scope": scope, "tables": paths}}}}}} + schema = tmp_path / "headers.json" + schema.write_text(canonical_json({"schema_version": 2, "mapping_version": 1, "datasets": datasets}) + "\n") + for versions in entries.values(): + versions[2025]["metadata"]["references"] = [{"reference_id": "columns", "role": "schema", "status": "available", + "path": "headers.json", "reviewed_sha256": sha256(schema.read_bytes()).hexdigest()}] + if write_failure == "missing_reference_store": + versions[2025]["metadata"]["references"][0]["provenance_ids"] = ["1" * 64] + cfg = Config.from_dict({"data_sources": entries}) + cfg.base_dir = tmp_path + monkeypatch.setattr(script, "load_config", lambda _: cfg) + output_dir = tmp_path / "new-output" + if write_failure == "missing_reference_store": + with pytest.raises(ValueError, match="explicit reference_store"): + script.main(["--edition", "2025", "--input-dir", str(raw), "--output-dir", str(output_dir)]) + assert not output_dir.exists() + assert not list(tmp_path.glob(".tapr-preparation-*")) + return + if write_failure: + def fail(*args, **kwargs): + raise OSError("simulated artifact write failure") + monkeypatch.setattr(pq, "write_table", fail) + with pytest.raises(OSError, match="simulated artifact write failure"): + script.main(["--edition", "2025", "--input-dir", str(raw), "--output-dir", str(output_dir)]) + assert not output_dir.exists() + assert not list(tmp_path.glob(".tapr-preparation-*")) + return + script.main(["--edition", "2025", "--input-dir", str(raw), "--output-dir", str(output_dir)]) + assert pq.read_table(output_dir / "campus.parquet").to_pylist() == [{"campus_number": "000000123", "example_value": "42"}] + assert pq.read_table(output_dir / "district.parquet").to_pylist() == [{"district_number": "000456", "example_value": "42"}] + receipt = json.loads((output_dir / "preparation.json").read_text()) + assert receipt["release_activation"] is False + assert receipt["scopes"]["campus"]["source_columns_accounted"] == 4 + assert receipt["scopes"]["campus"]["identity_fields"] == ["campus_number"] + from teadata.provenance import ProvenanceStore + store = ProvenanceStore(output_dir / "provenance") + for scope in ("campus", "district"): + assert receipt["scopes"][scope]["local_reference_closure_verified"] is True + closure = store.verify_record_closure([receipt["scopes"][scope]["processing_record_id"]]) + for record in closure.values(): + for reference in record.get("source_metadata", {}).get("references", []): + assert reference["provenance_ids"] + assert all(identifier in closure for identifier in reference["provenance_ids"]) + assert not list(output_dir.glob("*.xlsx")) def test_snapshot_writer_only_writes_staging(monkeypatch, tmp_path, catalog): diff --git a/tests/test_tapr_profile_reader.py b/tests/test_tapr_profile_reader.py index f47d65e..92d80a6 100644 --- a/tests/test_tapr_profile_reader.py +++ b/tests/test_tapr_profile_reader.py @@ -1,14 +1,23 @@ import csv +from dataclasses import replace from hashlib import sha256 +from io import StringIO +from pathlib import Path +from types import SimpleNamespace +import pyarrow as pa import pytest -from teadata.scripts import build_tapr_2025_profiles as script -from teadata.column_schema import source_schema_fingerprint +from teadata.column_schema import source_schema_fingerprint, validate_header_table +from teadata.identifiers import canonical_source_identifier, canonical_source_identifiers +from teadata.scripts.build_tapr_profiles import prepare_profiles +from teadata.tapr import TaprSourceTable, merge_tapr_tables, read_tapr_table LABELS = ["9 Digit Campus Number", "Example Value"] CODES = ["CAMPUS", "VALUE"] +FIELDS = ["campus_number", "example_value"] +DATASET = "campus_tapr_student_staff_profile" def write_source(tmp_path, records): @@ -18,146 +27,96 @@ def write_source(tmp_path, records): return path -def mapping_for(path, *, labels=LABELS, codes=CODES, fields=("campus_number", "example_value")): - return {"table": "student", "input_sha256": sha256(path.read_bytes()).hexdigest(), - "source_schema_sha256": source_schema_fingerprint(labels, codes), - "fields": [{"position": i, "code": code, "label": label, "field": field} - for i, (code, label, field) in enumerate(zip(codes, labels, fields, strict=True), 1)]} +def mapping_for(path, *, labels=LABELS, codes=CODES, fields=FIELDS, layout=None): + mapping = {"table": "student", "input_sha256": sha256(path.read_bytes()).hexdigest(), + "source_schema_sha256": source_schema_fingerprint(labels, codes), + "fields": [{"position": i, "code": code, "label": label, "field": field} + for i, (code, label, field) in enumerate(zip(codes, labels, fields, strict=True), 1)]} + if layout is not None: + mapping["layout"] = layout + return mapping -def read_source(path, *, mapping=None): - return script._read_tapr_csv(path, mapping=mapping_for(path) if mapping is None else mapping, key_field="campus_number") +def read_source(path, *, mapping=None, key_field="campus_number", dataset=DATASET, edition="2025"): + return read_tapr_table(path, mapping=mapping_for(path) if mapping is None else mapping, + key_field=key_field, dataset=dataset, edition=edition) -@pytest.mark.parametrize("token", ["-1", "-3", "-2", ".", "•", "n/a", "0", "0.0", "9007199254740993", ""]) -def test_reader_preserves_source_tokens_without_interpreting_masking(tmp_path, token): +@pytest.mark.parametrize("token", ["-1", "-3", "-2", ".", "•", "n/a", "0", "0.0", "9007199254740993", "", " -3 ", "first\nsecond"]) +def test_native_reader_preserves_exact_source_tokens_without_masking_or_whitespace_casts(tmp_path, token): path = write_source(tmp_path, [LABELS, CODES, ["001902001", token]]) before = path.read_bytes() - headers, rows, elements = read_source(path) - assert headers == ["campus_number", "example_value"] - assert rows == {"001902001": {"campus_number": "001902001", "example_value": token}} - assert elements == [ - {"code": "CAMPUS", "label": LABELS[0], "sanitized_label": "campus_number"}, - {"code": "VALUE", "label": LABELS[1], "sanitized_label": "example_value"}, - ] + result = read_source(path) + assert result.table.to_pylist() == [{"campus_number": "001902001", "example_value": token}] + assert all(pa.types.is_string(field.type) for field in result.table.schema) assert path.read_bytes() == before -def test_metadata_retains_exact_human_labels_and_codes(tmp_path): - labels = [LABELS[0], " Campus 2025: Example (Value) "] - codes = ["CAMPUS", " VALUE "] - path = write_source(tmp_path, [labels, codes, ["001902001", " -3 "]]) - headers, rows, elements = read_source(path, mapping=mapping_for(path, labels=labels, codes=codes, - fields=("campus_number", "campus_2025_example_value"))) - assert headers == ["campus_number", "campus_2025_example_value"] - assert elements[1] == {"code": " VALUE ", "label": labels[1], "sanitized_label": headers[1]} - assert rows["001902001"][headers[1]] == "-3" # Existing body whitespace behavior. - - @pytest.mark.parametrize("override", ["CamelCase", "naïve", "2025_name", "class", ""]) -def test_explicit_header_overrides_must_be_python_safe_ascii_snake_case(tmp_path, override): +def test_unsafe_canonical_names_fail_without_sanitizing_at_runtime(tmp_path, override): path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) - with pytest.raises(ValueError, match="(?i)invalid canonical header.*ASCII snake_case"): - read_source(path, mapping=mapping_for(path, fields=("campus_number", override))) - - -def test_explicit_header_override_collision_names_the_column(tmp_path): - path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) - with pytest.raises(ValueError, match="(?i)canonical header collision in column 2: 'campus_number'"): - read_source(path, mapping=mapping_for(path, fields=("campus_number", "campus_number"))) - - -@pytest.mark.parametrize("records, message", [ - ([], "header records"), - ([LABELS], "header records"), - ([LABELS, ["CAMPUS"]], "header width mismatch"), - ([LABELS, CODES + ["EXTRA"]], "header width mismatch"), - ([LABELS, ["001902001", "42"], ["001902041", "99"]], "expected source-code header 'CAMPUS'"), - ([LABELS, ["CAMPUS", ""]], "headers differ"), - ([LABELS, ["CAMPUS", "CAMPUS"]], "headers differ"), - ([[LABELS[0], "Class"], CODES], "headers differ"), - ([[LABELS[0], "2025 Value"], CODES], "headers differ"), - ([[LABELS[0], "???"], CODES], "headers differ"), - ([[LABELS[0], "Example-Value", "Example Value"], ["CAMPUS", "A", "B"]], "headers differ"), - ([["Not The Campus Key", "Example"], CODES], "headers differ"), - ([LABELS, CODES], "no TAPR data records"), -]) -def test_ambiguous_or_incomplete_headers_fail_closed(tmp_path, records, message): - path = write_source(tmp_path, records) - with pytest.raises(ValueError, match=message) as error: - read_source(path) - assert str(path) in str(error.value) + with pytest.raises(ValueError, match="Invalid canonical header"): + read_source(path, mapping=mapping_for(path, fields=["campus_number", override])) @pytest.mark.parametrize("codes", [["CAMPUS", ""], ["CAMPUS", " CAMPUS "]]) -def test_crosswalk_rejects_empty_or_duplicate_source_codes(tmp_path, codes): +def test_duplicate_or_blank_publisher_codes_fail(tmp_path, codes): path = write_source(tmp_path, [LABELS, codes, ["001902001", "42"]]) - with pytest.raises(ValueError, match="(?i)(invalid header crosswalk column|duplicate source code)"): + with pytest.raises(ValueError, match="(Invalid header crosswalk|Duplicate source code)"): read_source(path, mapping=mapping_for(path, codes=codes)) -def test_reader_rejects_input_bytes_outside_the_reviewed_edition(tmp_path): +def test_canonical_header_collision_is_not_suffixed(tmp_path): path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) - mapping = mapping_for(path) - path.write_text(path.read_text().replace("42", "99")) - with pytest.raises(ValueError, match="input differs"): - read_source(path, mapping=mapping) + with pytest.raises(ValueError, match="Canonical header collision"): + read_source(path, mapping=mapping_for(path, fields=["campus_number", "campus_number"])) + + +@pytest.mark.parametrize("records", [[], [LABELS], [LABELS, ["CAMPUS"]], [LABELS, CODES + ["EXTRA"]], + [LABELS, ["001902001", "42"], ["001902041", "99"]], [[LABELS[0], "Changed label"], CODES], + [["Metadata title"], LABELS, CODES, ["001902001", "42"]]]) +def test_unreviewed_header_preamble_or_code_record_changes_fail(tmp_path, records): + path = write_source(tmp_path, records) + with pytest.raises(ValueError) as error: + read_source(path) + assert str(path) in str(error.value) @pytest.mark.parametrize("row", [["001902001"], ["001902001", "42", "EXTRA"], []]) -def test_reader_rejects_bad_width_instead_of_padding_truncating_or_skipping(tmp_path, row): +def test_bad_record_width_is_never_padded_truncated_or_skipped(tmp_path, row): path = write_source(tmp_path, [LABELS, CODES, row]) with pytest.raises(ValueError, match=r"record 3 has .* fields; expected 2"): read_source(path) @pytest.mark.parametrize("key", ["", "000000000", "-1", "True", "001902001.5", "1001902001", "1e3", "999999999", "Notes: suppression applies"]) -def test_invalid_identifiers_and_footer_text_are_not_data(tmp_path, key): +def test_invalid_identity_or_footer_text_is_not_silently_removed(tmp_path, key): path = write_source(tmp_path, [LABELS, CODES, [key, "42"]]) - with pytest.raises(ValueError, match="record 3 has invalid campus_number"): + with pytest.raises(ValueError, match="invalid campus_number"): read_source(path) @pytest.mark.parametrize("later", ["001902001", "1902001", "'001902001"]) -def test_duplicate_entity_identity_is_never_overwritten(tmp_path, later): +def test_duplicate_entity_identity_is_not_overwritten(tmp_path, later): path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"], [later, "99"]]) - with pytest.raises(ValueError, match="duplicate campus_number at records 3 and 4"): + with pytest.raises(ValueError, match=r"duplicate campus_number at records \[3, 4\]"): read_source(path) -def test_campus_district_claim_is_checked_when_present(tmp_path): - labels, codes = [LABELS[0], "6 Digit County District Number"], ["CAMPUS", "DISTRICT"] - path = write_source(tmp_path, [ - labels, codes, - ["001902001", "227901"], - ]) +@pytest.mark.parametrize("district", ["", "227901"]) +def test_campus_parent_claim_is_required_and_consistent_when_present(tmp_path, district): + labels, codes = [LABELS[0], "District Number"], ["CAMPUS", "DISTRICT"] + path = write_source(tmp_path, [labels, codes, ["001902001", district]]) with pytest.raises(ValueError, match="campus and district identifiers disagree"): - read_source(path, mapping=mapping_for(path, labels=labels, codes=codes, - fields=("campus_number", "district_number"))) - - -def test_district_reader_uses_six_digit_identity_and_preserves_metadata(tmp_path): - labels, codes = ["6 Digit County District Number", "District Name"], ["DISTRICT", "DISTNAME"] - path = write_source(tmp_path, [ - labels, codes, - ["001902", "CAYUGA ISD"], - ]) - headers, rows, elements = script._read_tapr_csv(path, mapping=mapping_for(path, labels=labels, codes=codes, - fields=("district_number", "district_name")), key_field="district_number") - assert headers == ["district_number", "district_name"] - assert rows["001902"]["district_name"] == "CAYUGA ISD" - assert elements[0]["code"] == "DISTRICT" - - -def test_district_reader_refuses_a_data_record_as_the_code_header(tmp_path): - path = write_source(tmp_path, [ - ["6 Digit County District Number", "District Name"], - ["001902", "CAYUGA ISD"], ["001903", "FRANKSTON ISD"], - ]) - with pytest.raises(ValueError, match="expected source-code header 'DISTRICT'"): - script._read_tapr_csv(path, mapping=mapping_for(path, - labels=["6 Digit County District Number", "District Name"], codes=["DISTRICT", "DISTNAME"], - fields=("district_number", "district_name")), key_field="district_number") + read_source(path, mapping=mapping_for(path, labels=labels, codes=codes, fields=["campus_number", "district_number"])) + + +def test_original_content_revision_is_not_replaced_under_one_contract(tmp_path): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) + mapping = mapping_for(path) + path.write_text(path.read_text().replace("42", "99")) + with pytest.raises(ValueError, match="input differs"): + read_source(path, mapping=mapping) def test_csv_quoting_error_is_not_silently_accepted(tmp_path): @@ -167,58 +126,157 @@ def test_csv_quoting_error_is_not_silently_accepted(tmp_path): read_source(path) -def merge(primary, secondary): - return script._merge_tables( - list(next(iter(primary.values()))), primary, - list(next(iter(secondary.values()))), secondary, - key_field="campus_number", preferred_cols=("campus_number", "campus_name"), - ) - - -def test_merge_rejects_conflicting_shared_values_without_masking_assumptions(): - primary = {"001902001": {"campus_number": "001902001", "example": "."}} - secondary = {"001902001": {"campus_number": "001902001", "example": "42"}} +def test_reviewed_preamble_gap_and_footer_notes_have_exact_provenance(tmp_path): + records = [["Publisher report"], CODES, ["001902001", " -3 "], [], ["001902041", "."], ["Notes:", "Unavailable is not zero"]] + path = write_source(tmp_path, records) + def note(number, kind): + text = StringIO(newline="") + csv.writer(text).writerow(records[number - 1]) + return {"first_record": number, "last_record": number, "kind": kind, "sha256": sha256(text.getvalue().encode()).hexdigest()} + layout = {"code_record": 2, "label_record": None, "first_data_record": 3, "last_data_record": 5, + "annotations": [note(1, "preamble"), note(4, "blank"), note(6, "footer")]} + result = read_source(path, mapping=mapping_for(path, layout=layout)) + assert result.table.to_pylist() == [{"campus_number": "001902001", "example_value": " -3 "}, {"campus_number": "001902041", "example_value": "."}] + assert result.annotations[-1]["records"] == [["Notes:", "Unavailable is not zero"]] + assert [note["first_record"] for note in result.annotations] == [1, 4, 6] + changed = mapping_for(path, layout=layout) + changed["layout"]["annotations"][-1]["sha256"] = "0" * 64 + with pytest.raises(ValueError, match="annotation range"): + read_source(path, mapping=changed) + + +@pytest.mark.parametrize("kind", ["unreviewed", "overlap", "header_overlap"]) +def test_ambiguous_or_unaccounted_note_ranges_fail(tmp_path, kind): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"], ["Footer", "note"]]) + layout = {"code_record": 2, "label_record": 1, "first_data_record": 3, "last_data_record": 3, "annotations": []} + if kind != "unreviewed": + item = {"first_record": 1 if kind == "header_overlap" else 4, "last_record": 4, "kind": "footer", "sha256": "0" * 64} + layout["annotations"] = [item] if kind == "header_overlap" else [item, item] + with pytest.raises(ValueError, match="(unaccounted record 4|overlap)"): + read_source(path, mapping=mapping_for(path, layout=layout)) + + +def native_source(records, *, edition="2025", labels=None, table_name="student"): + table = pa.Table.from_pylist(records) + fields = table.column_names + codes = ["CAMPUS" if name == "campus_number" else name.upper() for name in fields] + labels = labels or fields + mapping = {"table": table_name, "input_sha256": "0" * 64, "source_schema_sha256": source_schema_fingerprint(labels, codes), + "fields": [{"position": i, "code": code, "label": label, "field": field} for i, (code, label, field) in enumerate(zip(codes, labels, fields, strict=True), 1)]} + return TaprSourceTable(table, Path(__file__), "0" * 64, DATASET, edition, (), mapping) + + +def test_same_edition_shared_identity_conflicts_fail_without_masking_assumptions(): + a = native_source([{"campus_number": "001902001", "example": "."}]) + b = native_source([{"campus_number": "001902001", "example": "42"}], table_name="staff") with pytest.raises(ValueError, match="Conflicting TAPR values.*example"): - merge(primary, secondary) - assert primary["001902001"]["example"] == "." + merge_tapr_tables([a, b], key_field="campus_number") -def test_merge_preserves_blank_fill_behavior_order_and_nonconflicting_tokens(): - primary = {"001902001": {"campus_number": "001902001", "empty": "", "student": "-1"}} - secondary = {"001902001": {"campus_number": "001902001", "empty": "filled", "staff": "-3"}} - headers, records = merge(primary, secondary) - assert headers == ["campus_number", "empty", "student", "staff"] - assert records == [{"campus_number": "001902001", "empty": "filled", "student": "-1", "staff": "-3"}] +def test_one_sided_historical_entities_remain_and_absent_table_is_not_raw_blank(): + a = native_source([{"campus_number": "001902001", "student": "-1"}]) + b = native_source([{"campus_number": "001902041", "staff": "-3"}], table_name="staff") + assert merge_tapr_tables([a, b], key_field="campus_number").to_pylist() == [ + {"campus_number": "001902001", "student": "-1", "staff": None}, + {"campus_number": "001902041", "student": None, "staff": "-3"}] -def test_merge_retains_one_sided_entities_without_claiming_complete_coverage(): - primary = {"001902001": {"campus_number": "001902001", "student": "-1"}} - secondary = {"001902041": {"campus_number": "001902041", "staff": "-3"}} - headers, records = merge(primary, secondary) - assert headers == ["campus_number", "student", "staff"] - assert records == [primary["001902001"], secondary["001902041"]] - assert script._rows_for_headers(headers, records) == [["001902001", "-1", ""], ["001902041", "", "-3"]] +def test_blank_fill_and_nonblank_shared_values_have_explicit_rules(): + a = native_source([{"campus_number": "001902001", "campus_name": "Historical school", "empty": "", "student": "-1"}]) + b = native_source([{"campus_number": "001902001", "campus_name": "Historical school", "empty": "filled", "staff": "-3"}], table_name="staff") + assert merge_tapr_tables([a, b], key_field="campus_number").to_pylist() == [ + {"campus_number": "001902001", "campus_name": "Historical school", "empty": "filled", "student": "-1", "staff": "-3"}] + conflict = native_source([{"campus_number": "001902001", "campus_name": "A different school"}], table_name="staff") + with pytest.raises(ValueError, match="campus_name"): + merge_tapr_tables([a, conflict], key_field="campus_number") -def test_merge_refuses_two_spellings_of_the_same_source_identity(): - primary = {"001902001": {"campus_number": "001902001"}} - secondary = {"1902001": {"campus_number": "1902001"}} +def test_equivalent_identity_spellings_must_not_duplicate_or_overwrite_an_entity(): + a = native_source([{"campus_number": "001902001"}]) + b = native_source([{"campus_number": "1902001"}], table_name="staff") with pytest.raises(ValueError, match="Inconsistent TAPR campus_number representations"): - merge(primary, secondary) - - -def test_bad_input_prevents_cli_from_invoking_a_writer(tmp_path, monkeypatch): - raw = tmp_path / "raw" - raw.mkdir() - (raw / "2025 Campus Student Information.csv").write_text( - "9 Digit Campus Number,Example Value\nCAMPUS,VALUE\n001902001,42,EXTRA\n" - ) - def forbidden(*args, **kwargs): - raise AssertionError("Writer must not run for invalid input") - monkeypatch.setattr(script, "_write_workbook", forbidden) - monkeypatch.setattr(script, "load_config", lambda *_: object()) - mapping = mapping_for(raw / "2025 Campus Student Information.csv") - monkeypatch.setattr(script, "_header_tables", lambda *_: {"student": mapping, "staff": mapping}) + merge_tapr_tables([a, b], key_field="campus_number") + + +def test_observations_from_different_editions_or_datasets_are_not_coalesced(): + original = native_source([{"campus_number": "001902001", "campus_name": "Earlier name"}], edition="2024") + later = native_source([{"campus_number": "001902001", "campus_name": "Later name"}], edition="2025") + with pytest.raises(ValueError, match="different qualified datasets or editions"): + merge_tapr_tables([original, later], key_field="campus_number") + foreign = replace(original, dataset="accountability") + with pytest.raises(ValueError, match="different qualified datasets or editions"): + merge_tapr_tables([original, foreign], key_field="campus_number") + assert original.table["campus_name"][0].as_py() == "Earlier name" + + +def test_reissued_table_revision_is_not_silently_coalesced_with_retained_observation(): + original = native_source([{"campus_number": "001902001", "example": "42"}]) + reissued = replace(original, input_sha256="1" * 64) + with pytest.raises(ValueError, match="Different revisions or repeated observations"): + merge_tapr_tables([original, reissued], key_field="campus_number") + + +@pytest.mark.parametrize("token", [None, "", " ", "'", "0", "000000000", "001902001", "1902001", "'001902001", " ' 001902001.00 ", "\x1c001902001\x1f", "True", "-1", "1e3", "001902001.1", "999999999"]) +def test_native_string_identifier_contract_matches_scalar_oracle(token): + try: + expected = canonical_source_identifier(token, width=9) + except ValueError: + with pytest.raises(ValueError): + canonical_source_identifiers(pa.array([token], type=pa.string()), width=9) + else: + assert canonical_source_identifiers(pa.array([token], type=pa.string()), width=9).to_pylist() == [expected] + + +def test_bad_input_prevents_all_writers_and_output_activation(tmp_path, monkeypatch): + import pyarrow.parquet as pq + + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42", "EXTRA"]]) + def load(*args, **kwargs): + return [read_source(path)] + cfg = SimpleNamespace(read_tapr_sources=load) + monkeypatch.setattr(pq, "write_table", lambda *a, **k: pytest.fail("Writer ran for invalid input")) + out = tmp_path / "new" / "output" with pytest.raises(ValueError, match="record 3 has 3 fields"): - script.main(["--input-dir", str(raw), "--output-dir", str(tmp_path / "output")]) - assert not (tmp_path / "output").exists() + prepare_profiles(cfg, edition="2025", scopes=["campus"], input_dir=tmp_path, output_dir=out) + assert not out.parent.exists() + + +def test_preparation_never_overwrites_an_existing_directory(tmp_path): + out = tmp_path / "preserved" + out.mkdir() + marker = out / "original.txt" + marker.write_text("original") + with pytest.raises(FileExistsError): + prepare_profiles(object(), edition="2024", scopes=["district"], input_dir=tmp_path, output_dir=out) + assert marker.read_text() == "original" + + +def test_source_column_disposition_cannot_silently_exclude_a_publisher_field(tmp_path): + path = write_source(tmp_path, [LABELS, CODES, ["001902001", "42"]]) + mapping = mapping_for(path) + mapping["fields"][1]["disposition"] = "ignore" + with pytest.raises(ValueError, match="Unaccounted source column 2"): + validate_header_table(mapping) + + +@pytest.mark.parametrize("large", [False, True]) +def test_native_identifier_contract_supports_chunked_string_representations(large): + kind = pa.large_string() if large else pa.string() + values = pa.chunked_array([["1902001", None], ["'001902041"]], type=kind) + assert canonical_source_identifiers(values, width=9).to_pylist() == ["'001902001", None, "'001902041"] + + +def test_publisher_dictionary_revision_is_checked_before_excel_decode(tmp_path, monkeypatch): + import pandas as pd + + path = write_source(tmp_path, [CODES, ["001902001", "42"]]) + dictionary = tmp_path / "dictionary.xlsx" + dictionary.write_bytes(b"changed publisher workbook") + mapping = mapping_for(path, layout={"code_record": 1, "label_record": None, + "first_data_record": 2, "last_data_record": 2, "annotations": []}) + mapping["dictionary"] = {"filename": dictionary.name, "sha256": "0" * 64, "sheet_name": "Sheet1"} + for field in mapping["fields"]: + field.update(publisher_type="Character", publisher_length="", disposition="fact") + monkeypatch.setattr(pd, "read_excel", lambda *a, **k: pytest.fail("Unreviewed dictionary decoded")) + with pytest.raises(ValueError, match="publisher dictionary bytes differ"): + read_source(path, mapping=mapping) From 8fd7b321f9f7ee43efa9a0581ddc3e95448cb991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 11:51:54 -0500 Subject: [PATCH 04/11] Prepare 2025 TAPR graduation profiles with explicit metadata --- docs/config.md | 34 +- ...7e69c54b8c1ddb4149f2f871c8346941a0c99.json | 1 + ...f280af5b9560b370967f661b3a83a906c4fca.json | 1 + ...8ac1f115cbd962b284aca3ad988900117dc82.json | 1 + ...efc76a83381e3f1357010db2ce850013ec664.json | 1 + teadata/column_schema.py | 46 +- teadata/load_data.py | 3 +- ...r--2025--graduation-profile-crosswalk.json | 1 + teadata/scripts/build_tapr_profiles.py | 45 +- teadata/tapr.py | 8 +- teadata/teadata_config.py | 30 +- teadata/teadata_sources.yaml | 489 ++++++++++++++++++ tests/conftest.py | 4 + tests/test_tapr_graduation_profile.py | 367 +++++++++++++ 14 files changed, 1007 insertions(+), 24 deletions(-) create mode 100644 provenance/records/2fdf8e78ac6879c765eda31ff907e69c54b8c1ddb4149f2f871c8346941a0c99.json create mode 100644 provenance/records/436dc9d78129baeceafc63c59a5f280af5b9560b370967f661b3a83a906c4fca.json create mode 100644 provenance/records/7fe8d8252f1c6a45a8700840d758ac1f115cbd962b284aca3ad988900117dc82.json create mode 100644 provenance/records/aa9450c995c2e41da8ca190e390efc76a83381e3f1357010db2ce850013ec664.json create mode 100644 teadata/schemas/tapr--2025--graduation-profile-crosswalk.json create mode 100644 tests/test_tapr_graduation_profile.py diff --git a/docs/config.md b/docs/config.md index 9e1da76..9d9a046 100644 --- a/docs/config.md +++ b/docs/config.md @@ -314,9 +314,37 @@ metadata and resolve against the configured data directory only when selected. Coverage refers to the declared inputs: 2024 `PROF` contains 407 campus and 420 district columns, including 34 lagged annual-graduate fields in each scope. -The current 2025 inputs are `STUD` and `STAF` only. They contain no graduate -fields; the separate publisher `GRAD` Graduation Profile needs its own audited -input/header contract before claiming equivalent annual-profile coverage. +The 2025 `STUD`/`STAF` source preparation remains separate from `GRAD` +Graduation Profile. Select the latter explicitly: + +```bash +uv run python -m teadata.scripts.build_tapr_profiles \ + --edition 2025 --family graduation_profile --input-dir raw/ \ + --reference-store provenance --output-dir prepared/tapr-2025-grad +``` + +`campus_tapr_graduation_profile` and `district_tapr_graduation_profile` declare +only edition 2025, measuring 2023–2024 annual graduates. They retain 42 metrics +and four/two canonical identity/history attributes in separate wide leaves; +identity/name observation dates remain unknown. Their source-only crosswalk has +no historical prepared-input hash and requires the explicit `source` profile. +The source metadata and availability report describe this declared coverage, +not inclusion in a released catalog. `cfg.is_source_only(dataset, 2025)` reads +that flag from the reviewed crosswalk without opening source data. GRAD1–4 readiness/assessment families and +other annual TAPR families are outside this preparation target. + +All 42 GRAD source codes and exact human labels are published in CSV records +2 and 1. The acquired publisher dictionary documents only 39 metric codes per +scope. `CA0GS24N`, `CA0GM24R`, `CA0GS24R` and their district `D` counterparts +remain independent fields with `dictionary_status: not_documented`, null type +and description, and the original CSV-header reference. Documented dictionary +descriptions are retained without treating a similar label or equal value as +semantic equivalence. Every metric uses the verified 2023–2024 reference period; +units remain explicitly unknown until individually reviewed. Raw blanks and +zeros are preserved without assigning a missingness or suppression cause. +The producer requires and retains the original acquisition receipts and bytes +for source-only datasets; a new local observation does not replace download +history. GRAD is never automatically merged with STUD/STAF or entity metadata. The `source` reader profile exposes complete header contracts without reading source rows, for example diff --git a/provenance/records/2fdf8e78ac6879c765eda31ff907e69c54b8c1ddb4149f2f871c8346941a0c99.json b/provenance/records/2fdf8e78ac6879c765eda31ff907e69c54b8c1ddb4149f2f871c8346941a0c99.json new file mode 100644 index 0000000..1d8b0de --- /dev/null +++ b/provenance/records/2fdf8e78ac6879c765eda31ff907e69c54b8c1ddb4149f2f871c8346941a0c99.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2025 Campus Graduation Profile.csv","sha256":"8734133d9b8805e51f68185e954175ac63a50a2650c048ff25f6afe7f059174f","size_bytes":1078678},"dataset":"campus_tapr_graduation_profile","downloaded_at":"2026-10-31T15:12:32.450333+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","edition":"2025","family":"GRAD","http_method":"GET","http_status":200,"max_bytes":33554432,"measurement_period":"2023-24","role":"raw_csv","scope":"campus","selection_source":"verified official step7/dictionary controls","timeout_seconds":20},"recorded_at":"2026-10-31T15:12:32.450400+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&level=Campus&tapr=all_c&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv","requested_year":2025,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&level=Campus&tapr=all_c&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv","resolved_year":2025,"response_headers":{"content-disposition":"attachment; filename=2025 Campus Graduation Profile.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current official GRAD-family download observation. Publisher edition2025 is separate from2023\u201324 annual-graduate measurement period. No historical acquisition or preparation lineage is inferred.","period":{"end_year":2024,"kind":"school_year","start_year":2023},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2025 Campus Graduation Profile","version":"2025"}} diff --git a/provenance/records/436dc9d78129baeceafc63c59a5f280af5b9560b370967f661b3a83a906c4fca.json b/provenance/records/436dc9d78129baeceafc63c59a5f280af5b9560b370967f661b3a83a906c4fca.json new file mode 100644 index 0000000..a5f2d6e --- /dev/null +++ b/provenance/records/436dc9d78129baeceafc63c59a5f280af5b9560b370967f661b3a83a906c4fca.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2025 District Graduation Profile dictionary.html","sha256":"14e909067dc352a5cbf57b467d311954661743c47bf37bedb62f335127d27626","size_bytes":80010},"dataset":"district_tapr_graduation_profile","downloaded_at":"2026-10-31T15:12:33.804531+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","edition":"2025","family":"GRAD","http_method":"GET","http_status":200,"max_bytes":33554432,"measurement_period":"2023-24","role":"dictionary","scope":"district","selection_source":"verified official step7/dictionary controls","timeout_seconds":20},"recorded_at":"2026-10-31T15:12:33.804578+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas","requested_year":2025,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas","resolved_year":2025,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current official GRAD-family download observation. Publisher edition2025 is separate from2023\u201324 annual-graduate measurement period. No historical acquisition or preparation lineage is inferred.","period":{"end_year":2024,"kind":"school_year","start_year":2023},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2025 District Graduation Profile","version":"2025"}} diff --git a/provenance/records/7fe8d8252f1c6a45a8700840d758ac1f115cbd962b284aca3ad988900117dc82.json b/provenance/records/7fe8d8252f1c6a45a8700840d758ac1f115cbd962b284aca3ad988900117dc82.json new file mode 100644 index 0000000..5b0ae0d --- /dev/null +++ b/provenance/records/7fe8d8252f1c6a45a8700840d758ac1f115cbd962b284aca3ad988900117dc82.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2025 Campus Graduation Profile dictionary.html","sha256":"3fc2ca2a971fbc3f6de3e020712eab5bc594614c405836dfa44968a9bf111121","size_bytes":80002},"dataset":"campus_tapr_graduation_profile","downloaded_at":"2026-10-31T15:12:32.975585+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","edition":"2025","family":"GRAD","http_method":"GET","http_status":200,"max_bytes":33554432,"measurement_period":"2023-24","role":"dictionary","scope":"campus","selection_source":"verified official step7/dictionary controls","timeout_seconds":20},"recorded_at":"2026-10-31T15:12:32.975628+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas","requested_year":2025,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas","resolved_year":2025,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current official GRAD-family download observation. Publisher edition2025 is separate from2023\u201324 annual-graduate measurement period. No historical acquisition or preparation lineage is inferred.","period":{"end_year":2024,"kind":"school_year","start_year":2023},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2025 Campus Graduation Profile","version":"2025"}} diff --git a/provenance/records/aa9450c995c2e41da8ca190e390efc76a83381e3f1357010db2ce850013ec664.json b/provenance/records/aa9450c995c2e41da8ca190e390efc76a83381e3f1357010db2ce850013ec664.json new file mode 100644 index 0000000..addaeac --- /dev/null +++ b/provenance/records/aa9450c995c2e41da8ca190e390efc76a83381e3f1357010db2ce850013ec664.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2025 District Graduation Profile.csv","sha256":"486326546705eb72f068f5d587b68222a15e9d32a262914d04cc4c91ef24cf72","size_bytes":180693},"dataset":"district_tapr_graduation_profile","downloaded_at":"2026-10-31T15:12:33.213789+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","edition":"2025","family":"GRAD","http_method":"GET","http_status":200,"max_bytes":33554432,"measurement_period":"2023-24","role":"raw_csv","scope":"district","selection_source":"verified official step7/dictionary controls","timeout_seconds":20},"recorded_at":"2026-10-31T15:12:33.213825+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&level=District&tapr=all_d&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv","requested_year":2025,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&level=District&tapr=all_d&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv","resolved_year":2025,"response_headers":{"content-disposition":"attachment; filename=2025 District Graduation Profile.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current official GRAD-family download observation. Publisher edition2025 is separate from2023\u201324 annual-graduate measurement period. No historical acquisition or preparation lineage is inferred.","period":{"end_year":2024,"kind":"school_year","start_year":2023},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2025 District Graduation Profile","version":"2025"}} diff --git a/teadata/column_schema.py b/teadata/column_schema.py index fdac17d..9c72a4a 100644 --- a/teadata/column_schema.py +++ b/teadata/column_schema.py @@ -10,6 +10,11 @@ from typing import Any, Iterable, Mapping +def has_default_reader(reader: Mapping[str, Any]) -> bool: + """Named profiles without a default schema require explicit selection.""" + return not reader.get("profiles") or reader.get("column_schema") is not None + + def reader_options(reader: Mapping[str, Any], profile: str | None) -> dict[str, Any]: """Select the same reader contract for schema lookup and table loading.""" options = dict(reader) @@ -74,13 +79,19 @@ def validate_header_table(table: Mapping[str, Any]) -> None: """Validate one explicit mapping; never synthesize or deduplicate names.""" if (not isinstance(table, dict) or not {"table", "input_sha256", "source_schema_sha256", "fields"} <= set(table) - or set(table) - {"table", "input_sha256", "source_schema_sha256", "fields", "layout", "dictionary"} + or set(table) - {"table", "input_sha256", "source_schema_sha256", "fields", "layout", "dictionary", "metric_period"} or not isinstance(table["table"], str) or not table["table"].strip() or not _checksum(table["input_sha256"]) or not _checksum(table["source_schema_sha256"]) or not isinstance(table["fields"], list) or not table["fields"]): raise ValueError("Invalid header crosswalk table") if "layout" in table: validate_source_layout(table["layout"]) + if "metric_period" in table: + from .dataset_metadata import DataPeriod + + period = table["metric_period"] + if not isinstance(period, Mapping) or DataPeriod.from_dict(period).to_dict() != period: + raise ValueError("Source metric period requires an explicit canonical period mapping") if "dictionary" in table: dictionary = table["dictionary"] if (not isinstance(dictionary, dict) @@ -93,13 +104,27 @@ def validate_header_table(table: Mapping[str, Any]) -> None: for position, field in enumerate(table["fields"], 1): if (not isinstance(field, dict) or not {"position", "code", "label", "field"} <= set(field) - or set(field) - {"position", "code", "label", "field", "publisher_type", "publisher_length", "disposition"} + or set(field) - {"position", "code", "label", "field", "publisher_type", "publisher_length", "disposition", + "dictionary_status", "publisher_description"} or type(field["position"]) is not int or field["position"] != position or not isinstance(field["code"], str) or not field["code"].strip() or not isinstance(field["label"], str) or not field["label"].strip() or not isinstance(field["field"], str)): raise ValueError(f"Invalid header crosswalk column {position}") - if any(not isinstance(field[key], str) for key in ("publisher_type", "publisher_length") if key in field): + if "dictionary_status" in field: + status = field["dictionary_status"] + if (status not in {"documented", "not_documented", "not_applicable"} + or not {"publisher_type", "publisher_description", "disposition"} <= set(field) + or (status == "not_applicable" and field["disposition"] != "identity") + or (status == "documented" and any(not isinstance(field[key], str) or not field[key].strip() + for key in ("publisher_type", "publisher_description"))) + or (status != "documented" and any(field[key] is not None + for key in ("publisher_type", "publisher_description")))): + raise ValueError(f"Inconsistent publisher dictionary status in column {position}") + elif "publisher_description" in field or field.get("publisher_type", "") is None: + raise ValueError(f"Missing publisher dictionary status in column {position}") + if any(not isinstance(field[key], str) for key in ("publisher_type", "publisher_length") + if key in field and not (key == "publisher_type" and "dictionary_status" in field)): raise ValueError(f"Invalid publisher metadata in column {position}") if field.get("disposition", "fact") not in {"identity", "fact"}: raise ValueError(f"Unaccounted source column {position}; retain an identity or fact") @@ -179,9 +204,11 @@ def parse_column_schema(data: bytes) -> dict[str, Any]: seen = set() for dataset in document["datasets"]: if (not isinstance(dataset, dict) - or set(dataset) != {"dataset", "edition", "prepared_input_sha256", "tables"} + or set(dataset) not in ({"dataset", "edition", "prepared_input_sha256", "tables"}, + {"dataset", "edition", "source_only", "tables"}) or any(not isinstance(dataset[k], str) or not dataset[k].strip() for k in ("dataset", "edition")) - or not _checksum(dataset["prepared_input_sha256"]) + or ("source_only" in dataset and dataset["source_only"] is not True) + or ("prepared_input_sha256" in dataset and not _checksum(dataset["prepared_input_sha256"])) or not isinstance(dataset["tables"], list) or not dataset["tables"]): raise ValueError("Invalid header crosswalk dataset") identity = dataset["dataset"], dataset["edition"] @@ -191,6 +218,9 @@ def parse_column_schema(data: bytes) -> dict[str, Any]: tables, shared = set(), {} for table in dataset["tables"]: validate_header_table(table) + if dataset.get("source_only") and ("metric_period" not in table + or any("dictionary_status" not in field for field in table["fields"])): + raise ValueError("Source-only fields require an explicit metric period and publisher dictionary status") if table["table"] in tables: raise ValueError("Duplicate header crosswalk table") tables.add(table["table"]) @@ -233,7 +263,7 @@ def schema_columns(document: Mapping[str, Any], *, dataset: str | None = None, def validate_selected_crosswalk(document: Mapping[str, Any], *, dataset: str, edition: str, input_sha256: str, columns: list[str]) -> None: selected = crosswalk_dataset(document, dataset, edition) - if selected["prepared_input_sha256"] != input_sha256: + if selected.get("prepared_input_sha256") != input_sha256: raise ValueError("Header crosswalk belongs to a different prepared input") if schema_columns(document, dataset=dataset, edition=edition) != columns: raise ValueError("Header crosswalk differs from the selected prepared schema") @@ -247,7 +277,9 @@ def header_records(document: Mapping[str, Any], *, dataset: str, edition: str, raise ValueError(f"Header crosswalk table unavailable: {table!r}") return [{**field, "dataset": dataset, "edition": edition, "table": item["table"], "mapping_version": document["mapping_version"], "input_sha256": item["input_sha256"], - "source_schema_sha256": item["source_schema_sha256"]} + "source_schema_sha256": item["source_schema_sha256"], + **({"period": dict(item["metric_period"]) if field.get("disposition", "fact") == "fact" + else {"kind": "unknown"}} if "metric_period" in item else {})} for item in tables for field in item["fields"]] diff --git a/teadata/load_data.py b/teadata/load_data.py index 2255be7..5333b8e 100644 --- a/teadata/load_data.py +++ b/teadata/load_data.py @@ -2839,7 +2839,8 @@ def load_repo(districts_fp: str, campuses_fp: str) -> DataEngine: try: repo = _build_repo(districts_fp, campuses_fp) expected = ( - (set(cfg.data_sources) - {"tepsac", "tefa"}) + ({name for name in cfg.data_sources + if not cfg.is_source_only(name, YEAR)} - {"tepsac", "tefa"}) | {cfg.options["private_dataset"]} | set(cfg.spatial) ) diff --git a/teadata/schemas/tapr--2025--graduation-profile-crosswalk.json b/teadata/schemas/tapr--2025--graduation-profile-crosswalk.json new file mode 100644 index 0000000..832fd04 --- /dev/null +++ b/teadata/schemas/tapr--2025--graduation-profile-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_graduation_profile","edition":"2025","source_only":true,"tables":[{"fields":[{"code":"CAMPUS","dictionary_status":"not_applicable","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"CAMPNAME","dictionary_status":"not_applicable","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_description":null,"publisher_type":null},{"code":"CA0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_all_students_count_including_fhsp","label":"Campus 2024 Graduates: All Students Count (including FHSP)","position":5,"publisher_description":"Campus 2024 Graduates All Students Count (including FHSP)","publisher_type":"Number"},{"code":"CA0GM24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_minimum_hs_pgm_all_students_count","label":"Campus 2024 Graduates: Minimum HS PGM All Students Count","position":6,"publisher_description":"Campus 2024 Graduates Minimum HS PGM All Students Count","publisher_type":"Number"},{"code":"CA0GH24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_rhsp_dap_all_students_count","label":"Campus 2024 Graduates: RHSP/DAP All Students Count","position":7,"publisher_description":"Campus 2024 Graduates RHSP/DAP All Students Count","publisher_type":"Number"},{"code":"CA0GN24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_fhsp_no_endorsement_all_students_count","label":"Campus 2024 Graduates: FHSP No Endorsement All Students Count","position":8,"publisher_description":"Campus 2024 Graduates FHSP No Endorsement All Students Count","publisher_type":"Number"},{"code":"CA0GE24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_fhsp_e_all_students_count","label":"Campus 2024 Graduates: FHSP-E All Students Count","position":9,"publisher_description":"Campus 2024 Graduates FHSP-E All Students Count","publisher_type":"Number"},{"code":"CA0GA24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_fhsp_dla_all_students_count","label":"Campus 2024 Graduates: FHSP-DLA All Students Count","position":10,"publisher_description":"Campus 2024 Graduates FHSP-DLA All Students Count","publisher_type":"Number"},{"code":"CA0G124N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_texas_first_dla_all_students_count","label":"Campus 2024 Graduates: Texas First-DLA All Students Count","position":11,"publisher_description":"Campus 2024 Graduates Texas First-DLA All Students Count","publisher_type":"Number"},{"code":"CA0GS24N","dictionary_status":"not_documented","disposition":"fact","field":"campus_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count","label":"Campus 2024 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students Count","position":12,"publisher_description":null,"publisher_type":null},{"code":"CA0GS24D","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_all_students_count_all_students_denominator","label":"Campus 2024 Graduates: All Students Count All Students Denominator","position":13,"publisher_description":"Campus 2024 Graduates All Students Count All Students Denominator","publisher_type":"Number"},{"code":"CB0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_african_american_count","label":"Campus 2024 Graduates: African American Count","position":14,"publisher_description":"Campus 2024 Graduates African American Count","publisher_type":"Number"},{"code":"CH0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_hispanic_count","label":"Campus 2024 Graduates: Hispanic Count","position":15,"publisher_description":"Campus 2024 Graduates Hispanic Count","publisher_type":"Number"},{"code":"CW0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_white_count","label":"Campus 2024 Graduates: White Count","position":16,"publisher_description":"Campus 2024 Graduates White Count","publisher_type":"Number"},{"code":"CI0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_american_indian_count","label":"Campus 2024 Graduates: American Indian Count","position":17,"publisher_description":"Campus 2024 Graduates American Indian Count","publisher_type":"Number"},{"code":"C30GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_asian_count","label":"Campus 2024 Graduates: Asian Count","position":18,"publisher_description":"Campus 2024 Graduates Asian Count","publisher_type":"Number"},{"code":"C40GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_pacific_islander_count","label":"Campus 2024 Graduates: Pacific Islander Count","position":19,"publisher_description":"Campus 2024 Graduates Pacific Islander Count","publisher_type":"Number"},{"code":"C20GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_two_or_more_races_count","label":"Campus 2024 Graduates: Two or More Races Count","position":20,"publisher_description":"Campus 2024 Graduates Two or More Races Count","publisher_type":"Number"},{"code":"CE0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_econ_disadv_count","label":"Campus 2024 Graduates: Econ Disadv Count","position":21,"publisher_description":"Campus 2024 Graduates Econ Disadv Count","publisher_type":"Number"},{"code":"CS0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_special_ed_count","label":"Campus 2024 Graduates: Special Ed Count","position":22,"publisher_description":"Campus 2024 Graduates Special Ed Count","publisher_type":"Number"},{"code":"CL0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_eb_el_count","label":"Campus 2024 Graduates: EB/EL Count","position":23,"publisher_description":"Campus 2024 Graduates EB/EL Count","publisher_type":"Number"},{"code":"CR0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_at_risk_count","label":"Campus 2024 Graduates: At Risk Count","position":24,"publisher_description":"Campus 2024 Graduates At Risk Count","publisher_type":"Number"},{"code":"CV0GR24N","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_cte_program_completer_count","label":"Campus 2024 Graduates: CTE Program Completer Count","position":25,"publisher_description":"Campus 2024 Graduates CTE Program Completer Count","publisher_type":"Number"},{"code":"CV0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_cte_program_completer_student_group_percent","label":"Campus 2024 Graduates: CTE Program Completer Student Group %","position":26,"publisher_description":"Campus 2024 Graduates CTE Program Completer Student Group %","publisher_type":"Number"},{"code":"CA0GH24P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_rhsp_dap_all_students_percent_profile_only","label":"Campus 2024 Graduates: RHSP/DAP All Students % (Profile Only)","position":27,"publisher_description":"Campus 2024 Graduates RHSP/DAP All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GN24P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_fhsp_no_endorsement_all_students_percent_profile_only","label":"Campus 2024 Graduates: FHSP No Endorsement All Students % (Profile Only)","position":28,"publisher_description":"Campus 2024 Graduates FHSP No Endorsement All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GE24P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_fhsp_e_all_students_percent_profile_only","label":"Campus 2024 Graduates: FHSP-E All Students % (Profile Only)","position":29,"publisher_description":"Campus 2024 Graduates FHSP-E All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GA24P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_fhsp_dla_all_students_percent_profile_only","label":"Campus 2024 Graduates: FHSP-DLA All Students % (Profile Only)","position":30,"publisher_description":"Campus 2024 Graduates FHSP-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0G124P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_texas_first_dla_all_students_percent_profile_only","label":"Campus 2024 Graduates: Texas First-DLA All Students % (Profile Only)","position":31,"publisher_description":"Campus 2024 Graduates Texas First-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_all_students_group_percent","label":"Campus 2024 Graduates: All Students Group %","position":32,"publisher_description":"Campus 2024 Graduates All Students Group %","publisher_type":"Number"},{"code":"CA0GM24R","dictionary_status":"not_documented","disposition":"fact","field":"campus_2024_graduates_minimum_hs_pgm_all_students_percent","label":"Campus 2024 Graduates: Minimum HS PGM All Students %","position":33,"publisher_description":null,"publisher_type":null},{"code":"CA0GS24R","dictionary_status":"not_documented","disposition":"fact","field":"campus_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent","label":"Campus 2024 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students %","position":34,"publisher_description":null,"publisher_type":null},{"code":"CB0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_african_american_student_group_percent","label":"Campus 2024 Graduates: African American Student Group %","position":35,"publisher_description":"Campus 2024 Graduates African American Student Group %","publisher_type":"Number"},{"code":"CH0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_hispanic_student_group_percent","label":"Campus 2024 Graduates: Hispanic Student Group %","position":36,"publisher_description":"Campus 2024 Graduates Hispanic Student Group %","publisher_type":"Number"},{"code":"CW0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_white_student_group_percent","label":"Campus 2024 Graduates: White Student Group %","position":37,"publisher_description":"Campus 2024 Graduates White Student Group %","publisher_type":"Number"},{"code":"CI0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_american_indian_student_group_percent","label":"Campus 2024 Graduates: American Indian Student Group %","position":38,"publisher_description":"Campus 2024 Graduates American Indian Student Group %","publisher_type":"Number"},{"code":"C30GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_asian_student_group_percent","label":"Campus 2024 Graduates: Asian Student Group %","position":39,"publisher_description":"Campus 2024 Graduates Asian Student Group %","publisher_type":"Number"},{"code":"C40GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_pacific_islander_student_group_percent","label":"Campus 2024 Graduates: Pacific Islander Student Group %","position":40,"publisher_description":"Campus 2024 Graduates Pacific Islander Student Group %","publisher_type":"Number"},{"code":"C20GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_two_or_more_races_student_group_percent","label":"Campus 2024 Graduates: Two or More Races Student Group %","position":41,"publisher_description":"Campus 2024 Graduates Two or More Races Student Group %","publisher_type":"Number"},{"code":"CE0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_econ_disadv_student_group_percent","label":"Campus 2024 Graduates: Econ Disadv Student Group %","position":42,"publisher_description":"Campus 2024 Graduates Econ Disadv Student Group %","publisher_type":"Number"},{"code":"CS0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_special_ed_student_group_percent","label":"Campus 2024 Graduates: Special Ed Student Group %","position":43,"publisher_description":"Campus 2024 Graduates Special Ed Student Group %","publisher_type":"Number"},{"code":"CL0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_eb_el_student_group_percent","label":"Campus 2024 Graduates: EB/EL Student Group %","position":44,"publisher_description":"Campus 2024 Graduates EB/EL Student Group %","publisher_type":"Number"},{"code":"CR0GR24R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_at_risk_student_group_percent","label":"Campus 2024 Graduates: At Risk Student Group %","position":45,"publisher_description":"Campus 2024 Graduates At Risk Student Group %","publisher_type":"Number"},{"code":"CA0GM24P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_graduates_minimum_hs_pgm_all_students_percent_profile_only","label":"Campus 2024 Graduates: Minimum HS PGM All Students % (Profile Only)","position":46,"publisher_description":"Campus 2024 Graduates Minimum HS PGM All Students % (Profile Only)","publisher_type":"Number"}],"input_sha256":"8734133d9b8805e51f68185e954175ac63a50a2650c048ff25f6afe7f059174f","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":9086},"metric_period":{"end_year":2024,"kind":"school_year","start_year":2023},"source_schema_sha256":"b595f8ac930108e3e0f059566f53e9e588ece7b243cbe4d9ee43d8ac9549131d","table":"graduation_profile"}]},{"dataset":"district_tapr_graduation_profile","edition":"2025","source_only":true,"tables":[{"fields":[{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DA0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_all_students_count_including_fhsp","label":"District 2024 Graduates: All Students Count (including FHSP)","position":3,"publisher_description":"District 2024 Graduates All Students Count (including FHSP)","publisher_type":"Number"},{"code":"DA0GM24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_minimum_hs_pgm_all_students_count","label":"District 2024 Graduates: Minimum HS PGM All Students Count","position":4,"publisher_description":"District 2024 Graduates Minimum HS PGM All Students Count","publisher_type":"Number"},{"code":"DA0GH24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_rhsp_dap_all_students_count","label":"District 2024 Graduates: RHSP/DAP All Students Count","position":5,"publisher_description":"District 2024 Graduates RHSP/DAP All Students Count","publisher_type":"Number"},{"code":"DA0GN24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_fhsp_no_endorsement_all_students_count","label":"District 2024 Graduates: FHSP No Endorsement All Students Count","position":6,"publisher_description":"District 2024 Graduates FHSP No Endorsement All Students Count","publisher_type":"Number"},{"code":"DA0GE24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_fhsp_e_all_students_count","label":"District 2024 Graduates: FHSP-E All Students Count","position":7,"publisher_description":"District 2024 Graduates FHSP-E All Students Count","publisher_type":"Number"},{"code":"DA0GA24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_fhsp_dla_all_students_count","label":"District 2024 Graduates: FHSP-DLA All Students Count","position":8,"publisher_description":"District 2024 Graduates FHSP-DLA All Students Count","publisher_type":"Number"},{"code":"DA0G124N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_texas_first_dla_all_students_count","label":"District 2024 Graduates: Texas First-DLA All Students Count","position":9,"publisher_description":"District 2024 Graduates Texas First-DLA All Students Count","publisher_type":"Number"},{"code":"DA0GS24N","dictionary_status":"not_documented","disposition":"fact","field":"district_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count","label":"District 2024 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students Count","position":10,"publisher_description":null,"publisher_type":null},{"code":"DA0GS24D","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_all_students_count_all_students_denominator","label":"District 2024 Graduates: All Students Count All Students Denominator","position":11,"publisher_description":"District 2024 Graduates All Students Count All Students Denominator","publisher_type":"Number"},{"code":"DB0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_african_american_count","label":"District 2024 Graduates: African American Count","position":12,"publisher_description":"District 2024 Graduates African American Count","publisher_type":"Number"},{"code":"DH0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_hispanic_count","label":"District 2024 Graduates: Hispanic Count","position":13,"publisher_description":"District 2024 Graduates Hispanic Count","publisher_type":"Number"},{"code":"DW0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_white_count","label":"District 2024 Graduates: White Count","position":14,"publisher_description":"District 2024 Graduates White Count","publisher_type":"Number"},{"code":"DI0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_american_indian_count","label":"District 2024 Graduates: American Indian Count","position":15,"publisher_description":"District 2024 Graduates American Indian Count","publisher_type":"Number"},{"code":"D30GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_asian_count","label":"District 2024 Graduates: Asian Count","position":16,"publisher_description":"District 2024 Graduates Asian Count","publisher_type":"Number"},{"code":"D40GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_pacific_islander_count","label":"District 2024 Graduates: Pacific Islander Count","position":17,"publisher_description":"District 2024 Graduates Pacific Islander Count","publisher_type":"Number"},{"code":"D20GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_two_or_more_races_count","label":"District 2024 Graduates: Two or More Races Count","position":18,"publisher_description":"District 2024 Graduates Two or More Races Count","publisher_type":"Number"},{"code":"DE0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_econ_disadv_count","label":"District 2024 Graduates: Econ Disadv Count","position":19,"publisher_description":"District 2024 Graduates Econ Disadv Count","publisher_type":"Number"},{"code":"DS0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_special_ed_count","label":"District 2024 Graduates: Special Ed Count","position":20,"publisher_description":"District 2024 Graduates Special Ed Count","publisher_type":"Number"},{"code":"DL0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_eb_el_count","label":"District 2024 Graduates: EB/EL Count","position":21,"publisher_description":"District 2024 Graduates EB/EL Count","publisher_type":"Number"},{"code":"DR0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_at_risk_count","label":"District 2024 Graduates: At Risk Count","position":22,"publisher_description":"District 2024 Graduates At Risk Count","publisher_type":"Number"},{"code":"DV0GR24N","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_cte_program_completer_count","label":"District 2024 Graduates: CTE Program Completer Count","position":23,"publisher_description":"District 2024 Graduates CTE Program Completer Count","publisher_type":"Number"},{"code":"DV0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_cte_program_completer_student_group_percent","label":"District 2024 Graduates: CTE Program Completer Student Group %","position":24,"publisher_description":"District 2024 Graduates CTE Program Completer Student Group %","publisher_type":"Number"},{"code":"DA0GH24P","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_rhsp_dap_all_students_percent_profile_only","label":"District 2024 Graduates: RHSP/DAP All Students % (Profile Only)","position":25,"publisher_description":"District 2024 Graduates RHSP/DAP All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GN24P","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_fhsp_no_endorsement_all_students_percent_profile_only","label":"District 2024 Graduates: FHSP No Endorsement All Students % (Profile Only)","position":26,"publisher_description":"District 2024 Graduates FHSP No Endorsement All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GE24P","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_fhsp_e_all_students_percent_profile_only","label":"District 2024 Graduates: FHSP-E All Students % (Profile Only)","position":27,"publisher_description":"District 2024 Graduates FHSP-E All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GA24P","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_fhsp_dla_all_students_percent_profile_only","label":"District 2024 Graduates: FHSP-DLA All Students % (Profile Only)","position":28,"publisher_description":"District 2024 Graduates FHSP-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0G124P","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_texas_first_dla_all_students_percent_profile_only","label":"District 2024 Graduates: Texas First-DLA All Students % (Profile Only)","position":29,"publisher_description":"District 2024 Graduates Texas First-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_all_students_group_percent","label":"District 2024 Graduates: All Students Group %","position":30,"publisher_description":"District 2024 Graduates All Students Group %","publisher_type":"Number"},{"code":"DA0GM24R","dictionary_status":"not_documented","disposition":"fact","field":"district_2024_graduates_minimum_hs_pgm_all_students_percent","label":"District 2024 Graduates: Minimum HS PGM All Students %","position":31,"publisher_description":null,"publisher_type":null},{"code":"DA0GS24R","dictionary_status":"not_documented","disposition":"fact","field":"district_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent","label":"District 2024 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students %","position":32,"publisher_description":null,"publisher_type":null},{"code":"DB0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_african_american_student_group_percent","label":"District 2024 Graduates: African American Student Group %","position":33,"publisher_description":"District 2024 Graduates African American Student Group %","publisher_type":"Number"},{"code":"DH0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_hispanic_student_group_percent","label":"District 2024 Graduates: Hispanic Student Group %","position":34,"publisher_description":"District 2024 Graduates Hispanic Student Group %","publisher_type":"Number"},{"code":"DW0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_white_student_group_percent","label":"District 2024 Graduates: White Student Group %","position":35,"publisher_description":"District 2024 Graduates White Student Group %","publisher_type":"Number"},{"code":"DI0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_american_indian_student_group_percent","label":"District 2024 Graduates: American Indian Student Group %","position":36,"publisher_description":"District 2024 Graduates American Indian Student Group %","publisher_type":"Number"},{"code":"D30GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_asian_student_group_percent","label":"District 2024 Graduates: Asian Student Group %","position":37,"publisher_description":"District 2024 Graduates Asian Student Group %","publisher_type":"Number"},{"code":"D40GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_pacific_islander_student_group_percent","label":"District 2024 Graduates: Pacific Islander Student Group %","position":38,"publisher_description":"District 2024 Graduates Pacific Islander Student Group %","publisher_type":"Number"},{"code":"D20GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_two_or_more_races_student_group_percent","label":"District 2024 Graduates: Two or More Races Student Group %","position":39,"publisher_description":"District 2024 Graduates Two or More Races Student Group %","publisher_type":"Number"},{"code":"DE0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_econ_disadv_student_group_percent","label":"District 2024 Graduates: Econ Disadv Student Group %","position":40,"publisher_description":"District 2024 Graduates Econ Disadv Student Group %","publisher_type":"Number"},{"code":"DS0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_special_ed_student_group_percent","label":"District 2024 Graduates: Special Ed Student Group %","position":41,"publisher_description":"District 2024 Graduates Special Ed Student Group %","publisher_type":"Number"},{"code":"DL0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_eb_el_student_group_percent","label":"District 2024 Graduates: EB/EL Student Group %","position":42,"publisher_description":"District 2024 Graduates EB/EL Student Group %","publisher_type":"Number"},{"code":"DR0GR24R","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_at_risk_student_group_percent","label":"District 2024 Graduates: At Risk Student Group %","position":43,"publisher_description":"District 2024 Graduates At Risk Student Group %","publisher_type":"Number"},{"code":"DA0GM24P","dictionary_status":"documented","disposition":"fact","field":"district_2024_graduates_minimum_hs_pgm_all_students_percent_profile_only","label":"District 2024 Graduates: Minimum HS PGM All Students % (Profile Only)","position":44,"publisher_description":"District 2024 Graduates Minimum HS PGM All Students % (Profile Only)","publisher_type":"Number"}],"input_sha256":"486326546705eb72f068f5d587b68222a15e9d32a262914d04cc4c91ef24cf72","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":1210},"metric_period":{"end_year":2024,"kind":"school_year","start_year":2023},"source_schema_sha256":"72d7d736ff5372d06457c2047b116057c469ef5b20b1f03d0052a84216c140a5","table":"graduation_profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/scripts/build_tapr_profiles.py b/teadata/scripts/build_tapr_profiles.py index 546a1a7..9dc8700 100644 --- a/teadata/scripts/build_tapr_profiles.py +++ b/teadata/scripts/build_tapr_profiles.py @@ -17,27 +17,31 @@ import sys import tempfile +from teadata.column_schema import crosswalk_dataset, parse_column_schema from teadata.dataset_metadata import DatasetMetadata from teadata.manifest import processor_identity, verify_reference_receipts from teadata.provenance import ProvenanceStore from teadata.scripts.paths import data_path -from teadata.tapr import merge_tapr_tables +from teadata.tapr import TAPR_PROFILE_FAMILIES, merge_tapr_tables from teadata.teadata_config import load_config def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | None, - output_dir: Path, reference_store: ProvenanceStore | None = None) -> dict: + output_dir: Path, reference_store: ProvenanceStore | None = None, + family: str = "student_staff_profile") -> dict: """Validate all selected inputs, then publish one complete new generation.""" import pyarrow.parquet as pq - if edition not in {"2024", "2025"} or not scopes or len(scopes) != len(set(scopes)) or set(scopes) - {"campus", "district"}: + if (edition not in {"2024", "2025"} or not scopes or len(scopes) != len(set(scopes)) + or set(scopes) - {"campus", "district"} + or family not in TAPR_PROFILE_FAMILIES): raise ValueError("Select a declared 2024/2025 edition and distinct campus/district scopes") output_dir = Path(output_dir) if output_dir.exists() or output_dir.is_symlink(): raise FileExistsError(f"Preparation output already exists: {output_dir}") prepared = [] for scope in scopes: - dataset = scope + "_tapr_student_staff_profile" + dataset = scope + "_tapr_" + family sources = cfg.read_tapr_sources(dataset, int(edition), input_dir=input_dir) table = merge_tapr_tables(sources, key_field=scope + "_number") if table.column_names != cfg.column_schema(dataset, int(edition), reader_profile="source"): @@ -49,7 +53,8 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | stage.chmod(0o700) try: store = ProvenanceStore(stage / "provenance") - receipt = {"schema_version": 1, "edition": edition, "status": "validated_source_preparation", + receipt = {"schema_version": 1, "edition": edition, "family": family, + "status": "validated_source_preparation", "release_activation": False, "toolchain": {"python": sys.version, "packages": {name: version(name) for name in ("pyarrow", "duckdb", "pandas", "openpyxl")}}, "processor_sha256": processor_identity(), @@ -65,6 +70,22 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | replace(source, path=str(crosswalk_path), dataset=dataset + ":schema", section="reference", metadata=DatasetMetadata(title="TEA Data full TAPR source/header contract"))) inputs = [contract_observation] + selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, edition) + if selected.get("source_only"): + if reference_store is None or not source.metadata.provenance_ids: + raise ValueError("Source-only preparation requires original acquisition receipts in an explicit reference_store") + acquired = set() + expected = {item.input_sha256 for item in sources} + for identifier in source.metadata.provenance_ids: + store.copy_record_from(reference_store, identifier) + record = store.read_record(identifier) + if (record["kind"] != "acquisition" or record["dataset"] != dataset + or record["artifact"]["sha256"] not in expected): + raise ValueError("Source acquisition receipt does not identify the selected raw input") + acquired.add(record["artifact"]["sha256"]) + inputs.append(identifier) + if acquired != expected: + raise ValueError("Original acquisition receipts do not account for every source-only raw input") references = [] for reference in cfg.reader_references(dataset, int(edition), reader_profile="source"): for identifier in reference.provenance_ids: @@ -83,7 +104,7 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | for item in sources: acquisition = store.record_acquisition(item.path, replace(source, path=str(item.path), metadata=bound_metadata), - parameters={"observation": "retained local raw source; original acquisition time remains unknown", + parameters={"observation": "local raw-source read; acquisition history is retained separately when available", "table": item.mapping["table"]}) if store.read_record(acquisition)["artifact"]["sha256"] != item.input_sha256: raise ValueError("TAPR input changed before provenance binding") @@ -114,7 +135,8 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | processor="teadata.scripts.build_tapr_profiles", code_version=receipt["processor_sha256"], parameters={"edition": edition, "column_schema_sha256": contract["sha256"], "preparation_code_sha256": receipt["preparation_code_sha256"], - "toolchain": receipt["toolchain"], "whitespace": "preserve", "geospatial_filter": False}, + "toolchain": receipt["toolchain"], "family": family, + "whitespace": "preserve", "geospatial_filter": False}, validation=validation) store.verify_record_closure([processing]) receipt["scopes"][scope] = {**validation, "dataset": dataset, "processing_record_id": processing, @@ -124,7 +146,9 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | "acquisition_state": "retained" if ref.provenance_ids else "not_acquired", "provenance_ids": list(ref.provenance_ids)} for ref in references], "source_tables": [{"table": item.mapping["table"], "source_revision_sha256": item.input_sha256, - "publisher_columns": len(item.mapping["fields"]), "rows": item.table.num_rows} + "publisher_columns": len(item.mapping["fields"]), "rows": item.table.num_rows, + **({"metric_period": item.mapping["metric_period"]} + if "metric_period" in item.mapping else {})} for item in sources], "coverage_scope": "Complete columns of the explicitly declared source tables; not all annual TAPR download families.", "qualified_metrics": {key: value.to_dict() for key, value in source.metadata.metrics.items()}, @@ -144,6 +168,8 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | def main(argv: list[str] | None = None) -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--edition", required=True, choices=("2024", "2025")) + parser.add_argument("--family", choices=TAPR_PROFILE_FAMILIES, + default="student_staff_profile") parser.add_argument("--scope", action="append", choices=("campus", "district")) parser.add_argument("--config", type=Path) parser.add_argument("--reference-store", type=Path, @@ -153,7 +179,8 @@ def main(argv: list[str] | None = None) -> None: args = parser.parse_args(argv) result = prepare_profiles(load_config(args.config), edition=args.edition, scopes=args.scope or ["campus", "district"], input_dir=args.input_dir, output_dir=args.output_dir, - reference_store=ProvenanceStore(args.reference_store) if args.reference_store is not None else None) + reference_store=ProvenanceStore(args.reference_store) if args.reference_store is not None else None, + family=args.family) print(json.dumps({"edition": args.edition, "output_dir": str(args.output_dir), "scopes": {key: {"rows": value["rows"], "fields": value["fields"]} for key, value in result["scopes"].items()}})) diff --git a/teadata/tapr.py b/teadata/tapr.py index f6a902e..da18950 100644 --- a/teadata/tapr.py +++ b/teadata/tapr.py @@ -18,6 +18,9 @@ from .identifiers import canonical_source_identifiers +TAPR_PROFILE_FAMILIES = ("student_staff_profile", "graduation_profile") + + @dataclass(frozen=True) class TaprSourceTable: table: Any @@ -133,7 +136,8 @@ def read_tapr_table(path: str | Path, *, mapping: Mapping[str, Any], key_field: pc: Any = arrow_compute # Arrow registers compute kernels dynamically. path = Path(path) if (key_field not in {"campus_number", "district_number"} - or dataset != key_field.removesuffix("_number") + "_tapr_student_staff_profile" + or dataset not in {key_field.removesuffix("_number") + "_tapr_" + family + for family in TAPR_PROFILE_FAMILIES} or not isinstance(edition, str) or not edition.strip()): raise ValueError("TAPR preparation requires an explicit qualified dataset and source edition") validate_header_table(mapping) @@ -200,6 +204,8 @@ def merge_tapr_tables(sources: list[TaprSourceTable], *, key_field: str): width = 9 if key_field == "campus_number" else 6 if len({(source.dataset, source.edition) for source in sources}) != 1: raise ValueError("TAPR tables from different qualified datasets or editions must remain independent") + if len({tuple(sorted(source.mapping.get("metric_period", {}).items())) for source in sources}) != 1: + raise ValueError("TAPR tables with different metric reference periods must remain independent") if len({source.mapping["table"] for source in sources}) != len(sources): raise ValueError("Different revisions or repeated observations of one TAPR table must remain independent") for source in sources: diff --git a/teadata/teadata_config.py b/teadata/teadata_config.py index 792b777..4f16ea7 100644 --- a/teadata/teadata_config.py +++ b/teadata/teadata_config.py @@ -779,6 +779,28 @@ def header_records(self, dataset: str, *, edition: str, except ValueError as error: raise ContractError(str(error)) from error + def is_source_only(self, dataset: str, year: int | None = None, *, + section: str = "data_sources") -> bool: + """Describe preparation-only availability from the reviewed source contract. + + A named retained reader (such as accountability ratings) still belongs + in release coverage. Only the explicit source-only crosswalk opts out. + """ + from .column_schema import crosswalk_dataset, has_default_reader, parse_column_schema + + source = self.resolve_dataset(dataset, year, section=section) + if has_default_reader(source.reader) or "source" not in source.reader.get("profiles", {}): + return False + contract = self.column_contract(dataset, year, section=section, reader_profile="source") + if contract is None: + return False + document = parse_column_schema(contract["text"].encode()) + if document["schema_version"] != 2: + return False + if source.metadata.version is None: + raise ValueError("Source-only readers require an explicit source edition") + return crosswalk_dataset(document, dataset, source.metadata.version).get("source_only", False) + def header_mapping(self, dataset: str, *, edition: str, table: str, from_: str = "code", to: str = "field", columns: Iterable[str] | None = None, reader_profile: str | None = None) -> dict[str, str]: @@ -821,6 +843,9 @@ def read_tapr_sources(self, dataset: str, year: int, *, input_dir: str | Path | if contract is None: raise ContractError("Full TAPR source preparation requires a reviewed crosswalk") selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, source.metadata.version) + if selected.get("source_only") and any(table["metric_period"] != source.metadata.period.to_dict() + for table in selected["tables"]): + raise ContractError("Source-only metric period differs from its declared source metadata") if set(selection["tables"]) != {table["table"] for table in selected["tables"]}: raise ContractError("Full TAPR source paths do not account for every reviewed table") result = [] @@ -847,7 +872,7 @@ def load_df( Resolve the dataset for the year and load as DataFrame (or GeoDataFrame if spatial). For CSV loads, you can pass dtype=... etc through reader_kwargs. """ - from .column_schema import reader_options + from .column_schema import has_default_reader, reader_options from .manifest import ACTIVE_BUILD, ContractError source = self.resolve_dataset(dataset, year, section=section) @@ -860,8 +885,7 @@ def load_df( ) if ( reader_profile is None - and source.reader.get("profiles") - and expected_schema is None + and not has_default_reader(source.reader) ): raise ContractError( f"Reader profile is required for {dataset}; no default column schema is declared" diff --git a/teadata/teadata_sources.yaml b/teadata/teadata_sources.yaml index 1cba957..107fd63 100644 --- a/teadata/teadata_sources.yaml +++ b/teadata/teadata_sources.yaml @@ -521,6 +521,491 @@ data_sources: link status: unreviewed provenance_ids: [] + campus_tapr_graduation_profile: + 2025: + path: data/tapr/raw/2025 Campus Graduation Profile.csv + metadata: + title: 2024-2025 TAPR Campus Graduation Profile (2023-2024 annual graduates) + publisher: Texas Education Agency + version: '2025' + period: &id001 + kind: school_year + start_year: 2023 + end_year: 2024 + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&level=Campus&tapr=all_c&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv + provenance_ids: + - 2fdf8e78ac6879c765eda31ff907e69c54b8c1ddb4149f2f871c8346941a0c99 + notes: Source-only GRAD family; not released facts or all annual TAPR/readiness + families. Metrics measure 2023-2024 annual graduates inside publisher edition + 2025. Identity/name observation dates are unknown. Exact CSV code and label + headers supply all 42 metric bindings; three metrics lack publisher dictionary + type/definition. Units remain unknown until individually reviewed; no suppression + or blank-cause interpretation is applied. No cross-year equivalence or merge + with STUD/STAF is asserted. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&level=Campus&tapr=all_c&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv + title: 'Original publisher GRAD CSV: human labels in record 1 and source codes + in record 2' + status: available + provenance_ids: + - 2fdf8e78ac6879c765eda31ff907e69c54b8c1ddb4149f2f871c8346941a0c99 + reviewed_sha256: 8734133d9b8805e51f68185e954175ac63a50a2650c048ff25f6afe7f059174f + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas + title: 2024-2025 Campus Graduation Profile dictionary; 39 of 42 metric codes + documented + status: available + provenance_ids: + - 7fe8d8252f1c6a45a8700840d758ac1f115cbd962b284aca3ad988900117dc82 + reviewed_sha256: 3fc2ca2a971fbc3f6de3e020712eab5bc594614c405836dfa44968a9bf111121 + - reference_id: glossary + role: glossary + url: https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf + title: 2024-25 TAPR Glossary + status: available + provenance_ids: + - e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db + reviewed_sha256: 846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html + title: Explanation of 2024-25 TAPR Masking Rules + status: available + provenance_ids: + - 6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554 + reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 + field_year: 2024 + metrics: + campus_2024_graduates_all_students_count_including_fhsp: + field: campus_2024_graduates_all_students_count_including_fhsp + period: *id001 + unit: null + campus_2024_graduates_minimum_hs_pgm_all_students_count: + field: campus_2024_graduates_minimum_hs_pgm_all_students_count + period: *id001 + unit: null + campus_2024_graduates_rhsp_dap_all_students_count: + field: campus_2024_graduates_rhsp_dap_all_students_count + period: *id001 + unit: null + campus_2024_graduates_fhsp_no_endorsement_all_students_count: + field: campus_2024_graduates_fhsp_no_endorsement_all_students_count + period: *id001 + unit: null + campus_2024_graduates_fhsp_e_all_students_count: + field: campus_2024_graduates_fhsp_e_all_students_count + period: *id001 + unit: null + campus_2024_graduates_fhsp_dla_all_students_count: + field: campus_2024_graduates_fhsp_dla_all_students_count + period: *id001 + unit: null + campus_2024_graduates_texas_first_dla_all_students_count: + field: campus_2024_graduates_texas_first_dla_all_students_count + period: *id001 + unit: null + campus_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count: + field: campus_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count + period: *id001 + unit: null + campus_2024_graduates_all_students_count_all_students_denominator: + field: campus_2024_graduates_all_students_count_all_students_denominator + period: *id001 + unit: null + campus_2024_graduates_african_american_count: + field: campus_2024_graduates_african_american_count + period: *id001 + unit: null + campus_2024_graduates_hispanic_count: + field: campus_2024_graduates_hispanic_count + period: *id001 + unit: null + campus_2024_graduates_white_count: + field: campus_2024_graduates_white_count + period: *id001 + unit: null + campus_2024_graduates_american_indian_count: + field: campus_2024_graduates_american_indian_count + period: *id001 + unit: null + campus_2024_graduates_asian_count: + field: campus_2024_graduates_asian_count + period: *id001 + unit: null + campus_2024_graduates_pacific_islander_count: + field: campus_2024_graduates_pacific_islander_count + period: *id001 + unit: null + campus_2024_graduates_two_or_more_races_count: + field: campus_2024_graduates_two_or_more_races_count + period: *id001 + unit: null + campus_2024_graduates_econ_disadv_count: + field: campus_2024_graduates_econ_disadv_count + period: *id001 + unit: null + campus_2024_graduates_special_ed_count: + field: campus_2024_graduates_special_ed_count + period: *id001 + unit: null + campus_2024_graduates_eb_el_count: + field: campus_2024_graduates_eb_el_count + period: *id001 + unit: null + campus_2024_graduates_at_risk_count: + field: campus_2024_graduates_at_risk_count + period: *id001 + unit: null + campus_2024_graduates_cte_program_completer_count: + field: campus_2024_graduates_cte_program_completer_count + period: *id001 + unit: null + campus_2024_graduates_cte_program_completer_student_group_percent: + field: campus_2024_graduates_cte_program_completer_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_rhsp_dap_all_students_percent_profile_only: + field: campus_2024_graduates_rhsp_dap_all_students_percent_profile_only + period: *id001 + unit: null + campus_2024_graduates_fhsp_no_endorsement_all_students_percent_profile_only: + field: campus_2024_graduates_fhsp_no_endorsement_all_students_percent_profile_only + period: *id001 + unit: null + campus_2024_graduates_fhsp_e_all_students_percent_profile_only: + field: campus_2024_graduates_fhsp_e_all_students_percent_profile_only + period: *id001 + unit: null + campus_2024_graduates_fhsp_dla_all_students_percent_profile_only: + field: campus_2024_graduates_fhsp_dla_all_students_percent_profile_only + period: *id001 + unit: null + campus_2024_graduates_texas_first_dla_all_students_percent_profile_only: + field: campus_2024_graduates_texas_first_dla_all_students_percent_profile_only + period: *id001 + unit: null + campus_2024_graduates_all_students_group_percent: + field: campus_2024_graduates_all_students_group_percent + period: *id001 + unit: null + campus_2024_graduates_minimum_hs_pgm_all_students_percent: + field: campus_2024_graduates_minimum_hs_pgm_all_students_percent + period: *id001 + unit: null + campus_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent: + field: campus_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent + period: *id001 + unit: null + campus_2024_graduates_african_american_student_group_percent: + field: campus_2024_graduates_african_american_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_hispanic_student_group_percent: + field: campus_2024_graduates_hispanic_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_white_student_group_percent: + field: campus_2024_graduates_white_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_american_indian_student_group_percent: + field: campus_2024_graduates_american_indian_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_asian_student_group_percent: + field: campus_2024_graduates_asian_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_pacific_islander_student_group_percent: + field: campus_2024_graduates_pacific_islander_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_two_or_more_races_student_group_percent: + field: campus_2024_graduates_two_or_more_races_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_econ_disadv_student_group_percent: + field: campus_2024_graduates_econ_disadv_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_special_ed_student_group_percent: + field: campus_2024_graduates_special_ed_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_eb_el_student_group_percent: + field: campus_2024_graduates_eb_el_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_at_risk_student_group_percent: + field: campus_2024_graduates_at_risk_student_group_percent + period: *id001 + unit: null + campus_2024_graduates_minimum_hs_pgm_all_students_percent_profile_only: + field: campus_2024_graduates_minimum_hs_pgm_all_students_percent_profile_only + period: *id001 + unit: null + reader: + profiles: + source: + column_schema: schemas/tapr--2025--graduation-profile-crosswalk.json + tapr_source: + scope: campus + tables: + graduation_profile: data/tapr/raw/2025 Campus Graduation Profile.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2025--graduation-profile-crosswalk.json + title: Reviewed GRAD CSV headers, source layout and dictionary availability; + source-only, not a historical prepared-input claim + status: available + provenance_ids: [] + reviewed_sha256: bf848a6c47d7f5ed783b57d862d4fcaefced1e2988b65b75c13abddcd998ec98 + district_tapr_graduation_profile: + 2025: + path: data/tapr/raw/2025 District Graduation Profile.csv + metadata: + title: 2024-2025 TAPR District Graduation Profile (2023-2024 annual graduates) + publisher: Texas Education Agency + version: '2025' + period: *id001 + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&level=District&tapr=all_d&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv + provenance_ids: + - aa9450c995c2e41da8ca190e390efc76a83381e3f1357010db2ce850013ec664 + notes: Source-only GRAD family; not released facts or all annual TAPR/readiness + families. Metrics measure 2023-2024 annual graduates inside publisher edition + 2025. Identity/name observation dates are unknown. Exact CSV code and label + headers supply all 42 metric bindings; three metrics lack publisher dictionary + type/definition. Units remain unknown until individually reviewed; no suppression + or blank-cause interpretation is applied. No cross-year equivalence or merge + with STUD/STAF is asserted. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&level=District&tapr=all_d&id=&dsname=GRAD&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_7.sas&key=0G1%7C0GA%7C0GE%7C0GH%7C0GM%7C0GN%7C0GR%7C0GS&var_type=N&var_type=D&var_type=P&var_type=R&datafmt=csv + title: 'Original publisher GRAD CSV: human labels in record 1 and source codes + in record 2' + status: available + provenance_ids: + - aa9450c995c2e41da8ca190e390efc76a83381e3f1357010db2ce850013ec664 + reviewed_sha256: 486326546705eb72f068f5d587b68222a15e9d32a262914d04cc4c91ef24cf72 + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_dictionary.sas + title: 2024-2025 District Graduation Profile dictionary; 39 of 42 metric codes + documented + status: available + provenance_ids: + - 436dc9d78129baeceafc63c59a5f280af5b9560b370967f661b3a83a906c4fca + reviewed_sha256: 14e909067dc352a5cbf57b467d311954661743c47bf37bedb62f335127d27626 + - reference_id: glossary + role: glossary + url: https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf + title: 2024-25 TAPR Glossary + status: available + provenance_ids: + - e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db + reviewed_sha256: 846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html + title: Explanation of 2024-25 TAPR Masking Rules + status: available + provenance_ids: + - 6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554 + reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 + field_year: 2024 + metrics: + district_2024_graduates_all_students_count_including_fhsp: + field: district_2024_graduates_all_students_count_including_fhsp + period: *id001 + unit: null + district_2024_graduates_minimum_hs_pgm_all_students_count: + field: district_2024_graduates_minimum_hs_pgm_all_students_count + period: *id001 + unit: null + district_2024_graduates_rhsp_dap_all_students_count: + field: district_2024_graduates_rhsp_dap_all_students_count + period: *id001 + unit: null + district_2024_graduates_fhsp_no_endorsement_all_students_count: + field: district_2024_graduates_fhsp_no_endorsement_all_students_count + period: *id001 + unit: null + district_2024_graduates_fhsp_e_all_students_count: + field: district_2024_graduates_fhsp_e_all_students_count + period: *id001 + unit: null + district_2024_graduates_fhsp_dla_all_students_count: + field: district_2024_graduates_fhsp_dla_all_students_count + period: *id001 + unit: null + district_2024_graduates_texas_first_dla_all_students_count: + field: district_2024_graduates_texas_first_dla_all_students_count + period: *id001 + unit: null + district_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count: + field: district_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count + period: *id001 + unit: null + district_2024_graduates_all_students_count_all_students_denominator: + field: district_2024_graduates_all_students_count_all_students_denominator + period: *id001 + unit: null + district_2024_graduates_african_american_count: + field: district_2024_graduates_african_american_count + period: *id001 + unit: null + district_2024_graduates_hispanic_count: + field: district_2024_graduates_hispanic_count + period: *id001 + unit: null + district_2024_graduates_white_count: + field: district_2024_graduates_white_count + period: *id001 + unit: null + district_2024_graduates_american_indian_count: + field: district_2024_graduates_american_indian_count + period: *id001 + unit: null + district_2024_graduates_asian_count: + field: district_2024_graduates_asian_count + period: *id001 + unit: null + district_2024_graduates_pacific_islander_count: + field: district_2024_graduates_pacific_islander_count + period: *id001 + unit: null + district_2024_graduates_two_or_more_races_count: + field: district_2024_graduates_two_or_more_races_count + period: *id001 + unit: null + district_2024_graduates_econ_disadv_count: + field: district_2024_graduates_econ_disadv_count + period: *id001 + unit: null + district_2024_graduates_special_ed_count: + field: district_2024_graduates_special_ed_count + period: *id001 + unit: null + district_2024_graduates_eb_el_count: + field: district_2024_graduates_eb_el_count + period: *id001 + unit: null + district_2024_graduates_at_risk_count: + field: district_2024_graduates_at_risk_count + period: *id001 + unit: null + district_2024_graduates_cte_program_completer_count: + field: district_2024_graduates_cte_program_completer_count + period: *id001 + unit: null + district_2024_graduates_cte_program_completer_student_group_percent: + field: district_2024_graduates_cte_program_completer_student_group_percent + period: *id001 + unit: null + district_2024_graduates_rhsp_dap_all_students_percent_profile_only: + field: district_2024_graduates_rhsp_dap_all_students_percent_profile_only + period: *id001 + unit: null + district_2024_graduates_fhsp_no_endorsement_all_students_percent_profile_only: + field: district_2024_graduates_fhsp_no_endorsement_all_students_percent_profile_only + period: *id001 + unit: null + district_2024_graduates_fhsp_e_all_students_percent_profile_only: + field: district_2024_graduates_fhsp_e_all_students_percent_profile_only + period: *id001 + unit: null + district_2024_graduates_fhsp_dla_all_students_percent_profile_only: + field: district_2024_graduates_fhsp_dla_all_students_percent_profile_only + period: *id001 + unit: null + district_2024_graduates_texas_first_dla_all_students_percent_profile_only: + field: district_2024_graduates_texas_first_dla_all_students_percent_profile_only + period: *id001 + unit: null + district_2024_graduates_all_students_group_percent: + field: district_2024_graduates_all_students_group_percent + period: *id001 + unit: null + district_2024_graduates_minimum_hs_pgm_all_students_percent: + field: district_2024_graduates_minimum_hs_pgm_all_students_percent + period: *id001 + unit: null + district_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent: + field: district_2024_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent + period: *id001 + unit: null + district_2024_graduates_african_american_student_group_percent: + field: district_2024_graduates_african_american_student_group_percent + period: *id001 + unit: null + district_2024_graduates_hispanic_student_group_percent: + field: district_2024_graduates_hispanic_student_group_percent + period: *id001 + unit: null + district_2024_graduates_white_student_group_percent: + field: district_2024_graduates_white_student_group_percent + period: *id001 + unit: null + district_2024_graduates_american_indian_student_group_percent: + field: district_2024_graduates_american_indian_student_group_percent + period: *id001 + unit: null + district_2024_graduates_asian_student_group_percent: + field: district_2024_graduates_asian_student_group_percent + period: *id001 + unit: null + district_2024_graduates_pacific_islander_student_group_percent: + field: district_2024_graduates_pacific_islander_student_group_percent + period: *id001 + unit: null + district_2024_graduates_two_or_more_races_student_group_percent: + field: district_2024_graduates_two_or_more_races_student_group_percent + period: *id001 + unit: null + district_2024_graduates_econ_disadv_student_group_percent: + field: district_2024_graduates_econ_disadv_student_group_percent + period: *id001 + unit: null + district_2024_graduates_special_ed_student_group_percent: + field: district_2024_graduates_special_ed_student_group_percent + period: *id001 + unit: null + district_2024_graduates_eb_el_student_group_percent: + field: district_2024_graduates_eb_el_student_group_percent + period: *id001 + unit: null + district_2024_graduates_at_risk_student_group_percent: + field: district_2024_graduates_at_risk_student_group_percent + period: *id001 + unit: null + district_2024_graduates_minimum_hs_pgm_all_students_percent_profile_only: + field: district_2024_graduates_minimum_hs_pgm_all_students_percent_profile_only + period: *id001 + unit: null + reader: + profiles: + source: + column_schema: schemas/tapr--2025--graduation-profile-crosswalk.json + tapr_source: + scope: district + tables: + graduation_profile: data/tapr/raw/2025 District Graduation Profile.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2025--graduation-profile-crosswalk.json + title: Reviewed GRAD CSV headers, source layout and dictionary availability; + source-only, not a historical prepared-input claim + status: available + provenance_ids: [] + reviewed_sha256: bf848a6c47d7f5ed783b57d862d4fcaefced1e2988b65b75c13abddcd998ec98 campus_tapr_historical_enrollment: 2015: path: data/tapr/CAMPPROF_2014-2015_FINAL.xlsx @@ -1045,6 +1530,10 @@ schema: - csv campus_tapr_student_staff_profile: - xlsx + campus_tapr_graduation_profile: + - csv + district_tapr_graduation_profile: + - csv campus_tapr_historical_enrollment: - xlsx district_tapr_student_staff_profile: diff --git a/tests/conftest.py b/tests/conftest.py index bf74c12..edde713 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,6 +22,10 @@ def catalog(): for section in ("data_sources", "spatial"): for name in getattr(cfg, section): source = cfg.resolve_dataset(name, section=section) + # Source-only preparation contracts are discoverable configuration, + # not datasets loaded into this retained-format catalog fixture. + if cfg.is_source_only(name, section=section): + continue for identifier in source.metadata.provenance_ids: records[identifier] = store.read_record(identifier) for reference in source.metadata.references: diff --git a/tests/test_tapr_graduation_profile.py b/tests/test_tapr_graduation_profile.py new file mode 100644 index 0000000..9b5fe41 --- /dev/null +++ b/tests/test_tapr_graduation_profile.py @@ -0,0 +1,367 @@ +"""GRAD stays a lossless, source-qualified family with honest dictionary gaps.""" + +from copy import deepcopy +from dataclasses import replace +from datetime import datetime, timezone +from hashlib import sha256 +import csv +from pathlib import Path +import subprocess +import sys + +import pyarrow as pa +import pyarrow.parquet as pq +import pytest +import yaml + +from teadata.column_schema import ( + header_records, parse_column_schema, source_schema_fingerprint, validate_header_table, + validate_selected_crosswalk, +) +from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset +from teadata.manifest import ContractError, canonical_json +from teadata.provenance import ProvenanceStore +from teadata.scripts.build_tapr_profiles import prepare_profiles +from teadata.tapr import merge_tapr_tables, read_tapr_table +from teadata.teadata_config import Config, load_config + + +ROOT = Path(__file__).resolve().parents[1] +RESOURCE = ROOT / 'teadata/schemas/tapr--2025--graduation-profile-crosswalk.json' +PERIOD = {'kind': 'school_year', 'start_year': 2023, 'end_year': 2024} + + +@pytest.mark.parametrize('scope,identities', [('campus', 4), ('district', 2)]) +def test_full_publisher_coverage_is_discoverable_with_explicit_dictionary_gaps(scope, identities): + cfg = load_config() + dataset = scope + '_tapr_graduation_profile' + records = cfg.header_records(dataset, edition='2025', reader_profile='source') + assert len(records) == 42 + identities + facts = [f for f in records if f['disposition'] == 'fact'] + missing = [f for f in facts if f['dictionary_status'] == 'not_documented'] + prefix = scope[0].upper() + assert {f['code'] for f in missing} == {prefix + c for c in ['A0GS24N', 'A0GM24R', 'A0GS24R']} + assert all(f['publisher_type'] is None and f['publisher_description'] is None for f in missing) + assert sum(f['dictionary_status'] == 'documented' for f in facts) == 39 + assert all(f['period'] == PERIOD for f in facts) + assert all(f['period'] == {'kind': 'unknown'} for f in records if f['disposition'] == 'identity') + source = cfg.resolve_dataset(dataset, 2025) + assert source.metadata.version == '2025' and source.metadata.period.to_dict() == PERIOD + assert len(source.metadata.metrics) == 42 + assert all(m.unit is None and m.period is not None and m.period.to_dict() == PERIOD + for m in source.metadata.metrics.values()) + assert cfg.availability_report()['data_sources'][dataset]['years'] == [2025] + assert cfg.is_source_only(dataset, 2025) is True + assert cfg.column_schema(dataset, 2025) is None + with pytest.raises(ContractError, match='Reader profile is required'): + cfg.load_df(dataset, 2025) + with pytest.raises(ContractError, match='edition unavailable'): + cfg.header_records(dataset, edition='2024', reader_profile='source') + with pytest.raises(ContractError, match='exact declared edition'): + cfg.read_tapr_sources(dataset, 2026) + # A source-only contract cannot certify an unrelated prepared workbook. + with pytest.raises(ValueError, match='different prepared input'): + validate_selected_crosswalk(parse_column_schema(RESOURCE.read_bytes()), dataset=dataset, + edition='2025', input_sha256='0' * 64, columns=[f['field'] for f in records]) + + +@pytest.mark.parametrize('change', ['missing_status', 'invented_type', 'invented_definition', 'false_documented']) +def test_undocumented_fields_cannot_lose_unknown_status_or_gain_inferred_semantics(change): + document = parse_column_schema(RESOURCE.read_bytes()) + for dataset in document['datasets']: + for original in dataset['tables'][0]['fields']: + if original['dictionary_status'] != 'not_documented': + continue + table = deepcopy(dataset['tables'][0]) + field = table['fields'][original['position'] - 1] + if change == 'missing_status': + field.pop('dictionary_status') + elif change == 'invented_type': + field['publisher_type'] = 'Number' + elif change == 'invented_definition': + field['publisher_description'] = 'Guessed from a neighboring field' + else: + field['dictionary_status'] = 'documented' + with pytest.raises(ValueError, match='dictionary status'): + validate_header_table(table) + + +def test_undeclared_43rd_metric_fails_even_when_all_original_columns_remain(tmp_path): + table = deepcopy(parse_column_schema(RESOURCE.read_bytes())['datasets'][0]['tables'][0]) + fields = table['fields'] + path = tmp_path / 'unreviewed-extra.csv' + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([[f['label'] for f in fields] + ['Unreviewed metric'], + [f['code'] for f in fields] + ['NEW43'], ['001902001', 'School', '001902', 'District'] + ['0'] * 43]) + table['input_sha256'] = sha256(path.read_bytes()).hexdigest() + table.pop('layout') + with pytest.raises(ValueError, match='record 3 has 47 fields; expected 46'): + read_tapr_table(path, mapping=table, key_field='campus_number', + dataset='campus_tapr_graduation_profile', edition='2025') + + +def test_source_only_contract_requires_explicit_unknown_metadata(): + document = parse_column_schema(RESOURCE.read_bytes()) + for dataset in document['datasets']: + for field in dataset['tables'][0]['fields']: + if field['dictionary_status'] == 'not_documented': + for key in ('dictionary_status', 'publisher_type', 'publisher_description'): + field.pop(key) + with pytest.raises(ValueError, match='publisher dictionary status'): + parse_column_schema(canonical_json(document).encode()) + + +def test_returned_metric_periods_are_detached_from_siblings_and_source_document(): + document = parse_column_schema(RESOURCE.read_bytes()) + original = deepcopy(document) + records = header_records(document, dataset='campus_tapr_graduation_profile', edition='2025') + facts = [field for field in records if field['disposition'] == 'fact'] + facts[0]['period']['start_year'] = 1900 + assert all(field['period'] == PERIOD for field in facts[1:]) + assert document == original + assert header_records(document, dataset='campus_tapr_graduation_profile', edition='2025')[4]['period'] == PERIOD + + +@pytest.mark.parametrize('problem', ['missing_parent', 'conflicting_parent', 'duplicate_identity']) +def test_graduation_identity_history_cannot_bypass_shared_identity_validation(tmp_path, problem): + mapping = deepcopy(parse_column_schema(RESOURCE.read_bytes())['datasets'][0]['tables'][0]) + fields = mapping['fields'] + row = ['001902001', 'Historical campus', '001902', 'Historical district'] + [''] * 42 + if problem == 'missing_parent': + row[2] = '' + elif problem == 'conflicting_parent': + row[2] = '227901' + rows = [row, row] if problem == 'duplicate_identity' else [row] + path = tmp_path / 'invalid-identity.csv' + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([[f['label'] for f in fields], [f['code'] for f in fields], *rows]) + mapping['input_sha256'] = sha256(path.read_bytes()).hexdigest() + mapping.pop('layout') + with pytest.raises(ValueError, match='duplicate campus_number|campus and district identifiers disagree'): + read_tapr_table(path, mapping=mapping, key_field='campus_number', + dataset='campus_tapr_graduation_profile', edition='2025') + + +def grad_fixture(tmp_path, *, known_download=False): + dataset = 'campus_tapr_graduation_profile' + path = tmp_path / 'grad.csv' + labels = ['9 Digit Campus Number', 'Undocumented A', 'Undocumented B', 'Undocumented C'] + codes = ['CAMPUS', 'CA0GS24N', 'CA0GM24R', 'CA0GS24R'] + fields = ['campus_number', 'undocumented_a', 'undocumented_b', 'undocumented_c'] + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([labels, codes, ['001902001', '', '0', '-3']]) + mapping = {'table': 'graduation_profile', 'metric_period': PERIOD, + 'input_sha256': sha256(path.read_bytes()).hexdigest(), + 'source_schema_sha256': source_schema_fingerprint(labels, codes), + 'fields': [{'position': i, 'code': code, 'label': label, 'field': name, + 'disposition': 'identity' if i == 1 else 'fact', + 'dictionary_status': 'not_applicable' if i == 1 else 'not_documented', + 'publisher_type': None, 'publisher_description': None} + for i, (code, label, name) in enumerate(zip(codes, labels, fields, strict=True), 1)]} + document = {'schema_version': 2, 'mapping_version': 1, 'datasets': [ + {'dataset': dataset, 'edition': '2025', 'source_only': True, 'tables': [mapping]}]} + schema = tmp_path / 'crosswalk.json' + schema.write_text(canonical_json(document) + '\n') + source = ResolvedDataset(dataset, 'data_sources', 2025, 2025, str(path), + DatasetMetadata(version='2025')) + store = ProvenanceStore(tmp_path / 'original-store') + raw_id = store.record_acquisition(path, source, + downloaded_at=datetime(2026, 10, 30, tzinfo=timezone.utc) if known_download else None, + requested_url='https://example.test/grad.csv' if known_download else None) + dictionary = tmp_path / 'dictionary.html' + dictionary.write_text('Publisher response omits these three definitions.') + dictionary_id = store.record_acquisition(dictionary, replace(source, dataset=dataset + ':dictionary')) + entry = {'path': str(path), 'metadata': {'version': '2025', 'period': PERIOD, + 'provenance_ids': [raw_id], 'references': [ + {'reference_id': 'dictionary', 'role': 'data_dictionary', 'status': 'available', + 'path': 'dictionary.html', + 'provenance_ids': [dictionary_id], 'reviewed_sha256': sha256(dictionary.read_bytes()).hexdigest()}]}, + 'reader': {'profiles': {'source': {'column_schema': 'crosswalk.json', + 'references': [{'reference_id': 'columns', 'role': 'schema', 'status': 'available', + 'path': 'crosswalk.json', 'reviewed_sha256': sha256(schema.read_bytes()).hexdigest()}], + 'tapr_source': {'scope': 'campus', 'tables': {'graduation_profile': str(path)}}}}}} + cfg = Config.from_dict({'data_sources': {dataset: {2025: entry}}}) + cfg.base_dir = tmp_path + return cfg, store, raw_id, dictionary_id, path, mapping + + +@pytest.mark.parametrize('problem', [None, 'missing_original', 'wrong_original', 'missing_dictionary']) +def test_source_only_producer_preserves_original_receipts_and_closed_reference_graph(tmp_path, problem): + cfg, store, raw_id, dictionary_id, path, mapping = grad_fixture(tmp_path) + if problem == 'wrong_original': + dataset = cfg.data_sources['campus_tapr_graduation_profile'].entries[2025] + cfg.data_sources['campus_tapr_graduation_profile'].entries[2025] = replace( + dataset, metadata=replace(dataset.metadata, provenance_ids=(dictionary_id,))) + elif problem == 'missing_dictionary': + store.verify_artifact(store.read_record(dictionary_id)['artifact']['sha256']).unlink() + output = tmp_path / 'output' + if problem is not None: + with pytest.raises((ValueError, FileNotFoundError)): + prepare_profiles(cfg, edition='2025', family='graduation_profile', scopes=['campus'], + input_dir=tmp_path, output_dir=output, + reference_store=None if problem == 'missing_original' else store) + assert not output.exists() + assert not list(tmp_path.glob('.tapr-preparation-*')) + return + original = {i: store.read_record(i) for i in (raw_id, dictionary_id)} + receipt = prepare_profiles(cfg, edition='2025', family='graduation_profile', scopes=['campus'], + input_dir=tmp_path, output_dir=output, reference_store=store) + table = pq.read_table(output / 'campus.parquet') + assert table.to_pylist() == [{'campus_number': '001902001', 'undocumented_a': '', + 'undocumented_b': '0', 'undocumented_c': '-3'}] + archive = ProvenanceStore(output / 'provenance') + closure = archive.verify_record_closure([receipt['scopes']['campus']['processing_record_id']]) + assert all(closure[i] == record for i, record in original.items()) + assert receipt['family'] == 'graduation_profile' + assert receipt['scopes']['campus']['source_tables'][0]['metric_period'] == PERIOD + assert all(f.type == pa.string() for f in table.schema) + + +@pytest.mark.parametrize('known_download', [False, True]) +def test_local_observation_keeps_known_and_unknown_acquisition_history_factual(tmp_path, known_download): + cfg, store, raw_id, _, _, _ = grad_fixture(tmp_path, known_download=known_download) + original = store.read_record(raw_id) + output = tmp_path / 'output' + receipt = prepare_profiles(cfg, edition='2025', family='graduation_profile', scopes=['campus'], + input_dir=tmp_path, output_dir=output, reference_store=store) + archive = ProvenanceStore(output / 'provenance') + closure = archive.verify_record_closure([receipt['scopes']['campus']['processing_record_id']]) + local = [record for identifier, record in closure.items() if identifier != raw_id + and record.get('dataset') == 'campus_tapr_graduation_profile' + and record.get('method') == 'local_observation'] + assert len(local) == 1 + assert local[0]['downloaded_at'] is None + assert local[0]['parameters']['observation'] == ( + 'local raw-source read; acquisition history is retained separately when available') + assert closure[raw_id] == original + assert (original['downloaded_at'] is not None) == known_download + + +@pytest.mark.parametrize('period', [None, {}, [], 'unknown', {'kind': 'unknown', 'year': None}]) +def test_invalid_or_implicit_metric_period_contracts_fail_validation(period): + document = parse_column_schema(RESOURCE.read_bytes()) + document['datasets'][0]['tables'][0]['metric_period'] = period + with pytest.raises(ValueError, match='explicit canonical period mapping'): + parse_column_schema(canonical_json(document).encode()) + + +def test_explicit_unknown_metric_period_remains_discoverable(): + document = parse_column_schema(RESOURCE.read_bytes()) + document['datasets'][0]['tables'][0]['metric_period'] = {'kind': 'unknown'} + parsed = parse_column_schema(canonical_json(document).encode()) + records = header_records(parsed, dataset='campus_tapr_graduation_profile', edition='2025') + assert all(record['period'] == {'kind': 'unknown'} for record in records) + + +def test_null_metric_period_is_rejected_before_discovery_or_source_io(tmp_path, monkeypatch): + cfg, _, _, _, _, _ = grad_fixture(tmp_path) + schema = tmp_path / 'crosswalk.json' + document = parse_column_schema(schema.read_bytes()) + document['datasets'][0]['tables'][0]['metric_period'] = None + schema.write_text(canonical_json(document) + '\n') + profile = cfg.data_sources['campus_tapr_graduation_profile'].entries[2025].reader['profiles']['source'] + profile['references'][0]['reviewed_sha256'] = sha256(schema.read_bytes()).hexdigest() + monkeypatch.setattr('teadata.tapr.read_tapr_table', lambda *a, **k: pytest.fail('Invalid period read source data')) + with pytest.raises(ContractError, match='explicit canonical period mapping'): + cfg.header_records('campus_tapr_graduation_profile', edition='2025', reader_profile='source') + with pytest.raises(ContractError, match='explicit canonical period mapping'): + cfg.read_tapr_sources('campus_tapr_graduation_profile', 2025) + + +@pytest.mark.parametrize('scope', ['campus', 'district']) +def test_grad_annual_references_reuse_exact_receipts_without_applying_token_or_unit_rules(scope): + source = load_config().resolve_dataset(scope + '_tapr_graduation_profile', 2025) + references = {reference.reference_id: reference for reference in source.metadata.references} + expected = { + 'glossary': ('glossary', 'https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf', + 'e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db', + '846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416'), + 'masking': ('masking_methodology', 'https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html', + '6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554', + '7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8'), + } + store = ProvenanceStore(ROOT / 'provenance') + for name, (role, url, identifier, digest) in expected.items(): + reference = references[name] + assert reference.role == role and reference.url == url and reference.status == 'available' + assert reference.provenance_ids == (identifier,) and reference.reviewed_sha256 == digest + record = store.read_record(identifier) + assert record['artifact']['sha256'] == digest + assert record['requested_url'] == url and record['method'] == 'download' + assert source.metadata.value_policy is None + assert all(metric.unit is None for metric in source.metadata.metrics.values()) + + +def test_graduation_is_not_merged_by_equal_values_with_another_family_or_period(tmp_path): + _, _, _, _, path, mapping = grad_fixture(tmp_path) + source = read_tapr_table(path, mapping=mapping, key_field='campus_number', + dataset='campus_tapr_graduation_profile', edition='2025') + foreign = replace(source, dataset='campus_tapr_student_staff_profile') + with pytest.raises(ValueError, match='different qualified datasets'): + merge_tapr_tables([source, foreign], key_field='campus_number') + other_period = {**mapping, 'table': 'other_observation', + 'metric_period': {'kind': 'school_year', 'start_year': 2024, 'end_year': 2025}} + with pytest.raises(ValueError, match='different metric reference periods'): + merge_tapr_tables([source, replace(source, mapping=other_period)], key_field='campus_number') + + +def test_source_only_metadata_period_mismatch_fails_before_reading_rows(tmp_path, monkeypatch): + cfg, _, _, _, _, _ = grad_fixture(tmp_path) + dataset = cfg.data_sources['campus_tapr_graduation_profile'].entries[2025] + cfg.data_sources['campus_tapr_graduation_profile'].entries[2025] = replace(dataset, + metadata=replace(dataset.metadata, period=replace(dataset.metadata.period, start_year=2024, end_year=2025))) + monkeypatch.setattr('teadata.tapr.read_tapr_table', lambda *a, **k: pytest.fail('Read contradictory period')) + with pytest.raises(ContractError, match='metric period differs'): + cfg.read_tapr_sources('campus_tapr_graduation_profile', 2025) + + +def test_existing_default_contracts_and_public_metric_bindings_remain_pinned(catalog): + cfg = yaml.safe_load((ROOT / 'teadata/teadata_sources.yaml').read_bytes()) + expected = {('campus', 2024): 'bedc5ea74bcba865ebf65942878a233fc695bd5cf3b83a2dbfdbc3023415e04d', + ('campus', 2025): '36fc570425e654fbc50bb257042d7078986626741f68745446316e8ea9860df4', + ('district', 2024): '63bc2ae7dacef0db0a0491d2f02e9d5c2c80bc3f7474419c4ed5b75af1e4979d', + ('district', 2025): 'fbdd676a4a2b3be9a2df36dfcd84337772e0247e64fe9f7c1c927c519f23dcbc'} + for (scope, year), digest in expected.items(): + entry = cfg['data_sources'][scope + '_tapr_student_staff_profile'][year] + assert sha256(canonical_json(entry).encode()).hexdigest() == digest + assert all('graduation' not in canonical_json(binding) for binding in cfg['metric_bindings'].values()) + assert not any('graduation' in dataset for dataset in catalog.datasets) + loaded = load_config() + assert not loaded.is_source_only('accountability', 2025) + assert all(not loaded.is_source_only(scope + '_tapr_student_staff_profile', year) + for scope in ('campus', 'district') for year in (2024, 2025)) + + +def test_grad_discovery_opens_only_metadata_in_a_fresh_process(): + code = ''' +import importlib.abc, pathlib, socket, sqlite3, sys, urllib.request +heavy = ('teadata.classes','teadata.engine','teadata.entities','teadata.geometry','pyarrow','duckdb','sqlalchemy','pandas','numpy','geopandas','shapely') +class Trap(importlib.abc.MetaPathFinder): + def find_spec(self, fullname, path=None, target=None): + if any(fullname == p or fullname.startswith(p + '.') for p in heavy): raise AssertionError('Heavy import: ' + fullname) +sys.meta_path.insert(0, Trap()) +from teadata import load_config +import teadata.teadata_config as config_module +root = pathlib.Path(config_module.__file__).parent +allowed = {(root/'teadata_sources.yaml').resolve(),(root/'schemas/tapr--2025--graduation-profile-crosswalk.json').resolve()} +original = pathlib.Path.open +def guarded(self,*args,**kwargs): + if self.resolve() not in allowed: raise AssertionError('Non-metadata open: ' + str(self)) + return original(self,*args,**kwargs) +pathlib.Path.open = guarded +def forbidden(*args,**kwargs): raise AssertionError('Data/network/database I/O') +socket.create_connection = forbidden +sqlite3.connect = forbidden +urllib.request.urlopen = forbidden +cfg = load_config() +for scope, width in [('campus',46),('district',44)]: + ds = scope + '_tapr_graduation_profile' + records = cfg.header_records(ds,edition='2025',reader_profile='source') + assert len(records) == width + assert cfg.availability_report()['data_sources'][ds]['years'] == [2025] + assert cfg.is_source_only(ds,2025) + assert len(cfg.resolve_dataset(ds,2025).metadata.metrics) == 42 +assert not any(n == p or n.startswith(p + '.') for n in sys.modules for p in heavy) +''' + result = subprocess.run([sys.executable, '-B', '-c', code], cwd=ROOT, capture_output=True, text=True) + assert result.returncode == 0, result.stdout + result.stderr From 49b227f8f40feefdb2954f696f32119bd0acfea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 12:32:02 -0500 Subject: [PATCH 05/11] Add source-qualified 2024 TAPR graduation profiles --- docs/config.md | 8 +- ...6c63d6a7682d167a3e87e9361f14f8912fabb.json | 1 + ...cbec98501c130d590cf867ae73316ce68dfc6.json | 1 + ...910dbfc47a1264d7fd216adb25499d1906595.json | 1 + ...b4e191a139564199d42446a1efe13f2fece49.json | 1 + ...b4e230b06137b033f9e8e5ebd9a9df2c84444.json | 1 + ...5d51e8307220b91d0a9ff8da1804104672cfc.json | 1 + ...32fff589b8e9d6acea141f75bff537ce2be32.json | 1 + ...3335d69dde9b51bf37e5f60f3670735ccc0e9.json | 1 + ...r--2024--graduation-profile-crosswalk.json | 1 + teadata/teadata_sources.yaml | 511 ++++++++++++++++++ tests/test_tapr_graduation_profile.py | 85 ++- 12 files changed, 591 insertions(+), 22 deletions(-) create mode 100644 provenance/records/0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb.json create mode 100644 provenance/records/25428be915b8b18e696da5f9dc3cbec98501c130d590cf867ae73316ce68dfc6.json create mode 100644 provenance/records/27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595.json create mode 100644 provenance/records/53cdecc0f085f7b2686c17072dcb4e191a139564199d42446a1efe13f2fece49.json create mode 100644 provenance/records/66393c3ad6f5be710952f3bbf42b4e230b06137b033f9e8e5ebd9a9df2c84444.json create mode 100644 provenance/records/7a6e8dd68795cf19130ed551cc65d51e8307220b91d0a9ff8da1804104672cfc.json create mode 100644 provenance/records/a3fca5bf618e48d8fde68c52d9e32fff589b8e9d6acea141f75bff537ce2be32.json create mode 100644 provenance/records/de5f5c13994ac556dd56b9884cd3335d69dde9b51bf37e5f60f3670735ccc0e9.json create mode 100644 teadata/schemas/tapr--2024--graduation-profile-crosswalk.json diff --git a/docs/config.md b/docs/config.md index 9d9a046..16b9e4a 100644 --- a/docs/config.md +++ b/docs/config.md @@ -324,7 +324,13 @@ uv run python -m teadata.scripts.build_tapr_profiles \ ``` `campus_tapr_graduation_profile` and `district_tapr_graduation_profile` declare -only edition 2025, measuring 2023–2024 annual graduates. They retain 42 metrics +editions 2024 and 2025, measuring 2022–2023 and 2023–2024 annual graduates. +The 2024 period comes from the annual glossary, pages 15–16. Its publisher +dictionary heading instead says 2023–2024; the source notes retain that +contradiction alongside the exact CSV labels, selection page and references. +The current 2024 GRAD observations remain independent of retained 2024 PROF; +their shared-cell literal `.` to blank changes remain visible in the audit. +They retain 42 metrics and four/two canonical identity/history attributes in separate wide leaves; identity/name observation dates remain unknown. Their source-only crosswalk has no historical prepared-input hash and requires the explicit `source` profile. diff --git a/provenance/records/0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb.json b/provenance/records/0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb.json new file mode 100644 index 0000000..6de1a85 --- /dev/null +++ b/provenance/records/0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-glossary.pdf","sha256":"e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8","size_bytes":709603},"dataset":"reference:tapr2024:glossary","downloaded_at":"2026-10-31T17:11:09.354125+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"2024 GRAD append-only historical refresh","http_method":"GET","http_status":200,"role":"annual_reference"},"recorded_at":"2026-10-31T17:11:09.354162+00:00","requested_url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf","resolved_year":2024,"response_headers":{"content-length":"709603","content-type":"application/pdf","etag":"\"ad3e3-633ff9c497200\"","last-modified":"Wed, 30 Apr 2025 14:19:52 GMT"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"2023-24 TAPR glossary","version":"2024"}} diff --git a/provenance/records/25428be915b8b18e696da5f9dc3cbec98501c130d590cf867ae73316ce68dfc6.json b/provenance/records/25428be915b8b18e696da5f9dc3cbec98501c130d590cf867ae73316ce68dfc6.json new file mode 100644 index 0000000..579e8c3 --- /dev/null +++ b/provenance/records/25428be915b8b18e696da5f9dc3cbec98501c130d590cf867ae73316ce68dfc6.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-c-GRAD-dictionary.html","sha256":"5bbc48ebac5f9d049c29291321464b74d609cd089308168cf87cf0476bf93b3a","size_bytes":80002},"dataset":"tapr_2024_family_dictionary","downloaded_at":"2026-10-31T17:03:49.626645+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_dictionary","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:49.626669+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_dictionary","version":"2024"}} diff --git a/provenance/records/27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595.json b/provenance/records/27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595.json new file mode 100644 index 0000000..f0b0eab --- /dev/null +++ b/provenance/records/27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-masking.html","sha256":"f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a","size_bytes":55241},"dataset":"reference:tapr2024:masking","downloaded_at":"2026-10-31T17:11:09.510022+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"2024 GRAD append-only historical refresh","http_method":"GET","http_status":200,"role":"annual_reference"},"recorded_at":"2026-10-31T17:11:09.510061+00:00","requested_url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"2023-24 TAPR masking","version":"2024"}} diff --git a/provenance/records/53cdecc0f085f7b2686c17072dcb4e191a139564199d42446a1efe13f2fece49.json b/provenance/records/53cdecc0f085f7b2686c17072dcb4e191a139564199d42446a1efe13f2fece49.json new file mode 100644 index 0000000..38edf35 --- /dev/null +++ b/provenance/records/53cdecc0f085f7b2686c17072dcb4e191a139564199d42446a1efe13f2fece49.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024 Campus Graduation Profile.csv","sha256":"49193776d55e4a9cbe3f02e568856b82dbbec14605df08c4ba3d1bc85ae494af","size_bytes":1075217},"dataset":"campus_tapr_graduation_profile","downloaded_at":"2026-10-31T17:08:52.796754+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","append_only_historical_refresh":true,"family":"GRAD","form_controls":[["_service","marykay"],["_program","perfrept.perfmast.sas"],["_debug","0"],["tapr","all_c"],["ccyy","2024"],["dsname","GRAD"],["sumlev","C"],["level","Campus"],["id",""],["prgopt","reports/tapr/dd/dd_tapr_step_7.sas"],["key","0G1|0GA|0GE|0GH|0GM|0GN|0GR|0GS"],["var_type","N"],["var_type","D"],["var_type","P"],["var_type","R"],["datafmt","csv"]],"http_method":"POST","http_status":200,"publisher_edition":"2024","role":"raw_csv","scope":"c","source_form_method":"POST","source_selection_receipt_id":"7a6e8dd68795cf19130ed551cc65d51e8307220b91d0a9ff8da1804104672cfc"},"recorded_at":"2026-10-31T17:08:52.796791+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","requested_year":2024,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","resolved_year":2024,"response_headers":{"content-disposition":"attachment; filename=2024 Campus Graduation Profile.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Append-only current historical-edition reacquisition. Period remains unresolved pending annual-document discrepancy audit; no code-suffix inference. Original retained PROF source is preserved.","period":{"kind":"unknown"},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2024 Campus current Graduation Profile source observation","version":"2024"}} diff --git a/provenance/records/66393c3ad6f5be710952f3bbf42b4e230b06137b033f9e8e5ebd9a9df2c84444.json b/provenance/records/66393c3ad6f5be710952f3bbf42b4e230b06137b033f9e8e5ebd9a9df2c84444.json new file mode 100644 index 0000000..7611bfb --- /dev/null +++ b/provenance/records/66393c3ad6f5be710952f3bbf42b4e230b06137b033f9e8e5ebd9a9df2c84444.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-d-GRAD-dictionary.html","sha256":"6002ce972c46c767be5a61926819caee7791e95460efc1a31876ad69bbf89766","size_bytes":80010},"dataset":"tapr_2024_family_dictionary","downloaded_at":"2026-10-31T17:03:50.182796+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_dictionary","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:50.182824+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_dictionary","version":"2024"}} diff --git a/provenance/records/7a6e8dd68795cf19130ed551cc65d51e8307220b91d0a9ff8da1804104672cfc.json b/provenance/records/7a6e8dd68795cf19130ed551cc65d51e8307220b91d0a9ff8da1804104672cfc.json new file mode 100644 index 0000000..c83c031 --- /dev/null +++ b/provenance/records/7a6e8dd68795cf19130ed551cc65d51e8307220b91d0a9ff8da1804104672cfc.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-c-GRAD-selection.html","sha256":"63524df30a48010367530d6ec338d5375ccf9ba24dd489a602c811c6f9167a73","size_bytes":56748},"dataset":"tapr_2024_family_selection","downloaded_at":"2026-10-31T17:03:22.312156+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_selection","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:22.312197+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=GRAD","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=GRAD","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_selection","version":"2024"}} diff --git a/provenance/records/a3fca5bf618e48d8fde68c52d9e32fff589b8e9d6acea141f75bff537ce2be32.json b/provenance/records/a3fca5bf618e48d8fde68c52d9e32fff589b8e9d6acea141f75bff537ce2be32.json new file mode 100644 index 0000000..a6ec214 --- /dev/null +++ b/provenance/records/a3fca5bf618e48d8fde68c52d9e32fff589b8e9d6acea141f75bff537ce2be32.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024 District Graduation Profile.csv","sha256":"93417418d29fecd1cf514f5fa7d493c9b4bdc39fba3820597250a1c581dc97ee","size_bytes":180028},"dataset":"district_tapr_graduation_profile","downloaded_at":"2026-10-31T17:08:53.030912+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","append_only_historical_refresh":true,"family":"GRAD","form_controls":[["_service","marykay"],["_program","perfrept.perfmast.sas"],["_debug","0"],["tapr","all_d"],["ccyy","2024"],["dsname","GRAD"],["sumlev","D"],["level","District"],["id",""],["prgopt","reports/tapr/dd/dd_tapr_step_7.sas"],["key","0G1|0GA|0GE|0GH|0GM|0GN|0GR|0GS"],["var_type","N"],["var_type","D"],["var_type","P"],["var_type","R"],["datafmt","csv"]],"http_method":"POST","http_status":200,"publisher_edition":"2024","role":"raw_csv","scope":"d","source_form_method":"POST","source_selection_receipt_id":"de5f5c13994ac556dd56b9884cd3335d69dde9b51bf37e5f60f3670735ccc0e9"},"recorded_at":"2026-10-31T17:08:53.030940+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","requested_year":2024,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","resolved_year":2024,"response_headers":{"content-disposition":"attachment; filename=2024 District Graduation Profile.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Append-only current historical-edition reacquisition. Period remains unresolved pending annual-document discrepancy audit; no code-suffix inference. Original retained PROF source is preserved.","period":{"kind":"unknown"},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2024 District current Graduation Profile source observation","version":"2024"}} diff --git a/provenance/records/de5f5c13994ac556dd56b9884cd3335d69dde9b51bf37e5f60f3670735ccc0e9.json b/provenance/records/de5f5c13994ac556dd56b9884cd3335d69dde9b51bf37e5f60f3670735ccc0e9.json new file mode 100644 index 0000000..02b6791 --- /dev/null +++ b/provenance/records/de5f5c13994ac556dd56b9884cd3335d69dde9b51bf37e5f60f3670735ccc0e9.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-d-GRAD-selection.html","sha256":"e4f4e5c732b72a0faddab5be2b0ee27f3fac1628c8a093e228057342a3a8b78b","size_bytes":56752},"dataset":"tapr_2024_family_selection","downloaded_at":"2026-10-31T17:03:23.283480+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_selection","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:23.283501+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=GRAD","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=GRAD","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_selection","version":"2024"}} diff --git a/teadata/schemas/tapr--2024--graduation-profile-crosswalk.json b/teadata/schemas/tapr--2024--graduation-profile-crosswalk.json new file mode 100644 index 0000000..4477736 --- /dev/null +++ b/teadata/schemas/tapr--2024--graduation-profile-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_graduation_profile","edition":"2024","source_only":true,"tables":[{"fields":[{"code":"CAMPUS","dictionary_status":"not_applicable","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"CAMPNAME","dictionary_status":"not_applicable","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_description":null,"publisher_type":null},{"code":"CA0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_all_students_count_including_fhsp","label":"Campus 2023 Graduates: All Students Count (including FHSP)","position":5,"publisher_description":"Campus 2023 Graduates All Students Count (including FHSP)","publisher_type":"Number"},{"code":"CA0GM23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_minimum_hs_pgm_all_students_count","label":"Campus 2023 Graduates: Minimum HS PGM All Students Count","position":6,"publisher_description":"Campus 2023 Graduates Minimum HS PGM All Students Count","publisher_type":"Number"},{"code":"CA0GH23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_rhsp_dap_all_students_count","label":"Campus 2023 Graduates: RHSP/DAP All Students Count","position":7,"publisher_description":"Campus 2023 Graduates RHSP/DAP All Students Count","publisher_type":"Number"},{"code":"CA0GN23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_fhsp_no_endorsement_all_students_count","label":"Campus 2023 Graduates: FHSP No Endorsement All Students Count","position":8,"publisher_description":"Campus 2023 Graduates FHSP No Endorsement All Students Count","publisher_type":"Number"},{"code":"CA0GE23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_fhsp_e_all_students_count","label":"Campus 2023 Graduates: FHSP-E All Students Count","position":9,"publisher_description":"Campus 2023 Graduates FHSP-E All Students Count","publisher_type":"Number"},{"code":"CA0GA23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_fhsp_dla_all_students_count","label":"Campus 2023 Graduates: FHSP-DLA All Students Count","position":10,"publisher_description":"Campus 2023 Graduates FHSP-DLA All Students Count","publisher_type":"Number"},{"code":"CA0G123N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_texas_first_dla_all_students_count","label":"Campus 2023 Graduates: Texas First-DLA All Students Count","position":11,"publisher_description":"Campus 2023 Graduates Texas First-DLA All Students Count","publisher_type":"Number"},{"code":"CA0GS23N","dictionary_status":"not_documented","disposition":"fact","field":"campus_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count","label":"Campus 2023 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students Count","position":12,"publisher_description":null,"publisher_type":null},{"code":"CA0GS23D","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_all_students_count_all_students_denominator","label":"Campus 2023 Graduates: All Students Count All Students Denominator","position":13,"publisher_description":"Campus 2023 Graduates All Students Count All Students Denominator","publisher_type":"Number"},{"code":"CB0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_african_american_count","label":"Campus 2023 Graduates: African American Count","position":14,"publisher_description":"Campus 2023 Graduates African American Count","publisher_type":"Number"},{"code":"CH0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_hispanic_count","label":"Campus 2023 Graduates: Hispanic Count","position":15,"publisher_description":"Campus 2023 Graduates Hispanic Count","publisher_type":"Number"},{"code":"CW0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_white_count","label":"Campus 2023 Graduates: White Count","position":16,"publisher_description":"Campus 2023 Graduates White Count","publisher_type":"Number"},{"code":"CI0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_american_indian_count","label":"Campus 2023 Graduates: American Indian Count","position":17,"publisher_description":"Campus 2023 Graduates American Indian Count","publisher_type":"Number"},{"code":"C30GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_asian_count","label":"Campus 2023 Graduates: Asian Count","position":18,"publisher_description":"Campus 2023 Graduates Asian Count","publisher_type":"Number"},{"code":"C40GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_pacific_islander_count","label":"Campus 2023 Graduates: Pacific Islander Count","position":19,"publisher_description":"Campus 2023 Graduates Pacific Islander Count","publisher_type":"Number"},{"code":"C20GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_two_or_more_races_count","label":"Campus 2023 Graduates: Two or More Races Count","position":20,"publisher_description":"Campus 2023 Graduates Two or More Races Count","publisher_type":"Number"},{"code":"CE0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_econ_disadv_count","label":"Campus 2023 Graduates: Econ Disadv Count","position":21,"publisher_description":"Campus 2023 Graduates Econ Disadv Count","publisher_type":"Number"},{"code":"CS0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_special_ed_count","label":"Campus 2023 Graduates: Special Ed Count","position":22,"publisher_description":"Campus 2023 Graduates Special Ed Count","publisher_type":"Number"},{"code":"CL0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_eb_el_count","label":"Campus 2023 Graduates: EB/EL Count","position":23,"publisher_description":"Campus 2023 Graduates EB/EL Count","publisher_type":"Number"},{"code":"CR0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_at_risk_count","label":"Campus 2023 Graduates: At Risk Count","position":24,"publisher_description":"Campus 2023 Graduates At Risk Count","publisher_type":"Number"},{"code":"CV0GR23N","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_cte_program_completer_count","label":"Campus 2023 Graduates: CTE Program Completer Count","position":25,"publisher_description":"Campus 2023 Graduates CTE Program Completer Count","publisher_type":"Number"},{"code":"CV0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_cte_program_completer_student_group_percent","label":"Campus 2023 Graduates: CTE Program Completer Student Group %","position":26,"publisher_description":"Campus 2023 Graduates CTE Program Completer Student Group %","publisher_type":"Number"},{"code":"CA0GH23P","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_rhsp_dap_all_students_percent_profile_only","label":"Campus 2023 Graduates: RHSP/DAP All Students % (Profile Only)","position":27,"publisher_description":"Campus 2023 Graduates RHSP/DAP All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GN23P","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only","label":"Campus 2023 Graduates: FHSP No Endorsement All Students % (Profile Only)","position":28,"publisher_description":"Campus 2023 Graduates FHSP No Endorsement All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GE23P","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_fhsp_e_all_students_percent_profile_only","label":"Campus 2023 Graduates: FHSP-E All Students % (Profile Only)","position":29,"publisher_description":"Campus 2023 Graduates FHSP-E All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GA23P","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_fhsp_dla_all_students_percent_profile_only","label":"Campus 2023 Graduates: FHSP-DLA All Students % (Profile Only)","position":30,"publisher_description":"Campus 2023 Graduates FHSP-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0G123P","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_texas_first_dla_all_students_percent_profile_only","label":"Campus 2023 Graduates: Texas First-DLA All Students % (Profile Only)","position":31,"publisher_description":"Campus 2023 Graduates Texas First-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"CA0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_all_students_group_percent","label":"Campus 2023 Graduates: All Students Group %","position":32,"publisher_description":"Campus 2023 Graduates All Students Group %","publisher_type":"Number"},{"code":"CA0GM23R","dictionary_status":"not_documented","disposition":"fact","field":"campus_2023_graduates_minimum_hs_pgm_all_students_percent","label":"Campus 2023 Graduates: Minimum HS PGM All Students %","position":33,"publisher_description":null,"publisher_type":null},{"code":"CA0GS23R","dictionary_status":"not_documented","disposition":"fact","field":"campus_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent","label":"Campus 2023 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students %","position":34,"publisher_description":null,"publisher_type":null},{"code":"CB0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_african_american_student_group_percent","label":"Campus 2023 Graduates: African American Student Group %","position":35,"publisher_description":"Campus 2023 Graduates African American Student Group %","publisher_type":"Number"},{"code":"CH0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_hispanic_student_group_percent","label":"Campus 2023 Graduates: Hispanic Student Group %","position":36,"publisher_description":"Campus 2023 Graduates Hispanic Student Group %","publisher_type":"Number"},{"code":"CW0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_white_student_group_percent","label":"Campus 2023 Graduates: White Student Group %","position":37,"publisher_description":"Campus 2023 Graduates White Student Group %","publisher_type":"Number"},{"code":"CI0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_american_indian_student_group_percent","label":"Campus 2023 Graduates: American Indian Student Group %","position":38,"publisher_description":"Campus 2023 Graduates American Indian Student Group %","publisher_type":"Number"},{"code":"C30GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_asian_student_group_percent","label":"Campus 2023 Graduates: Asian Student Group %","position":39,"publisher_description":"Campus 2023 Graduates Asian Student Group %","publisher_type":"Number"},{"code":"C40GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_pacific_islander_student_group_percent","label":"Campus 2023 Graduates: Pacific Islander Student Group %","position":40,"publisher_description":"Campus 2023 Graduates Pacific Islander Student Group %","publisher_type":"Number"},{"code":"C20GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_two_or_more_races_student_group_percent","label":"Campus 2023 Graduates: Two or More Races Student Group %","position":41,"publisher_description":"Campus 2023 Graduates Two or More Races Student Group %","publisher_type":"Number"},{"code":"CE0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_econ_disadv_student_group_percent","label":"Campus 2023 Graduates: Econ Disadv Student Group %","position":42,"publisher_description":"Campus 2023 Graduates Econ Disadv Student Group %","publisher_type":"Number"},{"code":"CS0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_special_ed_student_group_percent","label":"Campus 2023 Graduates: Special Ed Student Group %","position":43,"publisher_description":"Campus 2023 Graduates Special Ed Student Group %","publisher_type":"Number"},{"code":"CL0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_eb_el_student_group_percent","label":"Campus 2023 Graduates: EB/EL Student Group %","position":44,"publisher_description":"Campus 2023 Graduates EB/EL Student Group %","publisher_type":"Number"},{"code":"CR0GR23R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_at_risk_student_group_percent","label":"Campus 2023 Graduates: At Risk Student Group %","position":45,"publisher_description":"Campus 2023 Graduates At Risk Student Group %","publisher_type":"Number"},{"code":"CA0GM23P","dictionary_status":"documented","disposition":"fact","field":"campus_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only","label":"Campus 2023 Graduates: Minimum HS PGM All Students % (Profile Only)","position":46,"publisher_description":"Campus 2023 Graduates Minimum HS PGM All Students % (Profile Only)","publisher_type":"Number"}],"input_sha256":"49193776d55e4a9cbe3f02e568856b82dbbec14605df08c4ba3d1bc85ae494af","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":9084},"metric_period":{"end_year":2023,"kind":"school_year","start_year":2022},"source_schema_sha256":"2400e6f678b1e0032cdc5d2575600f25c718b3b9765211c689fc20538f963bff","table":"graduation_profile"}]},{"dataset":"district_tapr_graduation_profile","edition":"2024","source_only":true,"tables":[{"fields":[{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DA0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_all_students_count_including_fhsp","label":"District 2023 Graduates: All Students Count (including FHSP)","position":3,"publisher_description":"District 2023 Graduates All Students Count (including FHSP)","publisher_type":"Number"},{"code":"DA0GM23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_minimum_hs_pgm_all_students_count","label":"District 2023 Graduates: Minimum HS PGM All Students Count","position":4,"publisher_description":"District 2023 Graduates Minimum HS PGM All Students Count","publisher_type":"Number"},{"code":"DA0GH23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_rhsp_dap_all_students_count","label":"District 2023 Graduates: RHSP/DAP All Students Count","position":5,"publisher_description":"District 2023 Graduates RHSP/DAP All Students Count","publisher_type":"Number"},{"code":"DA0GN23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_fhsp_no_endorsement_all_students_count","label":"District 2023 Graduates: FHSP No Endorsement All Students Count","position":6,"publisher_description":"District 2023 Graduates FHSP No Endorsement All Students Count","publisher_type":"Number"},{"code":"DA0GE23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_fhsp_e_all_students_count","label":"District 2023 Graduates: FHSP-E All Students Count","position":7,"publisher_description":"District 2023 Graduates FHSP-E All Students Count","publisher_type":"Number"},{"code":"DA0GA23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_fhsp_dla_all_students_count","label":"District 2023 Graduates: FHSP-DLA All Students Count","position":8,"publisher_description":"District 2023 Graduates FHSP-DLA All Students Count","publisher_type":"Number"},{"code":"DA0G123N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_texas_first_dla_all_students_count","label":"District 2023 Graduates: Texas First-DLA All Students Count","position":9,"publisher_description":"District 2023 Graduates Texas First-DLA All Students Count","publisher_type":"Number"},{"code":"DA0GS23N","dictionary_status":"not_documented","disposition":"fact","field":"district_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count","label":"District 2023 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students Count","position":10,"publisher_description":null,"publisher_type":null},{"code":"DA0GS23D","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_all_students_count_all_students_denominator","label":"District 2023 Graduates: All Students Count All Students Denominator","position":11,"publisher_description":"District 2023 Graduates All Students Count All Students Denominator","publisher_type":"Number"},{"code":"DB0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_african_american_count","label":"District 2023 Graduates: African American Count","position":12,"publisher_description":"District 2023 Graduates African American Count","publisher_type":"Number"},{"code":"DH0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_hispanic_count","label":"District 2023 Graduates: Hispanic Count","position":13,"publisher_description":"District 2023 Graduates Hispanic Count","publisher_type":"Number"},{"code":"DW0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_white_count","label":"District 2023 Graduates: White Count","position":14,"publisher_description":"District 2023 Graduates White Count","publisher_type":"Number"},{"code":"DI0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_american_indian_count","label":"District 2023 Graduates: American Indian Count","position":15,"publisher_description":"District 2023 Graduates American Indian Count","publisher_type":"Number"},{"code":"D30GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_asian_count","label":"District 2023 Graduates: Asian Count","position":16,"publisher_description":"District 2023 Graduates Asian Count","publisher_type":"Number"},{"code":"D40GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_pacific_islander_count","label":"District 2023 Graduates: Pacific Islander Count","position":17,"publisher_description":"District 2023 Graduates Pacific Islander Count","publisher_type":"Number"},{"code":"D20GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_two_or_more_races_count","label":"District 2023 Graduates: Two or More Races Count","position":18,"publisher_description":"District 2023 Graduates Two or More Races Count","publisher_type":"Number"},{"code":"DE0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_econ_disadv_count","label":"District 2023 Graduates: Econ Disadv Count","position":19,"publisher_description":"District 2023 Graduates Econ Disadv Count","publisher_type":"Number"},{"code":"DS0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_special_ed_count","label":"District 2023 Graduates: Special Ed Count","position":20,"publisher_description":"District 2023 Graduates Special Ed Count","publisher_type":"Number"},{"code":"DL0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_eb_el_count","label":"District 2023 Graduates: EB/EL Count","position":21,"publisher_description":"District 2023 Graduates EB/EL Count","publisher_type":"Number"},{"code":"DR0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_at_risk_count","label":"District 2023 Graduates: At Risk Count","position":22,"publisher_description":"District 2023 Graduates At Risk Count","publisher_type":"Number"},{"code":"DV0GR23N","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_cte_program_completer_count","label":"District 2023 Graduates: CTE Program Completer Count","position":23,"publisher_description":"District 2023 Graduates CTE Program Completer Count","publisher_type":"Number"},{"code":"DV0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_cte_program_completer_student_group_percent","label":"District 2023 Graduates: CTE Program Completer Student Group %","position":24,"publisher_description":"District 2023 Graduates CTE Program Completer Student Group %","publisher_type":"Number"},{"code":"DA0GH23P","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_rhsp_dap_all_students_percent_profile_only","label":"District 2023 Graduates: RHSP/DAP All Students % (Profile Only)","position":25,"publisher_description":"District 2023 Graduates RHSP/DAP All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GN23P","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only","label":"District 2023 Graduates: FHSP No Endorsement All Students % (Profile Only)","position":26,"publisher_description":"District 2023 Graduates FHSP No Endorsement All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GE23P","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_fhsp_e_all_students_percent_profile_only","label":"District 2023 Graduates: FHSP-E All Students % (Profile Only)","position":27,"publisher_description":"District 2023 Graduates FHSP-E All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GA23P","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_fhsp_dla_all_students_percent_profile_only","label":"District 2023 Graduates: FHSP-DLA All Students % (Profile Only)","position":28,"publisher_description":"District 2023 Graduates FHSP-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0G123P","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_texas_first_dla_all_students_percent_profile_only","label":"District 2023 Graduates: Texas First-DLA All Students % (Profile Only)","position":29,"publisher_description":"District 2023 Graduates Texas First-DLA All Students % (Profile Only)","publisher_type":"Number"},{"code":"DA0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_all_students_group_percent","label":"District 2023 Graduates: All Students Group %","position":30,"publisher_description":"District 2023 Graduates All Students Group %","publisher_type":"Number"},{"code":"DA0GM23R","dictionary_status":"not_documented","disposition":"fact","field":"district_2023_graduates_minimum_hs_pgm_all_students_percent","label":"District 2023 Graduates: Minimum HS PGM All Students %","position":31,"publisher_description":null,"publisher_type":null},{"code":"DA0GS23R","dictionary_status":"not_documented","disposition":"fact","field":"district_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent","label":"District 2023 Graduates: RHSP/DAP/FHSP-E/FHSP-DLA/Texas First-DLA All Students %","position":32,"publisher_description":null,"publisher_type":null},{"code":"DB0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_african_american_student_group_percent","label":"District 2023 Graduates: African American Student Group %","position":33,"publisher_description":"District 2023 Graduates African American Student Group %","publisher_type":"Number"},{"code":"DH0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_hispanic_student_group_percent","label":"District 2023 Graduates: Hispanic Student Group %","position":34,"publisher_description":"District 2023 Graduates Hispanic Student Group %","publisher_type":"Number"},{"code":"DW0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_white_student_group_percent","label":"District 2023 Graduates: White Student Group %","position":35,"publisher_description":"District 2023 Graduates White Student Group %","publisher_type":"Number"},{"code":"DI0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_american_indian_student_group_percent","label":"District 2023 Graduates: American Indian Student Group %","position":36,"publisher_description":"District 2023 Graduates American Indian Student Group %","publisher_type":"Number"},{"code":"D30GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_asian_student_group_percent","label":"District 2023 Graduates: Asian Student Group %","position":37,"publisher_description":"District 2023 Graduates Asian Student Group %","publisher_type":"Number"},{"code":"D40GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_pacific_islander_student_group_percent","label":"District 2023 Graduates: Pacific Islander Student Group %","position":38,"publisher_description":"District 2023 Graduates Pacific Islander Student Group %","publisher_type":"Number"},{"code":"D20GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_two_or_more_races_student_group_percent","label":"District 2023 Graduates: Two or More Races Student Group %","position":39,"publisher_description":"District 2023 Graduates Two or More Races Student Group %","publisher_type":"Number"},{"code":"DE0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_econ_disadv_student_group_percent","label":"District 2023 Graduates: Econ Disadv Student Group %","position":40,"publisher_description":"District 2023 Graduates Econ Disadv Student Group %","publisher_type":"Number"},{"code":"DS0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_special_ed_student_group_percent","label":"District 2023 Graduates: Special Ed Student Group %","position":41,"publisher_description":"District 2023 Graduates Special Ed Student Group %","publisher_type":"Number"},{"code":"DL0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_eb_el_student_group_percent","label":"District 2023 Graduates: EB/EL Student Group %","position":42,"publisher_description":"District 2023 Graduates EB/EL Student Group %","publisher_type":"Number"},{"code":"DR0GR23R","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_at_risk_student_group_percent","label":"District 2023 Graduates: At Risk Student Group %","position":43,"publisher_description":"District 2023 Graduates At Risk Student Group %","publisher_type":"Number"},{"code":"DA0GM23P","dictionary_status":"documented","disposition":"fact","field":"district_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only","label":"District 2023 Graduates: Minimum HS PGM All Students % (Profile Only)","position":44,"publisher_description":"District 2023 Graduates Minimum HS PGM All Students % (Profile Only)","publisher_type":"Number"}],"input_sha256":"93417418d29fecd1cf514f5fa7d493c9b4bdc39fba3820597250a1c581dc97ee","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":1209},"metric_period":{"end_year":2023,"kind":"school_year","start_year":2022},"source_schema_sha256":"3b904f2a4703d36de801e4d6e7b5ed667d91ebe4982e8a1b136782efe4eb9951","table":"graduation_profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/teadata_sources.yaml b/teadata/teadata_sources.yaml index 107fd63..78bf7dc 100644 --- a/teadata/teadata_sources.yaml +++ b/teadata/teadata_sources.yaml @@ -522,6 +522,263 @@ data_sources: status: unreviewed provenance_ids: [] campus_tapr_graduation_profile: + 2024: + path: data/tapr/raw/2024 Campus Graduation Profile.csv + metadata: + title: 2023-2024 TAPR Campus Graduation Profile (2022-2023 annual graduates) + publisher: Texas Education Agency + version: '2024' + period: &grad2024_id001 + kind: school_year + start_year: 2022 + end_year: 2023 + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: + - 53cdecc0f085f7b2686c17072dcb4e191a139564199d42446a1efe13f2fece49 + notes: Source-only current GRAD family and immutable content revision, independent + of retained 2024 PROF. Graduation Profile in the annual 2023-24 TAPR Glossary + pages 15-16 documents 2022-23 annual graduates; the selector and CSV labels + say 2023. The acquired dictionary contradicts these with its heading Graduates + (2023-24 Annual Graduates); preserve the heading discrepancy and original + references. Period is bound from the annual glossary, not inferred from source-code + suffixes. Identity/name observation dates and all metric units remain unknown. + Three metrics per scope have no dictionary type/definition. Literal dots and + empty strings remain distinct raw observations with no guessed cause or suppression + status. Do not coalesce with PROF or another edition/family; no released facts + or default hydration is activated. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Original current 2024 GRAD CSV headers; exact POST controls are preserved + in its acquisition receipt + status: available + provenance_ids: + - 53cdecc0f085f7b2686c17072dcb4e191a139564199d42446a1efe13f2fece49 + reviewed_sha256: 49193776d55e4a9cbe3f02e568856b82dbbec14605df08c4ba3d1bc85ae494af + - reference_id: selection + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=GRAD + title: 2023-24 Campus GRAD selection; Graduation Profile, 2023; original download + controls + status: available + provenance_ids: + - 7a6e8dd68795cf19130ed551cc65d51e8307220b91d0a9ff8da1804104672cfc + reviewed_sha256: 63524df30a48010367530d6ec338d5375ccf9ba24dd489a602c811c6f9167a73 + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + title: 2023-24 Campus GRAD dictionary; 39 defined metrics; contradictory 2023-24 + Annual Graduates heading retained + status: available + provenance_ids: + - 25428be915b8b18e696da5f9dc3cbec98501c130d590cf867ae73316ce68dfc6 + reviewed_sha256: 5bbc48ebac5f9d049c29291321464b74d609cd089308168cf87cf0476bf93b3a + - reference_id: glossary + role: glossary + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf + title: 2023-24 TAPR Glossary; Graduation Profile pages 15-16 document 2022-23 + status: available + provenance_ids: + - 0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb + reviewed_sha256: e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html + title: Explanation of 2023-24 TAPR Masking Rules; reference only, no field + policy inferred + status: available + provenance_ids: + - 27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595 + reviewed_sha256: f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a + field_year: 2023 + metrics: + campus_2023_graduates_all_students_count_including_fhsp: + field: campus_2023_graduates_all_students_count_including_fhsp + period: *grad2024_id001 + unit: null + campus_2023_graduates_minimum_hs_pgm_all_students_count: + field: campus_2023_graduates_minimum_hs_pgm_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_rhsp_dap_all_students_count: + field: campus_2023_graduates_rhsp_dap_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_fhsp_no_endorsement_all_students_count: + field: campus_2023_graduates_fhsp_no_endorsement_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_fhsp_e_all_students_count: + field: campus_2023_graduates_fhsp_e_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_fhsp_dla_all_students_count: + field: campus_2023_graduates_fhsp_dla_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_texas_first_dla_all_students_count: + field: campus_2023_graduates_texas_first_dla_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count: + field: campus_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_all_students_count_all_students_denominator: + field: campus_2023_graduates_all_students_count_all_students_denominator + period: *grad2024_id001 + unit: null + campus_2023_graduates_african_american_count: + field: campus_2023_graduates_african_american_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_hispanic_count: + field: campus_2023_graduates_hispanic_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_white_count: + field: campus_2023_graduates_white_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_american_indian_count: + field: campus_2023_graduates_american_indian_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_asian_count: + field: campus_2023_graduates_asian_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_pacific_islander_count: + field: campus_2023_graduates_pacific_islander_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_two_or_more_races_count: + field: campus_2023_graduates_two_or_more_races_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_econ_disadv_count: + field: campus_2023_graduates_econ_disadv_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_special_ed_count: + field: campus_2023_graduates_special_ed_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_eb_el_count: + field: campus_2023_graduates_eb_el_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_at_risk_count: + field: campus_2023_graduates_at_risk_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_cte_program_completer_count: + field: campus_2023_graduates_cte_program_completer_count + period: *grad2024_id001 + unit: null + campus_2023_graduates_cte_program_completer_student_group_percent: + field: campus_2023_graduates_cte_program_completer_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_rhsp_dap_all_students_percent_profile_only: + field: campus_2023_graduates_rhsp_dap_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + campus_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only: + field: campus_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + campus_2023_graduates_fhsp_e_all_students_percent_profile_only: + field: campus_2023_graduates_fhsp_e_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + campus_2023_graduates_fhsp_dla_all_students_percent_profile_only: + field: campus_2023_graduates_fhsp_dla_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + campus_2023_graduates_texas_first_dla_all_students_percent_profile_only: + field: campus_2023_graduates_texas_first_dla_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + campus_2023_graduates_all_students_group_percent: + field: campus_2023_graduates_all_students_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_minimum_hs_pgm_all_students_percent: + field: campus_2023_graduates_minimum_hs_pgm_all_students_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent: + field: campus_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_african_american_student_group_percent: + field: campus_2023_graduates_african_american_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_hispanic_student_group_percent: + field: campus_2023_graduates_hispanic_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_white_student_group_percent: + field: campus_2023_graduates_white_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_american_indian_student_group_percent: + field: campus_2023_graduates_american_indian_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_asian_student_group_percent: + field: campus_2023_graduates_asian_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_pacific_islander_student_group_percent: + field: campus_2023_graduates_pacific_islander_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_two_or_more_races_student_group_percent: + field: campus_2023_graduates_two_or_more_races_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_econ_disadv_student_group_percent: + field: campus_2023_graduates_econ_disadv_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_special_ed_student_group_percent: + field: campus_2023_graduates_special_ed_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_eb_el_student_group_percent: + field: campus_2023_graduates_eb_el_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_at_risk_student_group_percent: + field: campus_2023_graduates_at_risk_student_group_percent + period: *grad2024_id001 + unit: null + campus_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only: + field: campus_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + reader: + profiles: + source: + column_schema: schemas/tapr--2024--graduation-profile-crosswalk.json + tapr_source: + scope: campus + tables: + graduation_profile: data/tapr/raw/2024 Campus Graduation Profile.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--graduation-profile-crosswalk.json + title: Reviewed complete 2024 GRAD source-only code/label/layout and dictionary-availability + contract; not a retained prepared reference + status: available + provenance_ids: [] + reviewed_sha256: 5458555c86b37a813db887362a34c35de3520ad64f06065f593c639312fc6b3b 2025: path: data/tapr/raw/2025 Campus Graduation Profile.csv metadata: @@ -766,6 +1023,260 @@ data_sources: provenance_ids: [] reviewed_sha256: bf848a6c47d7f5ed783b57d862d4fcaefced1e2988b65b75c13abddcd998ec98 district_tapr_graduation_profile: + 2024: + path: data/tapr/raw/2024 District Graduation Profile.csv + metadata: + title: 2023-2024 TAPR District Graduation Profile (2022-2023 annual graduates) + publisher: Texas Education Agency + version: '2024' + period: *grad2024_id001 + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: + - a3fca5bf618e48d8fde68c52d9e32fff589b8e9d6acea141f75bff537ce2be32 + notes: Source-only current GRAD family and immutable content revision, independent + of retained 2024 PROF. Graduation Profile in the annual 2023-24 TAPR Glossary + pages 15-16 documents 2022-23 annual graduates; the selector and CSV labels + say 2023. The acquired dictionary contradicts these with its heading Graduates + (2023-24 Annual Graduates); preserve the heading discrepancy and original + references. Period is bound from the annual glossary, not inferred from source-code + suffixes. Identity/name observation dates and all metric units remain unknown. + Three metrics per scope have no dictionary type/definition. Literal dots and + empty strings remain distinct raw observations with no guessed cause or suppression + status. Do not coalesce with PROF or another edition/family; no released facts + or default hydration is activated. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Original current 2024 GRAD CSV headers; exact POST controls are preserved + in its acquisition receipt + status: available + provenance_ids: + - a3fca5bf618e48d8fde68c52d9e32fff589b8e9d6acea141f75bff537ce2be32 + reviewed_sha256: 93417418d29fecd1cf514f5fa7d493c9b4bdc39fba3820597250a1c581dc97ee + - reference_id: selection + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=GRAD + title: 2023-24 District GRAD selection; Graduation Profile, 2023; original download + controls + status: available + provenance_ids: + - de5f5c13994ac556dd56b9884cd3335d69dde9b51bf37e5f60f3670735ccc0e9 + reviewed_sha256: e4f4e5c732b72a0faddab5be2b0ee27f3fac1628c8a093e228057342a3a8b78b + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=GRAD&dd=gradprofile&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + title: 2023-24 District GRAD dictionary; 39 defined metrics; contradictory 2023-24 + Annual Graduates heading retained + status: available + provenance_ids: + - 66393c3ad6f5be710952f3bbf42b4e230b06137b033f9e8e5ebd9a9df2c84444 + reviewed_sha256: 6002ce972c46c767be5a61926819caee7791e95460efc1a31876ad69bbf89766 + - reference_id: glossary + role: glossary + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf + title: 2023-24 TAPR Glossary; Graduation Profile pages 15-16 document 2022-23 + status: available + provenance_ids: + - 0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb + reviewed_sha256: e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html + title: Explanation of 2023-24 TAPR Masking Rules; reference only, no field + policy inferred + status: available + provenance_ids: + - 27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595 + reviewed_sha256: f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a + field_year: 2023 + metrics: + district_2023_graduates_all_students_count_including_fhsp: + field: district_2023_graduates_all_students_count_including_fhsp + period: *grad2024_id001 + unit: null + district_2023_graduates_minimum_hs_pgm_all_students_count: + field: district_2023_graduates_minimum_hs_pgm_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_rhsp_dap_all_students_count: + field: district_2023_graduates_rhsp_dap_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_fhsp_no_endorsement_all_students_count: + field: district_2023_graduates_fhsp_no_endorsement_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_fhsp_e_all_students_count: + field: district_2023_graduates_fhsp_e_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_fhsp_dla_all_students_count: + field: district_2023_graduates_fhsp_dla_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_texas_first_dla_all_students_count: + field: district_2023_graduates_texas_first_dla_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count: + field: district_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_count + period: *grad2024_id001 + unit: null + district_2023_graduates_all_students_count_all_students_denominator: + field: district_2023_graduates_all_students_count_all_students_denominator + period: *grad2024_id001 + unit: null + district_2023_graduates_african_american_count: + field: district_2023_graduates_african_american_count + period: *grad2024_id001 + unit: null + district_2023_graduates_hispanic_count: + field: district_2023_graduates_hispanic_count + period: *grad2024_id001 + unit: null + district_2023_graduates_white_count: + field: district_2023_graduates_white_count + period: *grad2024_id001 + unit: null + district_2023_graduates_american_indian_count: + field: district_2023_graduates_american_indian_count + period: *grad2024_id001 + unit: null + district_2023_graduates_asian_count: + field: district_2023_graduates_asian_count + period: *grad2024_id001 + unit: null + district_2023_graduates_pacific_islander_count: + field: district_2023_graduates_pacific_islander_count + period: *grad2024_id001 + unit: null + district_2023_graduates_two_or_more_races_count: + field: district_2023_graduates_two_or_more_races_count + period: *grad2024_id001 + unit: null + district_2023_graduates_econ_disadv_count: + field: district_2023_graduates_econ_disadv_count + period: *grad2024_id001 + unit: null + district_2023_graduates_special_ed_count: + field: district_2023_graduates_special_ed_count + period: *grad2024_id001 + unit: null + district_2023_graduates_eb_el_count: + field: district_2023_graduates_eb_el_count + period: *grad2024_id001 + unit: null + district_2023_graduates_at_risk_count: + field: district_2023_graduates_at_risk_count + period: *grad2024_id001 + unit: null + district_2023_graduates_cte_program_completer_count: + field: district_2023_graduates_cte_program_completer_count + period: *grad2024_id001 + unit: null + district_2023_graduates_cte_program_completer_student_group_percent: + field: district_2023_graduates_cte_program_completer_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_rhsp_dap_all_students_percent_profile_only: + field: district_2023_graduates_rhsp_dap_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + district_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only: + field: district_2023_graduates_fhsp_no_endorsement_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + district_2023_graduates_fhsp_e_all_students_percent_profile_only: + field: district_2023_graduates_fhsp_e_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + district_2023_graduates_fhsp_dla_all_students_percent_profile_only: + field: district_2023_graduates_fhsp_dla_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + district_2023_graduates_texas_first_dla_all_students_percent_profile_only: + field: district_2023_graduates_texas_first_dla_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + district_2023_graduates_all_students_group_percent: + field: district_2023_graduates_all_students_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_minimum_hs_pgm_all_students_percent: + field: district_2023_graduates_minimum_hs_pgm_all_students_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent: + field: district_2023_graduates_rhsp_dap_fhsp_e_fhsp_dla_texas_first_dla_all_students_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_african_american_student_group_percent: + field: district_2023_graduates_african_american_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_hispanic_student_group_percent: + field: district_2023_graduates_hispanic_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_white_student_group_percent: + field: district_2023_graduates_white_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_american_indian_student_group_percent: + field: district_2023_graduates_american_indian_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_asian_student_group_percent: + field: district_2023_graduates_asian_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_pacific_islander_student_group_percent: + field: district_2023_graduates_pacific_islander_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_two_or_more_races_student_group_percent: + field: district_2023_graduates_two_or_more_races_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_econ_disadv_student_group_percent: + field: district_2023_graduates_econ_disadv_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_special_ed_student_group_percent: + field: district_2023_graduates_special_ed_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_eb_el_student_group_percent: + field: district_2023_graduates_eb_el_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_at_risk_student_group_percent: + field: district_2023_graduates_at_risk_student_group_percent + period: *grad2024_id001 + unit: null + district_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only: + field: district_2023_graduates_minimum_hs_pgm_all_students_percent_profile_only + period: *grad2024_id001 + unit: null + reader: + profiles: + source: + column_schema: schemas/tapr--2024--graduation-profile-crosswalk.json + tapr_source: + scope: district + tables: + graduation_profile: data/tapr/raw/2024 District Graduation Profile.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--graduation-profile-crosswalk.json + title: Reviewed complete 2024 GRAD source-only code/label/layout and dictionary-availability + contract; not a retained prepared reference + status: available + provenance_ids: [] + reviewed_sha256: 5458555c86b37a813db887362a34c35de3520ad64f06065f593c639312fc6b3b 2025: path: data/tapr/raw/2025 District Graduation Profile.csv metadata: diff --git a/tests/test_tapr_graduation_profile.py b/tests/test_tapr_graduation_profile.py index 9b5fe41..a120bb0 100644 --- a/tests/test_tapr_graduation_profile.py +++ b/tests/test_tapr_graduation_profile.py @@ -32,37 +32,39 @@ @pytest.mark.parametrize('scope,identities', [('campus', 4), ('district', 2)]) -def test_full_publisher_coverage_is_discoverable_with_explicit_dictionary_gaps(scope, identities): +@pytest.mark.parametrize('edition,ending,period', [(2024, '23', {'kind': 'school_year', 'start_year': 2022, 'end_year': 2023}), + (2025, '24', PERIOD)]) +def test_full_publisher_coverage_is_discoverable_with_explicit_dictionary_gaps(scope, identities, edition, ending, period): cfg = load_config() dataset = scope + '_tapr_graduation_profile' - records = cfg.header_records(dataset, edition='2025', reader_profile='source') + records = cfg.header_records(dataset, edition=str(edition), reader_profile='source') assert len(records) == 42 + identities facts = [f for f in records if f['disposition'] == 'fact'] missing = [f for f in facts if f['dictionary_status'] == 'not_documented'] prefix = scope[0].upper() - assert {f['code'] for f in missing} == {prefix + c for c in ['A0GS24N', 'A0GM24R', 'A0GS24R']} + assert {f['code'] for f in missing} == {prefix + c + ending + kind for c, kind in [('A0GS', 'N'), ('A0GM', 'R'), ('A0GS', 'R')]} assert all(f['publisher_type'] is None and f['publisher_description'] is None for f in missing) assert sum(f['dictionary_status'] == 'documented' for f in facts) == 39 - assert all(f['period'] == PERIOD for f in facts) + assert all(f['period'] == period for f in facts) assert all(f['period'] == {'kind': 'unknown'} for f in records if f['disposition'] == 'identity') - source = cfg.resolve_dataset(dataset, 2025) - assert source.metadata.version == '2025' and source.metadata.period.to_dict() == PERIOD + source = cfg.resolve_dataset(dataset, edition) + assert source.metadata.version == str(edition) and source.metadata.period.to_dict() == period assert len(source.metadata.metrics) == 42 - assert all(m.unit is None and m.period is not None and m.period.to_dict() == PERIOD + assert all(m.unit is None and m.period is not None and m.period.to_dict() == period for m in source.metadata.metrics.values()) - assert cfg.availability_report()['data_sources'][dataset]['years'] == [2025] - assert cfg.is_source_only(dataset, 2025) is True - assert cfg.column_schema(dataset, 2025) is None + assert cfg.availability_report()['data_sources'][dataset]['years'] == [2024, 2025] + assert cfg.is_source_only(dataset, edition) is True + assert cfg.column_schema(dataset, edition) is None with pytest.raises(ContractError, match='Reader profile is required'): - cfg.load_df(dataset, 2025) + cfg.load_df(dataset, edition) with pytest.raises(ContractError, match='edition unavailable'): - cfg.header_records(dataset, edition='2024', reader_profile='source') + cfg.header_records(dataset, edition='2023', reader_profile='source') with pytest.raises(ContractError, match='exact declared edition'): cfg.read_tapr_sources(dataset, 2026) # A source-only contract cannot certify an unrelated prepared workbook. with pytest.raises(ValueError, match='different prepared input'): - validate_selected_crosswalk(parse_column_schema(RESOURCE.read_bytes()), dataset=dataset, - edition='2025', input_sha256='0' * 64, columns=[f['field'] for f in records]) + validate_selected_crosswalk(parse_column_schema(RESOURCE.with_name(f'tapr--{edition}--graduation-profile-crosswalk.json').read_bytes()), + dataset=dataset, edition=str(edition), input_sha256='0' * 64, columns=[f['field'] for f in records]) @pytest.mark.parametrize('change', ['missing_status', 'invented_type', 'invented_definition', 'false_documented']) @@ -324,6 +326,9 @@ def test_existing_default_contracts_and_public_metric_bindings_remain_pinned(cat for (scope, year), digest in expected.items(): entry = cfg['data_sources'][scope + '_tapr_student_staff_profile'][year] assert sha256(canonical_json(entry).encode()).hexdigest() == digest + for scope, digest in [('campus', 'da06b3e24f7acc2b553c25f09e35d4f21fbfb8ef1c270b6a7cba80317ceda2fa'), + ('district', '172240f0850fa64d294307874fcef3e69c5d94ee14e39da83d2682c75ae97c61')]: + assert sha256(canonical_json(cfg['data_sources'][scope + '_tapr_graduation_profile'][2025]).encode()).hexdigest() == digest assert all('graduation' not in canonical_json(binding) for binding in cfg['metric_bindings'].values()) assert not any('graduation' in dataset for dataset in catalog.datasets) loaded = load_config() @@ -332,7 +337,44 @@ def test_existing_default_contracts_and_public_metric_bindings_remain_pinned(cat for scope in ('campus', 'district') for year in (2024, 2025)) -def test_grad_discovery_opens_only_metadata_in_a_fresh_process(): +@pytest.mark.parametrize('scope', ['campus', 'district']) +def test_2024_grad_period_and_dictionary_contradiction_are_discoverable_without_coalescing(scope): + source = load_config().resolve_dataset(scope + '_tapr_graduation_profile', 2024) + assert source.metadata.version == '2024' + assert source.metadata.period.to_dict() == {'kind': 'school_year', 'start_year': 2022, 'end_year': 2023} + notes = source.metadata.notes + assert notes and '2023-24 Annual Graduates' in notes and 'pages 15-16' in notes + assert 'not inferred from source-code suffixes' in notes and 'independent of retained 2024 PROF' in notes + refs = {ref.reference_id: ref for ref in source.metadata.references} + assert {refs[name].role for name in ('dictionary', 'glossary', 'masking', 'selection')} == { + 'data_dictionary', 'glossary', 'masking_methodology', 'source_notes'} + assert refs['glossary'].reviewed_sha256 == 'e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8' + assert all(ref.provenance_ids for ref in source.metadata.references) + assert source.metadata.value_policy is None + + +def test_2024_current_source_preserves_dot_blank_and_historical_members_independently(tmp_path): + resource = RESOURCE.with_name('tapr--2024--graduation-profile-crosswalk.json') + mapping = deepcopy(parse_column_schema(resource.read_bytes())['datasets'][0]['tables'][0]) + fields = mapping['fields'] + rows = [['001902001', 'Historical campus', '001902', 'Historical district', '.'] + [''] * 41, + ['001902041', 'Another historical campus', '001902', 'Historical district', ''] + ['0'] * 41] + path = tmp_path / 'source.csv' + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([[f['label'] for f in fields], [f['code'] for f in fields], *rows]) + mapping['input_sha256'] = sha256(path.read_bytes()).hexdigest() + mapping['layout']['last_data_record'] = 4 + result = read_tapr_table(path, mapping=mapping, key_field='campus_number', + dataset='campus_tapr_graduation_profile', edition='2024') + assert result.table.num_rows == 2 + assert result.table[fields[4]['field']].to_pylist() == ['.', ''] + assert result.table['campus_name'].to_pylist() == ['Historical campus', 'Another historical campus'] + assert result.table['campus_number'].to_pylist() == ['001902001', '001902041'] + assert result.edition == '2024' and result.dataset == 'campus_tapr_graduation_profile' + + +@pytest.mark.parametrize('edition', [2024, 2025]) +def test_grad_discovery_opens_only_metadata_in_a_fresh_process(edition): code = ''' import importlib.abc, pathlib, socket, sqlite3, sys, urllib.request heavy = ('teadata.classes','teadata.engine','teadata.entities','teadata.geometry','pyarrow','duckdb','sqlalchemy','pandas','numpy','geopandas','shapely') @@ -343,7 +385,8 @@ def find_spec(self, fullname, path=None, target=None): from teadata import load_config import teadata.teadata_config as config_module root = pathlib.Path(config_module.__file__).parent -allowed = {(root/'teadata_sources.yaml').resolve(),(root/'schemas/tapr--2025--graduation-profile-crosswalk.json').resolve()} +edition = __EDITION__ +allowed = {(root/'teadata_sources.yaml').resolve(),(root/f'schemas/tapr--{edition}--graduation-profile-crosswalk.json').resolve()} original = pathlib.Path.open def guarded(self,*args,**kwargs): if self.resolve() not in allowed: raise AssertionError('Non-metadata open: ' + str(self)) @@ -356,12 +399,12 @@ def forbidden(*args,**kwargs): raise AssertionError('Data/network/database I/O') cfg = load_config() for scope, width in [('campus',46),('district',44)]: ds = scope + '_tapr_graduation_profile' - records = cfg.header_records(ds,edition='2025',reader_profile='source') + records = cfg.header_records(ds,edition=str(edition),reader_profile='source') assert len(records) == width - assert cfg.availability_report()['data_sources'][ds]['years'] == [2025] - assert cfg.is_source_only(ds,2025) - assert len(cfg.resolve_dataset(ds,2025).metadata.metrics) == 42 + assert cfg.availability_report()['data_sources'][ds]['years'] == [2024,2025] + assert cfg.is_source_only(ds,edition) + assert len(cfg.resolve_dataset(ds,edition).metadata.metrics) == 42 assert not any(n == p or n.startswith(p + '.') for n in sys.modules for p in heavy) ''' - result = subprocess.run([sys.executable, '-B', '-c', code], cwd=ROOT, capture_output=True, text=True) + result = subprocess.run([sys.executable, '-B', '-c', code.replace('__EDITION__', str(edition))], cwd=ROOT, capture_output=True, text=True) assert result.returncode == 0, result.stdout + result.stderr From 98faf77c9324ae2917ee7cd41cd8d79c17a011db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 13:41:45 -0500 Subject: [PATCH 06/11] Prepare independent 2024 TAPR student and staff sources --- docs/config.md | 34 ++ ...8313cc68af7ef8e8204a246bc2a2fd8de0509.json | 1 + ...2849dec2b5a0d969dacde56f7e5e383aba18c.json | 1 + ...c06e91b2c6c63f18245519677f8b7164684ab.json | 1 + ...a42fedfd480044110da323f310bd20bcd45b7.json | 1 + ...c7e5abad777c87cdca80e5d1a39a2d7150d1e.json | 1 + ...0dbbfc4c4d7c620a1498b1ed965c0bf66aaa7.json | 1 + ...105b3841b517dc70cf01441f8644d231baa3c.json | 1 + ...fc14e06ab55658b496f31064776277b16658c.json | 1 + ...00ec3610d3a14935ad794ae58f5e6e1434a1e.json | 1 + ...3303efacd4b5322b431243db42f50b26f07a5.json | 1 + ...eac233940c006607dc3192dd7e58503029864.json | 1 + ...d6d77e1ed9656b29d83644ac4d021a51074b6.json | 1 + teadata/column_schema.py | 75 +++- teadata/manifest.py | 5 +- .../tapr--2024--staff-profile-crosswalk.json | 1 + ...tapr--2024--student-profile-crosswalk.json | 1 + teadata/scripts/build_tapr_profiles.py | 14 +- teadata/tapr.py | 2 +- teadata/teadata_config.py | 16 +- teadata/teadata_sources.yaml | 356 +++++++++++++++ tests/test_tapr_student_staff_sources.py | 424 ++++++++++++++++++ 22 files changed, 923 insertions(+), 17 deletions(-) create mode 100644 provenance/records/02df3081b6b7178e8d536ee5ceb8313cc68af7ef8e8204a246bc2a2fd8de0509.json create mode 100644 provenance/records/15de5c0052e59b903fa812bd5c62849dec2b5a0d969dacde56f7e5e383aba18c.json create mode 100644 provenance/records/3bb286b5cd21ee5776ca8269c47c06e91b2c6c63f18245519677f8b7164684ab.json create mode 100644 provenance/records/457b51f5da28051f04166675ffca42fedfd480044110da323f310bd20bcd45b7.json create mode 100644 provenance/records/747c65c197c2f8a298d2c0d13c2c7e5abad777c87cdca80e5d1a39a2d7150d1e.json create mode 100644 provenance/records/7751ad5be1a4b99a80902d2d8370dbbfc4c4d7c620a1498b1ed965c0bf66aaa7.json create mode 100644 provenance/records/873673ddd77f0272a9b27d6b35f105b3841b517dc70cf01441f8644d231baa3c.json create mode 100644 provenance/records/9b115abb5b7c0f5ce4ebdd82f36fc14e06ab55658b496f31064776277b16658c.json create mode 100644 provenance/records/af099020dae0691ae9cb783daaf00ec3610d3a14935ad794ae58f5e6e1434a1e.json create mode 100644 provenance/records/b79b0b56bab1386c7e12c64e6373303efacd4b5322b431243db42f50b26f07a5.json create mode 100644 provenance/records/bbcdf5e655c1a2a1e37534a3d42eac233940c006607dc3192dd7e58503029864.json create mode 100644 provenance/records/fdaea8543aff26c718af0d4f7ced6d77e1ed9656b29d83644ac4d021a51074b6.json create mode 100644 teadata/schemas/tapr--2024--staff-profile-crosswalk.json create mode 100644 teadata/schemas/tapr--2024--student-profile-crosswalk.json create mode 100644 tests/test_tapr_student_staff_sources.py diff --git a/docs/config.md b/docs/config.md index 16b9e4a..1be4344 100644 --- a/docs/config.md +++ b/docs/config.md @@ -352,6 +352,40 @@ The producer requires and retains the original acquisition receipts and bytes for source-only datasets; a new local observation does not replace download history. GRAD is never automatically merged with STUD/STAF or entity metadata. +The current 2024 STUD and STAF observations have separate source-only datasets: +`campus_tapr_student_profile`, `district_tapr_student_profile`, +`campus_tapr_staff_profile` and `district_tapr_staff_profile`. Select +`--edition 2024 --family student_profile` or `--family staff_profile` with the +same producer, input directory and canonical reference store. Each produces +one independent table per scope: STUD has 243/242 campus/district columns and +STAF has 106/118. These observations do not replace retained PROF or fill fields +absent from the selected family. PROF retains its 407/420 columns, including +38/42 codes absent from the current three-family union. + +The mixed STUD/STAF tables have an explicit unknown reference period, separate +from publisher edition 2024. Source-reviewed mobility and attrition percent +fields declare 2022–2023, supported by their current dictionary descriptions +and annual glossary page 32. Total enrollment count and total staff FTE declare +the 2023–2024 context documented on pages 28 and 34. Enrollment is an October +snapshot, not an annual cumulative count; no exact observation date is invented. +Staff FTE is not headcount and its unit remains unknown in the current vocabulary. +Other periods and units remain unknown. The one header projection uses exact registered +`MetricDefinition.field` matches: explicit field periods refine unknown table +periods; an omitted registered period uses selected dataset metadata; an +explicit unknown stays unknown. Identities and undeclared fields never inherit +a report year. Conflicting known table/field periods or conflicting definitions +fail before source rows are opened. Config and a frozen catalog use this same +projection, with the catalog consulting only its own bound metadata. + +The new crosswalks preserve all ordered dictionary occurrences, including +identical repeated district definitions, and retain dictionary-only codes +without creating CSV columns. Campus staff `CPSCTOFC` remains undocumented; +dictionary-only `CPSCTOST` is not an alias. Original HTTP receipts retain their +original composite dataset names. The reviewed `csv_headers` source-notes +reference binds exact raw bytes to each independent derivation without +rewriting those receipts. Raw dots, blanks, zeros and the six observed new +positive numeric lexemes remain distinct; no revision cause is inferred. + The `source` reader profile exposes complete header contracts without reading source rows, for example `cfg.header_records("district_tapr_student_staff_profile", edition="2024", reader_profile="source")`. diff --git a/provenance/records/02df3081b6b7178e8d536ee5ceb8313cc68af7ef8e8204a246bc2a2fd8de0509.json b/provenance/records/02df3081b6b7178e8d536ee5ceb8313cc68af7ef8e8204a246bc2a2fd8de0509.json new file mode 100644 index 0000000..552fc34 --- /dev/null +++ b/provenance/records/02df3081b6b7178e8d536ee5ceb8313cc68af7ef8e8204a246bc2a2fd8de0509.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024 Campus Staff Information.csv","sha256":"bead14bbdc54396c8e41e5b744c2aeccf8728df3b819981a9f4270b225c2ea16","size_bytes":4102190},"dataset":"campus_tapr_student_staff_profile","downloaded_at":"2026-10-31T17:39:24.026659+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","append_only_historical_refresh":true,"form_controls":[["_service","marykay"],["_program","perfrept.perfmast.sas"],["_debug","0"],["tapr","all_c"],["ccyy","2024"],["dsname","STAF"],["sumlev","C"],["level","Campus"],["id",""],["prgopt","reports/tapr/dd/dd_tapr_step_7.sas"],["key","SATOF|SPTOF|STTOF|SUTOF|SSTOF|SCTOF|SETOF|SXTOF"],["key","ST00F|ST01F|ST06F|ST11F|ST21F|ST30F|STKID"],["key","SBTOF|SBTOP|SRTOF|SRTOP|SAMIF|SAMIF"],["key","SHEXP|SHTEN|SLEXP|SLTEN|STEXP|STTEN"],["key","STBLF|STHIF|STWHF|STINF|STASF|STPIF|STTWF"],["key","ST00S|ST01S|ST06S|ST11S|ST21S|ST30S"],["key","STMAF|STFEF"],["key","STTOS|SUTOS|SSTOS|STURN|PSCTOSA"],["key","STNOF|STBAF|STMSF|STPHF"],["key","STBIF|STVOF|STCOF|STGIF|STREF|STSPF|STOPF"],["datafmt","csv"]],"http_method":"POST","http_status":200,"publisher_edition":"2024","role":"raw_csv","scope":"campus","source_form_method":"POST","source_selection_receipt_id":"3bb286b5cd21ee5776ca8269c47c06e91b2c6c63f18245519677f8b7164684ab","table":"STAF"},"recorded_at":"2026-10-31T17:39:24.026706+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","requested_year":2024,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","resolved_year":2024,"response_headers":{"content-disposition":"attachment; filename=2024 Campus Staff Information.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Append-only current historical-edition acquisition. Separate STUD/STAF original and source revision; metric periods and units are not inferred from edition or code suffix. Retained PROF and GRAD originals remain independent.","period":{"kind":"unknown"},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2024 Campus Staff Information current source observation","version":"2024"}} diff --git a/provenance/records/15de5c0052e59b903fa812bd5c62849dec2b5a0d969dacde56f7e5e383aba18c.json b/provenance/records/15de5c0052e59b903fa812bd5c62849dec2b5a0d969dacde56f7e5e383aba18c.json new file mode 100644 index 0000000..a1abbe6 --- /dev/null +++ b/provenance/records/15de5c0052e59b903fa812bd5c62849dec2b5a0d969dacde56f7e5e383aba18c.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-d-STAF-selection.html","sha256":"a5d682dde8c30afc955f3693e6a7911fa165b3acd8055a0cfb640a017932c840","size_bytes":58720},"dataset":"tapr_2024_family_selection","downloaded_at":"2026-10-31T17:05:02.819029+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_selection","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:05:02.819054+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STAF","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STAF","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_selection","version":"2024"}} diff --git a/provenance/records/3bb286b5cd21ee5776ca8269c47c06e91b2c6c63f18245519677f8b7164684ab.json b/provenance/records/3bb286b5cd21ee5776ca8269c47c06e91b2c6c63f18245519677f8b7164684ab.json new file mode 100644 index 0000000..0bf88e0 --- /dev/null +++ b/provenance/records/3bb286b5cd21ee5776ca8269c47c06e91b2c6c63f18245519677f8b7164684ab.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-c-STAF-selection.html","sha256":"5026de1af092315800f80e81fb05ee1dba82bca6a15490d35f5150c20d5f73c8","size_bytes":57952},"dataset":"tapr_2024_family_selection","downloaded_at":"2026-10-31T17:03:22.009853+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_selection","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:22.009900+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STAF","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STAF","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_selection","version":"2024"}} diff --git a/provenance/records/457b51f5da28051f04166675ffca42fedfd480044110da323f310bd20bcd45b7.json b/provenance/records/457b51f5da28051f04166675ffca42fedfd480044110da323f310bd20bcd45b7.json new file mode 100644 index 0000000..bd205d1 --- /dev/null +++ b/provenance/records/457b51f5da28051f04166675ffca42fedfd480044110da323f310bd20bcd45b7.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-d-STUD-dictionary.html","sha256":"b38d8255e5717bc82a8b7083d2fbc34cd8be9f19c88fc2d65807552ecf97934b","size_bytes":212709},"dataset":"tapr_2024_family_dictionary","downloaded_at":"2026-10-31T17:05:02.467502+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_dictionary","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:05:02.467538+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_dictionary","version":"2024"}} diff --git a/provenance/records/747c65c197c2f8a298d2c0d13c2c7e5abad777c87cdca80e5d1a39a2d7150d1e.json b/provenance/records/747c65c197c2f8a298d2c0d13c2c7e5abad777c87cdca80e5d1a39a2d7150d1e.json new file mode 100644 index 0000000..15fc628 --- /dev/null +++ b/provenance/records/747c65c197c2f8a298d2c0d13c2c7e5abad777c87cdca80e5d1a39a2d7150d1e.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-c-STAF-dictionary.html","sha256":"e25bc3ae475bbd756b324ccefa839ded1f7e7106aee9e5bbf2990193fea4a4be","size_bytes":124980},"dataset":"tapr_2024_family_dictionary","downloaded_at":"2026-10-31T17:03:51.899677+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_dictionary","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:51.899701+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_dictionary","version":"2024"}} diff --git a/provenance/records/7751ad5be1a4b99a80902d2d8370dbbfc4c4d7c620a1498b1ed965c0bf66aaa7.json b/provenance/records/7751ad5be1a4b99a80902d2d8370dbbfc4c4d7c620a1498b1ed965c0bf66aaa7.json new file mode 100644 index 0000000..5565e63 --- /dev/null +++ b/provenance/records/7751ad5be1a4b99a80902d2d8370dbbfc4c4d7c620a1498b1ed965c0bf66aaa7.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024 District Student Information.csv","sha256":"f595728ad54e4e49986fc060ee8f492964127ebb8f6b262b725e1daf30c96984","size_bytes":1056080},"dataset":"district_tapr_student_staff_profile","downloaded_at":"2026-10-31T17:39:24.317554+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","append_only_historical_refresh":true,"form_controls":[["_service","marykay"],["_program","perfrept.perfmast.sas"],["_debug","0"],["tapr","all_d"],["ccyy","2024"],["dsname","STUD"],["sumlev","D"],["level","District"],["id",""],["prgopt","reports/tapr/dd/dd_tapr_step_7.sas"],["key","ETALL|NTALL"],["key","ETBIL|ETVOC|ETVHS|ETGIF|ETSPE"],["key","ETGEEC|ETGEEP|ETGPKC|ETGPKP|ETGP3C|ETGP3P|ETGP4C|ETGP4P|ETGKNC|ETGKNP|ETG01C|ETG01P|ETG02C|ETG02P|ETG03C|ETG03P|ETG04C|ETG04P|ETG05C|ETG05P|ETG06C|ETG06P|ETG07C|ETG07P|ETG08C|ETG08P|ETG09C|ETG09P|ETG10C|ETG10P|ETG11C|ETG11P|ETG12C|ETG12P"],["key","NTBIL|NTVOC|NTVHS|NTGIF|NTSPE"],["key","NTGEEC|NTGEEP|NTGPKC|NTGPKP|NTGP3C|NTGP3P|NTGP4C|NTGP4P|NTGKNC|NTGKNP|NTG01C|NTG01P|NTG02C|NTG02P|NTG03C|NTG03P|NTG04C|NTG04P|NTG05C|NTG05P|NTG06C|NTG06P|NTG07C|NTG07P|NTG08C|NTG08P|NTG09C|NTG09P|NTG10C|NTG10P|NTG11C|NTG11P|NTG12C|NTG12P"],["key","ETSIM|ETSIN|ETSIN|ETSPH|ETSPH|ETSAU|ETSAU|ETSBH|ETSBH|ETSNO|ETSNO"],["key","ETBLAC|ETBLAP|ETHISC|ETHISP|ETWHIC|ETWHIP|ETINDC|ETINDP|ETASIC|ETASIP|ETPCIC|ETPCIP|ETTWOC|ETTWOP"],["key","EMALL|EMBLA|EMHIS|EMWHI|EMIND|EMASI|EMPCI|EMTWO|EMSPE|EMLEP|EMECO|ETATT"],["key","NTBLAC|NTBLAP|NTHISC|NTHISP|NTWHIC|NTWHIP|NTINDC|NTINDP|NTASIC|NTASIP|NTPCIC|NTPCIP|NTTWOC|NTTWOP"],["key","PERR|ERS"],["key","ETFEM|NTFEM|ETMAL|NTMAL"],["key","AUND"],["key","ETECO|ETNED|ET504|ETLEP|ETDIS|ETDSL|ETFOS|ETHOM|ETIMM|ETMIG|ETTT1|ETMLC|ETRSK"],["key","CTGKGA|CTG01A|CTG02A|CTG03A|CTG04A|CTG05A|CTG06A|CTENGA|CTFLAA|CTMATA|CTSCIA|CTSOCA"],["key","NTECO|NTNED|NT504|NTLEP|NTDSL|NTFOS|NTHOM|NTIMM|NTMIG|NTTT1|NTMLC|NTRSK|NTBIL"],["datafmt","csv"]],"http_method":"POST","http_status":200,"publisher_edition":"2024","role":"raw_csv","scope":"district","source_form_method":"POST","source_selection_receipt_id":"bbcdf5e655c1a2a1e37534a3d42eac233940c006607dc3192dd7e58503029864","table":"STUD"},"recorded_at":"2026-10-31T17:39:24.317614+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","requested_year":2024,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","resolved_year":2024,"response_headers":{"content-disposition":"attachment; filename=2024 District Student Information.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Append-only current historical-edition acquisition. Separate STUD/STAF original and source revision; metric periods and units are not inferred from edition or code suffix. Retained PROF and GRAD originals remain independent.","period":{"kind":"unknown"},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2024 District Student Information current source observation","version":"2024"}} diff --git a/provenance/records/873673ddd77f0272a9b27d6b35f105b3841b517dc70cf01441f8644d231baa3c.json b/provenance/records/873673ddd77f0272a9b27d6b35f105b3841b517dc70cf01441f8644d231baa3c.json new file mode 100644 index 0000000..f2e922d --- /dev/null +++ b/provenance/records/873673ddd77f0272a9b27d6b35f105b3841b517dc70cf01441f8644d231baa3c.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-c-STUD-selection.html","sha256":"1b97e003c153c6102b740180959050d162afbf52e85d28170a3879376248352b","size_bytes":60192},"dataset":"tapr_2024_family_selection","downloaded_at":"2026-10-31T17:03:21.707465+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_selection","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:21.707502+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STUD","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STUD","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_selection","version":"2024"}} diff --git a/provenance/records/9b115abb5b7c0f5ce4ebdd82f36fc14e06ab55658b496f31064776277b16658c.json b/provenance/records/9b115abb5b7c0f5ce4ebdd82f36fc14e06ab55658b496f31064776277b16658c.json new file mode 100644 index 0000000..e8e43a8 --- /dev/null +++ b/provenance/records/9b115abb5b7c0f5ce4ebdd82f36fc14e06ab55658b496f31064776277b16658c.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024 Campus Student Information.csv","sha256":"8dc181ee75c5da8451a45c8f405f8cbc8fe9987efb198d9ded90d7d512f161a0","size_bytes":6968991},"dataset":"campus_tapr_student_staff_profile","downloaded_at":"2026-10-31T17:39:23.486407+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","append_only_historical_refresh":true,"form_controls":[["_service","marykay"],["_program","perfrept.perfmast.sas"],["_debug","0"],["tapr","all_c"],["ccyy","2024"],["dsname","STUD"],["sumlev","C"],["level","Campus"],["id",""],["prgopt","reports/tapr/dd/dd_tapr_step_7.sas"],["key","ETALL|NTALL"],["key","NTECO|NTNED|NT504|NTLEP|NTDSL|NTFOS|NTHOM|NTIMM|NTMIG|NTTT1|NTMLC|NTRSK|NTBIL"],["key","ETGEEC|ETGEEP|ETGPKC|ETGPKP|ETGP3C|ETGP3P|ETGP4C|ETGP4P|ETGKNC|ETGKNP|ETG01C|ETG01P|ETG02C|ETG02P|ETG03C|ETG03P|ETG04C|ETG04P|ETG05C|ETG05P|ETG06C|ETG06P|ETG07C|ETG07P|ETG08C|ETG08P|ETG09C|ETG09P|ETG10C|ETG10P|ETG11C|ETG11P|ETG12C|ETG12P"],["key","ETBIL|ETVOC|ETVHS|ETGIF|ETSPE"],["key","NTGEEC|NTGEEP|NTGPKC|NTGPKP|NTGP3C|NTGP3P|NTGP4C|NTGP4P|NTGKNC|NTGKNP|NTG01C|NTG01P|NTG02C|NTG02P|NTG03C|NTG03P|NTG04C|NTG04P|NTG05C|NTG05P|NTG06C|NTG06P|NTG07C|NTG07P|NTG08C|NTG08P|NTG09C|NTG09P|NTG10C|NTG10P|NTG11C|NTG11P|NTG12C|NTG12P"],["key","NTBIL|NTVOC|NTVHS|NTGIF|NTSPE"],["key","ETBLAC|ETBLAP|ETHISC|ETHISP|ETWHIC|ETWHIP|ETINDC|ETINDP|ETASIC|ETASIP|ETPCIC|ETPCIP|ETTWOC|ETTWOP"],["key","ETSIM|ETSIN|ETSIN|ETSPH|ETSPH|ETSAU|ETSAU|ETSBH|ETSBH|ETSNO|ETSNO"],["key","NTBLAC|NTBLAP|NTHISC|NTHISP|NTWHIC|NTWHIP|NTINDC|NTINDP|NTASIC|NTASIP|NTPCIC|NTPCIP|NTTWOC|NTTWOP"],["key","EMALL|EMBLA|EMHIS|EMWHI|EMIND|EMASI|EMPCI|EMTWO|EMSPE|EMLEP|EMECO|ETATT"],["key","ETFEM|NTFEM|ETMAL|NTMAL"],["key","PERR|ERS"],["key","ETECO|ETNED|ET504|ETLEP|ETDIS|ETDSL|ETFOS|ETHOM|ETIMM|ETMIG|ETTT1|ETMLC|ETRSK"],["key","CTGKGA|CTG01A|CTG02A|CTG03A|CTG04A|CTG05A|CTG06A|CTENGA|CTFLAA|CTMATA|CTSCIA|CTSOCA"],["datafmt","csv"]],"http_method":"POST","http_status":200,"publisher_edition":"2024","role":"raw_csv","scope":"campus","source_form_method":"POST","source_selection_receipt_id":"873673ddd77f0272a9b27d6b35f105b3841b517dc70cf01441f8644d231baa3c","table":"STUD"},"recorded_at":"2026-10-31T17:39:23.486478+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","requested_year":2024,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","resolved_year":2024,"response_headers":{"content-disposition":"attachment; filename=2024 Campus Student Information.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Append-only current historical-edition acquisition. Separate STUD/STAF original and source revision; metric periods and units are not inferred from edition or code suffix. Retained PROF and GRAD originals remain independent.","period":{"kind":"unknown"},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2024 Campus Student Information current source observation","version":"2024"}} diff --git a/provenance/records/af099020dae0691ae9cb783daaf00ec3610d3a14935ad794ae58f5e6e1434a1e.json b/provenance/records/af099020dae0691ae9cb783daaf00ec3610d3a14935ad794ae58f5e6e1434a1e.json new file mode 100644 index 0000000..d1c9025 --- /dev/null +++ b/provenance/records/af099020dae0691ae9cb783daaf00ec3610d3a14935ad794ae58f5e6e1434a1e.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-c-STUD-dictionary.html","sha256":"71b163012db6b6b8c59e247be815428627dec22e7d0c6c7ca8d48cad02145ad7","size_bytes":210691},"dataset":"tapr_2024_family_dictionary","downloaded_at":"2026-10-31T17:03:51.543988+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_dictionary","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:03:51.544011+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_dictionary","version":"2024"}} diff --git a/provenance/records/b79b0b56bab1386c7e12c64e6373303efacd4b5322b431243db42f50b26f07a5.json b/provenance/records/b79b0b56bab1386c7e12c64e6373303efacd4b5322b431243db42f50b26f07a5.json new file mode 100644 index 0000000..275941e --- /dev/null +++ b/provenance/records/b79b0b56bab1386c7e12c64e6373303efacd4b5322b431243db42f50b26f07a5.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024 District Staff Information.csv","sha256":"f1107353cdaacc78085fbc0621f1696cd14faf276052d8c9d879f29e53f281c3","size_bytes":630914},"dataset":"district_tapr_student_staff_profile","downloaded_at":"2026-10-31T17:39:24.565622+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","append_only_historical_refresh":true,"form_controls":[["_service","marykay"],["_program","perfrept.perfmast.sas"],["_debug","0"],["tapr","all_d"],["ccyy","2024"],["dsname","STAF"],["sumlev","D"],["level","District"],["id",""],["prgopt","reports/tapr/dd/dd_tapr_step_7.sas"],["key","SATOF|SPTOF|STTOF|SUTOF|SSTOF|SCTOF|SETOF|SXTOF"],["key","SHEXP|SHTEN|SLEXP|SLTEN|STEXP|STTEN"],["key","SBTOF|SBTOP|SRTOF|SRTOP|SAMIF|SAMIF"],["key","ST00S|ST01S|ST06S|ST11S|ST21S|ST30S"],["key","STBLF|STHIF|STWHF|STINF|STASF|STPIF|STTWF"],["key","STTOS|SUTOS|SSTOS|STURN|PSCTOSA"],["key","STMAF|STFEF"],["key","SECOF|SETOF|SXTOF|SOTOF"],["key","STNOF|STBAF|STMSF|STPHF"],["key","RECHCNT|EXPHCNT|MSTHCNT|RECAVGP|EXPAVGP|MSTAVGP|PSAINHP"],["key","ST00F|ST01F|ST06F|ST11F|ST21F|ST30F|STKID"],["key","STBIF|STVOF|STCOF|STGIF|STREF|STSPF|STOPF"],["datafmt","csv"]],"http_method":"POST","http_status":200,"publisher_edition":"2024","role":"raw_csv","scope":"district","source_form_method":"POST","source_selection_receipt_id":"15de5c0052e59b903fa812bd5c62849dec2b5a0d969dacde56f7e5e383aba18c","table":"STAF"},"recorded_at":"2026-10-31T17:39:24.565660+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","requested_year":2024,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker/","resolved_year":2024,"response_headers":{"content-disposition":"attachment; filename=2024 District Staff Information.csv","content-type":"text/&content_type.-separated-values"},"schema_version":1,"section":"data_sources","source_metadata":{"identifiers":[],"metrics":{},"notes":"Append-only current historical-edition acquisition. Separate STUD/STAF original and source revision; metric periods and units are not inferred from edition or code suffix. Retained PROF and GRAD originals remain independent.","period":{"kind":"unknown"},"provenance_ids":[],"publisher":"Texas Education Agency","references":[],"title":"2024 District Staff Information current source observation","version":"2024"}} diff --git a/provenance/records/bbcdf5e655c1a2a1e37534a3d42eac233940c006607dc3192dd7e58503029864.json b/provenance/records/bbcdf5e655c1a2a1e37534a3d42eac233940c006607dc3192dd7e58503029864.json new file mode 100644 index 0000000..08fc52f --- /dev/null +++ b/provenance/records/bbcdf5e655c1a2a1e37534a3d42eac233940c006607dc3192dd7e58503029864.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-d-STUD-selection.html","sha256":"df9388b25d3fa9db851028a12284b7b83179248b1bd79da9fa39df91d6680b82","size_bytes":60774},"dataset":"tapr_2024_family_selection","downloaded_at":"2026-10-31T17:05:02.013259+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_selection","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:05:02.013286+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STUD","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STUD","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_selection","version":"2024"}} diff --git a/provenance/records/fdaea8543aff26c718af0d4f7ced6d77e1ed9656b29d83644ac4d021a51074b6.json b/provenance/records/fdaea8543aff26c718af0d4f7ced6d77e1ed9656b29d83644ac4d021a51074b6.json new file mode 100644 index 0000000..c30762b --- /dev/null +++ b/provenance/records/fdaea8543aff26c718af0d4f7ced6d77e1ed9656b29d83644ac4d021a51074b6.json @@ -0,0 +1 @@ +{"artifact":{"filename":"2024-d-STAF-dictionary.html","sha256":"64c41ab6871956220100fbe6006b569a1187965420429d1144d9d31756a1dc6a","size_bytes":138474},"dataset":"tapr_2024_family_dictionary","downloaded_at":"2026-10-31T17:05:03.233361+00:00","kind":"acquisition","method":"download","parameters":{"acquisition_client_sha256":"91066d8b0507fbb2bb22bc6e18a03ce773bb0d215dc3dbd72fed374cbc95d4ad","audit":"download_family_coverage","edition":"2024","http_method":"GET","http_status":200,"max_bytes":2097152,"role":"family_dictionary","scope":"small official navigation/reference metadata; no statewide dataset download","timeout_seconds":15},"recorded_at":"2026-10-31T17:05:03.233385+00:00","requested_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","requested_year":null,"resolved_url":"https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas","resolved_year":2024,"response_headers":{"content-type":"text/html; charset=iso-8859-1"},"schema_version":1,"section":"reference","source_metadata":{"identifiers":[],"metrics":{},"notes":"Current bounded metadata acquisition only. No dataset rows or original historical acquisition are inferred.","period":{"kind":"unknown"},"provenance_ids":[],"references":[],"title":"Official TEA TAPR 2024 family_dictionary","version":"2024"}} diff --git a/teadata/column_schema.py b/teadata/column_schema.py index 9c72a4a..dd4d39e 100644 --- a/teadata/column_schema.py +++ b/teadata/column_schema.py @@ -7,7 +7,10 @@ import keyword from pathlib import Path, PurePosixPath import re -from typing import Any, Iterable, Mapping +from typing import TYPE_CHECKING, Any, Iterable, Mapping + +if TYPE_CHECKING: + from .dataset_metadata import DatasetMetadata def has_default_reader(reader: Mapping[str, Any]) -> bool: @@ -79,7 +82,7 @@ def validate_header_table(table: Mapping[str, Any]) -> None: """Validate one explicit mapping; never synthesize or deduplicate names.""" if (not isinstance(table, dict) or not {"table", "input_sha256", "source_schema_sha256", "fields"} <= set(table) - or set(table) - {"table", "input_sha256", "source_schema_sha256", "fields", "layout", "dictionary", "metric_period"} + or set(table) - {"table", "input_sha256", "source_schema_sha256", "fields", "layout", "dictionary", "metric_period", "dictionary_records"} or not isinstance(table["table"], str) or not table["table"].strip() or not _checksum(table["input_sha256"]) or not _checksum(table["source_schema_sha256"]) or not isinstance(table["fields"], list) or not table["fields"]): @@ -100,6 +103,21 @@ def validate_header_table(table: Mapping[str, Any]) -> None: or not isinstance(dictionary["sheet_name"], str) or not dictionary["sheet_name"]): raise ValueError("Invalid source dictionary reference") _adjacent_filename(dictionary["filename"]) + definitions: dict[str, tuple[str, str]] = {} + if "dictionary_records" in table: + records = table["dictionary_records"] + if not isinstance(records, list) or not records: + raise ValueError("Publisher dictionary records must retain their ordered occurrences") + for ordinal, record in enumerate(records, 1): + if (not isinstance(record, dict) + or set(record) != {"ordinal", "code", "publisher_type", "publisher_description"} + or type(record["ordinal"]) is not int or record["ordinal"] != ordinal + or any(not isinstance(record[key], str) or not record[key].strip() + for key in ("code", "publisher_type", "publisher_description"))): + raise ValueError("Invalid publisher dictionary occurrence") + definition = record["publisher_type"], record["publisher_description"] + if definitions.setdefault(record["code"], definition) != definition: + raise ValueError(f"Conflicting publisher dictionary definitions for {record['code']!r}") seen_codes, seen_fields = set(), set() for position, field in enumerate(table["fields"], 1): if (not isinstance(field, dict) @@ -128,6 +146,13 @@ def validate_header_table(table: Mapping[str, Any]) -> None: raise ValueError(f"Invalid publisher metadata in column {position}") if field.get("disposition", "fact") not in {"identity", "fact"}: raise ValueError(f"Unaccounted source column {position}; retain an identity or fact") + if "dictionary_records" in table: + definition = definitions.get(field["code"]) + status = field.get("dictionary_status") + if ((status == "documented" and definition != (field.get("publisher_type"), field.get("publisher_description"))) + or (status in {"not_applicable", "not_documented"} and definition is not None) + or status is None): + raise ValueError(f"Source column {position} differs from its publisher dictionary occurrences") if "dictionary" in table and not {"publisher_type", "publisher_length", "disposition"} <= set(field): raise ValueError(f"Missing publisher dictionary metadata in column {position}") name = field["field"] @@ -270,17 +295,49 @@ def validate_selected_crosswalk(document: Mapping[str, Any], *, dataset: str, ed def header_records(document: Mapping[str, Any], *, dataset: str, edition: str, - table: str | None = None) -> list[dict[str, Any]]: + table: str | None = None, + metadata: DatasetMetadata | None = None) -> list[dict[str, Any]]: + """Project reviewed field periods from this selected metadata, never report years. + + Exact MetricDefinition fields use their explicit period, or the selected + dataset period when omitted, as catalog metric resolution does. Undeclared + names never acquire a period from a field prefix or report year. + """ + from .dataset_metadata import DataPeriod + selected = crosswalk_dataset(document, dataset, edition) tables = [item for item in selected["tables"] if table is None or item["table"] == table] if not tables: raise ValueError(f"Header crosswalk table unavailable: {table!r}") - return [{**field, "dataset": dataset, "edition": edition, "table": item["table"], - "mapping_version": document["mapping_version"], "input_sha256": item["input_sha256"], - "source_schema_sha256": item["source_schema_sha256"], - **({"period": dict(item["metric_period"]) if field.get("disposition", "fact") == "fact" - else {"kind": "unknown"}} if "metric_period" in item else {})} - for item in tables for field in item["fields"]] + periods: dict[str, DataPeriod] = {} + if metadata is not None: + for definition in metadata.metrics.values(): + period = definition.period if definition.period is not None else metadata.period + if periods.setdefault(definition.field, period) != period: + raise ValueError(f"Conflicting reviewed field periods for {definition.field!r}") + result = [] + for item in tables: + default = DataPeriod.from_dict(item.get("metric_period")) + if (metadata is not None and metadata.period.kind != "unknown" and default.kind != "unknown" + and metadata.period != default): + raise ValueError("Source metric period differs from its declared source metadata") + occurrences: dict[str, list[dict[str, Any]]] = {} + for row in item.get("dictionary_records", ()): + occurrences.setdefault(row["code"], []).append(row) + for field in item["fields"]: + identity = field.get("disposition", "fact") == "identity" + reviewed = periods.get(field["field"]) + if (not identity and reviewed is not None and reviewed.kind != "unknown" + and default.kind != "unknown" and reviewed != default): + raise ValueError(f"Conflicting known table/field periods for {field['field']!r}") + period = DataPeriod() if identity else reviewed if reviewed is not None else default + record = {**field, "dataset": dataset, "edition": edition, "table": item["table"], + "mapping_version": document["mapping_version"], "input_sha256": item["input_sha256"], + "source_schema_sha256": item["source_schema_sha256"], "period": period.to_dict()} + if "dictionary_records" in item: + record["dictionary_occurrences"] = [dict(row) for row in occurrences.get(field["code"], ())] + result.append(record) + return result def header_rename_map(records: list[dict[str, Any]], *, from_: str = "code", to: str = "field", diff --git a/teadata/manifest.py b/teadata/manifest.py index a3d7da0..7769e0e 100644 --- a/teadata/manifest.py +++ b/teadata/manifest.py @@ -226,6 +226,8 @@ def __init__(self, document: Mapping[str, Any], *, expected_build_id: str | None validate_selected_crosswalk(self._column_schemas[crosswalk_sha], dataset=key, edition=metadata.version, input_sha256=artifact["sha256"], columns=read["columns"]) + crosswalk_records(self._column_schemas[crosswalk_sha], dataset=key, + edition=metadata.version, metadata=metadata) except (KeyError, ValueError) as error: raise ContractError(f"Invalid selected header crosswalk: {error}") from error self._build_id = identity @@ -322,7 +324,8 @@ def header_records(self, dataset: str, *, edition: str | None = None, if digest is None or selected is None: raise ContractError(f"Header crosswalk unavailable for selected dataset {dataset!r}") try: - return crosswalk_records(self._column_schemas[digest], dataset=dataset, edition=selected, table=table) + return crosswalk_records(self._column_schemas[digest], dataset=dataset, edition=selected, + table=table, metadata=metadata) except ValueError as error: raise ContractError(str(error)) from error diff --git a/teadata/schemas/tapr--2024--staff-profile-crosswalk.json b/teadata/schemas/tapr--2024--staff-profile-crosswalk.json new file mode 100644 index 0000000..e85b923 --- /dev/null +++ b/teadata/schemas/tapr--2024--staff-profile-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_staff_profile","edition":"2024","source_only":true,"tables":[{"dictionary_records":[{"code":"CPSATOFC","ordinal":1,"publisher_description":"Campus 2024 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSPTOFC","ordinal":2,"publisher_description":"Campus 2024 Staff Professional Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSPTOFP","ordinal":3,"publisher_description":"Campus 2024 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTTOFC","ordinal":4,"publisher_description":"Campus 2024 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTOFP","ordinal":5,"publisher_description":"Campus 2024 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSUTOFC","ordinal":6,"publisher_description":"Campus 2024 Staff Support Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSUTOFP","ordinal":7,"publisher_description":"Campus 2024 Staff Support Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSSTOFC","ordinal":8,"publisher_description":"Campus 2024 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSSTOFP","ordinal":9,"publisher_description":"Campus 2024 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSETOFC","ordinal":10,"publisher_description":"Campus 2024 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSETOFP","ordinal":11,"publisher_description":"Campus 2024 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSBTOFC","ordinal":12,"publisher_description":"Campus 2024 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSBTOPC","ordinal":13,"publisher_description":"Campus 2024 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number"},{"code":"CPSRTOFC","ordinal":14,"publisher_description":"Campus 2024 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSRTOPC","ordinal":15,"publisher_description":"Campus 2024 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number"},{"code":"CPSAMIFC","ordinal":16,"publisher_description":"Campus 2024 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSAMIFP","ordinal":17,"publisher_description":"Campus 2024 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBLFC","ordinal":18,"publisher_description":"Campus 2024 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBLFP","ordinal":19,"publisher_description":"Campus 2024 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTHIFC","ordinal":20,"publisher_description":"Campus 2024 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTHIFP","ordinal":21,"publisher_description":"Campus 2024 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTWHFC","ordinal":22,"publisher_description":"Campus 2024 Staff Teacher White Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTWHFP","ordinal":23,"publisher_description":"Campus 2024 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTINFC","ordinal":24,"publisher_description":"Campus 2024 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTINFP","ordinal":25,"publisher_description":"Campus 2024 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTASFC","ordinal":26,"publisher_description":"Campus 2024 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTASFP","ordinal":27,"publisher_description":"Campus 2024 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTPIFC","ordinal":28,"publisher_description":"Campus 2024 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTPIFP","ordinal":29,"publisher_description":"Campus 2024 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTTWFC","ordinal":30,"publisher_description":"Campus 2024 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTWFP","ordinal":31,"publisher_description":"Campus 2024 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTMAFC","ordinal":32,"publisher_description":"Campus 2024 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTMAFP","ordinal":33,"publisher_description":"Campus 2024 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTFEFC","ordinal":34,"publisher_description":"Campus 2024 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTFEFP","ordinal":35,"publisher_description":"Campus 2024 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTNOFC","ordinal":36,"publisher_description":"Campus 2024 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTNOFP","ordinal":37,"publisher_description":"Campus 2024 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBAFC","ordinal":38,"publisher_description":"Campus 2024 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBAFP","ordinal":39,"publisher_description":"Campus 2024 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTMSFC","ordinal":40,"publisher_description":"Campus 2024 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTMSFP","ordinal":41,"publisher_description":"Campus 2024 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTPHFC","ordinal":42,"publisher_description":"Campus 2024 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTPHFP","ordinal":43,"publisher_description":"Campus 2024 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST00FC","ordinal":44,"publisher_description":"Campus 2024 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST00FP","ordinal":45,"publisher_description":"Campus 2024 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST01FC","ordinal":46,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST01FP","ordinal":47,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST06FC","ordinal":48,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST06FP","ordinal":49,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST11FC","ordinal":50,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST11FP","ordinal":51,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST21FC","ordinal":52,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST21FP","ordinal":53,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST30FC","ordinal":54,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST30FP","ordinal":55,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTKIDR","ordinal":56,"publisher_description":"Campus 2024 Staff Teacher Student Ratio","publisher_type":"Number"},{"code":"CPSHEXPA","ordinal":57,"publisher_description":"Campus 2024 Staff Principal Experience Average","publisher_type":"Number"},{"code":"CPSHEXPT","ordinal":58,"publisher_description":"Campus 2024 Staff Principal Experience Total","publisher_type":"Number"},{"code":"CPSHTENA","ordinal":59,"publisher_description":"Campus 2024 Staff Principal Tenure Average","publisher_type":"Number"},{"code":"CPSHTENT","ordinal":60,"publisher_description":"Campus 2024 Staff Principal Tenure Total","publisher_type":"Number"},{"code":"CPSLEXPA","ordinal":61,"publisher_description":"Campus 2024 Staff Assistant Principal Experience Average","publisher_type":"Number"},{"code":"CPSLEXPT","ordinal":62,"publisher_description":"Campus 2024 Staff Assistant Principal Experience Total","publisher_type":"Number"},{"code":"CPSLTENA","ordinal":63,"publisher_description":"Campus 2024 Staff Assistant Principal Tenure Average","publisher_type":"Number"},{"code":"CPSLTENT","ordinal":64,"publisher_description":"Campus 2024 Staff Assistant Principal Tenure Total","publisher_type":"Number"},{"code":"CPSTEXPA","ordinal":65,"publisher_description":"Campus 2024 Staff Teacher Experience Average","publisher_type":"Number"},{"code":"CPSTEXPT","ordinal":66,"publisher_description":"Campus 2024 Staff Teacher Experience Total","publisher_type":"Number"},{"code":"CPSTTENA","ordinal":67,"publisher_description":"Campus 2024 Staff Teacher Tenure Average","publisher_type":"Number"},{"code":"CPSTTENT","ordinal":68,"publisher_description":"Campus 2024 Staff Teacher Tenure Total","publisher_type":"Number"},{"code":"CPST00SA","ordinal":69,"publisher_description":"Campus 2024 Staff Teacher Beginning Base Salary Average","publisher_type":"Number"},{"code":"CPST00ST","ordinal":70,"publisher_description":"Campus 2024 Staff Teacher Beginning Base Salary Total","publisher_type":"Number"},{"code":"CPST01SA","ordinal":71,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST01ST","ordinal":72,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST06SA","ordinal":73,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST06ST","ordinal":74,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST11SA","ordinal":75,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST11ST","ordinal":76,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST21SA","ordinal":77,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST21ST","ordinal":78,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST30SA","ordinal":79,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST30ST","ordinal":80,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number"},{"code":"CPSTTOSA","ordinal":81,"publisher_description":"Campus 2024 Staff Teacher Total Base Salary Average","publisher_type":"Number"},{"code":"CPSTTOST","ordinal":82,"publisher_description":"Campus 2024 Staff Teacher Total Base Salary Total","publisher_type":"Number"},{"code":"CPSUTOSA","ordinal":83,"publisher_description":"Campus 2024 Staff Support Total Base Salary Average","publisher_type":"Number"},{"code":"CPSUTOST","ordinal":84,"publisher_description":"Campus 2024 Staff Support Total Base Salary Total","publisher_type":"Number"},{"code":"CPSSTOSA","ordinal":85,"publisher_description":"Campus 2024 Staff School Admin Total Base Salary Average","publisher_type":"Number"},{"code":"CPSSTOST","ordinal":86,"publisher_description":"Campus 2024 Staff School Admin Total Base Salary Total","publisher_type":"Number"},{"code":"CPSCTOSA","ordinal":87,"publisher_description":"Campus 2024 Staff Central Admin Total Base Salary Average","publisher_type":"Number"},{"code":"CPSCTOST","ordinal":88,"publisher_description":"Campus 2024 Staff Central Admin Total Base Salary Total","publisher_type":"Number"},{"code":"CPSTBIFC","ordinal":89,"publisher_description":"Campus 2024 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBIFP","ordinal":90,"publisher_description":"Campus 2024 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTVOFC","ordinal":91,"publisher_description":"Campus 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTVOFP","ordinal":92,"publisher_description":"Campus 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTCOFC","ordinal":93,"publisher_description":"Campus 2024 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTCOFP","ordinal":94,"publisher_description":"Campus 2024 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTGIFC","ordinal":95,"publisher_description":"Campus 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTGIFP","ordinal":96,"publisher_description":"Campus 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTREFC","ordinal":97,"publisher_description":"Campus 2024 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTREFP","ordinal":98,"publisher_description":"Campus 2024 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTSPFC","ordinal":99,"publisher_description":"Campus 2024 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTSPFP","ordinal":100,"publisher_description":"Campus 2024 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTOPFC","ordinal":101,"publisher_description":"Campus 2024 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTOPFP","ordinal":102,"publisher_description":"Campus 2024 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number"}],"fields":[{"code":"CAMPUS","dictionary_status":"not_applicable","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"CAMPNAME","dictionary_status":"not_applicable","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_description":null,"publisher_type":null},{"code":"CPSTTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_total_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Total Full Time Equiv Count","position":5,"publisher_description":"Campus 2024 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSUTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_support_total_full_time_equiv_count","label":"Campus 2024 Staff: Support Total Full Time Equiv Count","position":6,"publisher_description":"Campus 2024 Staff Support Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSSTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_school_admin_total_full_time_equiv_count","label":"Campus 2024 Staff: School Admin Total Full Time Equiv Count","position":7,"publisher_description":"Campus 2024 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSCTOFC","dictionary_status":"not_documented","disposition":"fact","field":"campus_2024_staff_central_admin_total_full_time_equiv_count","label":"Campus 2024 Staff: Central Admin Total Full Time Equiv Count","position":8,"publisher_description":null,"publisher_type":null},{"code":"CPSETOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_educ_aide_total_full_time_equiv_count","label":"Campus 2024 Staff: Educ Aide Total Full Time Equiv Count","position":9,"publisher_description":"Campus 2024 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTOST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_total_base_salary_total","label":"Campus 2024 Staff: Teacher Total Base Salary Total","position":10,"publisher_description":"Campus 2024 Staff Teacher Total Base Salary Total","publisher_type":"Number"},{"code":"CPSUTOST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_support_total_base_salary_total","label":"Campus 2024 Staff: Support Total Base Salary Total","position":11,"publisher_description":"Campus 2024 Staff Support Total Base Salary Total","publisher_type":"Number"},{"code":"CPSSTOST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_school_admin_total_base_salary_total","label":"Campus 2024 Staff: School Admin Total Base Salary Total","position":12,"publisher_description":"Campus 2024 Staff School Admin Total Base Salary Total","publisher_type":"Number"},{"code":"CPST00FC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_beginning_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Beginning Full Time Equiv Count","position":13,"publisher_description":"Campus 2024 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST01FC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 1-5 Years Full Time Equiv Count","position":14,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST06FC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 6-10 Years Full Time Equiv Count","position":15,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST11FC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 11-20 Years Full Time Equiv Count","position":16,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST21FC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher 21-30 Years Full Time Equiv Count","position":17,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST30FC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_full_time_equiv_count","label":"Campus 2024 Staff: Teacher > 30 Years Full Time Equiv Count","position":18,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST00ST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_beginning_base_salary_total","label":"Campus 2024 Staff: Teacher Beginning Base Salary Total","position":19,"publisher_description":"Campus 2024 Staff Teacher Beginning Base Salary Total","publisher_type":"Number"},{"code":"CPST01ST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_base_salary_total","label":"Campus 2024 Staff: Teacher 1-5 Years Base Salary Total","position":20,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST06ST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_base_salary_total","label":"Campus 2024 Staff: Teacher 6-10 Years Base Salary Total","position":21,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST11ST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_base_salary_total","label":"Campus 2024 Staff: Teacher 11-20 Years Base Salary Total","position":22,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST21ST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_base_salary_total","label":"Campus 2024 Staff: Teacher 21-30 Years Base Salary Total","position":23,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST30ST","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_base_salary_total","label":"Campus 2024 Staff: Teacher > 30 Years Base Salary Total","position":24,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number"},{"code":"CPSTNOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_no_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher No Degree Full Time Equiv Count","position":25,"publisher_description":"Campus 2024 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBAFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_ba_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher BA Degree Full Time Equiv Count","position":26,"publisher_description":"Campus 2024 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTMSFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_ms_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher MS Degree Full Time Equiv Count","position":27,"publisher_description":"Campus 2024 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTPHFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_ph_degree_full_time_equiv_count","label":"Campus 2024 Staff: Teacher PH Degree Full Time Equiv Count","position":28,"publisher_description":"Campus 2024 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSPTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_professional_total_full_time_equiv_count","label":"Campus 2024 Staff: Professional Total Full Time Equiv Count","position":29,"publisher_description":"Campus 2024 Staff Professional Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSATOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_all_staff_total_full_time_equiv_count","label":"Campus 2024 Staff: All Staff Total Full Time Equiv Count","position":30,"publisher_description":"Campus 2024 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSRTOPC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_counselor_total_part_time_equiv_count","label":"Campus 2024 Staff: Counselor Total Part Time Equiv Count","position":31,"publisher_description":"Campus 2024 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number"},{"code":"CPSRTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_counselor_total_full_time_equiv_count","label":"Campus 2024 Staff: Counselor Total Full Time Equiv Count","position":32,"publisher_description":"Campus 2024 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSBTOPC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_librarian_total_part_time_equiv_count","label":"Campus 2024 Staff: Librarian Total Part Time Equiv Count","position":33,"publisher_description":"Campus 2024 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number"},{"code":"CPSBTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_librarian_total_full_time_equiv_count","label":"Campus 2024 Staff: Librarian Total Full Time Equiv Count","position":34,"publisher_description":"Campus 2024 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSUTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_support_total_base_salary_average","label":"Campus 2024 Staff: Support Total Base Salary Average","position":35,"publisher_description":"Campus 2024 Staff Support Total Base Salary Average","publisher_type":"Number"},{"code":"CPSSTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_school_admin_total_base_salary_average","label":"Campus 2024 Staff: School Admin Total Base Salary Average","position":36,"publisher_description":"Campus 2024 Staff School Admin Total Base Salary Average","publisher_type":"Number"},{"code":"CPSCTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_central_admin_total_base_salary_average","label":"Campus 2024 Staff: Central Admin Total Base Salary Average","position":37,"publisher_description":"Campus 2024 Staff Central Admin Total Base Salary Average","publisher_type":"Number"},{"code":"CPSTTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_total_base_salary_average","label":"Campus 2024 Staff: Teacher Total Base Salary Average","position":38,"publisher_description":"Campus 2024 Staff Teacher Total Base Salary Average","publisher_type":"Number"},{"code":"CPST00SA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_beginning_base_salary_average","label":"Campus 2024 Staff: Teacher Beginning Base Salary Average","position":39,"publisher_description":"Campus 2024 Staff Teacher Beginning Base Salary Average","publisher_type":"Number"},{"code":"CPST01SA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_base_salary_average","label":"Campus 2024 Staff: Teacher 1-5 Years Base Salary Average","position":40,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST06SA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_base_salary_average","label":"Campus 2024 Staff: Teacher 6-10 Years Base Salary Average","position":41,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST11SA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_base_salary_average","label":"Campus 2024 Staff: Teacher 11-20 Years Base Salary Average","position":42,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST21SA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_base_salary_average","label":"Campus 2024 Staff: Teacher 21-30 Years Base Salary Average","position":43,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST30SA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_base_salary_average","label":"Campus 2024 Staff: Teacher > 30 Years Base Salary Average","position":44,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number"},{"code":"CPSTINFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_american_indian_full_time_equiv_count","label":"Campus 2024 Staff: Teacher American Indian Full Time Equiv Count","position":45,"publisher_description":"Campus 2024 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTPIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_pacific_islander_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Pacific Islander Full Time Equiv Count","position":46,"publisher_description":"Campus 2024 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTASFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_asian_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Asian Full Time Equiv Count","position":47,"publisher_description":"Campus 2024 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBLFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_african_american_full_time_equiv_count","label":"Campus 2024 Staff: Teacher African American Full Time Equiv Count","position":48,"publisher_description":"Campus 2024 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTHIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_hispanic_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Hispanic Full Time Equiv Count","position":49,"publisher_description":"Campus 2024 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTWHFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_white_full_time_equiv_count","label":"Campus 2024 Staff: Teacher White Full Time Equiv Count","position":50,"publisher_description":"Campus 2024 Staff Teacher White Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTWFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_two_or_more_races_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Two or more races Full Time Equiv Count","position":51,"publisher_description":"Campus 2024 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTMAFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_male_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Male Full Time Equiv Count","position":52,"publisher_description":"Campus 2024 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTFEFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_female_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Female Full Time Equiv Count","position":53,"publisher_description":"Campus 2024 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTENA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_tenure_average","label":"Campus 2024 Staff: Teacher Tenure Average","position":54,"publisher_description":"Campus 2024 Staff Teacher Tenure Average","publisher_type":"Number"},{"code":"CPSTEXPA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_experience_average","label":"Campus 2024 Staff: Teacher Experience Average","position":55,"publisher_description":"Campus 2024 Staff Teacher Experience Average","publisher_type":"Number"},{"code":"CPSTREFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_regular_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Regular Program Full Time Equiv Count","position":56,"publisher_description":"Campus 2024 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTVOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":57,"publisher_description":"Campus 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_bilingual_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Bilingual Program Full Time Equiv Count","position":58,"publisher_description":"Campus 2024 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTCOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_compensatory_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Compensatory Program Full Time Equiv Count","position":59,"publisher_description":"Campus 2024 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTGIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":60,"publisher_description":"Campus 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTSPFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_special_education_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Special Education Full Time Equiv Count","position":61,"publisher_description":"Campus 2024 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTOPFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_other_full_time_equiv_count","label":"Campus 2024 Staff: Teacher Other Full Time Equiv Count","position":62,"publisher_description":"Campus 2024 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSHEXPA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_principal_experience_average","label":"Campus 2024 Staff: Principal Experience Average","position":63,"publisher_description":"Campus 2024 Staff Principal Experience Average","publisher_type":"Number"},{"code":"CPSHTENA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_principal_tenure_average","label":"Campus 2024 Staff: Principal Tenure Average","position":64,"publisher_description":"Campus 2024 Staff Principal Tenure Average","publisher_type":"Number"},{"code":"CPSLEXPA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_assistant_principal_experience_average","label":"Campus 2024 Staff: Assistant Principal Experience Average","position":65,"publisher_description":"Campus 2024 Staff Assistant Principal Experience Average","publisher_type":"Number"},{"code":"CPSLTENA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_assistant_principal_tenure_average","label":"Campus 2024 Staff: Assistant Principal Tenure Average","position":66,"publisher_description":"Campus 2024 Staff Assistant Principal Tenure Average","publisher_type":"Number"},{"code":"CPSHEXPT","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_principal_experience_total","label":"Campus 2024 Staff: Principal Experience Total","position":67,"publisher_description":"Campus 2024 Staff Principal Experience Total","publisher_type":"Number"},{"code":"CPSHTENT","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_principal_tenure_total","label":"Campus 2024 Staff: Principal Tenure Total","position":68,"publisher_description":"Campus 2024 Staff Principal Tenure Total","publisher_type":"Number"},{"code":"CPSLEXPT","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_assistant_principal_experience_total","label":"Campus 2024 Staff: Assistant Principal Experience Total","position":69,"publisher_description":"Campus 2024 Staff Assistant Principal Experience Total","publisher_type":"Number"},{"code":"CPSLTENT","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_assistant_principal_tenure_total","label":"Campus 2024 Staff: Assistant Principal Tenure Total","position":70,"publisher_description":"Campus 2024 Staff Assistant Principal Tenure Total","publisher_type":"Number"},{"code":"CPSAMIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_all_staff_minority_full_time_equiv_count","label":"Campus 2024 Staff: All Staff Minority Full Time Equiv Count","position":71,"publisher_description":"Campus 2024 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTEXPT","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_experience_total","label":"Campus 2024 Staff: Teacher Experience Total","position":72,"publisher_description":"Campus 2024 Staff Teacher Experience Total","publisher_type":"Number"},{"code":"CPSTTENT","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_tenure_total","label":"Campus 2024 Staff: Teacher Tenure Total","position":73,"publisher_description":"Campus 2024 Staff Teacher Tenure Total","publisher_type":"Number"},{"code":"CPSTTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_total_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Total Full Time Equiv Percent","position":74,"publisher_description":"Campus 2024 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSUTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_support_total_full_time_equiv_percent","label":"Campus 2024 Staff: Support Total Full Time Equiv Percent","position":75,"publisher_description":"Campus 2024 Staff Support Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSSTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_school_admin_total_full_time_equiv_percent","label":"Campus 2024 Staff: School Admin Total Full Time Equiv Percent","position":76,"publisher_description":"Campus 2024 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSETOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_educ_aide_total_full_time_equiv_percent","label":"Campus 2024 Staff: Educ Aide Total Full Time Equiv Percent","position":77,"publisher_description":"Campus 2024 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSPTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_professional_total_full_time_equiv_percent","label":"Campus 2024 Staff: Professional Total Full Time Equiv Percent","position":78,"publisher_description":"Campus 2024 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSAMIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_all_staff_minority_full_time_equiv_percent","label":"Campus 2024 Staff: All Staff Minority Full Time Equiv Percent","position":79,"publisher_description":"Campus 2024 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST00FP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_beginning_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Beginning Full Time Equiv Percent","position":80,"publisher_description":"Campus 2024 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST01FP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_1_5_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":81,"publisher_description":"Campus 2024 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST06FP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_6_10_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":82,"publisher_description":"Campus 2024 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST11FP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_11_20_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":83,"publisher_description":"Campus 2024 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST21FP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_21_30_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":84,"publisher_description":"Campus 2024 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST30FP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_gt_30_years_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher > 30 Years Full Time Equiv Percent","position":85,"publisher_description":"Campus 2024 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTREFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_regular_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Regular Program Full Time Equiv Percent","position":86,"publisher_description":"Campus 2024 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTVOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":87,"publisher_description":"Campus 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_bilingual_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":88,"publisher_description":"Campus 2024 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTCOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_compensatory_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":89,"publisher_description":"Campus 2024 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTGIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":90,"publisher_description":"Campus 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTSPFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_special_education_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Special Education Full Time Equiv Percent","position":91,"publisher_description":"Campus 2024 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTOPFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_other_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Other Full Time Equiv Percent","position":92,"publisher_description":"Campus 2024 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTNOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_no_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher No Degree Full Time Equiv Percent","position":93,"publisher_description":"Campus 2024 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBAFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_ba_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher BA Degree Full Time Equiv Percent","position":94,"publisher_description":"Campus 2024 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTMSFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_ms_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher MS Degree Full Time Equiv Percent","position":95,"publisher_description":"Campus 2024 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTPHFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_ph_degree_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher PH Degree Full Time Equiv Percent","position":96,"publisher_description":"Campus 2024 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTWHFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_white_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher White Full Time Equiv Percent","position":97,"publisher_description":"Campus 2024 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBLFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_african_american_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher African American Full Time Equiv Percent","position":98,"publisher_description":"Campus 2024 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTHIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_hispanic_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Hispanic Full Time Equiv Percent","position":99,"publisher_description":"Campus 2024 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTPIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_pacific_islander_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":100,"publisher_description":"Campus 2024 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTINFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_american_indian_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher American Indian Full Time Equiv Percent","position":101,"publisher_description":"Campus 2024 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTASFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_asian_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Asian Full Time Equiv Percent","position":102,"publisher_description":"Campus 2024 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTTWFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Two or more races Full Time Equiv Percent","position":103,"publisher_description":"Campus 2024 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTMAFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_male_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Male Full Time Equiv Percent","position":104,"publisher_description":"Campus 2024 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTFEFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_female_full_time_equiv_percent","label":"Campus 2024 Staff: Teacher Female Full Time Equiv Percent","position":105,"publisher_description":"Campus 2024 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTKIDR","dictionary_status":"documented","disposition":"fact","field":"campus_2024_staff_teacher_student_ratio","label":"Campus 2024 Staff: Teacher Student Ratio","position":106,"publisher_description":"Campus 2024 Staff Teacher Student Ratio","publisher_type":"Number"}],"input_sha256":"bead14bbdc54396c8e41e5b744c2aeccf8728df3b819981a9f4270b225c2ea16","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":9084},"metric_period":{"kind":"unknown"},"source_schema_sha256":"fa1a7488fe3c86f464508a747170f9da8ee9827f49125097acf99c0e86217234","table":"staff_profile"}]},{"dataset":"district_tapr_staff_profile","edition":"2024","source_only":true,"tables":[{"dictionary_records":[{"code":"DPSATOFC","ordinal":1,"publisher_description":"District 2024 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSPTOFC","ordinal":2,"publisher_description":"District 2024 Staff Professional Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSPTOFP","ordinal":3,"publisher_description":"District 2024 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTTOFC","ordinal":4,"publisher_description":"District 2024 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTTOFP","ordinal":5,"publisher_description":"District 2024 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSUTOFC","ordinal":6,"publisher_description":"District 2024 Staff Support Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSUTOFP","ordinal":7,"publisher_description":"District 2024 Staff Support Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSSTOFC","ordinal":8,"publisher_description":"District 2024 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSSTOFP","ordinal":9,"publisher_description":"District 2024 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSCTOFC","ordinal":10,"publisher_description":"District 2024 Staff Central Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSCTOFP","ordinal":11,"publisher_description":"District 2024 Staff Central Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSETOFC","ordinal":12,"publisher_description":"District 2024 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSETOFP","ordinal":13,"publisher_description":"District 2024 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSXTOFC","ordinal":14,"publisher_description":"District 2024 Staff Auxiliary Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSXTOFP","ordinal":15,"publisher_description":"District 2024 Staff Auxiliary Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSBTOFC","ordinal":16,"publisher_description":"District 2024 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSBTOPC","ordinal":17,"publisher_description":"District 2024 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number"},{"code":"DPSRTOFC","ordinal":18,"publisher_description":"District 2024 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSRTOPC","ordinal":19,"publisher_description":"District 2024 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number"},{"code":"DPSAMIFC","ordinal":20,"publisher_description":"District 2024 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSAMIFP","ordinal":21,"publisher_description":"District 2024 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBLFC","ordinal":22,"publisher_description":"District 2024 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBLFP","ordinal":23,"publisher_description":"District 2024 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTHIFC","ordinal":24,"publisher_description":"District 2024 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTHIFP","ordinal":25,"publisher_description":"District 2024 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTWHFC","ordinal":26,"publisher_description":"District 2024 Staff Teacher White Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTWHFP","ordinal":27,"publisher_description":"District 2024 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTINFC","ordinal":28,"publisher_description":"District 2024 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTINFP","ordinal":29,"publisher_description":"District 2024 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTASFC","ordinal":30,"publisher_description":"District 2024 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTASFP","ordinal":31,"publisher_description":"District 2024 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTPIFC","ordinal":32,"publisher_description":"District 2024 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTPIFP","ordinal":33,"publisher_description":"District 2024 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTTWFC","ordinal":34,"publisher_description":"District 2024 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTTWFP","ordinal":35,"publisher_description":"District 2024 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTMAFC","ordinal":36,"publisher_description":"District 2024 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTMAFP","ordinal":37,"publisher_description":"District 2024 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTFEFC","ordinal":38,"publisher_description":"District 2024 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTFEFP","ordinal":39,"publisher_description":"District 2024 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTNOFC","ordinal":40,"publisher_description":"District 2024 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTNOFP","ordinal":41,"publisher_description":"District 2024 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBAFC","ordinal":42,"publisher_description":"District 2024 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBAFP","ordinal":43,"publisher_description":"District 2024 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTMSFC","ordinal":44,"publisher_description":"District 2024 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTMSFP","ordinal":45,"publisher_description":"District 2024 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTPHFC","ordinal":46,"publisher_description":"District 2024 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTPHFP","ordinal":47,"publisher_description":"District 2024 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST00FC","ordinal":48,"publisher_description":"District 2024 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST00FP","ordinal":49,"publisher_description":"District 2024 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST01FC","ordinal":50,"publisher_description":"District 2024 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST01FP","ordinal":51,"publisher_description":"District 2024 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST06FC","ordinal":52,"publisher_description":"District 2024 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST06FP","ordinal":53,"publisher_description":"District 2024 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST11FC","ordinal":54,"publisher_description":"District 2024 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST11FP","ordinal":55,"publisher_description":"District 2024 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST21FC","ordinal":56,"publisher_description":"District 2024 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST21FP","ordinal":57,"publisher_description":"District 2024 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST30FC","ordinal":58,"publisher_description":"District 2024 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST30FP","ordinal":59,"publisher_description":"District 2024 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTKIDR","ordinal":60,"publisher_description":"District 2024 Staff Teacher Student Ratio","publisher_type":"Number"},{"code":"DPSHEXPA","ordinal":61,"publisher_description":"District 2024 Staff Principal Experience Average","publisher_type":"Number"},{"code":"DPSHEXPT","ordinal":62,"publisher_description":"District 2024 Staff Principal Experience Total","publisher_type":"Number"},{"code":"DPSHTENA","ordinal":63,"publisher_description":"District 2024 Staff Principal Tenure Average","publisher_type":"Number"},{"code":"DPSHTENT","ordinal":64,"publisher_description":"District 2024 Staff Principal Tenure Total","publisher_type":"Number"},{"code":"DPSLEXPA","ordinal":65,"publisher_description":"District 2024 Staff Assistant Principal Experience Average","publisher_type":"Number"},{"code":"DPSLEXPT","ordinal":66,"publisher_description":"District 2024 Staff Assistant Principal Experience Total","publisher_type":"Number"},{"code":"DPSLTENA","ordinal":67,"publisher_description":"District 2024 Staff Assistant Principal Tenure Average","publisher_type":"Number"},{"code":"DPSLTENT","ordinal":68,"publisher_description":"District 2024 Staff Assistant Principal Tenure Total","publisher_type":"Number"},{"code":"DPSTEXPA","ordinal":69,"publisher_description":"District 2024 Staff Teacher Experience Average","publisher_type":"Number"},{"code":"DPSTEXPT","ordinal":70,"publisher_description":"District 2024 Staff Teacher Experience Total","publisher_type":"Number"},{"code":"DPSTTENA","ordinal":71,"publisher_description":"District 2024 Staff Teacher Tenure Average","publisher_type":"Number"},{"code":"DPSTTENT","ordinal":72,"publisher_description":"District 2024 Staff Teacher Tenure Total","publisher_type":"Number"},{"code":"DPST00SA","ordinal":73,"publisher_description":"District 2024 Staff Teacher Beginning Base Salary Average","publisher_type":"Number"},{"code":"DPST00ST","ordinal":74,"publisher_description":"District 2024 Staff Teacher Beginning Base Salary Total","publisher_type":"Number"},{"code":"DPST01SA","ordinal":75,"publisher_description":"District 2024 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST01ST","ordinal":76,"publisher_description":"District 2024 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST06SA","ordinal":77,"publisher_description":"District 2024 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST06ST","ordinal":78,"publisher_description":"District 2024 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST11SA","ordinal":79,"publisher_description":"District 2024 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST11ST","ordinal":80,"publisher_description":"District 2024 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST21SA","ordinal":81,"publisher_description":"District 2024 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST21ST","ordinal":82,"publisher_description":"District 2024 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST30SA","ordinal":83,"publisher_description":"District 2024 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST30ST","ordinal":84,"publisher_description":"District 2024 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number"},{"code":"DPSTTOSA","ordinal":85,"publisher_description":"District 2024 Staff Teacher Total Base Salary Average","publisher_type":"Number"},{"code":"DPSTTOST","ordinal":86,"publisher_description":"District 2024 Staff Teacher Total Base Salary Total","publisher_type":"Number"},{"code":"DPSUTOSA","ordinal":87,"publisher_description":"District 2024 Staff Support Total Base Salary Average","publisher_type":"Number"},{"code":"DPSUTOST","ordinal":88,"publisher_description":"District 2024 Staff Support Total Base Salary Total","publisher_type":"Number"},{"code":"DPSSTOSA","ordinal":89,"publisher_description":"District 2024 Staff School Admin Total Base Salary Average","publisher_type":"Number"},{"code":"DPSSTOST","ordinal":90,"publisher_description":"District 2024 Staff School Admin Total Base Salary Total","publisher_type":"Number"},{"code":"DPSCTOSA","ordinal":91,"publisher_description":"District 2024 Staff Central Admin Total Base Salary Average","publisher_type":"Number"},{"code":"DPSCTOST","ordinal":92,"publisher_description":"District 2024 Staff Central Admin Total Base Salary Total","publisher_type":"Number"},{"code":"DPSTURNR","ordinal":93,"publisher_description":"District 2024 Staff Teacher Turnover Ratio","publisher_type":"Number"},{"code":"DPSTURNN","ordinal":94,"publisher_description":"District 2024 Staff Teacher Turnover Numerator","publisher_type":"Number"},{"code":"DPSTURND","ordinal":95,"publisher_description":"District 2024 Staff Teacher Turnover Denominator","publisher_type":"Number"},{"code":"DPSECOFC","ordinal":96,"publisher_description":"District 2024 Staff SSA Educational Aides Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSETOFC","ordinal":97,"publisher_description":"District 2024 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSXTOFC","ordinal":98,"publisher_description":"District 2024 Staff Auxiliary Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSOTOFC","ordinal":99,"publisher_description":"District 2024 Staff Contract Serv Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DRECHCNT","ordinal":100,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Recognized Head Count","publisher_type":"Number"},{"code":"DRECAVGP","ordinal":101,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Recognized Payout Average","publisher_type":"Number"},{"code":"DEXPHCNT","ordinal":102,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Exemplary Head Count","publisher_type":"Number"},{"code":"DEXPAVGP","ordinal":103,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Exemplary Payout Average","publisher_type":"Number"},{"code":"DMSTHCNT","ordinal":104,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Master Head Count","publisher_type":"Number"},{"code":"DMSTAVGP","ordinal":105,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Master Payout Average","publisher_type":"Number"},{"code":"DPSTBIFC","ordinal":106,"publisher_description":"District 2024 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBIFP","ordinal":107,"publisher_description":"District 2024 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTVOFC","ordinal":108,"publisher_description":"District 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTVOFP","ordinal":109,"publisher_description":"District 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTCOFC","ordinal":110,"publisher_description":"District 2024 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTCOFP","ordinal":111,"publisher_description":"District 2024 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTGIFC","ordinal":112,"publisher_description":"District 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTGIFP","ordinal":113,"publisher_description":"District 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTREFC","ordinal":114,"publisher_description":"District 2024 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTREFP","ordinal":115,"publisher_description":"District 2024 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTSPFC","ordinal":116,"publisher_description":"District 2024 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTSPFP","ordinal":117,"publisher_description":"District 2024 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTOPFC","ordinal":118,"publisher_description":"District 2024 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTOPFP","ordinal":119,"publisher_description":"District 2024 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number"}],"fields":[{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DPSTTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_total_full_time_equiv_count","label":"District 2024 Staff: Teacher Total Full Time Equiv Count","position":3,"publisher_description":"District 2024 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSUTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_support_total_full_time_equiv_count","label":"District 2024 Staff: Support Total Full Time Equiv Count","position":4,"publisher_description":"District 2024 Staff Support Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSSTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_school_admin_total_full_time_equiv_count","label":"District 2024 Staff: School Admin Total Full Time Equiv Count","position":5,"publisher_description":"District 2024 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSCTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_central_admin_total_full_time_equiv_count","label":"District 2024 Staff: Central Admin Total Full Time Equiv Count","position":6,"publisher_description":"District 2024 Staff Central Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSETOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_educ_aide_total_full_time_equiv_count","label":"District 2024 Staff: Educ Aide Total Full Time Equiv Count","position":7,"publisher_description":"District 2024 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTTOST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_total_base_salary_total","label":"District 2024 Staff: Teacher Total Base Salary Total","position":8,"publisher_description":"District 2024 Staff Teacher Total Base Salary Total","publisher_type":"Number"},{"code":"DPSUTOST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_support_total_base_salary_total","label":"District 2024 Staff: Support Total Base Salary Total","position":9,"publisher_description":"District 2024 Staff Support Total Base Salary Total","publisher_type":"Number"},{"code":"DPSSTOST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_school_admin_total_base_salary_total","label":"District 2024 Staff: School Admin Total Base Salary Total","position":10,"publisher_description":"District 2024 Staff School Admin Total Base Salary Total","publisher_type":"Number"},{"code":"DPST00FC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_beginning_full_time_equiv_count","label":"District 2024 Staff: Teacher Beginning Full Time Equiv Count","position":11,"publisher_description":"District 2024 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST01FC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 1-5 Years Full Time Equiv Count","position":12,"publisher_description":"District 2024 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST06FC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 6-10 Years Full Time Equiv Count","position":13,"publisher_description":"District 2024 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST11FC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 11-20 Years Full Time Equiv Count","position":14,"publisher_description":"District 2024 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST21FC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_full_time_equiv_count","label":"District 2024 Staff: Teacher 21-30 Years Full Time Equiv Count","position":15,"publisher_description":"District 2024 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST30FC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_full_time_equiv_count","label":"District 2024 Staff: Teacher > 30 Years Full Time Equiv Count","position":16,"publisher_description":"District 2024 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST00ST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_beginning_base_salary_total","label":"District 2024 Staff: Teacher Beginning Base Salary Total","position":17,"publisher_description":"District 2024 Staff Teacher Beginning Base Salary Total","publisher_type":"Number"},{"code":"DPST01ST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_base_salary_total","label":"District 2024 Staff: Teacher 1-5 Years Base Salary Total","position":18,"publisher_description":"District 2024 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST06ST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_base_salary_total","label":"District 2024 Staff: Teacher 6-10 Years Base Salary Total","position":19,"publisher_description":"District 2024 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST11ST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_base_salary_total","label":"District 2024 Staff: Teacher 11-20 Years Base Salary Total","position":20,"publisher_description":"District 2024 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST21ST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_base_salary_total","label":"District 2024 Staff: Teacher 21-30 Years Base Salary Total","position":21,"publisher_description":"District 2024 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST30ST","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_base_salary_total","label":"District 2024 Staff: Teacher > 30 Years Base Salary Total","position":22,"publisher_description":"District 2024 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number"},{"code":"DPSTNOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_no_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher No Degree Full Time Equiv Count","position":23,"publisher_description":"District 2024 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBAFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_ba_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher BA Degree Full Time Equiv Count","position":24,"publisher_description":"District 2024 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTMSFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_ms_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher MS Degree Full Time Equiv Count","position":25,"publisher_description":"District 2024 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTPHFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_ph_degree_full_time_equiv_count","label":"District 2024 Staff: Teacher PH Degree Full Time Equiv Count","position":26,"publisher_description":"District 2024 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSECOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_ssa_educational_aides_full_time_equiv_count","label":"District 2024 Staff: SSA Educational Aides Full Time Equiv Count","position":27,"publisher_description":"District 2024 Staff SSA Educational Aides Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSPTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_professional_total_full_time_equiv_count","label":"District 2024 Staff: Professional Total Full Time Equiv Count","position":28,"publisher_description":"District 2024 Staff Professional Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSRTOPC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_counselor_total_part_time_equiv_count","label":"District 2024 Staff: Counselor Total Part Time Equiv Count","position":29,"publisher_description":"District 2024 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number"},{"code":"DPSRTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_counselor_total_full_time_equiv_count","label":"District 2024 Staff: Counselor Total Full Time Equiv Count","position":30,"publisher_description":"District 2024 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSBTOPC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_librarian_total_part_time_equiv_count","label":"District 2024 Staff: Librarian Total Part Time Equiv Count","position":31,"publisher_description":"District 2024 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number"},{"code":"DPSBTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_librarian_total_full_time_equiv_count","label":"District 2024 Staff: Librarian Total Full Time Equiv Count","position":32,"publisher_description":"District 2024 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSXTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_auxiliary_total_full_time_equiv_count","label":"District 2024 Staff: Auxiliary Total Full Time Equiv Count","position":33,"publisher_description":"District 2024 Staff Auxiliary Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSATOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_all_staff_total_full_time_equiv_count","label":"District 2024 Staff: All Staff Total Full Time Equiv Count","position":34,"publisher_description":"District 2024 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSOTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_contract_serv_total_full_time_equiv_count","label":"District 2024 Staff: Contract Serv Total Full Time Equiv Count","position":35,"publisher_description":"District 2024 Staff Contract Serv Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTINFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_american_indian_full_time_equiv_count","label":"District 2024 Staff: Teacher American Indian Full Time Equiv Count","position":36,"publisher_description":"District 2024 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTPIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_pacific_islander_full_time_equiv_count","label":"District 2024 Staff: Teacher Pacific Islander Full Time Equiv Count","position":37,"publisher_description":"District 2024 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTASFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_asian_full_time_equiv_count","label":"District 2024 Staff: Teacher Asian Full Time Equiv Count","position":38,"publisher_description":"District 2024 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBLFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_african_american_full_time_equiv_count","label":"District 2024 Staff: Teacher African American Full Time Equiv Count","position":39,"publisher_description":"District 2024 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTHIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_hispanic_full_time_equiv_count","label":"District 2024 Staff: Teacher Hispanic Full Time Equiv Count","position":40,"publisher_description":"District 2024 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTWHFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_white_full_time_equiv_count","label":"District 2024 Staff: Teacher White Full Time Equiv Count","position":41,"publisher_description":"District 2024 Staff Teacher White Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTTWFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_two_or_more_races_full_time_equiv_count","label":"District 2024 Staff: Teacher Two or more races Full Time Equiv Count","position":42,"publisher_description":"District 2024 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTMAFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_male_full_time_equiv_count","label":"District 2024 Staff: Teacher Male Full Time Equiv Count","position":43,"publisher_description":"District 2024 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTFEFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_female_full_time_equiv_count","label":"District 2024 Staff: Teacher Female Full Time Equiv Count","position":44,"publisher_description":"District 2024 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTREFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_regular_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Regular Program Full Time Equiv Count","position":45,"publisher_description":"District 2024 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTVOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"District 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":46,"publisher_description":"District 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_bilingual_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Bilingual Program Full Time Equiv Count","position":47,"publisher_description":"District 2024 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTCOFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_compensatory_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Compensatory Program Full Time Equiv Count","position":48,"publisher_description":"District 2024 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTGIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"District 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":49,"publisher_description":"District 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTSPFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_special_education_full_time_equiv_count","label":"District 2024 Staff: Teacher Special Education Full Time Equiv Count","position":50,"publisher_description":"District 2024 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTOPFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_other_full_time_equiv_count","label":"District 2024 Staff: Teacher Other Full Time Equiv Count","position":51,"publisher_description":"District 2024 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTURNN","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_turnover_numerator","label":"District 2024 Staff: Teacher Turnover Numerator","position":52,"publisher_description":"District 2024 Staff Teacher Turnover Numerator","publisher_type":"Number"},{"code":"DPSTURND","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_turnover_denominator","label":"District 2024 Staff: Teacher Turnover Denominator","position":53,"publisher_description":"District 2024 Staff Teacher Turnover Denominator","publisher_type":"Number"},{"code":"DPSTURNR","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_turnover_ratio","label":"District 2024 Staff: Teacher Turnover Ratio","position":54,"publisher_description":"District 2024 Staff Teacher Turnover Ratio","publisher_type":"Number"},{"code":"DPSTTENA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_tenure_average","label":"District 2024 Staff: Teacher Tenure Average","position":55,"publisher_description":"District 2024 Staff Teacher Tenure Average","publisher_type":"Number"},{"code":"DPSTEXPA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_experience_average","label":"District 2024 Staff: Teacher Experience Average","position":56,"publisher_description":"District 2024 Staff Teacher Experience Average","publisher_type":"Number"},{"code":"DPSHEXPA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_principal_experience_average","label":"District 2024 Staff: Principal Experience Average","position":57,"publisher_description":"District 2024 Staff Principal Experience Average","publisher_type":"Number"},{"code":"DPSHTENA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_principal_tenure_average","label":"District 2024 Staff: Principal Tenure Average","position":58,"publisher_description":"District 2024 Staff Principal Tenure Average","publisher_type":"Number"},{"code":"DPSLEXPA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_assistant_principal_experience_average","label":"District 2024 Staff: Assistant Principal Experience Average","position":59,"publisher_description":"District 2024 Staff Assistant Principal Experience Average","publisher_type":"Number"},{"code":"DPSLTENA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_assistant_principal_tenure_average","label":"District 2024 Staff: Assistant Principal Tenure Average","position":60,"publisher_description":"District 2024 Staff Assistant Principal Tenure Average","publisher_type":"Number"},{"code":"DPSHEXPT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_principal_experience_total","label":"District 2024 Staff: Principal Experience Total","position":61,"publisher_description":"District 2024 Staff Principal Experience Total","publisher_type":"Number"},{"code":"DPSHTENT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_principal_tenure_total","label":"District 2024 Staff: Principal Tenure Total","position":62,"publisher_description":"District 2024 Staff Principal Tenure Total","publisher_type":"Number"},{"code":"DPSLEXPT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_assistant_principal_experience_total","label":"District 2024 Staff: Assistant Principal Experience Total","position":63,"publisher_description":"District 2024 Staff Assistant Principal Experience Total","publisher_type":"Number"},{"code":"DPSLTENT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_assistant_principal_tenure_total","label":"District 2024 Staff: Assistant Principal Tenure Total","position":64,"publisher_description":"District 2024 Staff Assistant Principal Tenure Total","publisher_type":"Number"},{"code":"DPSAMIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_all_staff_minority_full_time_equiv_count","label":"District 2024 Staff: All Staff Minority Full Time Equiv Count","position":65,"publisher_description":"District 2024 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTEXPT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_experience_total","label":"District 2024 Staff: Teacher Experience Total","position":66,"publisher_description":"District 2024 Staff Teacher Experience Total","publisher_type":"Number"},{"code":"DPSTTENT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_tenure_total","label":"District 2024 Staff: Teacher Tenure Total","position":67,"publisher_description":"District 2024 Staff Teacher Tenure Total","publisher_type":"Number"},{"code":"DPSPTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_professional_total_full_time_equiv_percent","label":"District 2024 Staff: Professional Total Full Time Equiv Percent","position":68,"publisher_description":"District 2024 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_total_full_time_equiv_percent","label":"District 2024 Staff: Teacher Total Full Time Equiv Percent","position":69,"publisher_description":"District 2024 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSUTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_support_total_full_time_equiv_percent","label":"District 2024 Staff: Support Total Full Time Equiv Percent","position":70,"publisher_description":"District 2024 Staff Support Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSSTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_school_admin_total_full_time_equiv_percent","label":"District 2024 Staff: School Admin Total Full Time Equiv Percent","position":71,"publisher_description":"District 2024 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSCTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_central_admin_total_full_time_equiv_percent","label":"District 2024 Staff: Central Admin Total Full Time Equiv Percent","position":72,"publisher_description":"District 2024 Staff Central Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSETOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_educ_aide_total_full_time_equiv_percent","label":"District 2024 Staff: Educ Aide Total Full Time Equiv Percent","position":73,"publisher_description":"District 2024 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSXTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_auxiliary_total_full_time_equiv_percent","label":"District 2024 Staff: Auxiliary Total Full Time Equiv Percent","position":74,"publisher_description":"District 2024 Staff Auxiliary Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSAMIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_all_staff_minority_full_time_equiv_percent","label":"District 2024 Staff: All Staff Minority Full Time Equiv Percent","position":75,"publisher_description":"District 2024 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTNOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_no_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher No Degree Full Time Equiv Percent","position":76,"publisher_description":"District 2024 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBAFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_ba_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher BA Degree Full Time Equiv Percent","position":77,"publisher_description":"District 2024 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTMSFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_ms_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher MS Degree Full Time Equiv Percent","position":78,"publisher_description":"District 2024 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTPHFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_ph_degree_full_time_equiv_percent","label":"District 2024 Staff: Teacher PH Degree Full Time Equiv Percent","position":79,"publisher_description":"District 2024 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST00FP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_beginning_full_time_equiv_percent","label":"District 2024 Staff: Teacher Beginning Full Time Equiv Percent","position":80,"publisher_description":"District 2024 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST01FP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":81,"publisher_description":"District 2024 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST06FP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":82,"publisher_description":"District 2024 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST11FP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":83,"publisher_description":"District 2024 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST21FP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":84,"publisher_description":"District 2024 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST30FP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_full_time_equiv_percent","label":"District 2024 Staff: Teacher > 30 Years Full Time Equiv Percent","position":85,"publisher_description":"District 2024 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTREFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_regular_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Regular Program Full Time Equiv Percent","position":86,"publisher_description":"District 2024 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTVOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"District 2024 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":87,"publisher_description":"District 2024 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_bilingual_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":88,"publisher_description":"District 2024 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTCOFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_compensatory_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":89,"publisher_description":"District 2024 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTGIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"District 2024 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":90,"publisher_description":"District 2024 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTSPFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_special_education_full_time_equiv_percent","label":"District 2024 Staff: Teacher Special Education Full Time Equiv Percent","position":91,"publisher_description":"District 2024 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTOPFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_other_full_time_equiv_percent","label":"District 2024 Staff: Teacher Other Full Time Equiv Percent","position":92,"publisher_description":"District 2024 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBLFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_african_american_full_time_equiv_percent","label":"District 2024 Staff: Teacher African American Full Time Equiv Percent","position":93,"publisher_description":"District 2024 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTWHFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_white_full_time_equiv_percent","label":"District 2024 Staff: Teacher White Full Time Equiv Percent","position":94,"publisher_description":"District 2024 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTHIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_hispanic_full_time_equiv_percent","label":"District 2024 Staff: Teacher Hispanic Full Time Equiv Percent","position":95,"publisher_description":"District 2024 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTPIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_pacific_islander_full_time_equiv_percent","label":"District 2024 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":96,"publisher_description":"District 2024 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTINFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_american_indian_full_time_equiv_percent","label":"District 2024 Staff: Teacher American Indian Full Time Equiv Percent","position":97,"publisher_description":"District 2024 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTASFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_asian_full_time_equiv_percent","label":"District 2024 Staff: Teacher Asian Full Time Equiv Percent","position":98,"publisher_description":"District 2024 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTTWFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"District 2024 Staff: Teacher Two or more races Full Time Equiv Percent","position":99,"publisher_description":"District 2024 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTMAFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_male_full_time_equiv_percent","label":"District 2024 Staff: Teacher Male Full Time Equiv Percent","position":100,"publisher_description":"District 2024 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTFEFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_female_full_time_equiv_percent","label":"District 2024 Staff: Teacher Female Full Time Equiv Percent","position":101,"publisher_description":"District 2024 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTKIDR","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_student_ratio","label":"District 2024 Staff: Teacher Student Ratio","position":102,"publisher_description":"District 2024 Staff Teacher Student Ratio","publisher_type":"Number"},{"code":"DPST00SA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_beginning_base_salary_average","label":"District 2024 Staff: Teacher Beginning Base Salary Average","position":103,"publisher_description":"District 2024 Staff Teacher Beginning Base Salary Average","publisher_type":"Number"},{"code":"DPST01SA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_1_5_years_base_salary_average","label":"District 2024 Staff: Teacher 1-5 Years Base Salary Average","position":104,"publisher_description":"District 2024 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST06SA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_6_10_years_base_salary_average","label":"District 2024 Staff: Teacher 6-10 Years Base Salary Average","position":105,"publisher_description":"District 2024 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST11SA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_11_20_years_base_salary_average","label":"District 2024 Staff: Teacher 11-20 Years Base Salary Average","position":106,"publisher_description":"District 2024 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST21SA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_21_30_years_base_salary_average","label":"District 2024 Staff: Teacher 21-30 Years Base Salary Average","position":107,"publisher_description":"District 2024 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST30SA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_gt_30_years_base_salary_average","label":"District 2024 Staff: Teacher > 30 Years Base Salary Average","position":108,"publisher_description":"District 2024 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number"},{"code":"DPSTTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_total_base_salary_average","label":"District 2024 Staff: Teacher Total Base Salary Average","position":109,"publisher_description":"District 2024 Staff Teacher Total Base Salary Average","publisher_type":"Number"},{"code":"DPSUTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_support_total_base_salary_average","label":"District 2024 Staff: Support Total Base Salary Average","position":110,"publisher_description":"District 2024 Staff Support Total Base Salary Average","publisher_type":"Number"},{"code":"DPSSTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_school_admin_total_base_salary_average","label":"District 2024 Staff: School Admin Total Base Salary Average","position":111,"publisher_description":"District 2024 Staff School Admin Total Base Salary Average","publisher_type":"Number"},{"code":"DPSCTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_central_admin_total_base_salary_average","label":"District 2024 Staff: Central Admin Total Base Salary Average","position":112,"publisher_description":"District 2024 Staff Central Admin Total Base Salary Average","publisher_type":"Number"},{"code":"DMSTHCNT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_incentive_allotment_master_head_count","label":"District 2024 Staff: Teacher Incentive Allotment Master Head Count","position":113,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Master Head Count","publisher_type":"Number"},{"code":"DEXPHCNT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_incentive_allotment_exemplary_head_count","label":"District 2024 Staff: Teacher Incentive Allotment Exemplary Head Count","position":114,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Exemplary Head Count","publisher_type":"Number"},{"code":"DRECHCNT","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_incentive_allotment_recognized_head_count","label":"District 2024 Staff: Teacher Incentive Allotment Recognized Head Count","position":115,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Recognized Head Count","publisher_type":"Number"},{"code":"DRECAVGP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_incentive_allotment_recognized_payout_average","label":"District 2024 Staff: Teacher Incentive Allotment Recognized Payout Average","position":116,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Recognized Payout Average","publisher_type":"Number"},{"code":"DEXPAVGP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_incentive_allotment_exemplary_payout_average","label":"District 2024 Staff: Teacher Incentive Allotment Exemplary Payout Average","position":117,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Exemplary Payout Average","publisher_type":"Number"},{"code":"DMSTAVGP","dictionary_status":"documented","disposition":"fact","field":"district_2024_staff_teacher_incentive_allotment_master_payout_average","label":"District 2024 Staff: Teacher Incentive Allotment Master Payout Average","position":118,"publisher_description":"District 2024 Staff Teacher Incentive Allotment Master Payout Average","publisher_type":"Number"}],"input_sha256":"f1107353cdaacc78085fbc0621f1696cd14faf276052d8c9d879f29e53f281c3","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":1209},"metric_period":{"kind":"unknown"},"source_schema_sha256":"55e525a81c31cfd5783731094280e63866f96cf2b09e738858d87364a16db6e2","table":"staff_profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/schemas/tapr--2024--student-profile-crosswalk.json b/teadata/schemas/tapr--2024--student-profile-crosswalk.json new file mode 100644 index 0000000..6980eea --- /dev/null +++ b/teadata/schemas/tapr--2024--student-profile-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_student_profile","edition":"2024","source_only":true,"tables":[{"dictionary_records":[{"code":"CPETALLC","ordinal":1,"publisher_description":"Campus 2024 Student Membership All Students Count","publisher_type":"Number"},{"code":"CPNTALLC","ordinal":2,"publisher_description":"Campus 2024 Student Enrollment All Students Count","publisher_type":"Number"},{"code":"CPETGEEC","ordinal":3,"publisher_description":"Campus 2024 Student Membership EE Count","publisher_type":"Number"},{"code":"CPETGEEP","ordinal":4,"publisher_description":"Campus 2024 Student Membership EE Percent","publisher_type":"Number"},{"code":"CPNTGEEC","ordinal":5,"publisher_description":"Campus 2024 Student Enrollment EE Count","publisher_type":"Number"},{"code":"CPNTGEEP","ordinal":6,"publisher_description":"Campus 2024 Student Enrollment EE Percent","publisher_type":"Number"},{"code":"CPETGPKC","ordinal":7,"publisher_description":"Campus 2024 Student Membership PK Count","publisher_type":"Number"},{"code":"CPETGPKP","ordinal":8,"publisher_description":"Campus 2024 Student Membership PK Percent","publisher_type":"Number"},{"code":"CPNTGPKC","ordinal":9,"publisher_description":"Campus 2024 Student Enrollment PK Count","publisher_type":"Number"},{"code":"CPNTGPKP","ordinal":10,"publisher_description":"Campus 2024 Student Enrollment PK Percent","publisher_type":"Number"},{"code":"CPETGP3C","ordinal":11,"publisher_description":"Campus 2024 Student Membership PK Ages 3 and Under Count","publisher_type":"Number"},{"code":"CPETGP3P","ordinal":12,"publisher_description":"Campus 2024 Student Membership PK Ages 3 and Under Percent","publisher_type":"Number"},{"code":"CPNTGP3C","ordinal":13,"publisher_description":"Campus 2024 Student Enrollment PK-03 Count","publisher_type":"Number"},{"code":"CPNTGP3P","ordinal":14,"publisher_description":"Campus 2024 Student Enrollment PK-03 Percent","publisher_type":"Number"},{"code":"CPETGP4C","ordinal":15,"publisher_description":"Campus 2024 Student Membership PK Ages 4 and Over Count","publisher_type":"Number"},{"code":"CPETGP4P","ordinal":16,"publisher_description":"Campus 2024 Student Membership PK Ages 4 and Over Percent","publisher_type":"Number"},{"code":"CPNTGP4C","ordinal":17,"publisher_description":"Campus 2024 Student Enrollment PK-04 Count","publisher_type":"Number"},{"code":"CPNTGP4P","ordinal":18,"publisher_description":"Campus 2024 Student Enrollment PK-04 Percent","publisher_type":"Number"},{"code":"CPETGKNC","ordinal":19,"publisher_description":"Campus 2024 Student Membership KG Count","publisher_type":"Number"},{"code":"CPETGKNP","ordinal":20,"publisher_description":"Campus 2024 Student Membership KG Percent","publisher_type":"Number"},{"code":"CPNTGKNC","ordinal":21,"publisher_description":"Campus 2024 Student Enrollment KG Count","publisher_type":"Number"},{"code":"CPNTGKNP","ordinal":22,"publisher_description":"Campus 2024 Student Enrollment KG Percent","publisher_type":"Number"},{"code":"CPETG01C","ordinal":23,"publisher_description":"Campus 2024 Student Membership 01 Count","publisher_type":"Number"},{"code":"CPETG01P","ordinal":24,"publisher_description":"Campus 2024 Student Membership 01 Percent","publisher_type":"Number"},{"code":"CPNTG01C","ordinal":25,"publisher_description":"Campus 2024 Student Enrollment 01 Count","publisher_type":"Number"},{"code":"CPNTG01P","ordinal":26,"publisher_description":"Campus 2024 Student Enrollment 01 Percent","publisher_type":"Number"},{"code":"CPETG02C","ordinal":27,"publisher_description":"Campus 2024 Student Membership 02 Count","publisher_type":"Number"},{"code":"CPETG02P","ordinal":28,"publisher_description":"Campus 2024 Student Membership 02 Percent","publisher_type":"Number"},{"code":"CPNTG02C","ordinal":29,"publisher_description":"Campus 2024 Student Enrollment 02 Count","publisher_type":"Number"},{"code":"CPNTG02P","ordinal":30,"publisher_description":"Campus 2024 Student Enrollment 02 Percent","publisher_type":"Number"},{"code":"CPETG03C","ordinal":31,"publisher_description":"Campus 2024 Student Membership 03 Count","publisher_type":"Number"},{"code":"CPETG03P","ordinal":32,"publisher_description":"Campus 2024 Student Membership 03 Percent","publisher_type":"Number"},{"code":"CPNTG03C","ordinal":33,"publisher_description":"Campus 2024 Student Enrollment 03 Count","publisher_type":"Number"},{"code":"CPNTG03P","ordinal":34,"publisher_description":"Campus 2024 Student Enrollment 03 Percent","publisher_type":"Number"},{"code":"CPETG04C","ordinal":35,"publisher_description":"Campus 2024 Student Membership 04 Count","publisher_type":"Number"},{"code":"CPETG04P","ordinal":36,"publisher_description":"Campus 2024 Student Membership 04 Percent","publisher_type":"Number"},{"code":"CPNTG04C","ordinal":37,"publisher_description":"Campus 2024 Student Enrollment 04 Count","publisher_type":"Number"},{"code":"CPNTG04P","ordinal":38,"publisher_description":"Campus 2024 Student Enrollment 04 Percent","publisher_type":"Number"},{"code":"CPETG05C","ordinal":39,"publisher_description":"Campus 2024 Student Membership 05 Count","publisher_type":"Number"},{"code":"CPETG05P","ordinal":40,"publisher_description":"Campus 2024 Student Membership 05 Percent","publisher_type":"Number"},{"code":"CPNTG05C","ordinal":41,"publisher_description":"Campus 2024 Student Enrollment 05 Count","publisher_type":"Number"},{"code":"CPNTG05P","ordinal":42,"publisher_description":"Campus 2024 Student Enrollment 05 Percent","publisher_type":"Number"},{"code":"CPETG06C","ordinal":43,"publisher_description":"Campus 2024 Student Membership 06 Count","publisher_type":"Number"},{"code":"CPETG06P","ordinal":44,"publisher_description":"Campus 2024 Student Membership 06 Percent","publisher_type":"Number"},{"code":"CPNTG06C","ordinal":45,"publisher_description":"Campus 2024 Student Enrollment 06 Count","publisher_type":"Number"},{"code":"CPNTG06P","ordinal":46,"publisher_description":"Campus 2024 Student Enrollment 06 Percent","publisher_type":"Number"},{"code":"CPETG07C","ordinal":47,"publisher_description":"Campus 2024 Student Membership 07 Count","publisher_type":"Number"},{"code":"CPETG07P","ordinal":48,"publisher_description":"Campus 2024 Student Membership 07 Percent","publisher_type":"Number"},{"code":"CPNTG07C","ordinal":49,"publisher_description":"Campus 2024 Student Enrollment 07 Count","publisher_type":"Number"},{"code":"CPNTG07P","ordinal":50,"publisher_description":"Campus 2024 Student Enrollment 07 Percent","publisher_type":"Number"},{"code":"CPETG08C","ordinal":51,"publisher_description":"Campus 2024 Student Membership 08 Count","publisher_type":"Number"},{"code":"CPETG08P","ordinal":52,"publisher_description":"Campus 2024 Student Membership 08 Percent","publisher_type":"Number"},{"code":"CPNTG08C","ordinal":53,"publisher_description":"Campus 2024 Student Enrollment 08 Count","publisher_type":"Number"},{"code":"CPNTG08P","ordinal":54,"publisher_description":"Campus 2024 Student Enrollment 08 Percent","publisher_type":"Number"},{"code":"CPETG09C","ordinal":55,"publisher_description":"Campus 2024 Student Membership 09 Count","publisher_type":"Number"},{"code":"CPETG09P","ordinal":56,"publisher_description":"Campus 2024 Student Membership 09 Percent","publisher_type":"Number"},{"code":"CPNTG09C","ordinal":57,"publisher_description":"Campus 2024 Student Enrollment 09 Count","publisher_type":"Number"},{"code":"CPNTG09P","ordinal":58,"publisher_description":"Campus 2024 Student Enrollment 09 Percent","publisher_type":"Number"},{"code":"CPETG10C","ordinal":59,"publisher_description":"Campus 2024 Student Membership 10 Count","publisher_type":"Number"},{"code":"CPETG10P","ordinal":60,"publisher_description":"Campus 2024 Student Membership 10 Percent","publisher_type":"Number"},{"code":"CPNTG10C","ordinal":61,"publisher_description":"Campus 2024 Student Enrollment 10 Count","publisher_type":"Number"},{"code":"CPNTG10P","ordinal":62,"publisher_description":"Campus 2024 Student Enrollment 10 Percent","publisher_type":"Number"},{"code":"CPETG11C","ordinal":63,"publisher_description":"Campus 2024 Student Membership 11 Count","publisher_type":"Number"},{"code":"CPETG11P","ordinal":64,"publisher_description":"Campus 2024 Student Membership 11 Percent","publisher_type":"Number"},{"code":"CPNTG11C","ordinal":65,"publisher_description":"Campus 2024 Student Enrollment 11 Count","publisher_type":"Number"},{"code":"CPNTG11P","ordinal":66,"publisher_description":"Campus 2024 Student Enrollment 11 Percent","publisher_type":"Number"},{"code":"CPETG12C","ordinal":67,"publisher_description":"Campus 2024 Student Membership 12 Count","publisher_type":"Number"},{"code":"CPETG12P","ordinal":68,"publisher_description":"Campus 2024 Student Membership 12 Percent","publisher_type":"Number"},{"code":"CPNTG12C","ordinal":69,"publisher_description":"Campus 2024 Student Enrollment 12 Count","publisher_type":"Number"},{"code":"CPNTG12P","ordinal":70,"publisher_description":"Campus 2024 Student Enrollment 12 Percent","publisher_type":"Number"},{"code":"CPETBLAC","ordinal":71,"publisher_description":"Campus 2024 Student Membership African American Count","publisher_type":"Number"},{"code":"CPETBLAP","ordinal":72,"publisher_description":"Campus 2024 Student Membership African American Percent","publisher_type":"Number"},{"code":"CPNTBLAC","ordinal":73,"publisher_description":"Campus 2024 Student Enrollment African American Count","publisher_type":"Number"},{"code":"CPNTBLAP","ordinal":74,"publisher_description":"Campus 2024 Student Enrollment African American Percent","publisher_type":"Number"},{"code":"CPETHISC","ordinal":75,"publisher_description":"Campus 2024 Student Membership Hispanic Count","publisher_type":"Number"},{"code":"CPETHISP","ordinal":76,"publisher_description":"Campus 2024 Student Membership Hispanic Percent","publisher_type":"Number"},{"code":"CPNTHISC","ordinal":77,"publisher_description":"Campus 2024 Student Enrollment Hispanic Count","publisher_type":"Number"},{"code":"CPNTHISP","ordinal":78,"publisher_description":"Campus 2024 Student Enrollment Hispanic Percent","publisher_type":"Number"},{"code":"CPETWHIC","ordinal":79,"publisher_description":"Campus 2024 Student Membership White Count","publisher_type":"Number"},{"code":"CPETWHIP","ordinal":80,"publisher_description":"Campus 2024 Student Membership White Percent","publisher_type":"Number"},{"code":"CPNTWHIC","ordinal":81,"publisher_description":"Campus 2024 Student Enrollment White Count","publisher_type":"Number"},{"code":"CPNTWHIP","ordinal":82,"publisher_description":"Campus 2024 Student Enrollment White Percent","publisher_type":"Number"},{"code":"CPETINDC","ordinal":83,"publisher_description":"Campus 2024 Student Membership American Indian Count","publisher_type":"Number"},{"code":"CPETINDP","ordinal":84,"publisher_description":"Campus 2024 Student Membership American Indian Percent","publisher_type":"Number"},{"code":"CPNTINDC","ordinal":85,"publisher_description":"Campus 2024 Student Enrollment American Indian Count","publisher_type":"Number"},{"code":"CPNTINDP","ordinal":86,"publisher_description":"Campus 2024 Student Enrollment American Indian Percent","publisher_type":"Number"},{"code":"CPETASIC","ordinal":87,"publisher_description":"Campus 2024 Student Membership Asian Count","publisher_type":"Number"},{"code":"CPETASIP","ordinal":88,"publisher_description":"Campus 2024 Student Membership Asian Percent","publisher_type":"Number"},{"code":"CPNTASIC","ordinal":89,"publisher_description":"Campus 2024 Student Enrollment Asian Count","publisher_type":"Number"},{"code":"CPNTASIP","ordinal":90,"publisher_description":"Campus 2024 Student Enrollment Asian Percent","publisher_type":"Number"},{"code":"CPETPCIC","ordinal":91,"publisher_description":"Campus 2024 Student Membership Pacific Islander Count","publisher_type":"Number"},{"code":"CPETPCIP","ordinal":92,"publisher_description":"Campus 2024 Student Membership Pacific Islander Percent","publisher_type":"Number"},{"code":"CPNTPCIC","ordinal":93,"publisher_description":"Campus 2024 Student Enrollment Pacific Islander Count","publisher_type":"Number"},{"code":"CPNTPCIP","ordinal":94,"publisher_description":"Campus 2024 Student Enrollment Pacific Islander Percent","publisher_type":"Number"},{"code":"CPETTWOC","ordinal":95,"publisher_description":"Campus 2024 Student Membership Two or More Races Count","publisher_type":"Number"},{"code":"CPETTWOP","ordinal":96,"publisher_description":"Campus 2024 Student Membership Two or More Races Percent","publisher_type":"Number"},{"code":"CPNTTWOC","ordinal":97,"publisher_description":"Campus 2024 Student Enrollment Two or More Races Count","publisher_type":"Number"},{"code":"CPNTTWOP","ordinal":98,"publisher_description":"Campus 2024 Student Enrollment Two or More Races Percent","publisher_type":"Number"},{"code":"CPETFEMC","ordinal":99,"publisher_description":"Campus 2024 Student Membership Female Count","publisher_type":"Number"},{"code":"CPETFEMP","ordinal":100,"publisher_description":"Campus 2024 Student Membership Female Percent","publisher_type":"Number"},{"code":"CPNTFEMC","ordinal":101,"publisher_description":"Campus 2024 Student Enrollment Female Count","publisher_type":"Number"},{"code":"CPNTFEMP","ordinal":102,"publisher_description":"Campus 2024 Student Enrollment Female Percent","publisher_type":"Number"},{"code":"CPETMALC","ordinal":103,"publisher_description":"Campus 2024 Student Membership Male Count","publisher_type":"Number"},{"code":"CPETMALP","ordinal":104,"publisher_description":"Campus 2024 Student Membership Male Percent","publisher_type":"Number"},{"code":"CPNTMALC","ordinal":105,"publisher_description":"Campus 2024 Student Enrollment Male Count","publisher_type":"Number"},{"code":"CPNTMALP","ordinal":106,"publisher_description":"Campus 2024 Student Enrollment Male Percent","publisher_type":"Number"},{"code":"CPETECOC","ordinal":107,"publisher_description":"Campus 2024 Student Membership Econ Disadv Count","publisher_type":"Number"},{"code":"CPETECOP","ordinal":108,"publisher_description":"Campus 2024 Student Membership Econ Disadv Percent","publisher_type":"Number"},{"code":"CPNTECOC","ordinal":109,"publisher_description":"Campus 2024 Student Enrollment Econ Disadv Count","publisher_type":"Number"},{"code":"CPNTECOP","ordinal":110,"publisher_description":"Campus 2024 Student Enrollment Econ Disadv Percent","publisher_type":"Number"},{"code":"CPETNEDC","ordinal":111,"publisher_description":"Campus 2024 Student Membership Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"CPETNEDP","ordinal":112,"publisher_description":"Campus 2024 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"CPNTNEDC","ordinal":113,"publisher_description":"Campus 2024 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"CPNTNEDP","ordinal":114,"publisher_description":"Campus 2024 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"CPET504C","ordinal":115,"publisher_description":"Campus 2024 Student Membership Section 504 Count","publisher_type":"Number"},{"code":"CPET504P","ordinal":116,"publisher_description":"Campus 2024 Student Membership Section 504 Percent","publisher_type":"Number"},{"code":"CPNT504C","ordinal":117,"publisher_description":"Campus 2024 Student Enrollment Section 504 Count","publisher_type":"Number"},{"code":"CPNT504P","ordinal":118,"publisher_description":"Campus 2024 Student Enrollment Section 504 Percent","publisher_type":"Number"},{"code":"CPETLEPC","ordinal":119,"publisher_description":"Campus 2024 Student Membership EB/EL Count","publisher_type":"Number"},{"code":"CPETLEPP","ordinal":120,"publisher_description":"Campus 2024 Student Membership EB/EL Percent","publisher_type":"Number"},{"code":"CPNTLEPC","ordinal":121,"publisher_description":"Campus 2024 Student Enrollment EL Count","publisher_type":"Number"},{"code":"CPNTLEPP","ordinal":122,"publisher_description":"Campus 2024 Student Enrollment EL Percent","publisher_type":"Number"},{"code":"CPETDISC","ordinal":123,"publisher_description":"Campus 2023 DAEP Count","publisher_type":"Number"},{"code":"CPETDISP","ordinal":124,"publisher_description":"Campus 2023 DAEP Percent","publisher_type":"Number"},{"code":"CPETDSLC","ordinal":125,"publisher_description":"Campus 2024 Student Membership Dyslexia Count","publisher_type":"Number"},{"code":"CPETDSLP","ordinal":126,"publisher_description":"Campus 2024 Student Membership Dyslexia Percent","publisher_type":"Number"},{"code":"CPNTDSLC","ordinal":127,"publisher_description":"Campus 2024 Student Enrollment Dyslexia Count","publisher_type":"Number"},{"code":"CPNTDSLP","ordinal":128,"publisher_description":"Campus 2024 Student Enrollment Dyslexia Percent","publisher_type":"Number"},{"code":"CPETFOSC","ordinal":129,"publisher_description":"Campus 2024 Student Membership Foster Care Count","publisher_type":"Number"},{"code":"CPETFOSP","ordinal":130,"publisher_description":"Campus 2024 Student Membership Foster Care Percent","publisher_type":"Number"},{"code":"CPNTFOSC","ordinal":131,"publisher_description":"Campus 2024 Student Enrollment Foster Care Count","publisher_type":"Number"},{"code":"CPNTFOSP","ordinal":132,"publisher_description":"Campus 2024 Student Enrollment Foster Care Percent","publisher_type":"Number"},{"code":"CPETHOMC","ordinal":133,"publisher_description":"Campus 2024 Student Membership Homeless Count","publisher_type":"Number"},{"code":"CPETHOMP","ordinal":134,"publisher_description":"Campus 2024 Student Membership Homeless Percent","publisher_type":"Number"},{"code":"CPNTHOMC","ordinal":135,"publisher_description":"Campus 2024 Student Enrollment Homeless Count","publisher_type":"Number"},{"code":"CPNTHOMP","ordinal":136,"publisher_description":"Campus 2024 Student Enrollment Homeless Percent","publisher_type":"Number"},{"code":"CPETIMMC","ordinal":137,"publisher_description":"Campus 2024 Student Membership Immigrant Count","publisher_type":"Number"},{"code":"CPETIMMP","ordinal":138,"publisher_description":"Campus 2024 Student Membership Immigrant Percent","publisher_type":"Number"},{"code":"CPNTIMMC","ordinal":139,"publisher_description":"Campus 2024 Student Enrollment Immigrant Count","publisher_type":"Number"},{"code":"CPNTIMMP","ordinal":140,"publisher_description":"Campus 2024 Student Enrollment Immigrant Percent","publisher_type":"Number"},{"code":"CPETMIGC","ordinal":141,"publisher_description":"Campus 2024 Student Membership Migrant Count","publisher_type":"Number"},{"code":"CPETMIGP","ordinal":142,"publisher_description":"Campus 2024 Student Membership Migrant Percent","publisher_type":"Number"},{"code":"CPNTMIGC","ordinal":143,"publisher_description":"Campus 2024 Student Enrollment Migrant Count","publisher_type":"Number"},{"code":"CPNTMIGP","ordinal":144,"publisher_description":"Campus 2024 Student Enrollment Migrant Percent","publisher_type":"Number"},{"code":"CPETTT1C","ordinal":145,"publisher_description":"Campus 2024 Student Membership Title I Count","publisher_type":"Number"},{"code":"CPETTT1P","ordinal":146,"publisher_description":"Campus 2024 Student Membership Title I Percent","publisher_type":"Number"},{"code":"CPNTTT1C","ordinal":147,"publisher_description":"Campus 2024 Student Enrollment Title I Count","publisher_type":"Number"},{"code":"CPNTTT1P","ordinal":148,"publisher_description":"Campus 2024 Student Enrollment Title I Percent","publisher_type":"Number"},{"code":"CPETMLCC","ordinal":149,"publisher_description":"Campus 2024 Student Membership Military-Connected Count","publisher_type":"Number"},{"code":"CPETMLCP","ordinal":150,"publisher_description":"Campus 2024 Student Membership Military-Connected Percent","publisher_type":"Number"},{"code":"CPNTMLCC","ordinal":151,"publisher_description":"Campus 2024 Student Enrollment Military-Connected Count","publisher_type":"Number"},{"code":"CPNTMLCP","ordinal":152,"publisher_description":"Campus 2024 Student Enrollment Military-Connected Percent","publisher_type":"Number"},{"code":"CPETRSKC","ordinal":153,"publisher_description":"Campus 2024 Student Membership At Risk Count","publisher_type":"Number"},{"code":"CPETRSKP","ordinal":154,"publisher_description":"Campus 2024 Student Membership At Risk Percent","publisher_type":"Number"},{"code":"CPNTRSKC","ordinal":155,"publisher_description":"Campus 2024 Student Enrollment At Risk Count","publisher_type":"Number"},{"code":"CPNTRSKP","ordinal":156,"publisher_description":"Campus 2024 Student Enrollment At Risk Percent","publisher_type":"Number"},{"code":"CPETBILC","ordinal":157,"publisher_description":"Campus 2024 Student Membership Bilingual/ESL Count","publisher_type":"Number"},{"code":"CPETBILP","ordinal":158,"publisher_description":"Campus 2024 Student Membership Bilingual/ESL Percent","publisher_type":"Number"},{"code":"CPNTBILC","ordinal":159,"publisher_description":"Campus 2024 Student Enrollment Bilingual/ESL Count","publisher_type":"Number"},{"code":"CPNTBILP","ordinal":160,"publisher_description":"Campus 2024 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number"},{"code":"CPETVOCC","ordinal":161,"publisher_description":"Campus 2024 Student Membership Career & Technical Education Count","publisher_type":"Number"},{"code":"CPETVOCP","ordinal":162,"publisher_description":"Campus 2024 Student Membership Career & Technical Education Percent","publisher_type":"Number"},{"code":"CPETVHSC","ordinal":163,"publisher_description":"Campus 2024 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number"},{"code":"CPETVHSP","ordinal":164,"publisher_description":"Campus 2024 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number"},{"code":"CPETGIFC","ordinal":165,"publisher_description":"Campus 2024 Student Membership Gifted & Talented Count","publisher_type":"Number"},{"code":"CPETGIFP","ordinal":166,"publisher_description":"Campus 2024 Student Membership Gifted & Talented Percent","publisher_type":"Number"},{"code":"CPNTGIFC","ordinal":167,"publisher_description":"Campus 2024 Student Enrollment Gifted & Talented Count","publisher_type":"Number"},{"code":"CPNTGIFP","ordinal":168,"publisher_description":"Campus 2024 Student Enrollment Gifted & Talented Percent","publisher_type":"Number"},{"code":"CPETSPEC","ordinal":169,"publisher_description":"Campus 2024 Student Membership Special Ed Count","publisher_type":"Number"},{"code":"CPETSPEP","ordinal":170,"publisher_description":"Campus 2024 Student Membership Special Ed Percent","publisher_type":"Number"},{"code":"CPNTSPEC","ordinal":171,"publisher_description":"Campus 2024 Student Enrollment Special Ed Count","publisher_type":"Number"},{"code":"CPNTSPEP","ordinal":172,"publisher_description":"Campus 2024 Student Enrollment Special Ed Percent","publisher_type":"Number"},{"code":"CPETSIMC","ordinal":173,"publisher_description":"Campus 2024 Student Membership Total Students with Disabilities Count","publisher_type":"Number"},{"code":"CPETSINC","ordinal":174,"publisher_description":"Campus 2024 Student Membership Intellectual Disabilities Count","publisher_type":"Number"},{"code":"CPETSINP","ordinal":175,"publisher_description":"Campus 2024 Student Membership Intellectual Disabilities Percent","publisher_type":"Number"},{"code":"CPETSPHC","ordinal":176,"publisher_description":"Campus 2024 Student Membership Physical Disabilities Count","publisher_type":"Number"},{"code":"CPETSPHP","ordinal":177,"publisher_description":"Campus 2024 Student Membership Physical Disabilities Percent","publisher_type":"Number"},{"code":"CPETSAUC","ordinal":178,"publisher_description":"Campus 2024 Student Membership Autism Count","publisher_type":"Number"},{"code":"CPETSAUP","ordinal":179,"publisher_description":"Campus 2024 Student Membership Autism Percent","publisher_type":"Number"},{"code":"CPETSBHC","ordinal":180,"publisher_description":"Campus 2024 Student Membership Behavioral Disabilities Count","publisher_type":"Number"},{"code":"CPETSBHP","ordinal":181,"publisher_description":"Campus 2024 Student Membership Behavioral Disabilities Percent","publisher_type":"Number"},{"code":"CPETSNOC","ordinal":182,"publisher_description":"Campus 2024 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number"},{"code":"CPETSNOP","ordinal":183,"publisher_description":"Campus 2024 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number"},{"code":"CPEMBLAC","ordinal":184,"publisher_description":"Campus 2024 Student Membership 2023 Mobility African American Count","publisher_type":"Number"},{"code":"CPEMBLAP","ordinal":185,"publisher_description":"Campus 2024 Student Membership 2023 Mobility African American Percent","publisher_type":"Number"},{"code":"CPEMHISC","ordinal":186,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Hispanic Count","publisher_type":"Number"},{"code":"CPEMHISP","ordinal":187,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Hispanic Percent","publisher_type":"Number"},{"code":"CPEMWHIC","ordinal":188,"publisher_description":"Campus 2024 Student Membership 2023 Mobility White Count","publisher_type":"Number"},{"code":"CPEMWHIP","ordinal":189,"publisher_description":"Campus 2024 Student Membership 2023 Mobility White Percent","publisher_type":"Number"},{"code":"CPEMINDC","ordinal":190,"publisher_description":"Campus 2024 Student Membership 2023 Mobility American Indian Count","publisher_type":"Number"},{"code":"CPEMINDP","ordinal":191,"publisher_description":"Campus 2024 Student Membership 2023 Mobility American Indian Percent","publisher_type":"Number"},{"code":"CPEMASIC","ordinal":192,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Asian Count","publisher_type":"Number"},{"code":"CPEMASIP","ordinal":193,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Asian Percent","publisher_type":"Number"},{"code":"CPEMPCIC","ordinal":194,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Pacific Islander Count","publisher_type":"Number"},{"code":"CPEMPCIP","ordinal":195,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Pacific Islander Percent","publisher_type":"Number"},{"code":"CPEMTWOC","ordinal":196,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Two or More Races Count","publisher_type":"Number"},{"code":"CPEMTWOP","ordinal":197,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Two or More Races Percent","publisher_type":"Number"},{"code":"CPEMALLC","ordinal":198,"publisher_description":"Campus 2024 Student Membership 2023 Mobility All Students Count","publisher_type":"Number"},{"code":"CPEMALLP","ordinal":199,"publisher_description":"Campus 2024 Student Membership 2023 Mobility All Students Percent","publisher_type":"Number"},{"code":"CPEMSPEC","ordinal":200,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Special Ed Count","publisher_type":"Number"},{"code":"CPEMSPEP","ordinal":201,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Special Ed Percent","publisher_type":"Number"},{"code":"CPEMLEPC","ordinal":202,"publisher_description":"Campus 2024 Student Membership 2023 Mobility EB/EL Count","publisher_type":"Number"},{"code":"CPEMLEPP","ordinal":203,"publisher_description":"Campus 2024 Student Membership 2023 Mobility EB/EL Percent","publisher_type":"Number"},{"code":"CPEMECOC","ordinal":204,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Econ Disadv Count","publisher_type":"Number"},{"code":"CPEMECOP","ordinal":205,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Econ Disadv Percent","publisher_type":"Number"},{"code":"CPETATTC","ordinal":206,"publisher_description":"Campus 2024 Student Membership 2022-23 Attrition All Students Count","publisher_type":"Number"},{"code":"CPETATTP","ordinal":207,"publisher_description":"Campus 2024 Student Membership 2022-23 Attrition All Students Percent","publisher_type":"Number"},{"code":"CPERRAKR","ordinal":208,"publisher_description":"Campus 2023 Retention Regular Ed KG Rate","publisher_type":"Number"},{"code":"CPERSAKR","ordinal":209,"publisher_description":"Campus 2023 Retention Special Ed KG Rate","publisher_type":"Number"},{"code":"CPERRA1R","ordinal":210,"publisher_description":"Campus 2023 Retention Regular Ed 01 Rate","publisher_type":"Number"},{"code":"CPERSA1R","ordinal":211,"publisher_description":"Campus 2023 Retention Special Ed 01 Rate","publisher_type":"Number"},{"code":"CPERRA2R","ordinal":212,"publisher_description":"Campus 2023 Retention Regular Ed 02 Rate","publisher_type":"Number"},{"code":"CPERSA2R","ordinal":213,"publisher_description":"Campus 2023 Retention Special Ed 02 Rate","publisher_type":"Number"},{"code":"CPERRA3R","ordinal":214,"publisher_description":"Campus 2023 Retention Regular Ed 03 Rate","publisher_type":"Number"},{"code":"CPERSA3R","ordinal":215,"publisher_description":"Campus 2023 Retention Special Ed 03 Rate","publisher_type":"Number"},{"code":"CPERRA4R","ordinal":216,"publisher_description":"Campus 2023 Retention Regular Ed 04 Rate","publisher_type":"Number"},{"code":"CPERSA4R","ordinal":217,"publisher_description":"Campus 2023 Retention Special Ed 04 Rate","publisher_type":"Number"},{"code":"CPERRA5R","ordinal":218,"publisher_description":"Campus 2023 Retention Regular Ed 05 Rate","publisher_type":"Number"},{"code":"CPERSA5R","ordinal":219,"publisher_description":"Campus 2023 Retention Special Ed 05 Rate","publisher_type":"Number"},{"code":"CPERRA6R","ordinal":220,"publisher_description":"Campus 2023 Retention Regular Ed 06 Rate","publisher_type":"Number"},{"code":"CPERSA6R","ordinal":221,"publisher_description":"Campus 2023 Retention Special Ed 06 Rate","publisher_type":"Number"},{"code":"CPERRA7R","ordinal":222,"publisher_description":"Campus 2023 Retention Regular Ed 07 Rate","publisher_type":"Number"},{"code":"CPERSA7R","ordinal":223,"publisher_description":"Campus 2023 Retention Special Ed 07 Rate","publisher_type":"Number"},{"code":"CPERRA8R","ordinal":224,"publisher_description":"Campus 2023 Retention Regular Ed 08 Rate","publisher_type":"Number"},{"code":"CPERSA8R","ordinal":225,"publisher_description":"Campus 2023 Retention Special Ed 08 Rate","publisher_type":"Number"},{"code":"CPERRA9R","ordinal":226,"publisher_description":"Campus 2023 Retention Regular Ed 09 Rate","publisher_type":"Number"},{"code":"CPERSA9R","ordinal":227,"publisher_description":"Campus 2023 Retention Special Ed 09 Rate","publisher_type":"Number"},{"code":"CPCTGKGA","ordinal":228,"publisher_description":"Campus 2024 Class Size Kindergarten- Avg Size","publisher_type":"Number"},{"code":"CPCTG01A","ordinal":229,"publisher_description":"Campus 2024 Class Size Grade 1 - Avg Size","publisher_type":"Number"},{"code":"CPCTG02A","ordinal":230,"publisher_description":"Campus 2024 Class Size Grade 2 - Avg Size","publisher_type":"Number"},{"code":"CPCTG03A","ordinal":231,"publisher_description":"Campus 2024 Class Size Grade 3 - Avg Size","publisher_type":"Number"},{"code":"CPCTG04A","ordinal":232,"publisher_description":"Campus 2024 Class Size Grade 4 - Avg Size","publisher_type":"Number"},{"code":"CPCTG05A","ordinal":233,"publisher_description":"Campus 2024 Class Size Grade 5 - Avg Size","publisher_type":"Number"},{"code":"CPCTG06A","ordinal":234,"publisher_description":"Campus 2024 Class Size Grade 6 - Avg Size","publisher_type":"Number"},{"code":"CPCTENGA","ordinal":235,"publisher_description":"Campus 2024 Class Size Sec English - Avg Size","publisher_type":"Number"},{"code":"CPCTFLAA","ordinal":236,"publisher_description":"Campus 2024 Class Size Sec For Lng - Avg Size","publisher_type":"Number"},{"code":"CPCTMATA","ordinal":237,"publisher_description":"Campus 2024 Class Size Sec Math - Avg Size","publisher_type":"Number"},{"code":"CPCTSCIA","ordinal":238,"publisher_description":"Campus 2024 Class Size Sec Sci - Avg Size","publisher_type":"Number"},{"code":"CPCTSOCA","ordinal":239,"publisher_description":"Campus 2024 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number"}],"fields":[{"code":"CAMPUS","dictionary_status":"not_applicable","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"CAMPNAME","dictionary_status":"not_applicable","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_description":null,"publisher_type":null},{"code":"CPERRAKR","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_kg_rate","label":"Campus 2023 Retention: Regular Ed KG Rate","position":5,"publisher_description":"Campus 2023 Retention Regular Ed KG Rate","publisher_type":"Number"},{"code":"CPERRA1R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_01_rate","label":"Campus 2023 Retention: Regular Ed 01 Rate","position":6,"publisher_description":"Campus 2023 Retention Regular Ed 01 Rate","publisher_type":"Number"},{"code":"CPERRA2R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_02_rate","label":"Campus 2023 Retention: Regular Ed 02 Rate","position":7,"publisher_description":"Campus 2023 Retention Regular Ed 02 Rate","publisher_type":"Number"},{"code":"CPERRA3R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_03_rate","label":"Campus 2023 Retention: Regular Ed 03 Rate","position":8,"publisher_description":"Campus 2023 Retention Regular Ed 03 Rate","publisher_type":"Number"},{"code":"CPERRA4R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_04_rate","label":"Campus 2023 Retention: Regular Ed 04 Rate","position":9,"publisher_description":"Campus 2023 Retention Regular Ed 04 Rate","publisher_type":"Number"},{"code":"CPERRA5R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_05_rate","label":"Campus 2023 Retention: Regular Ed 05 Rate","position":10,"publisher_description":"Campus 2023 Retention Regular Ed 05 Rate","publisher_type":"Number"},{"code":"CPERRA6R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_06_rate","label":"Campus 2023 Retention: Regular Ed 06 Rate","position":11,"publisher_description":"Campus 2023 Retention Regular Ed 06 Rate","publisher_type":"Number"},{"code":"CPERRA7R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_07_rate","label":"Campus 2023 Retention: Regular Ed 07 Rate","position":12,"publisher_description":"Campus 2023 Retention Regular Ed 07 Rate","publisher_type":"Number"},{"code":"CPERRA8R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_08_rate","label":"Campus 2023 Retention: Regular Ed 08 Rate","position":13,"publisher_description":"Campus 2023 Retention Regular Ed 08 Rate","publisher_type":"Number"},{"code":"CPERRA9R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_regular_ed_09_rate","label":"Campus 2023 Retention: Regular Ed 09 Rate","position":14,"publisher_description":"Campus 2023 Retention Regular Ed 09 Rate","publisher_type":"Number"},{"code":"CPERSAKR","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_kg_rate","label":"Campus 2023 Retention: Special Ed KG Rate","position":15,"publisher_description":"Campus 2023 Retention Special Ed KG Rate","publisher_type":"Number"},{"code":"CPERSA1R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_01_rate","label":"Campus 2023 Retention: Special Ed 01 Rate","position":16,"publisher_description":"Campus 2023 Retention Special Ed 01 Rate","publisher_type":"Number"},{"code":"CPERSA2R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_02_rate","label":"Campus 2023 Retention: Special Ed 02 Rate","position":17,"publisher_description":"Campus 2023 Retention Special Ed 02 Rate","publisher_type":"Number"},{"code":"CPERSA3R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_03_rate","label":"Campus 2023 Retention: Special Ed 03 Rate","position":18,"publisher_description":"Campus 2023 Retention Special Ed 03 Rate","publisher_type":"Number"},{"code":"CPERSA4R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_04_rate","label":"Campus 2023 Retention: Special Ed 04 Rate","position":19,"publisher_description":"Campus 2023 Retention Special Ed 04 Rate","publisher_type":"Number"},{"code":"CPERSA5R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_05_rate","label":"Campus 2023 Retention: Special Ed 05 Rate","position":20,"publisher_description":"Campus 2023 Retention Special Ed 05 Rate","publisher_type":"Number"},{"code":"CPERSA6R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_06_rate","label":"Campus 2023 Retention: Special Ed 06 Rate","position":21,"publisher_description":"Campus 2023 Retention Special Ed 06 Rate","publisher_type":"Number"},{"code":"CPERSA7R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_07_rate","label":"Campus 2023 Retention: Special Ed 07 Rate","position":22,"publisher_description":"Campus 2023 Retention Special Ed 07 Rate","publisher_type":"Number"},{"code":"CPERSA8R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_08_rate","label":"Campus 2023 Retention: Special Ed 08 Rate","position":23,"publisher_description":"Campus 2023 Retention Special Ed 08 Rate","publisher_type":"Number"},{"code":"CPERSA9R","dictionary_status":"documented","disposition":"fact","field":"campus_2023_retention_special_ed_09_rate","label":"Campus 2023 Retention: Special Ed 09 Rate","position":24,"publisher_description":"Campus 2023 Retention Special Ed 09 Rate","publisher_type":"Number"},{"code":"CPETSIMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_total_students_with_disabilities_count","label":"Campus 2024 Student Membership: Total Students with Disabilities Count","position":25,"publisher_description":"Campus 2024 Student Membership Total Students with Disabilities Count","publisher_type":"Number"},{"code":"CPETSINC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_intellectual_disabilities_count","label":"Campus 2024 Student Membership: Intellectual Disabilities Count","position":26,"publisher_description":"Campus 2024 Student Membership Intellectual Disabilities Count","publisher_type":"Number"},{"code":"CPETSPHC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_physical_disabilities_count","label":"Campus 2024 Student Membership: Physical Disabilities Count","position":27,"publisher_description":"Campus 2024 Student Membership Physical Disabilities Count","publisher_type":"Number"},{"code":"CPETSBHC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_behavioral_disabilities_count","label":"Campus 2024 Student Membership: Behavioral Disabilities Count","position":28,"publisher_description":"Campus 2024 Student Membership Behavioral Disabilities Count","publisher_type":"Number"},{"code":"CPETSAUC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_autism_count","label":"Campus 2024 Student Membership: Autism Count","position":29,"publisher_description":"Campus 2024 Student Membership Autism Count","publisher_type":"Number"},{"code":"CPETSNOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_non_categorical_early_childhood_count","label":"Campus 2024 Student Membership: Non-Categorical Early Childhood Count","position":30,"publisher_description":"Campus 2024 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number"},{"code":"CPETSINP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_intellectual_disabilities_percent","label":"Campus 2024 Student Membership: Intellectual Disabilities Percent","position":31,"publisher_description":"Campus 2024 Student Membership Intellectual Disabilities Percent","publisher_type":"Number"},{"code":"CPETSPHP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_physical_disabilities_percent","label":"Campus 2024 Student Membership: Physical Disabilities Percent","position":32,"publisher_description":"Campus 2024 Student Membership Physical Disabilities Percent","publisher_type":"Number"},{"code":"CPETSBHP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_behavioral_disabilities_percent","label":"Campus 2024 Student Membership: Behavioral Disabilities Percent","position":33,"publisher_description":"Campus 2024 Student Membership Behavioral Disabilities Percent","publisher_type":"Number"},{"code":"CPETSAUP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_autism_percent","label":"Campus 2024 Student Membership: Autism Percent","position":34,"publisher_description":"Campus 2024 Student Membership Autism Percent","publisher_type":"Number"},{"code":"CPETSNOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_non_categorical_early_childhood_percent","label":"Campus 2024 Student Membership: Non-Categorical Early Childhood Percent","position":35,"publisher_description":"Campus 2024 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number"},{"code":"CPETDISC","dictionary_status":"documented","disposition":"fact","field":"campus_2023_daep_count","label":"Campus 2023 DAEP: Count","position":36,"publisher_description":"Campus 2023 DAEP Count","publisher_type":"Number"},{"code":"CPETDISP","dictionary_status":"documented","disposition":"fact","field":"campus_2023_daep_percent","label":"Campus 2023 DAEP: Percent","position":37,"publisher_description":"Campus 2023 DAEP Percent","publisher_type":"Number"},{"code":"CPETATTC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2022_23_attrition_all_students_count","label":"Campus 2024 Student Membership: 2022-23 Attrition All Students Count","position":38,"publisher_description":"Campus 2024 Student Membership 2022-23 Attrition All Students Count","publisher_type":"Number"},{"code":"CPETATTP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2022_23_attrition_all_students_percent","label":"Campus 2024 Student Membership: 2022-23 Attrition All Students Percent","position":39,"publisher_description":"Campus 2024 Student Membership 2022-23 Attrition All Students Percent","publisher_type":"Number"},{"code":"CPETLEPP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_eb_el_percent","label":"Campus 2024 Student Membership: EB/EL Percent","position":40,"publisher_description":"Campus 2024 Student Membership EB/EL Percent","publisher_type":"Number"},{"code":"CPETECOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_econ_disadv_percent","label":"Campus 2024 Student Membership: Econ Disadv Percent","position":41,"publisher_description":"Campus 2024 Student Membership Econ Disadv Percent","publisher_type":"Number"},{"code":"CPETRSKP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_at_risk_percent","label":"Campus 2024 Student Membership: At Risk Percent","position":42,"publisher_description":"Campus 2024 Student Membership At Risk Percent","publisher_type":"Number"},{"code":"CPETNEDP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_non_educationally_disadv_percent","label":"Campus 2024 Student Membership: Non-Educationally Disadv Percent","position":43,"publisher_description":"Campus 2024 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"CPETECOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_econ_disadv_count","label":"Campus 2024 Student Membership: Econ Disadv Count","position":44,"publisher_description":"Campus 2024 Student Membership Econ Disadv Count","publisher_type":"Number"},{"code":"CPETRSKC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_at_risk_count","label":"Campus 2024 Student Membership: At Risk Count","position":45,"publisher_description":"Campus 2024 Student Membership At Risk Count","publisher_type":"Number"},{"code":"CPETLEPC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_eb_el_count","label":"Campus 2024 Student Membership: EB/EL Count","position":46,"publisher_description":"Campus 2024 Student Membership EB/EL Count","publisher_type":"Number"},{"code":"CPETNEDC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_non_educationally_disadv_count","label":"Campus 2024 Student Membership: Non-Educationally Disadv Count","position":47,"publisher_description":"Campus 2024 Student Membership Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"CPETSPEC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_special_ed_count","label":"Campus 2024 Student Membership: Special Ed Count","position":48,"publisher_description":"Campus 2024 Student Membership Special Ed Count","publisher_type":"Number"},{"code":"CPETGIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_gifted_and_talented_count","label":"Campus 2024 Student Membership: Gifted & Talented Count","position":49,"publisher_description":"Campus 2024 Student Membership Gifted & Talented Count","publisher_type":"Number"},{"code":"CPETALLC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_all_students_count","label":"Campus 2024 Student Membership: All Students Count","position":50,"publisher_description":"Campus 2024 Student Membership All Students Count","publisher_type":"Number"},{"code":"CPETTT1C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_title_i_count","label":"Campus 2024 Student Membership: Title I Count","position":51,"publisher_description":"Campus 2024 Student Membership Title I Count","publisher_type":"Number"},{"code":"CPETHOMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_homeless_count","label":"Campus 2024 Student Membership: Homeless Count","position":52,"publisher_description":"Campus 2024 Student Membership Homeless Count","publisher_type":"Number"},{"code":"CPETIMMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_immigrant_count","label":"Campus 2024 Student Membership: Immigrant Count","position":53,"publisher_description":"Campus 2024 Student Membership Immigrant Count","publisher_type":"Number"},{"code":"CPET504C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_section_504_count","label":"Campus 2024 Student Membership: Section 504 Count","position":54,"publisher_description":"Campus 2024 Student Membership Section 504 Count","publisher_type":"Number"},{"code":"CPETDSLC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_dyslexia_count","label":"Campus 2024 Student Membership: Dyslexia Count","position":55,"publisher_description":"Campus 2024 Student Membership Dyslexia Count","publisher_type":"Number"},{"code":"CPETMIGC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_migrant_count","label":"Campus 2024 Student Membership: Migrant Count","position":56,"publisher_description":"Campus 2024 Student Membership Migrant Count","publisher_type":"Number"},{"code":"CPETMLCC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_military_connected_count","label":"Campus 2024 Student Membership: Military-Connected Count","position":57,"publisher_description":"Campus 2024 Student Membership Military-Connected Count","publisher_type":"Number"},{"code":"CPETFOSC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_foster_care_count","label":"Campus 2024 Student Membership: Foster Care Count","position":58,"publisher_description":"Campus 2024 Student Membership Foster Care Count","publisher_type":"Number"},{"code":"CPETVOCC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_education_count","label":"Campus 2024 Student Membership: Career & Technical Education Count","position":59,"publisher_description":"Campus 2024 Student Membership Career & Technical Education Count","publisher_type":"Number"},{"code":"CPETVHSC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_9_12_education_count","label":"Campus 2024 Student Membership: Career & Technical (9-12) Education Count","position":60,"publisher_description":"Campus 2024 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number"},{"code":"CPETGP3C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pk_ages_3_and_under_count","label":"Campus 2024 Student Membership: PK Ages 3 and Under Count","position":61,"publisher_description":"Campus 2024 Student Membership PK Ages 3 and Under Count","publisher_type":"Number"},{"code":"CPETGP4C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pk_ages_4_and_over_count","label":"Campus 2024 Student Membership: PK Ages 4 and Over Count","position":62,"publisher_description":"Campus 2024 Student Membership PK Ages 4 and Over Count","publisher_type":"Number"},{"code":"CPETBILC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_bilingual_esl_count","label":"Campus 2024 Student Membership: Bilingual/ESL Count","position":63,"publisher_description":"Campus 2024 Student Membership Bilingual/ESL Count","publisher_type":"Number"},{"code":"CPETINDC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_american_indian_count","label":"Campus 2024 Student Membership: American Indian Count","position":64,"publisher_description":"Campus 2024 Student Membership American Indian Count","publisher_type":"Number"},{"code":"CPETASIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_asian_count","label":"Campus 2024 Student Membership: Asian Count","position":65,"publisher_description":"Campus 2024 Student Membership Asian Count","publisher_type":"Number"},{"code":"CPETPCIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pacific_islander_count","label":"Campus 2024 Student Membership: Pacific Islander Count","position":66,"publisher_description":"Campus 2024 Student Membership Pacific Islander Count","publisher_type":"Number"},{"code":"CPETTWOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_two_or_more_races_count","label":"Campus 2024 Student Membership: Two or More Races Count","position":67,"publisher_description":"Campus 2024 Student Membership Two or More Races Count","publisher_type":"Number"},{"code":"CPETBLAC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_african_american_count","label":"Campus 2024 Student Membership: African American Count","position":68,"publisher_description":"Campus 2024 Student Membership African American Count","publisher_type":"Number"},{"code":"CPETHISC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_hispanic_count","label":"Campus 2024 Student Membership: Hispanic Count","position":69,"publisher_description":"Campus 2024 Student Membership Hispanic Count","publisher_type":"Number"},{"code":"CPETWHIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_white_count","label":"Campus 2024 Student Membership: White Count","position":70,"publisher_description":"Campus 2024 Student Membership White Count","publisher_type":"Number"},{"code":"CPETGEEC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_ee_count","label":"Campus 2024 Student Membership: EE Count","position":71,"publisher_description":"Campus 2024 Student Membership EE Count","publisher_type":"Number"},{"code":"CPETGPKC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pk_count","label":"Campus 2024 Student Membership: PK Count","position":72,"publisher_description":"Campus 2024 Student Membership PK Count","publisher_type":"Number"},{"code":"CPETGKNC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_kg_count","label":"Campus 2024 Student Membership: KG Count","position":73,"publisher_description":"Campus 2024 Student Membership KG Count","publisher_type":"Number"},{"code":"CPETG01C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_01_count","label":"Campus 2024 Student Membership: 01 Count","position":74,"publisher_description":"Campus 2024 Student Membership 01 Count","publisher_type":"Number"},{"code":"CPETG02C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_02_count","label":"Campus 2024 Student Membership: 02 Count","position":75,"publisher_description":"Campus 2024 Student Membership 02 Count","publisher_type":"Number"},{"code":"CPETG03C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_03_count","label":"Campus 2024 Student Membership: 03 Count","position":76,"publisher_description":"Campus 2024 Student Membership 03 Count","publisher_type":"Number"},{"code":"CPETG04C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_04_count","label":"Campus 2024 Student Membership: 04 Count","position":77,"publisher_description":"Campus 2024 Student Membership 04 Count","publisher_type":"Number"},{"code":"CPETG05C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_05_count","label":"Campus 2024 Student Membership: 05 Count","position":78,"publisher_description":"Campus 2024 Student Membership 05 Count","publisher_type":"Number"},{"code":"CPETG06C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_06_count","label":"Campus 2024 Student Membership: 06 Count","position":79,"publisher_description":"Campus 2024 Student Membership 06 Count","publisher_type":"Number"},{"code":"CPETG07C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_07_count","label":"Campus 2024 Student Membership: 07 Count","position":80,"publisher_description":"Campus 2024 Student Membership 07 Count","publisher_type":"Number"},{"code":"CPETG08C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_08_count","label":"Campus 2024 Student Membership: 08 Count","position":81,"publisher_description":"Campus 2024 Student Membership 08 Count","publisher_type":"Number"},{"code":"CPETG09C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_09_count","label":"Campus 2024 Student Membership: 09 Count","position":82,"publisher_description":"Campus 2024 Student Membership 09 Count","publisher_type":"Number"},{"code":"CPETG10C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_10_count","label":"Campus 2024 Student Membership: 10 Count","position":83,"publisher_description":"Campus 2024 Student Membership 10 Count","publisher_type":"Number"},{"code":"CPETG11C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_11_count","label":"Campus 2024 Student Membership: 11 Count","position":84,"publisher_description":"Campus 2024 Student Membership 11 Count","publisher_type":"Number"},{"code":"CPETG12C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_12_count","label":"Campus 2024 Student Membership: 12 Count","position":85,"publisher_description":"Campus 2024 Student Membership 12 Count","publisher_type":"Number"},{"code":"CPETMALC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_male_count","label":"Campus 2024 Student Membership: Male Count","position":86,"publisher_description":"Campus 2024 Student Membership Male Count","publisher_type":"Number"},{"code":"CPETFEMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_female_count","label":"Campus 2024 Student Membership: Female Count","position":87,"publisher_description":"Campus 2024 Student Membership Female Count","publisher_type":"Number"},{"code":"CPEMALLC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_all_students_count","label":"Campus 2024 Student Membership: 2023 Mobility All Students Count","position":88,"publisher_description":"Campus 2024 Student Membership 2023 Mobility All Students Count","publisher_type":"Number"},{"code":"CPEMINDC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_american_indian_count","label":"Campus 2024 Student Membership: 2023 Mobility American Indian Count","position":89,"publisher_description":"Campus 2024 Student Membership 2023 Mobility American Indian Count","publisher_type":"Number"},{"code":"CPEMASIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_asian_count","label":"Campus 2024 Student Membership: 2023 Mobility Asian Count","position":90,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Asian Count","publisher_type":"Number"},{"code":"CPEMPCIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_pacific_islander_count","label":"Campus 2024 Student Membership: 2023 Mobility Pacific Islander Count","position":91,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Pacific Islander Count","publisher_type":"Number"},{"code":"CPEMTWOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_two_or_more_races_count","label":"Campus 2024 Student Membership: 2023 Mobility Two or More Races Count","position":92,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Two or More Races Count","publisher_type":"Number"},{"code":"CPEMBLAC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_african_american_count","label":"Campus 2024 Student Membership: 2023 Mobility African American Count","position":93,"publisher_description":"Campus 2024 Student Membership 2023 Mobility African American Count","publisher_type":"Number"},{"code":"CPEMHISC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_hispanic_count","label":"Campus 2024 Student Membership: 2023 Mobility Hispanic Count","position":94,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Hispanic Count","publisher_type":"Number"},{"code":"CPEMWHIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_white_count","label":"Campus 2024 Student Membership: 2023 Mobility White Count","position":95,"publisher_description":"Campus 2024 Student Membership 2023 Mobility White Count","publisher_type":"Number"},{"code":"CPEMECOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_econ_disadv_count","label":"Campus 2024 Student Membership: 2023 Mobility Econ Disadv Count","position":96,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Econ Disadv Count","publisher_type":"Number"},{"code":"CPEMLEPC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_eb_el_count","label":"Campus 2024 Student Membership: 2023 Mobility EB/EL Count","position":97,"publisher_description":"Campus 2024 Student Membership 2023 Mobility EB/EL Count","publisher_type":"Number"},{"code":"CPEMSPEC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_special_ed_count","label":"Campus 2024 Student Membership: 2023 Mobility Special Ed Count","position":98,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Special Ed Count","publisher_type":"Number"},{"code":"CPEMALLP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_all_students_percent","label":"Campus 2024 Student Membership: 2023 Mobility All Students Percent","position":99,"publisher_description":"Campus 2024 Student Membership 2023 Mobility All Students Percent","publisher_type":"Number"},{"code":"CPEMBLAP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_african_american_percent","label":"Campus 2024 Student Membership: 2023 Mobility African American Percent","position":100,"publisher_description":"Campus 2024 Student Membership 2023 Mobility African American Percent","publisher_type":"Number"},{"code":"CPEMHISP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_hispanic_percent","label":"Campus 2024 Student Membership: 2023 Mobility Hispanic Percent","position":101,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Hispanic Percent","publisher_type":"Number"},{"code":"CPEMINDP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_american_indian_percent","label":"Campus 2024 Student Membership: 2023 Mobility American Indian Percent","position":102,"publisher_description":"Campus 2024 Student Membership 2023 Mobility American Indian Percent","publisher_type":"Number"},{"code":"CPEMWHIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_white_percent","label":"Campus 2024 Student Membership: 2023 Mobility White Percent","position":103,"publisher_description":"Campus 2024 Student Membership 2023 Mobility White Percent","publisher_type":"Number"},{"code":"CPEMASIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_asian_percent","label":"Campus 2024 Student Membership: 2023 Mobility Asian Percent","position":104,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Asian Percent","publisher_type":"Number"},{"code":"CPEMPCIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_pacific_islander_percent","label":"Campus 2024 Student Membership: 2023 Mobility Pacific Islander Percent","position":105,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Pacific Islander Percent","publisher_type":"Number"},{"code":"CPEMTWOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_two_or_more_races_percent","label":"Campus 2024 Student Membership: 2023 Mobility Two or More Races Percent","position":106,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Two or More Races Percent","publisher_type":"Number"},{"code":"CPEMECOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_econ_disadv_percent","label":"Campus 2024 Student Membership: 2023 Mobility Econ Disadv Percent","position":107,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Econ Disadv Percent","publisher_type":"Number"},{"code":"CPEMLEPP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_eb_el_percent","label":"Campus 2024 Student Membership: 2023 Mobility EB/EL Percent","position":108,"publisher_description":"Campus 2024 Student Membership 2023 Mobility EB/EL Percent","publisher_type":"Number"},{"code":"CPEMSPEP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_2023_mobility_special_ed_percent","label":"Campus 2024 Student Membership: 2023 Mobility Special Ed Percent","position":109,"publisher_description":"Campus 2024 Student Membership 2023 Mobility Special Ed Percent","publisher_type":"Number"},{"code":"CPETWHIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_white_percent","label":"Campus 2024 Student Membership: White Percent","position":110,"publisher_description":"Campus 2024 Student Membership White Percent","publisher_type":"Number"},{"code":"CPETBLAP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_african_american_percent","label":"Campus 2024 Student Membership: African American Percent","position":111,"publisher_description":"Campus 2024 Student Membership African American Percent","publisher_type":"Number"},{"code":"CPETHISP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_hispanic_percent","label":"Campus 2024 Student Membership: Hispanic Percent","position":112,"publisher_description":"Campus 2024 Student Membership Hispanic Percent","publisher_type":"Number"},{"code":"CPETINDP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_american_indian_percent","label":"Campus 2024 Student Membership: American Indian Percent","position":113,"publisher_description":"Campus 2024 Student Membership American Indian Percent","publisher_type":"Number"},{"code":"CPETASIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_asian_percent","label":"Campus 2024 Student Membership: Asian Percent","position":114,"publisher_description":"Campus 2024 Student Membership Asian Percent","publisher_type":"Number"},{"code":"CPETPCIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pacific_islander_percent","label":"Campus 2024 Student Membership: Pacific Islander Percent","position":115,"publisher_description":"Campus 2024 Student Membership Pacific Islander Percent","publisher_type":"Number"},{"code":"CPETTWOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_two_or_more_races_percent","label":"Campus 2024 Student Membership: Two or More Races Percent","position":116,"publisher_description":"Campus 2024 Student Membership Two or More Races Percent","publisher_type":"Number"},{"code":"CPETSPEP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_special_ed_percent","label":"Campus 2024 Student Membership: Special Ed Percent","position":117,"publisher_description":"Campus 2024 Student Membership Special Ed Percent","publisher_type":"Number"},{"code":"CPETVOCP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_education_percent","label":"Campus 2024 Student Membership: Career & Technical Education Percent","position":118,"publisher_description":"Campus 2024 Student Membership Career & Technical Education Percent","publisher_type":"Number"},{"code":"CPETBILP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_bilingual_esl_percent","label":"Campus 2024 Student Membership: Bilingual/ESL Percent","position":119,"publisher_description":"Campus 2024 Student Membership Bilingual/ESL Percent","publisher_type":"Number"},{"code":"CPETGIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_gifted_and_talented_percent","label":"Campus 2024 Student Membership: Gifted & Talented Percent","position":120,"publisher_description":"Campus 2024 Student Membership Gifted & Talented Percent","publisher_type":"Number"},{"code":"CPETDSLP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_dyslexia_percent","label":"Campus 2024 Student Membership: Dyslexia Percent","position":121,"publisher_description":"Campus 2024 Student Membership Dyslexia Percent","publisher_type":"Number"},{"code":"CPET504P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_section_504_percent","label":"Campus 2024 Student Membership: Section 504 Percent","position":122,"publisher_description":"Campus 2024 Student Membership Section 504 Percent","publisher_type":"Number"},{"code":"CPETTT1P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_title_i_percent","label":"Campus 2024 Student Membership: Title I Percent","position":123,"publisher_description":"Campus 2024 Student Membership Title I Percent","publisher_type":"Number"},{"code":"CPETHOMP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_homeless_percent","label":"Campus 2024 Student Membership: Homeless Percent","position":124,"publisher_description":"Campus 2024 Student Membership Homeless Percent","publisher_type":"Number"},{"code":"CPETIMMP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_immigrant_percent","label":"Campus 2024 Student Membership: Immigrant Percent","position":125,"publisher_description":"Campus 2024 Student Membership Immigrant Percent","publisher_type":"Number"},{"code":"CPETFOSP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_foster_care_percent","label":"Campus 2024 Student Membership: Foster Care Percent","position":126,"publisher_description":"Campus 2024 Student Membership Foster Care Percent","publisher_type":"Number"},{"code":"CPETMIGP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_migrant_percent","label":"Campus 2024 Student Membership: Migrant Percent","position":127,"publisher_description":"Campus 2024 Student Membership Migrant Percent","publisher_type":"Number"},{"code":"CPETMLCP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_military_connected_percent","label":"Campus 2024 Student Membership: Military-Connected Percent","position":128,"publisher_description":"Campus 2024 Student Membership Military-Connected Percent","publisher_type":"Number"},{"code":"CPETGEEP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_ee_percent","label":"Campus 2024 Student Membership: EE Percent","position":129,"publisher_description":"Campus 2024 Student Membership EE Percent","publisher_type":"Number"},{"code":"CPETGPKP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pk_percent","label":"Campus 2024 Student Membership: PK Percent","position":130,"publisher_description":"Campus 2024 Student Membership PK Percent","publisher_type":"Number"},{"code":"CPETGP3P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pk_ages_3_and_under_percent","label":"Campus 2024 Student Membership: PK Ages 3 and Under Percent","position":131,"publisher_description":"Campus 2024 Student Membership PK Ages 3 and Under Percent","publisher_type":"Number"},{"code":"CPETGP4P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_pk_ages_4_and_over_percent","label":"Campus 2024 Student Membership: PK Ages 4 and Over Percent","position":132,"publisher_description":"Campus 2024 Student Membership PK Ages 4 and Over Percent","publisher_type":"Number"},{"code":"CPETGKNP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_kg_percent","label":"Campus 2024 Student Membership: KG Percent","position":133,"publisher_description":"Campus 2024 Student Membership KG Percent","publisher_type":"Number"},{"code":"CPETG01P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_01_percent","label":"Campus 2024 Student Membership: 01 Percent","position":134,"publisher_description":"Campus 2024 Student Membership 01 Percent","publisher_type":"Number"},{"code":"CPETG02P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_02_percent","label":"Campus 2024 Student Membership: 02 Percent","position":135,"publisher_description":"Campus 2024 Student Membership 02 Percent","publisher_type":"Number"},{"code":"CPETG03P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_03_percent","label":"Campus 2024 Student Membership: 03 Percent","position":136,"publisher_description":"Campus 2024 Student Membership 03 Percent","publisher_type":"Number"},{"code":"CPETG04P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_04_percent","label":"Campus 2024 Student Membership: 04 Percent","position":137,"publisher_description":"Campus 2024 Student Membership 04 Percent","publisher_type":"Number"},{"code":"CPETG05P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_05_percent","label":"Campus 2024 Student Membership: 05 Percent","position":138,"publisher_description":"Campus 2024 Student Membership 05 Percent","publisher_type":"Number"},{"code":"CPETG06P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_06_percent","label":"Campus 2024 Student Membership: 06 Percent","position":139,"publisher_description":"Campus 2024 Student Membership 06 Percent","publisher_type":"Number"},{"code":"CPETG07P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_07_percent","label":"Campus 2024 Student Membership: 07 Percent","position":140,"publisher_description":"Campus 2024 Student Membership 07 Percent","publisher_type":"Number"},{"code":"CPETG08P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_08_percent","label":"Campus 2024 Student Membership: 08 Percent","position":141,"publisher_description":"Campus 2024 Student Membership 08 Percent","publisher_type":"Number"},{"code":"CPETG09P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_09_percent","label":"Campus 2024 Student Membership: 09 Percent","position":142,"publisher_description":"Campus 2024 Student Membership 09 Percent","publisher_type":"Number"},{"code":"CPETG10P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_10_percent","label":"Campus 2024 Student Membership: 10 Percent","position":143,"publisher_description":"Campus 2024 Student Membership 10 Percent","publisher_type":"Number"},{"code":"CPETG11P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_11_percent","label":"Campus 2024 Student Membership: 11 Percent","position":144,"publisher_description":"Campus 2024 Student Membership 11 Percent","publisher_type":"Number"},{"code":"CPETG12P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_12_percent","label":"Campus 2024 Student Membership: 12 Percent","position":145,"publisher_description":"Campus 2024 Student Membership 12 Percent","publisher_type":"Number"},{"code":"CPETMALP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_male_percent","label":"Campus 2024 Student Membership: Male Percent","position":146,"publisher_description":"Campus 2024 Student Membership Male Percent","publisher_type":"Number"},{"code":"CPETFEMP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_female_percent","label":"Campus 2024 Student Membership: Female Percent","position":147,"publisher_description":"Campus 2024 Student Membership Female Percent","publisher_type":"Number"},{"code":"CPETVHSP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_membership_career_and_technical_9_12_education_percent","label":"Campus 2024 Student Membership: Career & Technical (9-12) Education Percent","position":148,"publisher_description":"Campus 2024 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number"},{"code":"CPNTALLC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_all_students_count","label":"Campus 2024 Student Enrollment: All Students Count","position":149,"publisher_description":"Campus 2024 Student Enrollment All Students Count","publisher_type":"Number"},{"code":"CPNTGEEC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_ee_count","label":"Campus 2024 Student Enrollment: EE Count","position":150,"publisher_description":"Campus 2024 Student Enrollment EE Count","publisher_type":"Number"},{"code":"CPNTGEEP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_ee_percent","label":"Campus 2024 Student Enrollment: EE Percent","position":151,"publisher_description":"Campus 2024 Student Enrollment EE Percent","publisher_type":"Number"},{"code":"CPNTGPKC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pk_count","label":"Campus 2024 Student Enrollment: PK Count","position":152,"publisher_description":"Campus 2024 Student Enrollment PK Count","publisher_type":"Number"},{"code":"CPNTGPKP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pk_percent","label":"Campus 2024 Student Enrollment: PK Percent","position":153,"publisher_description":"Campus 2024 Student Enrollment PK Percent","publisher_type":"Number"},{"code":"CPNTGP3C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pk_03_count","label":"Campus 2024 Student Enrollment: PK-03 Count","position":154,"publisher_description":"Campus 2024 Student Enrollment PK-03 Count","publisher_type":"Number"},{"code":"CPNTGP3P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pk_03_percent","label":"Campus 2024 Student Enrollment: PK-03 Percent","position":155,"publisher_description":"Campus 2024 Student Enrollment PK-03 Percent","publisher_type":"Number"},{"code":"CPNTGP4C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pk_04_count","label":"Campus 2024 Student Enrollment: PK-04 Count","position":156,"publisher_description":"Campus 2024 Student Enrollment PK-04 Count","publisher_type":"Number"},{"code":"CPNTGP4P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pk_04_percent","label":"Campus 2024 Student Enrollment: PK-04 Percent","position":157,"publisher_description":"Campus 2024 Student Enrollment PK-04 Percent","publisher_type":"Number"},{"code":"CPNTGKNC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_kg_count","label":"Campus 2024 Student Enrollment: KG Count","position":158,"publisher_description":"Campus 2024 Student Enrollment KG Count","publisher_type":"Number"},{"code":"CPNTGKNP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_kg_percent","label":"Campus 2024 Student Enrollment: KG Percent","position":159,"publisher_description":"Campus 2024 Student Enrollment KG Percent","publisher_type":"Number"},{"code":"CPNTG01C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_01_count","label":"Campus 2024 Student Enrollment: 01 Count","position":160,"publisher_description":"Campus 2024 Student Enrollment 01 Count","publisher_type":"Number"},{"code":"CPNTG01P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_01_percent","label":"Campus 2024 Student Enrollment: 01 Percent","position":161,"publisher_description":"Campus 2024 Student Enrollment 01 Percent","publisher_type":"Number"},{"code":"CPNTG02C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_02_count","label":"Campus 2024 Student Enrollment: 02 Count","position":162,"publisher_description":"Campus 2024 Student Enrollment 02 Count","publisher_type":"Number"},{"code":"CPNTG02P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_02_percent","label":"Campus 2024 Student Enrollment: 02 Percent","position":163,"publisher_description":"Campus 2024 Student Enrollment 02 Percent","publisher_type":"Number"},{"code":"CPNTG03C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_03_count","label":"Campus 2024 Student Enrollment: 03 Count","position":164,"publisher_description":"Campus 2024 Student Enrollment 03 Count","publisher_type":"Number"},{"code":"CPNTG03P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_03_percent","label":"Campus 2024 Student Enrollment: 03 Percent","position":165,"publisher_description":"Campus 2024 Student Enrollment 03 Percent","publisher_type":"Number"},{"code":"CPNTG04C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_04_count","label":"Campus 2024 Student Enrollment: 04 Count","position":166,"publisher_description":"Campus 2024 Student Enrollment 04 Count","publisher_type":"Number"},{"code":"CPNTG04P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_04_percent","label":"Campus 2024 Student Enrollment: 04 Percent","position":167,"publisher_description":"Campus 2024 Student Enrollment 04 Percent","publisher_type":"Number"},{"code":"CPNTG05C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_05_count","label":"Campus 2024 Student Enrollment: 05 Count","position":168,"publisher_description":"Campus 2024 Student Enrollment 05 Count","publisher_type":"Number"},{"code":"CPNTG05P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_05_percent","label":"Campus 2024 Student Enrollment: 05 Percent","position":169,"publisher_description":"Campus 2024 Student Enrollment 05 Percent","publisher_type":"Number"},{"code":"CPNTG06C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_06_count","label":"Campus 2024 Student Enrollment: 06 Count","position":170,"publisher_description":"Campus 2024 Student Enrollment 06 Count","publisher_type":"Number"},{"code":"CPNTG06P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_06_percent","label":"Campus 2024 Student Enrollment: 06 Percent","position":171,"publisher_description":"Campus 2024 Student Enrollment 06 Percent","publisher_type":"Number"},{"code":"CPNTG07C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_07_count","label":"Campus 2024 Student Enrollment: 07 Count","position":172,"publisher_description":"Campus 2024 Student Enrollment 07 Count","publisher_type":"Number"},{"code":"CPNTG07P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_07_percent","label":"Campus 2024 Student Enrollment: 07 Percent","position":173,"publisher_description":"Campus 2024 Student Enrollment 07 Percent","publisher_type":"Number"},{"code":"CPNTG08C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_08_count","label":"Campus 2024 Student Enrollment: 08 Count","position":174,"publisher_description":"Campus 2024 Student Enrollment 08 Count","publisher_type":"Number"},{"code":"CPNTG08P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_08_percent","label":"Campus 2024 Student Enrollment: 08 Percent","position":175,"publisher_description":"Campus 2024 Student Enrollment 08 Percent","publisher_type":"Number"},{"code":"CPNTG09C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_09_count","label":"Campus 2024 Student Enrollment: 09 Count","position":176,"publisher_description":"Campus 2024 Student Enrollment 09 Count","publisher_type":"Number"},{"code":"CPNTG09P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_09_percent","label":"Campus 2024 Student Enrollment: 09 Percent","position":177,"publisher_description":"Campus 2024 Student Enrollment 09 Percent","publisher_type":"Number"},{"code":"CPNTG10C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_10_count","label":"Campus 2024 Student Enrollment: 10 Count","position":178,"publisher_description":"Campus 2024 Student Enrollment 10 Count","publisher_type":"Number"},{"code":"CPNTG10P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_10_percent","label":"Campus 2024 Student Enrollment: 10 Percent","position":179,"publisher_description":"Campus 2024 Student Enrollment 10 Percent","publisher_type":"Number"},{"code":"CPNTG11C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_11_count","label":"Campus 2024 Student Enrollment: 11 Count","position":180,"publisher_description":"Campus 2024 Student Enrollment 11 Count","publisher_type":"Number"},{"code":"CPNTG11P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_11_percent","label":"Campus 2024 Student Enrollment: 11 Percent","position":181,"publisher_description":"Campus 2024 Student Enrollment 11 Percent","publisher_type":"Number"},{"code":"CPNTG12C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_12_count","label":"Campus 2024 Student Enrollment: 12 Count","position":182,"publisher_description":"Campus 2024 Student Enrollment 12 Count","publisher_type":"Number"},{"code":"CPNTG12P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_12_percent","label":"Campus 2024 Student Enrollment: 12 Percent","position":183,"publisher_description":"Campus 2024 Student Enrollment 12 Percent","publisher_type":"Number"},{"code":"CPNTBLAC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_african_american_count","label":"Campus 2024 Student Enrollment: African American Count","position":184,"publisher_description":"Campus 2024 Student Enrollment African American Count","publisher_type":"Number"},{"code":"CPNTBLAP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_african_american_percent","label":"Campus 2024 Student Enrollment: African American Percent","position":185,"publisher_description":"Campus 2024 Student Enrollment African American Percent","publisher_type":"Number"},{"code":"CPNTHISC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_hispanic_count","label":"Campus 2024 Student Enrollment: Hispanic Count","position":186,"publisher_description":"Campus 2024 Student Enrollment Hispanic Count","publisher_type":"Number"},{"code":"CPNTHISP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_hispanic_percent","label":"Campus 2024 Student Enrollment: Hispanic Percent","position":187,"publisher_description":"Campus 2024 Student Enrollment Hispanic Percent","publisher_type":"Number"},{"code":"CPNTWHIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_white_count","label":"Campus 2024 Student Enrollment: White Count","position":188,"publisher_description":"Campus 2024 Student Enrollment White Count","publisher_type":"Number"},{"code":"CPNTWHIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_white_percent","label":"Campus 2024 Student Enrollment: White Percent","position":189,"publisher_description":"Campus 2024 Student Enrollment White Percent","publisher_type":"Number"},{"code":"CPNTINDC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_american_indian_count","label":"Campus 2024 Student Enrollment: American Indian Count","position":190,"publisher_description":"Campus 2024 Student Enrollment American Indian Count","publisher_type":"Number"},{"code":"CPNTINDP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_american_indian_percent","label":"Campus 2024 Student Enrollment: American Indian Percent","position":191,"publisher_description":"Campus 2024 Student Enrollment American Indian Percent","publisher_type":"Number"},{"code":"CPNTASIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_asian_count","label":"Campus 2024 Student Enrollment: Asian Count","position":192,"publisher_description":"Campus 2024 Student Enrollment Asian Count","publisher_type":"Number"},{"code":"CPNTASIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_asian_percent","label":"Campus 2024 Student Enrollment: Asian Percent","position":193,"publisher_description":"Campus 2024 Student Enrollment Asian Percent","publisher_type":"Number"},{"code":"CPNTPCIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pacific_islander_count","label":"Campus 2024 Student Enrollment: Pacific Islander Count","position":194,"publisher_description":"Campus 2024 Student Enrollment Pacific Islander Count","publisher_type":"Number"},{"code":"CPNTPCIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_pacific_islander_percent","label":"Campus 2024 Student Enrollment: Pacific Islander Percent","position":195,"publisher_description":"Campus 2024 Student Enrollment Pacific Islander Percent","publisher_type":"Number"},{"code":"CPNTTWOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_two_or_more_races_count","label":"Campus 2024 Student Enrollment: Two or More Races Count","position":196,"publisher_description":"Campus 2024 Student Enrollment Two or More Races Count","publisher_type":"Number"},{"code":"CPNTTWOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_two_or_more_races_percent","label":"Campus 2024 Student Enrollment: Two or More Races Percent","position":197,"publisher_description":"Campus 2024 Student Enrollment Two or More Races Percent","publisher_type":"Number"},{"code":"CPNTFEMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_female_count","label":"Campus 2024 Student Enrollment: Female Count","position":198,"publisher_description":"Campus 2024 Student Enrollment Female Count","publisher_type":"Number"},{"code":"CPNTFEMP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_female_percent","label":"Campus 2024 Student Enrollment: Female Percent","position":199,"publisher_description":"Campus 2024 Student Enrollment Female Percent","publisher_type":"Number"},{"code":"CPNTMALC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_male_count","label":"Campus 2024 Student Enrollment: Male Count","position":200,"publisher_description":"Campus 2024 Student Enrollment Male Count","publisher_type":"Number"},{"code":"CPNTMALP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_male_percent","label":"Campus 2024 Student Enrollment: Male Percent","position":201,"publisher_description":"Campus 2024 Student Enrollment Male Percent","publisher_type":"Number"},{"code":"CPNTECOC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_econ_disadv_count","label":"Campus 2024 Student Enrollment: Econ Disadv Count","position":202,"publisher_description":"Campus 2024 Student Enrollment Econ Disadv Count","publisher_type":"Number"},{"code":"CPNTECOP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_econ_disadv_percent","label":"Campus 2024 Student Enrollment: Econ Disadv Percent","position":203,"publisher_description":"Campus 2024 Student Enrollment Econ Disadv Percent","publisher_type":"Number"},{"code":"CPNTNEDC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_non_educationally_disadv_count","label":"Campus 2024 Student Enrollment: Non-Educationally Disadv Count","position":204,"publisher_description":"Campus 2024 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"CPNTNEDP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_non_educationally_disadv_percent","label":"Campus 2024 Student Enrollment: Non-Educationally Disadv Percent","position":205,"publisher_description":"Campus 2024 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"CPNT504C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_section_504_count","label":"Campus 2024 Student Enrollment: Section 504 Count","position":206,"publisher_description":"Campus 2024 Student Enrollment Section 504 Count","publisher_type":"Number"},{"code":"CPNT504P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_section_504_percent","label":"Campus 2024 Student Enrollment: Section 504 Percent","position":207,"publisher_description":"Campus 2024 Student Enrollment Section 504 Percent","publisher_type":"Number"},{"code":"CPNTLEPC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_el_count","label":"Campus 2024 Student Enrollment: EL Count","position":208,"publisher_description":"Campus 2024 Student Enrollment EL Count","publisher_type":"Number"},{"code":"CPNTLEPP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_el_percent","label":"Campus 2024 Student Enrollment: EL Percent","position":209,"publisher_description":"Campus 2024 Student Enrollment EL Percent","publisher_type":"Number"},{"code":"CPNTDSLC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_dyslexia_count","label":"Campus 2024 Student Enrollment: Dyslexia Count","position":210,"publisher_description":"Campus 2024 Student Enrollment Dyslexia Count","publisher_type":"Number"},{"code":"CPNTDSLP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_dyslexia_percent","label":"Campus 2024 Student Enrollment: Dyslexia Percent","position":211,"publisher_description":"Campus 2024 Student Enrollment Dyslexia Percent","publisher_type":"Number"},{"code":"CPNTFOSC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_foster_care_count","label":"Campus 2024 Student Enrollment: Foster Care Count","position":212,"publisher_description":"Campus 2024 Student Enrollment Foster Care Count","publisher_type":"Number"},{"code":"CPNTFOSP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_foster_care_percent","label":"Campus 2024 Student Enrollment: Foster Care Percent","position":213,"publisher_description":"Campus 2024 Student Enrollment Foster Care Percent","publisher_type":"Number"},{"code":"CPNTHOMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_homeless_count","label":"Campus 2024 Student Enrollment: Homeless Count","position":214,"publisher_description":"Campus 2024 Student Enrollment Homeless Count","publisher_type":"Number"},{"code":"CPNTHOMP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_homeless_percent","label":"Campus 2024 Student Enrollment: Homeless Percent","position":215,"publisher_description":"Campus 2024 Student Enrollment Homeless Percent","publisher_type":"Number"},{"code":"CPNTIMMC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_immigrant_count","label":"Campus 2024 Student Enrollment: Immigrant Count","position":216,"publisher_description":"Campus 2024 Student Enrollment Immigrant Count","publisher_type":"Number"},{"code":"CPNTIMMP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_immigrant_percent","label":"Campus 2024 Student Enrollment: Immigrant Percent","position":217,"publisher_description":"Campus 2024 Student Enrollment Immigrant Percent","publisher_type":"Number"},{"code":"CPNTMIGC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_migrant_count","label":"Campus 2024 Student Enrollment: Migrant Count","position":218,"publisher_description":"Campus 2024 Student Enrollment Migrant Count","publisher_type":"Number"},{"code":"CPNTMIGP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_migrant_percent","label":"Campus 2024 Student Enrollment: Migrant Percent","position":219,"publisher_description":"Campus 2024 Student Enrollment Migrant Percent","publisher_type":"Number"},{"code":"CPNTTT1C","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_title_i_count","label":"Campus 2024 Student Enrollment: Title I Count","position":220,"publisher_description":"Campus 2024 Student Enrollment Title I Count","publisher_type":"Number"},{"code":"CPNTTT1P","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_title_i_percent","label":"Campus 2024 Student Enrollment: Title I Percent","position":221,"publisher_description":"Campus 2024 Student Enrollment Title I Percent","publisher_type":"Number"},{"code":"CPNTMLCC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_military_connected_count","label":"Campus 2024 Student Enrollment: Military-Connected Count","position":222,"publisher_description":"Campus 2024 Student Enrollment Military-Connected Count","publisher_type":"Number"},{"code":"CPNTMLCP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_military_connected_percent","label":"Campus 2024 Student Enrollment: Military-Connected Percent","position":223,"publisher_description":"Campus 2024 Student Enrollment Military-Connected Percent","publisher_type":"Number"},{"code":"CPNTRSKC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_at_risk_count","label":"Campus 2024 Student Enrollment: At Risk Count","position":224,"publisher_description":"Campus 2024 Student Enrollment At Risk Count","publisher_type":"Number"},{"code":"CPNTRSKP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_at_risk_percent","label":"Campus 2024 Student Enrollment: At Risk Percent","position":225,"publisher_description":"Campus 2024 Student Enrollment At Risk Percent","publisher_type":"Number"},{"code":"CPNTBILC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_bilingual_esl_count","label":"Campus 2024 Student Enrollment: Bilingual/ESL Count","position":226,"publisher_description":"Campus 2024 Student Enrollment Bilingual/ESL Count","publisher_type":"Number"},{"code":"CPNTBILP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_bilingual_esl_percent","label":"Campus 2024 Student Enrollment: Bilingual/ESL Percent","position":227,"publisher_description":"Campus 2024 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number"},{"code":"CPNTGIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_gifted_and_talented_count","label":"Campus 2024 Student Enrollment: Gifted & Talented Count","position":228,"publisher_description":"Campus 2024 Student Enrollment Gifted & Talented Count","publisher_type":"Number"},{"code":"CPNTGIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_gifted_and_talented_percent","label":"Campus 2024 Student Enrollment: Gifted & Talented Percent","position":229,"publisher_description":"Campus 2024 Student Enrollment Gifted & Talented Percent","publisher_type":"Number"},{"code":"CPNTSPEC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_special_ed_count","label":"Campus 2024 Student Enrollment: Special Ed Count","position":230,"publisher_description":"Campus 2024 Student Enrollment Special Ed Count","publisher_type":"Number"},{"code":"CPNTSPEP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_student_enrollment_special_ed_percent","label":"Campus 2024 Student Enrollment: Special Ed Percent","position":231,"publisher_description":"Campus 2024 Student Enrollment Special Ed Percent","publisher_type":"Number"},{"code":"CPCTENGA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_sec_english_avg_size","label":"Campus 2024 Class Size: Sec English - Avg Size","position":232,"publisher_description":"Campus 2024 Class Size Sec English - Avg Size","publisher_type":"Number"},{"code":"CPCTMATA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_sec_math_avg_size","label":"Campus 2024 Class Size: Sec Math - Avg Size","position":233,"publisher_description":"Campus 2024 Class Size Sec Math - Avg Size","publisher_type":"Number"},{"code":"CPCTSCIA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_sec_sci_avg_size","label":"Campus 2024 Class Size: Sec Sci - Avg Size","position":234,"publisher_description":"Campus 2024 Class Size Sec Sci - Avg Size","publisher_type":"Number"},{"code":"CPCTSOCA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_sec_soc_stud_avg_size","label":"Campus 2024 Class Size: Sec Soc Stud- Avg Size","position":235,"publisher_description":"Campus 2024 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number"},{"code":"CPCTFLAA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_sec_for_lng_avg_size","label":"Campus 2024 Class Size: Sec For Lng - Avg Size","position":236,"publisher_description":"Campus 2024 Class Size Sec For Lng - Avg Size","publisher_type":"Number"},{"code":"CPCTGKGA","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_kindergarten_avg_size","label":"Campus 2024 Class Size: Kindergarten- Avg Size","position":237,"publisher_description":"Campus 2024 Class Size Kindergarten- Avg Size","publisher_type":"Number"},{"code":"CPCTG01A","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_grade_1_avg_size","label":"Campus 2024 Class Size: Grade 1 - Avg Size","position":238,"publisher_description":"Campus 2024 Class Size Grade 1 - Avg Size","publisher_type":"Number"},{"code":"CPCTG02A","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_grade_2_avg_size","label":"Campus 2024 Class Size: Grade 2 - Avg Size","position":239,"publisher_description":"Campus 2024 Class Size Grade 2 - Avg Size","publisher_type":"Number"},{"code":"CPCTG03A","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_grade_3_avg_size","label":"Campus 2024 Class Size: Grade 3 - Avg Size","position":240,"publisher_description":"Campus 2024 Class Size Grade 3 - Avg Size","publisher_type":"Number"},{"code":"CPCTG04A","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_grade_4_avg_size","label":"Campus 2024 Class Size: Grade 4 - Avg Size","position":241,"publisher_description":"Campus 2024 Class Size Grade 4 - Avg Size","publisher_type":"Number"},{"code":"CPCTG05A","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_grade_5_avg_size","label":"Campus 2024 Class Size: Grade 5 - Avg Size","position":242,"publisher_description":"Campus 2024 Class Size Grade 5 - Avg Size","publisher_type":"Number"},{"code":"CPCTG06A","dictionary_status":"documented","disposition":"fact","field":"campus_2024_class_size_grade_6_avg_size","label":"Campus 2024 Class Size: Grade 6 - Avg Size","position":243,"publisher_description":"Campus 2024 Class Size Grade 6 - Avg Size","publisher_type":"Number"}],"input_sha256":"8dc181ee75c5da8451a45c8f405f8cbc8fe9987efb198d9ded90d7d512f161a0","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":9084},"metric_period":{"kind":"unknown"},"source_schema_sha256":"08fc824de8a63181609e5a3d89000ba728bfa0e6751c6a57cfbe65216e465b89","table":"student_profile"}]},{"dataset":"district_tapr_student_profile","edition":"2024","source_only":true,"tables":[{"dictionary_records":[{"code":"DPETALLC","ordinal":1,"publisher_description":"District 2024 Student Membership All Students Count","publisher_type":"Number"},{"code":"DPNTALLC","ordinal":2,"publisher_description":"District 2024 Student Enrollment All Students Count","publisher_type":"Number"},{"code":"DPETGEEC","ordinal":3,"publisher_description":"District 2024 Student Membership EE Count","publisher_type":"Number"},{"code":"DPETGEEP","ordinal":4,"publisher_description":"District 2024 Student Membership EE Percent","publisher_type":"Number"},{"code":"DPNTGEEC","ordinal":5,"publisher_description":"District 2024 Student Enrollment EE Count","publisher_type":"Number"},{"code":"DPNTGEEP","ordinal":6,"publisher_description":"District 2024 Student Enrollment EE Percent","publisher_type":"Number"},{"code":"DPETGPKC","ordinal":7,"publisher_description":"District 2024 Student Membership PK Count","publisher_type":"Number"},{"code":"DPETGPKP","ordinal":8,"publisher_description":"District 2024 Student Membership PK Percent","publisher_type":"Number"},{"code":"DPNTGPKC","ordinal":9,"publisher_description":"District 2024 Student Enrollment PK Count","publisher_type":"Number"},{"code":"DPNTGPKP","ordinal":10,"publisher_description":"District 2024 Student Enrollment PK Percent","publisher_type":"Number"},{"code":"DPETGP3C","ordinal":11,"publisher_description":"District 2024 Student Membership PK Count Ages 3 and Under Count","publisher_type":"Number"},{"code":"DPETGP3P","ordinal":12,"publisher_description":"District 2024 Student Membership PK Count Ages 3 and Under Percent","publisher_type":"Number"},{"code":"DPNTGP3C","ordinal":13,"publisher_description":"District 2024 Student Enrollment PK-03 Count","publisher_type":"Number"},{"code":"DPNTGP3P","ordinal":14,"publisher_description":"District 2024 Student Enrollment PK-03 Percent","publisher_type":"Number"},{"code":"DPETGP4C","ordinal":15,"publisher_description":"District 2024 Student Membership PK Count Ages 4 and Over Count","publisher_type":"Number"},{"code":"DPETGP4P","ordinal":16,"publisher_description":"District 2024 Student Membership PK Count Ages 4 and Over Percent","publisher_type":"Number"},{"code":"DPNTGP4C","ordinal":17,"publisher_description":"District 2024 Student Enrollment PK-04 Count","publisher_type":"Number"},{"code":"DPNTGP4P","ordinal":18,"publisher_description":"District 2024 Student Enrollment PK-04 Percent","publisher_type":"Number"},{"code":"DPETGKNC","ordinal":19,"publisher_description":"District 2024 Student Membership KG Count","publisher_type":"Number"},{"code":"DPETGKNP","ordinal":20,"publisher_description":"District 2024 Student Membership KG Percent","publisher_type":"Number"},{"code":"DPNTGKNC","ordinal":21,"publisher_description":"District 2024 Student Enrollment KG Count","publisher_type":"Number"},{"code":"DPNTGKNP","ordinal":22,"publisher_description":"District 2024 Student Enrollment KG Percent","publisher_type":"Number"},{"code":"DPETG01C","ordinal":23,"publisher_description":"District 2024 Student Membership 01 Count","publisher_type":"Number"},{"code":"DPETG01P","ordinal":24,"publisher_description":"District 2024 Student Membership 01 Percent","publisher_type":"Number"},{"code":"DPNTG01C","ordinal":25,"publisher_description":"District 2024 Student Enrollment 01 Count","publisher_type":"Number"},{"code":"DPNTG01P","ordinal":26,"publisher_description":"District 2024 Student Enrollment 01 Percent","publisher_type":"Number"},{"code":"DPETG02C","ordinal":27,"publisher_description":"District 2024 Student Membership 02 Count","publisher_type":"Number"},{"code":"DPETG02P","ordinal":28,"publisher_description":"District 2024 Student Membership 02 Percent","publisher_type":"Number"},{"code":"DPNTG02C","ordinal":29,"publisher_description":"District 2024 Student Enrollment 02 Count","publisher_type":"Number"},{"code":"DPNTG02P","ordinal":30,"publisher_description":"District 2024 Student Enrollment 02 Percent","publisher_type":"Number"},{"code":"DPETG03C","ordinal":31,"publisher_description":"District 2024 Student Membership 03 Count","publisher_type":"Number"},{"code":"DPETG03P","ordinal":32,"publisher_description":"District 2024 Student Membership 03 Percent","publisher_type":"Number"},{"code":"DPNTG03C","ordinal":33,"publisher_description":"District 2024 Student Enrollment 03 Count","publisher_type":"Number"},{"code":"DPNTG03P","ordinal":34,"publisher_description":"District 2024 Student Enrollment 03 Percent","publisher_type":"Number"},{"code":"DPETG04C","ordinal":35,"publisher_description":"District 2024 Student Membership 04 Count","publisher_type":"Number"},{"code":"DPETG04P","ordinal":36,"publisher_description":"District 2024 Student Membership 04 Percent","publisher_type":"Number"},{"code":"DPNTG04C","ordinal":37,"publisher_description":"District 2024 Student Enrollment 04 Count","publisher_type":"Number"},{"code":"DPNTG04P","ordinal":38,"publisher_description":"District 2024 Student Enrollment 04 Percent","publisher_type":"Number"},{"code":"DPETG05C","ordinal":39,"publisher_description":"District 2024 Student Membership 05 Count","publisher_type":"Number"},{"code":"DPETG05P","ordinal":40,"publisher_description":"District 2024 Student Membership 05 Percent","publisher_type":"Number"},{"code":"DPNTG05C","ordinal":41,"publisher_description":"District 2024 Student Enrollment 05 Count","publisher_type":"Number"},{"code":"DPNTG05P","ordinal":42,"publisher_description":"District 2024 Student Enrollment 05 Percent","publisher_type":"Number"},{"code":"DPETG06C","ordinal":43,"publisher_description":"District 2024 Student Membership 06 Count","publisher_type":"Number"},{"code":"DPETG06P","ordinal":44,"publisher_description":"District 2024 Student Membership 06 Percent","publisher_type":"Number"},{"code":"DPNTG06C","ordinal":45,"publisher_description":"District 2024 Student Enrollment 06 Count","publisher_type":"Number"},{"code":"DPNTG06P","ordinal":46,"publisher_description":"District 2024 Student Enrollment 06 Percent","publisher_type":"Number"},{"code":"DPETG07C","ordinal":47,"publisher_description":"District 2024 Student Membership 07 Count","publisher_type":"Number"},{"code":"DPETG07P","ordinal":48,"publisher_description":"District 2024 Student Membership 07 Percent","publisher_type":"Number"},{"code":"DPNTG07C","ordinal":49,"publisher_description":"District 2024 Student Enrollment 07 Count","publisher_type":"Number"},{"code":"DPNTG07P","ordinal":50,"publisher_description":"District 2024 Student Enrollment 07 Percent","publisher_type":"Number"},{"code":"DPETG08C","ordinal":51,"publisher_description":"District 2024 Student Membership 08 Count","publisher_type":"Number"},{"code":"DPETG08P","ordinal":52,"publisher_description":"District 2024 Student Membership 08 Percent","publisher_type":"Number"},{"code":"DPNTG08C","ordinal":53,"publisher_description":"District 2024 Student Enrollment 08 Count","publisher_type":"Number"},{"code":"DPNTG08P","ordinal":54,"publisher_description":"District 2024 Student Enrollment 08 Percent","publisher_type":"Number"},{"code":"DPETG09C","ordinal":55,"publisher_description":"District 2024 Student Membership 09 Count","publisher_type":"Number"},{"code":"DPETG09P","ordinal":56,"publisher_description":"District 2024 Student Membership 09 Percent","publisher_type":"Number"},{"code":"DPNTG09C","ordinal":57,"publisher_description":"District 2024 Student Enrollment 09 Count","publisher_type":"Number"},{"code":"DPNTG09P","ordinal":58,"publisher_description":"District 2024 Student Enrollment 09 Percent","publisher_type":"Number"},{"code":"DPETG10C","ordinal":59,"publisher_description":"District 2024 Student Membership 10 Count","publisher_type":"Number"},{"code":"DPETG10P","ordinal":60,"publisher_description":"District 2024 Student Membership 10 Percent","publisher_type":"Number"},{"code":"DPNTG10C","ordinal":61,"publisher_description":"District 2024 Student Enrollment 10 Count","publisher_type":"Number"},{"code":"DPNTG10P","ordinal":62,"publisher_description":"District 2024 Student Enrollment 10 Percent","publisher_type":"Number"},{"code":"DPETG11C","ordinal":63,"publisher_description":"District 2024 Student Membership 11 Count","publisher_type":"Number"},{"code":"DPETG11P","ordinal":64,"publisher_description":"District 2024 Student Membership 11 Percent","publisher_type":"Number"},{"code":"DPNTG11C","ordinal":65,"publisher_description":"District 2024 Student Enrollment 11 Count","publisher_type":"Number"},{"code":"DPNTG11P","ordinal":66,"publisher_description":"District 2024 Student Enrollment 11 Percent","publisher_type":"Number"},{"code":"DPETG12C","ordinal":67,"publisher_description":"District 2024 Student Membership 12 Count","publisher_type":"Number"},{"code":"DPETG12P","ordinal":68,"publisher_description":"District 2024 Student Membership 12 Percent","publisher_type":"Number"},{"code":"DPNTG12C","ordinal":69,"publisher_description":"District 2024 Student Enrollment 12 Count","publisher_type":"Number"},{"code":"DPNTG12P","ordinal":70,"publisher_description":"District 2024 Student Enrollment 12 Percent","publisher_type":"Number"},{"code":"DPETBLAC","ordinal":71,"publisher_description":"District 2024 Student Membership African American Count","publisher_type":"Number"},{"code":"DPETBLAP","ordinal":72,"publisher_description":"District 2024 Student Membership African American Percent","publisher_type":"Number"},{"code":"DPNTBLAC","ordinal":73,"publisher_description":"District 2024 Student Enrollment African American Count","publisher_type":"Number"},{"code":"DPNTBLAP","ordinal":74,"publisher_description":"District 2024 Student Enrollment African American Percent","publisher_type":"Number"},{"code":"DPETHISC","ordinal":75,"publisher_description":"District 2024 Student Membership Hispanic Count","publisher_type":"Number"},{"code":"DPETHISP","ordinal":76,"publisher_description":"District 2024 Student Membership Hispanic Percent","publisher_type":"Number"},{"code":"DPNTHISC","ordinal":77,"publisher_description":"District 2024 Student Enrollment Hispanic Count","publisher_type":"Number"},{"code":"DPNTHISP","ordinal":78,"publisher_description":"District 2024 Student Enrollment Hispanic Percent","publisher_type":"Number"},{"code":"DPETWHIC","ordinal":79,"publisher_description":"District 2024 Student Membership White Count","publisher_type":"Number"},{"code":"DPETWHIP","ordinal":80,"publisher_description":"District 2024 Student Membership White Percent","publisher_type":"Number"},{"code":"DPNTWHIC","ordinal":81,"publisher_description":"District 2024 Student Enrollment White Count","publisher_type":"Number"},{"code":"DPNTWHIP","ordinal":82,"publisher_description":"District 2024 Student Enrollment White Percent","publisher_type":"Number"},{"code":"DPETINDC","ordinal":83,"publisher_description":"District 2024 Student Membership American Indian Count","publisher_type":"Number"},{"code":"DPETINDP","ordinal":84,"publisher_description":"District 2024 Student Membership American Indian Percent","publisher_type":"Number"},{"code":"DPNTINDC","ordinal":85,"publisher_description":"District 2024 Student Enrollment American Indian Count","publisher_type":"Number"},{"code":"DPNTINDP","ordinal":86,"publisher_description":"District 2024 Student Enrollment American Indian Percent","publisher_type":"Number"},{"code":"DPETASIC","ordinal":87,"publisher_description":"District 2024 Student Membership Asian Count","publisher_type":"Number"},{"code":"DPETASIP","ordinal":88,"publisher_description":"District 2024 Student Membership Asian Percent","publisher_type":"Number"},{"code":"DPNTASIC","ordinal":89,"publisher_description":"District 2024 Student Enrollment Asian Count","publisher_type":"Number"},{"code":"DPNTASIP","ordinal":90,"publisher_description":"District 2024 Student Enrollment Asian Percent","publisher_type":"Number"},{"code":"DPETPCIC","ordinal":91,"publisher_description":"District 2024 Student Membership Pacific Islander Count","publisher_type":"Number"},{"code":"DPETPCIP","ordinal":92,"publisher_description":"District 2024 Student Membership Pacific Islander Percent","publisher_type":"Number"},{"code":"DPNTPCIC","ordinal":93,"publisher_description":"District 2024 Student Enrollment Pacific Islander Count","publisher_type":"Number"},{"code":"DPNTPCIP","ordinal":94,"publisher_description":"District 2024 Student Enrollment Pacific Islander Percent","publisher_type":"Number"},{"code":"DPETTWOC","ordinal":95,"publisher_description":"District 2024 Student Membership Two or More Races Count","publisher_type":"Number"},{"code":"DPETTWOP","ordinal":96,"publisher_description":"District 2024 Student Membership Two or More Races Percent","publisher_type":"Number"},{"code":"DPNTTWOC","ordinal":97,"publisher_description":"District 2024 Student Enrollment Two or More Races Count","publisher_type":"Number"},{"code":"DPNTTWOP","ordinal":98,"publisher_description":"District 2024 Student Enrollment Two or More Races Percent","publisher_type":"Number"},{"code":"DPETFEMC","ordinal":99,"publisher_description":"District 2024 Student Membership Female Count","publisher_type":"Number"},{"code":"DPETFEMP","ordinal":100,"publisher_description":"District 2024 Student Membership Female Percent","publisher_type":"Number"},{"code":"DPNTFEMC","ordinal":101,"publisher_description":"District 2024 Student Enrollment Female Count","publisher_type":"Number"},{"code":"DPNTFEMP","ordinal":102,"publisher_description":"District 2024 Student Enrollment Female Percent","publisher_type":"Number"},{"code":"DPETMALC","ordinal":103,"publisher_description":"District 2024 Student Membership Male Count","publisher_type":"Number"},{"code":"DPETMALP","ordinal":104,"publisher_description":"District 2024 Student Membership Male Percent","publisher_type":"Number"},{"code":"DPNTMALC","ordinal":105,"publisher_description":"District 2024 Student Enrollment Male Count","publisher_type":"Number"},{"code":"DPNTMALP","ordinal":106,"publisher_description":"District 2024 Student Enrollment Male Percent","publisher_type":"Number"},{"code":"DPETECOC","ordinal":107,"publisher_description":"District 2024 Student Membership Econ Disadv Count","publisher_type":"Number"},{"code":"DPETECOP","ordinal":108,"publisher_description":"District 2024 Student Membership Econ Disadv Percent","publisher_type":"Number"},{"code":"DPNTECOC","ordinal":109,"publisher_description":"District 2024 Student Enrollment Econ Disadv Count","publisher_type":"Number"},{"code":"DPNTECOP","ordinal":110,"publisher_description":"District 2024 Student Enrollment Econ Disadv Percent","publisher_type":"Number"},{"code":"DPETNEDC","ordinal":111,"publisher_description":"District 2024 Student Membership Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"DPETNEDP","ordinal":112,"publisher_description":"District 2024 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"DPNTNEDC","ordinal":113,"publisher_description":"District 2024 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"DPNTNEDP","ordinal":114,"publisher_description":"District 2024 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"DPET504C","ordinal":115,"publisher_description":"District 2024 Student Membership Section 504 Count","publisher_type":"Number"},{"code":"DPET504P","ordinal":116,"publisher_description":"District 2024 Student Membership Section 504 Percent","publisher_type":"Number"},{"code":"DPNT504C","ordinal":117,"publisher_description":"District 2024 Student Enrollment Section 504 Count","publisher_type":"Number"},{"code":"DPNT504P","ordinal":118,"publisher_description":"District 2024 Student Enrollment Section 504 Percent","publisher_type":"Number"},{"code":"DPETLEPC","ordinal":119,"publisher_description":"District 2024 Student Membership EB/EL Count","publisher_type":"Number"},{"code":"DPETLEPP","ordinal":120,"publisher_description":"District 2024 Student Membership EB/EL Percent","publisher_type":"Number"},{"code":"DPNTLEPC","ordinal":121,"publisher_description":"District 2024 Student Enrollment EL Count","publisher_type":"Number"},{"code":"DPNTLEPP","ordinal":122,"publisher_description":"District 2024 Student Enrollment EL Percent","publisher_type":"Number"},{"code":"DPETDISC","ordinal":123,"publisher_description":"District 2023 DAEP Count","publisher_type":"Number"},{"code":"DPETDISP","ordinal":124,"publisher_description":"District 2023 DAEP Percent","publisher_type":"Number"},{"code":"DPETDSLC","ordinal":125,"publisher_description":"District 2024 Student Membership Dyslexia Count","publisher_type":"Number"},{"code":"DPETDSLP","ordinal":126,"publisher_description":"District 2024 Student Membership Dyslexia Percent","publisher_type":"Number"},{"code":"DPNTDSLC","ordinal":127,"publisher_description":"District 2024 Student Enrollment Dyslexia Count","publisher_type":"Number"},{"code":"DPNTDSLP","ordinal":128,"publisher_description":"District 2024 Student Enrollment Dyslexia Percent","publisher_type":"Number"},{"code":"DPETFOSC","ordinal":129,"publisher_description":"District 2024 Student Membership Foster Care Count","publisher_type":"Number"},{"code":"DPETFOSP","ordinal":130,"publisher_description":"District 2024 Student Membership Foster Care Percent","publisher_type":"Number"},{"code":"DPNTFOSC","ordinal":131,"publisher_description":"District 2024 Student Enrollment Foster Care Count","publisher_type":"Number"},{"code":"DPNTFOSP","ordinal":132,"publisher_description":"District 2024 Student Enrollment Foster Care Percent","publisher_type":"Number"},{"code":"DPETHOMC","ordinal":133,"publisher_description":"District 2024 Student Membership Homeless Count","publisher_type":"Number"},{"code":"DPETHOMP","ordinal":134,"publisher_description":"District 2024 Student Membership Homeless Percent","publisher_type":"Number"},{"code":"DPNTHOMC","ordinal":135,"publisher_description":"District 2024 Student Enrollment Homeless Count","publisher_type":"Number"},{"code":"DPNTHOMP","ordinal":136,"publisher_description":"District 2024 Student Enrollment Homeless Percent","publisher_type":"Number"},{"code":"DPETIMMC","ordinal":137,"publisher_description":"District 2024 Student Membership Immigrant Count","publisher_type":"Number"},{"code":"DPETIMMP","ordinal":138,"publisher_description":"District 2024 Student Membership Immigrant Percent","publisher_type":"Number"},{"code":"DPNTIMMC","ordinal":139,"publisher_description":"District 2024 Student Enrollment Immigrant Count","publisher_type":"Number"},{"code":"DPNTIMMP","ordinal":140,"publisher_description":"District 2024 Student Enrollment Immigrant Percent","publisher_type":"Number"},{"code":"DPETMIGC","ordinal":141,"publisher_description":"District 2024 Student Membership Migrant Count","publisher_type":"Number"},{"code":"DPETMIGP","ordinal":142,"publisher_description":"District 2024 Student Membership Migrant Percent","publisher_type":"Number"},{"code":"DPNTMIGC","ordinal":143,"publisher_description":"District 2024 Student Enrollment Migrant Count","publisher_type":"Number"},{"code":"DPNTMIGP","ordinal":144,"publisher_description":"District 2024 Student Enrollment Migrant Percent","publisher_type":"Number"},{"code":"DPETTT1C","ordinal":145,"publisher_description":"District 2024 Student Membership Title I Count","publisher_type":"Number"},{"code":"DPETTT1P","ordinal":146,"publisher_description":"District 2024 Student Membership Title I Percent","publisher_type":"Number"},{"code":"DPNTTT1C","ordinal":147,"publisher_description":"District 2024 Student Enrollment Title I Count","publisher_type":"Number"},{"code":"DPNTTT1P","ordinal":148,"publisher_description":"District 2024 Student Enrollment Title I Percent","publisher_type":"Number"},{"code":"DPETMLCC","ordinal":149,"publisher_description":"District 2024 Student Membership Military-Connected Count","publisher_type":"Number"},{"code":"DPETMLCP","ordinal":150,"publisher_description":"District 2024 Student Membership Military-Connected Percent","publisher_type":"Number"},{"code":"DPNTMLCC","ordinal":151,"publisher_description":"District 2024 Student Enrollment Military-Connected Count","publisher_type":"Number"},{"code":"DPNTMLCP","ordinal":152,"publisher_description":"District 2024 Student Enrollment Military-Connected Percent","publisher_type":"Number"},{"code":"DPETRSKC","ordinal":153,"publisher_description":"District 2024 Student Membership At Risk Count","publisher_type":"Number"},{"code":"DPETRSKP","ordinal":154,"publisher_description":"District 2024 Student Membership At Risk Percent","publisher_type":"Number"},{"code":"DPNTRSKC","ordinal":155,"publisher_description":"District 2024 Student Enrollment At Risk Count","publisher_type":"Number"},{"code":"DPNTRSKP","ordinal":156,"publisher_description":"District 2024 Student Enrollment At Risk Percent","publisher_type":"Number"},{"code":"DPETBILC","ordinal":157,"publisher_description":"District 2024 Student Membership Bilingual/ESL Count","publisher_type":"Number"},{"code":"DPETBILP","ordinal":158,"publisher_description":"District 2024 Student Membership Bilingual/ESL Percent","publisher_type":"Number"},{"code":"DPNTBILC","ordinal":159,"publisher_description":"District 2024 Student Enrollment Bilingual/ESL Count","publisher_type":"Number"},{"code":"DPNTBILP","ordinal":160,"publisher_description":"District 2024 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number"},{"code":"DPETVOCC","ordinal":161,"publisher_description":"District 2024 Student Membership Career & Technical Education Count","publisher_type":"Number"},{"code":"DPETVOCP","ordinal":162,"publisher_description":"District 2024 Student Membership Career & Technical Education Percent","publisher_type":"Number"},{"code":"DPETVHSC","ordinal":163,"publisher_description":"District 2024 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number"},{"code":"DPETVHSP","ordinal":164,"publisher_description":"District 2024 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number"},{"code":"DPETGIFC","ordinal":165,"publisher_description":"District 2024 Student Membership Gifted & Talented Count","publisher_type":"Number"},{"code":"DPETGIFP","ordinal":166,"publisher_description":"District 2024 Student Membership Gifted & Talented Percent","publisher_type":"Number"},{"code":"DPNTGIFC","ordinal":167,"publisher_description":"District 2024 Student Enrollment Gifted & Talented Count","publisher_type":"Number"},{"code":"DPNTGIFP","ordinal":168,"publisher_description":"District 2024 Student Enrollment Gifted & Talented Percent","publisher_type":"Number"},{"code":"DPETSPEC","ordinal":169,"publisher_description":"District 2024 Student Membership Special Ed Count","publisher_type":"Number"},{"code":"DPETSPEP","ordinal":170,"publisher_description":"District 2024 Student Membership Special Ed Percent","publisher_type":"Number"},{"code":"DPNTSPEC","ordinal":171,"publisher_description":"District 2024 Student Enrollment Special Ed Count","publisher_type":"Number"},{"code":"DPNTSPEP","ordinal":172,"publisher_description":"District 2024 Student Enrollment Special Ed Percent","publisher_type":"Number"},{"code":"DPETSIMC","ordinal":173,"publisher_description":"District 2024 Student Membership Total Students with Disabilities Count","publisher_type":"Number"},{"code":"DPETSINC","ordinal":174,"publisher_description":"District 2024 Student Membership Intellectual Disabilities Count","publisher_type":"Number"},{"code":"DPETSINP","ordinal":175,"publisher_description":"District 2024 Student Membership Intellectual Disabilities Percent","publisher_type":"Number"},{"code":"DPETSPHC","ordinal":176,"publisher_description":"District 2024 Student Membership Physical Disabilities Count","publisher_type":"Number"},{"code":"DPETSPHP","ordinal":177,"publisher_description":"District 2024 Student Membership Physical Disabilities Percent","publisher_type":"Number"},{"code":"DPETSAUC","ordinal":178,"publisher_description":"District 2024 Student Membership Autism Count","publisher_type":"Number"},{"code":"DPETSAUP","ordinal":179,"publisher_description":"District 2024 Student Membership Autism Percent","publisher_type":"Number"},{"code":"DPETSBHC","ordinal":180,"publisher_description":"District 2024 Student Membership Behavioral Disabilities Count","publisher_type":"Number"},{"code":"DPETSBHP","ordinal":181,"publisher_description":"District 2024 Student Membership Behavioral Disabilities Percent","publisher_type":"Number"},{"code":"DPETSNOC","ordinal":182,"publisher_description":"District 2024 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number"},{"code":"DPETSNOP","ordinal":183,"publisher_description":"District 2024 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number"},{"code":"DPEMBLAC","ordinal":184,"publisher_description":"District 2024 Student Membership 2023 Mobility African American Count","publisher_type":"Number"},{"code":"DPEMBLAP","ordinal":185,"publisher_description":"District 2024 Student Membership 2023 Mobility African American Percent","publisher_type":"Number"},{"code":"DPEMHISC","ordinal":186,"publisher_description":"District 2024 Student Membership 2023 Mobility Hispanic Count","publisher_type":"Number"},{"code":"DPEMHISP","ordinal":187,"publisher_description":"District 2024 Student Membership 2023 Mobility Hispanic Percent","publisher_type":"Number"},{"code":"DPEMWHIC","ordinal":188,"publisher_description":"District 2024 Student Membership 2023 Mobility White Count","publisher_type":"Number"},{"code":"DPEMWHIP","ordinal":189,"publisher_description":"District 2024 Student Membership 2023 Mobility White Percent","publisher_type":"Number"},{"code":"DPEMINDC","ordinal":190,"publisher_description":"District 2024 Student Membership 2023 Mobility American Indian Count","publisher_type":"Number"},{"code":"DPEMINDP","ordinal":191,"publisher_description":"District 2024 Student Membership 2023 Mobility American Indian Percent","publisher_type":"Number"},{"code":"DPEMASIC","ordinal":192,"publisher_description":"District 2024 Student Membership 2023 Mobility Asian Count","publisher_type":"Number"},{"code":"DPEMASIP","ordinal":193,"publisher_description":"District 2024 Student Membership 2023 Mobility Asian Percent","publisher_type":"Number"},{"code":"DPEMPCIC","ordinal":194,"publisher_description":"District 2024 Student Membership 2023 Mobility Pacific Islander Count","publisher_type":"Number"},{"code":"DPEMPCIP","ordinal":195,"publisher_description":"District 2024 Student Membership 2023 Mobility Pacific Islander Percent","publisher_type":"Number"},{"code":"DPEMTWOC","ordinal":196,"publisher_description":"District 2024 Student Membership 2023 Mobility Two or More Races Count","publisher_type":"Number"},{"code":"DPEMTWOP","ordinal":197,"publisher_description":"District 2024 Student Membership 2023 Mobility Two or More Races Percent","publisher_type":"Number"},{"code":"DPEMALLC","ordinal":198,"publisher_description":"District 2024 Student Membership 2023 Mobility All Students Count","publisher_type":"Number"},{"code":"DPEMALLP","ordinal":199,"publisher_description":"District 2024 Student Membership 2023 Mobility All Students Percent","publisher_type":"Number"},{"code":"DPEMSPEC","ordinal":200,"publisher_description":"District 2024 Student Membership 2023 Mobility Special Ed Count","publisher_type":"Number"},{"code":"DPEMSPEP","ordinal":201,"publisher_description":"District 2024 Student Membership 2023 Mobility Special Ed Percent","publisher_type":"Number"},{"code":"DPEMLEPC","ordinal":202,"publisher_description":"District 2024 Student Membership 2023 Mobility EB/EL Count","publisher_type":"Number"},{"code":"DPEMLEPP","ordinal":203,"publisher_description":"District 2024 Student Membership 2023 Mobility EB/EL Percent","publisher_type":"Number"},{"code":"DPEMECOC","ordinal":204,"publisher_description":"District 2024 Student Membership 2023 Mobility Econ Disadv Count","publisher_type":"Number"},{"code":"DPEMECOP","ordinal":205,"publisher_description":"District 2024 Student Membership 2023 Mobility Econ Disadv Percent","publisher_type":"Number"},{"code":"DPETATTC","ordinal":206,"publisher_description":"District 2024 Student Membership 2022-23 Attrition All Students Count","publisher_type":"Number"},{"code":"DPETATTP","ordinal":207,"publisher_description":"District 2024 Student Membership 2022-23 Attrition All Students Percent","publisher_type":"Number"},{"code":"DPERRAKR","ordinal":208,"publisher_description":"District 2023 Retention Regular Ed KG Rate","publisher_type":"Number"},{"code":"DPERSAKR","ordinal":209,"publisher_description":"District 2023 Retention Special Ed KG Rate","publisher_type":"Number"},{"code":"DPERRA1R","ordinal":210,"publisher_description":"District 2023 Retention Regular Ed 01 Rate","publisher_type":"Number"},{"code":"DPERSA1R","ordinal":211,"publisher_description":"District 2023 Retention Special Ed 01 Rate","publisher_type":"Number"},{"code":"DPERRA2R","ordinal":212,"publisher_description":"District 2023 Retention Regular Ed 02 Rate","publisher_type":"Number"},{"code":"DPERSA2R","ordinal":213,"publisher_description":"District 2023 Retention Special Ed 02 Rate","publisher_type":"Number"},{"code":"DPERRA3R","ordinal":214,"publisher_description":"District 2023 Retention Regular Ed 03 Rate","publisher_type":"Number"},{"code":"DPERSA3R","ordinal":215,"publisher_description":"District 2023 Retention Special Ed 03 Rate","publisher_type":"Number"},{"code":"DPERRA4R","ordinal":216,"publisher_description":"District 2023 Retention Regular Ed 04 Rate","publisher_type":"Number"},{"code":"DPERSA4R","ordinal":217,"publisher_description":"District 2023 Retention Special Ed 04 Rate","publisher_type":"Number"},{"code":"DPERRA5R","ordinal":218,"publisher_description":"District 2023 Retention Regular Ed 05 Rate","publisher_type":"Number"},{"code":"DPERSA5R","ordinal":219,"publisher_description":"District 2023 Retention Special Ed 05 Rate","publisher_type":"Number"},{"code":"DPERRA6R","ordinal":220,"publisher_description":"District 2023 Retention Regular Ed 06 Rate","publisher_type":"Number"},{"code":"DPERSA6R","ordinal":221,"publisher_description":"District 2023 Retention Special Ed 06 Rate","publisher_type":"Number"},{"code":"DPERRA7R","ordinal":222,"publisher_description":"District 2023 Retention Regular Ed 07 Rate","publisher_type":"Number"},{"code":"DPERSA7R","ordinal":223,"publisher_description":"District 2023 Retention Special Ed 07 Rate","publisher_type":"Number"},{"code":"DPERRA8R","ordinal":224,"publisher_description":"District 2023 Retention Regular Ed 08 Rate","publisher_type":"Number"},{"code":"DPERSA8R","ordinal":225,"publisher_description":"District 2023 Retention Special Ed 08 Rate","publisher_type":"Number"},{"code":"DPERRA9R","ordinal":226,"publisher_description":"District 2023 Retention Regular Ed 09 Rate","publisher_type":"Number"},{"code":"DPERSA9R","ordinal":227,"publisher_description":"District 2023 Retention Special Ed 09 Rate","publisher_type":"Number"},{"code":"DAUND23C","ordinal":228,"publisher_description":"District 2023 Underreported Students Count","publisher_type":"Number"},{"code":"DAUND23C","ordinal":229,"publisher_description":"District 2023 Underreported Students Count","publisher_type":"Number"},{"code":"DPCTGKGA","ordinal":230,"publisher_description":"District 2024 Class Size Kindergarten- Avg Size","publisher_type":"Number"},{"code":"DPCTG01A","ordinal":231,"publisher_description":"District 2024 Class Size Grade 1 - Avg Size","publisher_type":"Number"},{"code":"DPCTG02A","ordinal":232,"publisher_description":"District 2024 Class Size Grade 2 - Avg Size","publisher_type":"Number"},{"code":"DPCTG03A","ordinal":233,"publisher_description":"District 2024 Class Size Grade 3 - Avg Size","publisher_type":"Number"},{"code":"DPCTG04A","ordinal":234,"publisher_description":"District 2024 Class Size Grade 4 - Avg Size","publisher_type":"Number"},{"code":"DPCTG05A","ordinal":235,"publisher_description":"District 2024 Class Size Grade 5 - Avg Size","publisher_type":"Number"},{"code":"DPCTG06A","ordinal":236,"publisher_description":"District 2024 Class Size Grade 6 - Avg Size","publisher_type":"Number"},{"code":"DPCTENGA","ordinal":237,"publisher_description":"District 2024 Class Size Sec English - Avg Size","publisher_type":"Number"},{"code":"DPCTFLAA","ordinal":238,"publisher_description":"District 2024 Class Size Sec For Lng - Avg Size","publisher_type":"Number"},{"code":"DPCTMATA","ordinal":239,"publisher_description":"District 2024 Class Size Sec Math - Avg Size","publisher_type":"Number"},{"code":"DPCTSCIA","ordinal":240,"publisher_description":"District 2024 Class Size Sec Sci - Avg Size","publisher_type":"Number"},{"code":"DPCTSOCA","ordinal":241,"publisher_description":"District 2024 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number"}],"fields":[{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DPETGEEC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_ee_count","label":"District 2024 Student Membership: EE Count","position":3,"publisher_description":"District 2024 Student Membership EE Count","publisher_type":"Number"},{"code":"DPETGPKC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pk_count","label":"District 2024 Student Membership: PK Count","position":4,"publisher_description":"District 2024 Student Membership PK Count","publisher_type":"Number"},{"code":"DPETGKNC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_kg_count","label":"District 2024 Student Membership: KG Count","position":5,"publisher_description":"District 2024 Student Membership KG Count","publisher_type":"Number"},{"code":"DPETG01C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_01_count","label":"District 2024 Student Membership: 01 Count","position":6,"publisher_description":"District 2024 Student Membership 01 Count","publisher_type":"Number"},{"code":"DPETG02C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_02_count","label":"District 2024 Student Membership: 02 Count","position":7,"publisher_description":"District 2024 Student Membership 02 Count","publisher_type":"Number"},{"code":"DPETG03C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_03_count","label":"District 2024 Student Membership: 03 Count","position":8,"publisher_description":"District 2024 Student Membership 03 Count","publisher_type":"Number"},{"code":"DPETG04C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_04_count","label":"District 2024 Student Membership: 04 Count","position":9,"publisher_description":"District 2024 Student Membership 04 Count","publisher_type":"Number"},{"code":"DPETG05C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_05_count","label":"District 2024 Student Membership: 05 Count","position":10,"publisher_description":"District 2024 Student Membership 05 Count","publisher_type":"Number"},{"code":"DPETG06C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_06_count","label":"District 2024 Student Membership: 06 Count","position":11,"publisher_description":"District 2024 Student Membership 06 Count","publisher_type":"Number"},{"code":"DPETG07C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_07_count","label":"District 2024 Student Membership: 07 Count","position":12,"publisher_description":"District 2024 Student Membership 07 Count","publisher_type":"Number"},{"code":"DPETG08C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_08_count","label":"District 2024 Student Membership: 08 Count","position":13,"publisher_description":"District 2024 Student Membership 08 Count","publisher_type":"Number"},{"code":"DPETG09C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_09_count","label":"District 2024 Student Membership: 09 Count","position":14,"publisher_description":"District 2024 Student Membership 09 Count","publisher_type":"Number"},{"code":"DPETG10C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_10_count","label":"District 2024 Student Membership: 10 Count","position":15,"publisher_description":"District 2024 Student Membership 10 Count","publisher_type":"Number"},{"code":"DPETG11C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_11_count","label":"District 2024 Student Membership: 11 Count","position":16,"publisher_description":"District 2024 Student Membership 11 Count","publisher_type":"Number"},{"code":"DPETG12C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_12_count","label":"District 2024 Student Membership: 12 Count","position":17,"publisher_description":"District 2024 Student Membership 12 Count","publisher_type":"Number"},{"code":"DPETALLC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_all_students_count","label":"District 2024 Student Membership: All Students Count","position":18,"publisher_description":"District 2024 Student Membership All Students Count","publisher_type":"Number"},{"code":"DPETSPEC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_special_ed_count","label":"District 2024 Student Membership: Special Ed Count","position":19,"publisher_description":"District 2024 Student Membership Special Ed Count","publisher_type":"Number"},{"code":"DPETBILC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_bilingual_esl_count","label":"District 2024 Student Membership: Bilingual/ESL Count","position":20,"publisher_description":"District 2024 Student Membership Bilingual/ESL Count","publisher_type":"Number"},{"code":"DPETVOCC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_career_and_technical_education_count","label":"District 2024 Student Membership: Career & Technical Education Count","position":21,"publisher_description":"District 2024 Student Membership Career & Technical Education Count","publisher_type":"Number"},{"code":"DPETGIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_gifted_and_talented_count","label":"District 2024 Student Membership: Gifted & Talented Count","position":22,"publisher_description":"District 2024 Student Membership Gifted & Talented Count","publisher_type":"Number"},{"code":"DPETLEPC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_eb_el_count","label":"District 2024 Student Membership: EB/EL Count","position":23,"publisher_description":"District 2024 Student Membership EB/EL Count","publisher_type":"Number"},{"code":"DPETECOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_econ_disadv_count","label":"District 2024 Student Membership: Econ Disadv Count","position":24,"publisher_description":"District 2024 Student Membership Econ Disadv Count","publisher_type":"Number"},{"code":"DPETNEDC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_non_educationally_disadv_count","label":"District 2024 Student Membership: Non-Educationally Disadv Count","position":25,"publisher_description":"District 2024 Student Membership Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"DPETRSKC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_at_risk_count","label":"District 2024 Student Membership: At Risk Count","position":26,"publisher_description":"District 2024 Student Membership At Risk Count","publisher_type":"Number"},{"code":"DPETINDC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_american_indian_count","label":"District 2024 Student Membership: American Indian Count","position":27,"publisher_description":"District 2024 Student Membership American Indian Count","publisher_type":"Number"},{"code":"DPETASIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_asian_count","label":"District 2024 Student Membership: Asian Count","position":28,"publisher_description":"District 2024 Student Membership Asian Count","publisher_type":"Number"},{"code":"DPETPCIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pacific_islander_count","label":"District 2024 Student Membership: Pacific Islander Count","position":29,"publisher_description":"District 2024 Student Membership Pacific Islander Count","publisher_type":"Number"},{"code":"DPETTWOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_two_or_more_races_count","label":"District 2024 Student Membership: Two or More Races Count","position":30,"publisher_description":"District 2024 Student Membership Two or More Races Count","publisher_type":"Number"},{"code":"DPETBLAC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_african_american_count","label":"District 2024 Student Membership: African American Count","position":31,"publisher_description":"District 2024 Student Membership African American Count","publisher_type":"Number"},{"code":"DPETHISC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_hispanic_count","label":"District 2024 Student Membership: Hispanic Count","position":32,"publisher_description":"District 2024 Student Membership Hispanic Count","publisher_type":"Number"},{"code":"DPETWHIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_white_count","label":"District 2024 Student Membership: White Count","position":33,"publisher_description":"District 2024 Student Membership White Count","publisher_type":"Number"},{"code":"DPETMALC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_male_count","label":"District 2024 Student Membership: Male Count","position":34,"publisher_description":"District 2024 Student Membership Male Count","publisher_type":"Number"},{"code":"DPETFEMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_female_count","label":"District 2024 Student Membership: Female Count","position":35,"publisher_description":"District 2024 Student Membership Female Count","publisher_type":"Number"},{"code":"DPETDSLC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_dyslexia_count","label":"District 2024 Student Membership: Dyslexia Count","position":36,"publisher_description":"District 2024 Student Membership Dyslexia Count","publisher_type":"Number"},{"code":"DPET504C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_section_504_count","label":"District 2024 Student Membership: Section 504 Count","position":37,"publisher_description":"District 2024 Student Membership Section 504 Count","publisher_type":"Number"},{"code":"DPETTT1C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_title_i_count","label":"District 2024 Student Membership: Title I Count","position":38,"publisher_description":"District 2024 Student Membership Title I Count","publisher_type":"Number"},{"code":"DPETHOMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_homeless_count","label":"District 2024 Student Membership: Homeless Count","position":39,"publisher_description":"District 2024 Student Membership Homeless Count","publisher_type":"Number"},{"code":"DPETIMMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_immigrant_count","label":"District 2024 Student Membership: Immigrant Count","position":40,"publisher_description":"District 2024 Student Membership Immigrant Count","publisher_type":"Number"},{"code":"DPETMIGC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_migrant_count","label":"District 2024 Student Membership: Migrant Count","position":41,"publisher_description":"District 2024 Student Membership Migrant Count","publisher_type":"Number"},{"code":"DPETMLCC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_military_connected_count","label":"District 2024 Student Membership: Military-Connected Count","position":42,"publisher_description":"District 2024 Student Membership Military-Connected Count","publisher_type":"Number"},{"code":"DPETGP3C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pk_count_ages_3_and_under_count","label":"District 2024 Student Membership: PK Count Ages 3 and Under Count","position":43,"publisher_description":"District 2024 Student Membership PK Count Ages 3 and Under Count","publisher_type":"Number"},{"code":"DPETGP4C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pk_count_ages_4_and_over_count","label":"District 2024 Student Membership: PK Count Ages 4 and Over Count","position":44,"publisher_description":"District 2024 Student Membership PK Count Ages 4 and Over Count","publisher_type":"Number"},{"code":"DPETFOSC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_foster_care_count","label":"District 2024 Student Membership: Foster Care Count","position":45,"publisher_description":"District 2024 Student Membership Foster Care Count","publisher_type":"Number"},{"code":"DPETVHSC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_career_and_technical_9_12_education_count","label":"District 2024 Student Membership: Career & Technical (9-12) Education Count","position":46,"publisher_description":"District 2024 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number"},{"code":"DPETDISC","dictionary_status":"documented","disposition":"fact","field":"district_2023_daep_count","label":"District 2023 DAEP: Count","position":47,"publisher_description":"District 2023 DAEP Count","publisher_type":"Number"},{"code":"DPETDISP","dictionary_status":"documented","disposition":"fact","field":"district_2023_daep_percent","label":"District 2023 DAEP: Percent","position":48,"publisher_description":"District 2023 DAEP Percent","publisher_type":"Number"},{"code":"DPETATTC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2022_23_attrition_all_students_count","label":"District 2024 Student Membership: 2022-23 Attrition All Students Count","position":49,"publisher_description":"District 2024 Student Membership 2022-23 Attrition All Students Count","publisher_type":"Number"},{"code":"DPETATTP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2022_23_attrition_all_students_percent","label":"District 2024 Student Membership: 2022-23 Attrition All Students Percent","position":50,"publisher_description":"District 2024 Student Membership 2022-23 Attrition All Students Percent","publisher_type":"Number"},{"code":"DPETSIMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_total_students_with_disabilities_count","label":"District 2024 Student Membership: Total Students with Disabilities Count","position":51,"publisher_description":"District 2024 Student Membership Total Students with Disabilities Count","publisher_type":"Number"},{"code":"DPETSINC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_intellectual_disabilities_count","label":"District 2024 Student Membership: Intellectual Disabilities Count","position":52,"publisher_description":"District 2024 Student Membership Intellectual Disabilities Count","publisher_type":"Number"},{"code":"DPETSPHC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_physical_disabilities_count","label":"District 2024 Student Membership: Physical Disabilities Count","position":53,"publisher_description":"District 2024 Student Membership Physical Disabilities Count","publisher_type":"Number"},{"code":"DPETSBHC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_behavioral_disabilities_count","label":"District 2024 Student Membership: Behavioral Disabilities Count","position":54,"publisher_description":"District 2024 Student Membership Behavioral Disabilities Count","publisher_type":"Number"},{"code":"DPETSAUC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_autism_count","label":"District 2024 Student Membership: Autism Count","position":55,"publisher_description":"District 2024 Student Membership Autism Count","publisher_type":"Number"},{"code":"DPETSNOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_non_categorical_early_childhood_count","label":"District 2024 Student Membership: Non-Categorical Early Childhood Count","position":56,"publisher_description":"District 2024 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number"},{"code":"DPETSINP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_intellectual_disabilities_percent","label":"District 2024 Student Membership: Intellectual Disabilities Percent","position":57,"publisher_description":"District 2024 Student Membership Intellectual Disabilities Percent","publisher_type":"Number"},{"code":"DPETSPHP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_physical_disabilities_percent","label":"District 2024 Student Membership: Physical Disabilities Percent","position":58,"publisher_description":"District 2024 Student Membership Physical Disabilities Percent","publisher_type":"Number"},{"code":"DPETSBHP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_behavioral_disabilities_percent","label":"District 2024 Student Membership: Behavioral Disabilities Percent","position":59,"publisher_description":"District 2024 Student Membership Behavioral Disabilities Percent","publisher_type":"Number"},{"code":"DPETSAUP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_autism_percent","label":"District 2024 Student Membership: Autism Percent","position":60,"publisher_description":"District 2024 Student Membership Autism Percent","publisher_type":"Number"},{"code":"DPETSNOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_non_categorical_early_childhood_percent","label":"District 2024 Student Membership: Non-Categorical Early Childhood Percent","position":61,"publisher_description":"District 2024 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number"},{"code":"DPERRAKR","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_kg_rate","label":"District 2023 Retention: Regular Ed KG Rate","position":62,"publisher_description":"District 2023 Retention Regular Ed KG Rate","publisher_type":"Number"},{"code":"DPERRA1R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_01_rate","label":"District 2023 Retention: Regular Ed 01 Rate","position":63,"publisher_description":"District 2023 Retention Regular Ed 01 Rate","publisher_type":"Number"},{"code":"DPERRA2R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_02_rate","label":"District 2023 Retention: Regular Ed 02 Rate","position":64,"publisher_description":"District 2023 Retention Regular Ed 02 Rate","publisher_type":"Number"},{"code":"DPERRA3R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_03_rate","label":"District 2023 Retention: Regular Ed 03 Rate","position":65,"publisher_description":"District 2023 Retention Regular Ed 03 Rate","publisher_type":"Number"},{"code":"DPERRA4R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_04_rate","label":"District 2023 Retention: Regular Ed 04 Rate","position":66,"publisher_description":"District 2023 Retention Regular Ed 04 Rate","publisher_type":"Number"},{"code":"DPERRA5R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_05_rate","label":"District 2023 Retention: Regular Ed 05 Rate","position":67,"publisher_description":"District 2023 Retention Regular Ed 05 Rate","publisher_type":"Number"},{"code":"DPERRA6R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_06_rate","label":"District 2023 Retention: Regular Ed 06 Rate","position":68,"publisher_description":"District 2023 Retention Regular Ed 06 Rate","publisher_type":"Number"},{"code":"DPERRA7R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_07_rate","label":"District 2023 Retention: Regular Ed 07 Rate","position":69,"publisher_description":"District 2023 Retention Regular Ed 07 Rate","publisher_type":"Number"},{"code":"DPERRA8R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_08_rate","label":"District 2023 Retention: Regular Ed 08 Rate","position":70,"publisher_description":"District 2023 Retention Regular Ed 08 Rate","publisher_type":"Number"},{"code":"DPERRA9R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_regular_ed_09_rate","label":"District 2023 Retention: Regular Ed 09 Rate","position":71,"publisher_description":"District 2023 Retention Regular Ed 09 Rate","publisher_type":"Number"},{"code":"DPERSAKR","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_kg_rate","label":"District 2023 Retention: Special Ed KG Rate","position":72,"publisher_description":"District 2023 Retention Special Ed KG Rate","publisher_type":"Number"},{"code":"DPERSA1R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_01_rate","label":"District 2023 Retention: Special Ed 01 Rate","position":73,"publisher_description":"District 2023 Retention Special Ed 01 Rate","publisher_type":"Number"},{"code":"DPERSA2R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_02_rate","label":"District 2023 Retention: Special Ed 02 Rate","position":74,"publisher_description":"District 2023 Retention Special Ed 02 Rate","publisher_type":"Number"},{"code":"DPERSA3R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_03_rate","label":"District 2023 Retention: Special Ed 03 Rate","position":75,"publisher_description":"District 2023 Retention Special Ed 03 Rate","publisher_type":"Number"},{"code":"DPERSA4R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_04_rate","label":"District 2023 Retention: Special Ed 04 Rate","position":76,"publisher_description":"District 2023 Retention Special Ed 04 Rate","publisher_type":"Number"},{"code":"DPERSA5R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_05_rate","label":"District 2023 Retention: Special Ed 05 Rate","position":77,"publisher_description":"District 2023 Retention Special Ed 05 Rate","publisher_type":"Number"},{"code":"DPERSA6R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_06_rate","label":"District 2023 Retention: Special Ed 06 Rate","position":78,"publisher_description":"District 2023 Retention Special Ed 06 Rate","publisher_type":"Number"},{"code":"DPERSA7R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_07_rate","label":"District 2023 Retention: Special Ed 07 Rate","position":79,"publisher_description":"District 2023 Retention Special Ed 07 Rate","publisher_type":"Number"},{"code":"DPERSA8R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_08_rate","label":"District 2023 Retention: Special Ed 08 Rate","position":80,"publisher_description":"District 2023 Retention Special Ed 08 Rate","publisher_type":"Number"},{"code":"DPERSA9R","dictionary_status":"documented","disposition":"fact","field":"district_2023_retention_special_ed_09_rate","label":"District 2023 Retention: Special Ed 09 Rate","position":81,"publisher_description":"District 2023 Retention Special Ed 09 Rate","publisher_type":"Number"},{"code":"DAUND23C","dictionary_status":"documented","disposition":"fact","field":"district_2023_underreported_students_count","label":"District 2023 Underreported Students: Count","position":82,"publisher_description":"District 2023 Underreported Students Count","publisher_type":"Number"},{"code":"DPEMALLC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_all_students_count","label":"District 2024 Student Membership: 2023 Mobility All Students Count","position":83,"publisher_description":"District 2024 Student Membership 2023 Mobility All Students Count","publisher_type":"Number"},{"code":"DPEMALLP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_all_students_percent","label":"District 2024 Student Membership: 2023 Mobility All Students Percent","position":84,"publisher_description":"District 2024 Student Membership 2023 Mobility All Students Percent","publisher_type":"Number"},{"code":"DPETWHIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_white_percent","label":"District 2024 Student Membership: White Percent","position":85,"publisher_description":"District 2024 Student Membership White Percent","publisher_type":"Number"},{"code":"DPETBLAP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_african_american_percent","label":"District 2024 Student Membership: African American Percent","position":86,"publisher_description":"District 2024 Student Membership African American Percent","publisher_type":"Number"},{"code":"DPETHISP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_hispanic_percent","label":"District 2024 Student Membership: Hispanic Percent","position":87,"publisher_description":"District 2024 Student Membership Hispanic Percent","publisher_type":"Number"},{"code":"DPETINDP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_american_indian_percent","label":"District 2024 Student Membership: American Indian Percent","position":88,"publisher_description":"District 2024 Student Membership American Indian Percent","publisher_type":"Number"},{"code":"DPETASIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_asian_percent","label":"District 2024 Student Membership: Asian Percent","position":89,"publisher_description":"District 2024 Student Membership Asian Percent","publisher_type":"Number"},{"code":"DPETPCIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pacific_islander_percent","label":"District 2024 Student Membership: Pacific Islander Percent","position":90,"publisher_description":"District 2024 Student Membership Pacific Islander Percent","publisher_type":"Number"},{"code":"DPETTWOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_two_or_more_races_percent","label":"District 2024 Student Membership: Two or More Races Percent","position":91,"publisher_description":"District 2024 Student Membership Two or More Races Percent","publisher_type":"Number"},{"code":"DPETECOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_econ_disadv_percent","label":"District 2024 Student Membership: Econ Disadv Percent","position":92,"publisher_description":"District 2024 Student Membership Econ Disadv Percent","publisher_type":"Number"},{"code":"DPETNEDP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_non_educationally_disadv_percent","label":"District 2024 Student Membership: Non-Educationally Disadv Percent","position":93,"publisher_description":"District 2024 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"DPETRSKP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_at_risk_percent","label":"District 2024 Student Membership: At Risk Percent","position":94,"publisher_description":"District 2024 Student Membership At Risk Percent","publisher_type":"Number"},{"code":"DPETLEPP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_eb_el_percent","label":"District 2024 Student Membership: EB/EL Percent","position":95,"publisher_description":"District 2024 Student Membership EB/EL Percent","publisher_type":"Number"},{"code":"DPETSPEP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_special_ed_percent","label":"District 2024 Student Membership: Special Ed Percent","position":96,"publisher_description":"District 2024 Student Membership Special Ed Percent","publisher_type":"Number"},{"code":"DPETVOCP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_career_and_technical_education_percent","label":"District 2024 Student Membership: Career & Technical Education Percent","position":97,"publisher_description":"District 2024 Student Membership Career & Technical Education Percent","publisher_type":"Number"},{"code":"DPETBILP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_bilingual_esl_percent","label":"District 2024 Student Membership: Bilingual/ESL Percent","position":98,"publisher_description":"District 2024 Student Membership Bilingual/ESL Percent","publisher_type":"Number"},{"code":"DPETGIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_gifted_and_talented_percent","label":"District 2024 Student Membership: Gifted & Talented Percent","position":99,"publisher_description":"District 2024 Student Membership Gifted & Talented Percent","publisher_type":"Number"},{"code":"DPET504P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_section_504_percent","label":"District 2024 Student Membership: Section 504 Percent","position":100,"publisher_description":"District 2024 Student Membership Section 504 Percent","publisher_type":"Number"},{"code":"DPETDSLP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_dyslexia_percent","label":"District 2024 Student Membership: Dyslexia Percent","position":101,"publisher_description":"District 2024 Student Membership Dyslexia Percent","publisher_type":"Number"},{"code":"DPETTT1P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_title_i_percent","label":"District 2024 Student Membership: Title I Percent","position":102,"publisher_description":"District 2024 Student Membership Title I Percent","publisher_type":"Number"},{"code":"DPETHOMP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_homeless_percent","label":"District 2024 Student Membership: Homeless Percent","position":103,"publisher_description":"District 2024 Student Membership Homeless Percent","publisher_type":"Number"},{"code":"DPETIMMP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_immigrant_percent","label":"District 2024 Student Membership: Immigrant Percent","position":104,"publisher_description":"District 2024 Student Membership Immigrant Percent","publisher_type":"Number"},{"code":"DPETMIGP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_migrant_percent","label":"District 2024 Student Membership: Migrant Percent","position":105,"publisher_description":"District 2024 Student Membership Migrant Percent","publisher_type":"Number"},{"code":"DPETMLCP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_military_connected_percent","label":"District 2024 Student Membership: Military-Connected Percent","position":106,"publisher_description":"District 2024 Student Membership Military-Connected Percent","publisher_type":"Number"},{"code":"DPETFOSP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_foster_care_percent","label":"District 2024 Student Membership: Foster Care Percent","position":107,"publisher_description":"District 2024 Student Membership Foster Care Percent","publisher_type":"Number"},{"code":"DPETGEEP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_ee_percent","label":"District 2024 Student Membership: EE Percent","position":108,"publisher_description":"District 2024 Student Membership EE Percent","publisher_type":"Number"},{"code":"DPETGPKP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pk_percent","label":"District 2024 Student Membership: PK Percent","position":109,"publisher_description":"District 2024 Student Membership PK Percent","publisher_type":"Number"},{"code":"DPETGP3P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pk_count_ages_3_and_under_percent","label":"District 2024 Student Membership: PK Count Ages 3 and Under Percent","position":110,"publisher_description":"District 2024 Student Membership PK Count Ages 3 and Under Percent","publisher_type":"Number"},{"code":"DPETGP4P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_pk_count_ages_4_and_over_percent","label":"District 2024 Student Membership: PK Count Ages 4 and Over Percent","position":111,"publisher_description":"District 2024 Student Membership PK Count Ages 4 and Over Percent","publisher_type":"Number"},{"code":"DPETGKNP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_kg_percent","label":"District 2024 Student Membership: KG Percent","position":112,"publisher_description":"District 2024 Student Membership KG Percent","publisher_type":"Number"},{"code":"DPETG01P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_01_percent","label":"District 2024 Student Membership: 01 Percent","position":113,"publisher_description":"District 2024 Student Membership 01 Percent","publisher_type":"Number"},{"code":"DPETG02P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_02_percent","label":"District 2024 Student Membership: 02 Percent","position":114,"publisher_description":"District 2024 Student Membership 02 Percent","publisher_type":"Number"},{"code":"DPETG03P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_03_percent","label":"District 2024 Student Membership: 03 Percent","position":115,"publisher_description":"District 2024 Student Membership 03 Percent","publisher_type":"Number"},{"code":"DPETG04P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_04_percent","label":"District 2024 Student Membership: 04 Percent","position":116,"publisher_description":"District 2024 Student Membership 04 Percent","publisher_type":"Number"},{"code":"DPETG05P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_05_percent","label":"District 2024 Student Membership: 05 Percent","position":117,"publisher_description":"District 2024 Student Membership 05 Percent","publisher_type":"Number"},{"code":"DPETG06P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_06_percent","label":"District 2024 Student Membership: 06 Percent","position":118,"publisher_description":"District 2024 Student Membership 06 Percent","publisher_type":"Number"},{"code":"DPETG07P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_07_percent","label":"District 2024 Student Membership: 07 Percent","position":119,"publisher_description":"District 2024 Student Membership 07 Percent","publisher_type":"Number"},{"code":"DPETG08P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_08_percent","label":"District 2024 Student Membership: 08 Percent","position":120,"publisher_description":"District 2024 Student Membership 08 Percent","publisher_type":"Number"},{"code":"DPETG09P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_09_percent","label":"District 2024 Student Membership: 09 Percent","position":121,"publisher_description":"District 2024 Student Membership 09 Percent","publisher_type":"Number"},{"code":"DPETG10P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_10_percent","label":"District 2024 Student Membership: 10 Percent","position":122,"publisher_description":"District 2024 Student Membership 10 Percent","publisher_type":"Number"},{"code":"DPETG11P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_11_percent","label":"District 2024 Student Membership: 11 Percent","position":123,"publisher_description":"District 2024 Student Membership 11 Percent","publisher_type":"Number"},{"code":"DPETG12P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_12_percent","label":"District 2024 Student Membership: 12 Percent","position":124,"publisher_description":"District 2024 Student Membership 12 Percent","publisher_type":"Number"},{"code":"DPETMALP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_male_percent","label":"District 2024 Student Membership: Male Percent","position":125,"publisher_description":"District 2024 Student Membership Male Percent","publisher_type":"Number"},{"code":"DPETFEMP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_female_percent","label":"District 2024 Student Membership: Female Percent","position":126,"publisher_description":"District 2024 Student Membership Female Percent","publisher_type":"Number"},{"code":"DPETVHSP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_career_and_technical_9_12_education_percent","label":"District 2024 Student Membership: Career & Technical (9-12) Education Percent","position":127,"publisher_description":"District 2024 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number"},{"code":"DPNTALLC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_all_students_count","label":"District 2024 Student Enrollment: All Students Count","position":128,"publisher_description":"District 2024 Student Enrollment All Students Count","publisher_type":"Number"},{"code":"DPNTGEEC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_ee_count","label":"District 2024 Student Enrollment: EE Count","position":129,"publisher_description":"District 2024 Student Enrollment EE Count","publisher_type":"Number"},{"code":"DPNTGEEP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_ee_percent","label":"District 2024 Student Enrollment: EE Percent","position":130,"publisher_description":"District 2024 Student Enrollment EE Percent","publisher_type":"Number"},{"code":"DPNTGPKC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pk_count","label":"District 2024 Student Enrollment: PK Count","position":131,"publisher_description":"District 2024 Student Enrollment PK Count","publisher_type":"Number"},{"code":"DPNTGPKP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pk_percent","label":"District 2024 Student Enrollment: PK Percent","position":132,"publisher_description":"District 2024 Student Enrollment PK Percent","publisher_type":"Number"},{"code":"DPNTGP3C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pk_03_count","label":"District 2024 Student Enrollment: PK-03 Count","position":133,"publisher_description":"District 2024 Student Enrollment PK-03 Count","publisher_type":"Number"},{"code":"DPNTGP3P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pk_03_percent","label":"District 2024 Student Enrollment: PK-03 Percent","position":134,"publisher_description":"District 2024 Student Enrollment PK-03 Percent","publisher_type":"Number"},{"code":"DPNTGP4C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pk_04_count","label":"District 2024 Student Enrollment: PK-04 Count","position":135,"publisher_description":"District 2024 Student Enrollment PK-04 Count","publisher_type":"Number"},{"code":"DPNTGP4P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pk_04_percent","label":"District 2024 Student Enrollment: PK-04 Percent","position":136,"publisher_description":"District 2024 Student Enrollment PK-04 Percent","publisher_type":"Number"},{"code":"DPNTGKNC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_kg_count","label":"District 2024 Student Enrollment: KG Count","position":137,"publisher_description":"District 2024 Student Enrollment KG Count","publisher_type":"Number"},{"code":"DPNTGKNP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_kg_percent","label":"District 2024 Student Enrollment: KG Percent","position":138,"publisher_description":"District 2024 Student Enrollment KG Percent","publisher_type":"Number"},{"code":"DPNTG01C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_01_count","label":"District 2024 Student Enrollment: 01 Count","position":139,"publisher_description":"District 2024 Student Enrollment 01 Count","publisher_type":"Number"},{"code":"DPNTG01P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_01_percent","label":"District 2024 Student Enrollment: 01 Percent","position":140,"publisher_description":"District 2024 Student Enrollment 01 Percent","publisher_type":"Number"},{"code":"DPNTG02C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_02_count","label":"District 2024 Student Enrollment: 02 Count","position":141,"publisher_description":"District 2024 Student Enrollment 02 Count","publisher_type":"Number"},{"code":"DPNTG02P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_02_percent","label":"District 2024 Student Enrollment: 02 Percent","position":142,"publisher_description":"District 2024 Student Enrollment 02 Percent","publisher_type":"Number"},{"code":"DPNTG03C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_03_count","label":"District 2024 Student Enrollment: 03 Count","position":143,"publisher_description":"District 2024 Student Enrollment 03 Count","publisher_type":"Number"},{"code":"DPNTG03P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_03_percent","label":"District 2024 Student Enrollment: 03 Percent","position":144,"publisher_description":"District 2024 Student Enrollment 03 Percent","publisher_type":"Number"},{"code":"DPNTG04C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_04_count","label":"District 2024 Student Enrollment: 04 Count","position":145,"publisher_description":"District 2024 Student Enrollment 04 Count","publisher_type":"Number"},{"code":"DPNTG04P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_04_percent","label":"District 2024 Student Enrollment: 04 Percent","position":146,"publisher_description":"District 2024 Student Enrollment 04 Percent","publisher_type":"Number"},{"code":"DPNTG05C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_05_count","label":"District 2024 Student Enrollment: 05 Count","position":147,"publisher_description":"District 2024 Student Enrollment 05 Count","publisher_type":"Number"},{"code":"DPNTG05P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_05_percent","label":"District 2024 Student Enrollment: 05 Percent","position":148,"publisher_description":"District 2024 Student Enrollment 05 Percent","publisher_type":"Number"},{"code":"DPNTG06C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_06_count","label":"District 2024 Student Enrollment: 06 Count","position":149,"publisher_description":"District 2024 Student Enrollment 06 Count","publisher_type":"Number"},{"code":"DPNTG06P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_06_percent","label":"District 2024 Student Enrollment: 06 Percent","position":150,"publisher_description":"District 2024 Student Enrollment 06 Percent","publisher_type":"Number"},{"code":"DPNTG07C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_07_count","label":"District 2024 Student Enrollment: 07 Count","position":151,"publisher_description":"District 2024 Student Enrollment 07 Count","publisher_type":"Number"},{"code":"DPNTG07P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_07_percent","label":"District 2024 Student Enrollment: 07 Percent","position":152,"publisher_description":"District 2024 Student Enrollment 07 Percent","publisher_type":"Number"},{"code":"DPNTG08C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_08_count","label":"District 2024 Student Enrollment: 08 Count","position":153,"publisher_description":"District 2024 Student Enrollment 08 Count","publisher_type":"Number"},{"code":"DPNTG08P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_08_percent","label":"District 2024 Student Enrollment: 08 Percent","position":154,"publisher_description":"District 2024 Student Enrollment 08 Percent","publisher_type":"Number"},{"code":"DPNTG09C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_09_count","label":"District 2024 Student Enrollment: 09 Count","position":155,"publisher_description":"District 2024 Student Enrollment 09 Count","publisher_type":"Number"},{"code":"DPNTG09P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_09_percent","label":"District 2024 Student Enrollment: 09 Percent","position":156,"publisher_description":"District 2024 Student Enrollment 09 Percent","publisher_type":"Number"},{"code":"DPNTG10C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_10_count","label":"District 2024 Student Enrollment: 10 Count","position":157,"publisher_description":"District 2024 Student Enrollment 10 Count","publisher_type":"Number"},{"code":"DPNTG10P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_10_percent","label":"District 2024 Student Enrollment: 10 Percent","position":158,"publisher_description":"District 2024 Student Enrollment 10 Percent","publisher_type":"Number"},{"code":"DPNTG11C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_11_count","label":"District 2024 Student Enrollment: 11 Count","position":159,"publisher_description":"District 2024 Student Enrollment 11 Count","publisher_type":"Number"},{"code":"DPNTG11P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_11_percent","label":"District 2024 Student Enrollment: 11 Percent","position":160,"publisher_description":"District 2024 Student Enrollment 11 Percent","publisher_type":"Number"},{"code":"DPNTG12C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_12_count","label":"District 2024 Student Enrollment: 12 Count","position":161,"publisher_description":"District 2024 Student Enrollment 12 Count","publisher_type":"Number"},{"code":"DPNTG12P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_12_percent","label":"District 2024 Student Enrollment: 12 Percent","position":162,"publisher_description":"District 2024 Student Enrollment 12 Percent","publisher_type":"Number"},{"code":"DPNTBLAC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_african_american_count","label":"District 2024 Student Enrollment: African American Count","position":163,"publisher_description":"District 2024 Student Enrollment African American Count","publisher_type":"Number"},{"code":"DPNTBLAP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_african_american_percent","label":"District 2024 Student Enrollment: African American Percent","position":164,"publisher_description":"District 2024 Student Enrollment African American Percent","publisher_type":"Number"},{"code":"DPNTHISC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_hispanic_count","label":"District 2024 Student Enrollment: Hispanic Count","position":165,"publisher_description":"District 2024 Student Enrollment Hispanic Count","publisher_type":"Number"},{"code":"DPNTHISP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_hispanic_percent","label":"District 2024 Student Enrollment: Hispanic Percent","position":166,"publisher_description":"District 2024 Student Enrollment Hispanic Percent","publisher_type":"Number"},{"code":"DPNTWHIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_white_count","label":"District 2024 Student Enrollment: White Count","position":167,"publisher_description":"District 2024 Student Enrollment White Count","publisher_type":"Number"},{"code":"DPNTWHIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_white_percent","label":"District 2024 Student Enrollment: White Percent","position":168,"publisher_description":"District 2024 Student Enrollment White Percent","publisher_type":"Number"},{"code":"DPNTINDC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_american_indian_count","label":"District 2024 Student Enrollment: American Indian Count","position":169,"publisher_description":"District 2024 Student Enrollment American Indian Count","publisher_type":"Number"},{"code":"DPNTINDP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_american_indian_percent","label":"District 2024 Student Enrollment: American Indian Percent","position":170,"publisher_description":"District 2024 Student Enrollment American Indian Percent","publisher_type":"Number"},{"code":"DPNTASIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_asian_count","label":"District 2024 Student Enrollment: Asian Count","position":171,"publisher_description":"District 2024 Student Enrollment Asian Count","publisher_type":"Number"},{"code":"DPNTASIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_asian_percent","label":"District 2024 Student Enrollment: Asian Percent","position":172,"publisher_description":"District 2024 Student Enrollment Asian Percent","publisher_type":"Number"},{"code":"DPNTPCIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pacific_islander_count","label":"District 2024 Student Enrollment: Pacific Islander Count","position":173,"publisher_description":"District 2024 Student Enrollment Pacific Islander Count","publisher_type":"Number"},{"code":"DPNTPCIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_pacific_islander_percent","label":"District 2024 Student Enrollment: Pacific Islander Percent","position":174,"publisher_description":"District 2024 Student Enrollment Pacific Islander Percent","publisher_type":"Number"},{"code":"DPNTTWOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_two_or_more_races_count","label":"District 2024 Student Enrollment: Two or More Races Count","position":175,"publisher_description":"District 2024 Student Enrollment Two or More Races Count","publisher_type":"Number"},{"code":"DPNTTWOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_two_or_more_races_percent","label":"District 2024 Student Enrollment: Two or More Races Percent","position":176,"publisher_description":"District 2024 Student Enrollment Two or More Races Percent","publisher_type":"Number"},{"code":"DPNTFEMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_female_count","label":"District 2024 Student Enrollment: Female Count","position":177,"publisher_description":"District 2024 Student Enrollment Female Count","publisher_type":"Number"},{"code":"DPNTFEMP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_female_percent","label":"District 2024 Student Enrollment: Female Percent","position":178,"publisher_description":"District 2024 Student Enrollment Female Percent","publisher_type":"Number"},{"code":"DPNTMALC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_male_count","label":"District 2024 Student Enrollment: Male Count","position":179,"publisher_description":"District 2024 Student Enrollment Male Count","publisher_type":"Number"},{"code":"DPNTMALP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_male_percent","label":"District 2024 Student Enrollment: Male Percent","position":180,"publisher_description":"District 2024 Student Enrollment Male Percent","publisher_type":"Number"},{"code":"DPNTECOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_econ_disadv_count","label":"District 2024 Student Enrollment: Econ Disadv Count","position":181,"publisher_description":"District 2024 Student Enrollment Econ Disadv Count","publisher_type":"Number"},{"code":"DPNTECOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_econ_disadv_percent","label":"District 2024 Student Enrollment: Econ Disadv Percent","position":182,"publisher_description":"District 2024 Student Enrollment Econ Disadv Percent","publisher_type":"Number"},{"code":"DPNTNEDC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_non_educationally_disadv_count","label":"District 2024 Student Enrollment: Non-Educationally Disadv Count","position":183,"publisher_description":"District 2024 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"DPNTNEDP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_non_educationally_disadv_percent","label":"District 2024 Student Enrollment: Non-Educationally Disadv Percent","position":184,"publisher_description":"District 2024 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"DPNT504C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_section_504_count","label":"District 2024 Student Enrollment: Section 504 Count","position":185,"publisher_description":"District 2024 Student Enrollment Section 504 Count","publisher_type":"Number"},{"code":"DPNT504P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_section_504_percent","label":"District 2024 Student Enrollment: Section 504 Percent","position":186,"publisher_description":"District 2024 Student Enrollment Section 504 Percent","publisher_type":"Number"},{"code":"DPNTLEPC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_el_count","label":"District 2024 Student Enrollment: EL Count","position":187,"publisher_description":"District 2024 Student Enrollment EL Count","publisher_type":"Number"},{"code":"DPNTLEPP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_el_percent","label":"District 2024 Student Enrollment: EL Percent","position":188,"publisher_description":"District 2024 Student Enrollment EL Percent","publisher_type":"Number"},{"code":"DPNTDSLC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_dyslexia_count","label":"District 2024 Student Enrollment: Dyslexia Count","position":189,"publisher_description":"District 2024 Student Enrollment Dyslexia Count","publisher_type":"Number"},{"code":"DPNTDSLP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_dyslexia_percent","label":"District 2024 Student Enrollment: Dyslexia Percent","position":190,"publisher_description":"District 2024 Student Enrollment Dyslexia Percent","publisher_type":"Number"},{"code":"DPNTFOSC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_foster_care_count","label":"District 2024 Student Enrollment: Foster Care Count","position":191,"publisher_description":"District 2024 Student Enrollment Foster Care Count","publisher_type":"Number"},{"code":"DPNTFOSP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_foster_care_percent","label":"District 2024 Student Enrollment: Foster Care Percent","position":192,"publisher_description":"District 2024 Student Enrollment Foster Care Percent","publisher_type":"Number"},{"code":"DPNTHOMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_homeless_count","label":"District 2024 Student Enrollment: Homeless Count","position":193,"publisher_description":"District 2024 Student Enrollment Homeless Count","publisher_type":"Number"},{"code":"DPNTHOMP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_homeless_percent","label":"District 2024 Student Enrollment: Homeless Percent","position":194,"publisher_description":"District 2024 Student Enrollment Homeless Percent","publisher_type":"Number"},{"code":"DPNTIMMC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_immigrant_count","label":"District 2024 Student Enrollment: Immigrant Count","position":195,"publisher_description":"District 2024 Student Enrollment Immigrant Count","publisher_type":"Number"},{"code":"DPNTIMMP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_immigrant_percent","label":"District 2024 Student Enrollment: Immigrant Percent","position":196,"publisher_description":"District 2024 Student Enrollment Immigrant Percent","publisher_type":"Number"},{"code":"DPNTMIGC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_migrant_count","label":"District 2024 Student Enrollment: Migrant Count","position":197,"publisher_description":"District 2024 Student Enrollment Migrant Count","publisher_type":"Number"},{"code":"DPNTMIGP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_migrant_percent","label":"District 2024 Student Enrollment: Migrant Percent","position":198,"publisher_description":"District 2024 Student Enrollment Migrant Percent","publisher_type":"Number"},{"code":"DPNTTT1C","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_title_i_count","label":"District 2024 Student Enrollment: Title I Count","position":199,"publisher_description":"District 2024 Student Enrollment Title I Count","publisher_type":"Number"},{"code":"DPNTTT1P","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_title_i_percent","label":"District 2024 Student Enrollment: Title I Percent","position":200,"publisher_description":"District 2024 Student Enrollment Title I Percent","publisher_type":"Number"},{"code":"DPNTMLCC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_military_connected_count","label":"District 2024 Student Enrollment: Military-Connected Count","position":201,"publisher_description":"District 2024 Student Enrollment Military-Connected Count","publisher_type":"Number"},{"code":"DPNTMLCP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_military_connected_percent","label":"District 2024 Student Enrollment: Military-Connected Percent","position":202,"publisher_description":"District 2024 Student Enrollment Military-Connected Percent","publisher_type":"Number"},{"code":"DPNTRSKC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_at_risk_count","label":"District 2024 Student Enrollment: At Risk Count","position":203,"publisher_description":"District 2024 Student Enrollment At Risk Count","publisher_type":"Number"},{"code":"DPNTRSKP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_at_risk_percent","label":"District 2024 Student Enrollment: At Risk Percent","position":204,"publisher_description":"District 2024 Student Enrollment At Risk Percent","publisher_type":"Number"},{"code":"DPNTBILC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_bilingual_esl_count","label":"District 2024 Student Enrollment: Bilingual/ESL Count","position":205,"publisher_description":"District 2024 Student Enrollment Bilingual/ESL Count","publisher_type":"Number"},{"code":"DPNTBILP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_bilingual_esl_percent","label":"District 2024 Student Enrollment: Bilingual/ESL Percent","position":206,"publisher_description":"District 2024 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number"},{"code":"DPNTGIFC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_gifted_and_talented_count","label":"District 2024 Student Enrollment: Gifted & Talented Count","position":207,"publisher_description":"District 2024 Student Enrollment Gifted & Talented Count","publisher_type":"Number"},{"code":"DPNTGIFP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_gifted_and_talented_percent","label":"District 2024 Student Enrollment: Gifted & Talented Percent","position":208,"publisher_description":"District 2024 Student Enrollment Gifted & Talented Percent","publisher_type":"Number"},{"code":"DPNTSPEC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_special_ed_count","label":"District 2024 Student Enrollment: Special Ed Count","position":209,"publisher_description":"District 2024 Student Enrollment Special Ed Count","publisher_type":"Number"},{"code":"DPNTSPEP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_enrollment_special_ed_percent","label":"District 2024 Student Enrollment: Special Ed Percent","position":210,"publisher_description":"District 2024 Student Enrollment Special Ed Percent","publisher_type":"Number"},{"code":"DPCTSOCA","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_sec_soc_stud_avg_size","label":"District 2024 Class Size: Sec Soc Stud- Avg Size","position":211,"publisher_description":"District 2024 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number"},{"code":"DPCTSCIA","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_sec_sci_avg_size","label":"District 2024 Class Size: Sec Sci - Avg Size","position":212,"publisher_description":"District 2024 Class Size Sec Sci - Avg Size","publisher_type":"Number"},{"code":"DPCTMATA","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_sec_math_avg_size","label":"District 2024 Class Size: Sec Math - Avg Size","position":213,"publisher_description":"District 2024 Class Size Sec Math - Avg Size","publisher_type":"Number"},{"code":"DPCTGKGA","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_kindergarten_avg_size","label":"District 2024 Class Size: Kindergarten- Avg Size","position":214,"publisher_description":"District 2024 Class Size Kindergarten- Avg Size","publisher_type":"Number"},{"code":"DPCTG06A","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_grade_6_avg_size","label":"District 2024 Class Size: Grade 6 - Avg Size","position":215,"publisher_description":"District 2024 Class Size Grade 6 - Avg Size","publisher_type":"Number"},{"code":"DPCTG05A","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_grade_5_avg_size","label":"District 2024 Class Size: Grade 5 - Avg Size","position":216,"publisher_description":"District 2024 Class Size Grade 5 - Avg Size","publisher_type":"Number"},{"code":"DPCTG04A","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_grade_4_avg_size","label":"District 2024 Class Size: Grade 4 - Avg Size","position":217,"publisher_description":"District 2024 Class Size Grade 4 - Avg Size","publisher_type":"Number"},{"code":"DPCTG03A","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_grade_3_avg_size","label":"District 2024 Class Size: Grade 3 - Avg Size","position":218,"publisher_description":"District 2024 Class Size Grade 3 - Avg Size","publisher_type":"Number"},{"code":"DPCTG02A","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_grade_2_avg_size","label":"District 2024 Class Size: Grade 2 - Avg Size","position":219,"publisher_description":"District 2024 Class Size Grade 2 - Avg Size","publisher_type":"Number"},{"code":"DPCTG01A","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_grade_1_avg_size","label":"District 2024 Class Size: Grade 1 - Avg Size","position":220,"publisher_description":"District 2024 Class Size Grade 1 - Avg Size","publisher_type":"Number"},{"code":"DPCTFLAA","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_sec_for_lng_avg_size","label":"District 2024 Class Size: Sec For Lng - Avg Size","position":221,"publisher_description":"District 2024 Class Size Sec For Lng - Avg Size","publisher_type":"Number"},{"code":"DPCTENGA","dictionary_status":"documented","disposition":"fact","field":"district_2024_class_size_sec_english_avg_size","label":"District 2024 Class Size: Sec English - Avg Size","position":222,"publisher_description":"District 2024 Class Size Sec English - Avg Size","publisher_type":"Number"},{"code":"DPEMINDC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_american_indian_count","label":"District 2024 Student Membership: 2023 Mobility American Indian Count","position":223,"publisher_description":"District 2024 Student Membership 2023 Mobility American Indian Count","publisher_type":"Number"},{"code":"DPEMPCIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_pacific_islander_count","label":"District 2024 Student Membership: 2023 Mobility Pacific Islander Count","position":224,"publisher_description":"District 2024 Student Membership 2023 Mobility Pacific Islander Count","publisher_type":"Number"},{"code":"DPEMASIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_asian_count","label":"District 2024 Student Membership: 2023 Mobility Asian Count","position":225,"publisher_description":"District 2024 Student Membership 2023 Mobility Asian Count","publisher_type":"Number"},{"code":"DPEMBLAC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_african_american_count","label":"District 2024 Student Membership: 2023 Mobility African American Count","position":226,"publisher_description":"District 2024 Student Membership 2023 Mobility African American Count","publisher_type":"Number"},{"code":"DPEMHISC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_hispanic_count","label":"District 2024 Student Membership: 2023 Mobility Hispanic Count","position":227,"publisher_description":"District 2024 Student Membership 2023 Mobility Hispanic Count","publisher_type":"Number"},{"code":"DPEMWHIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_white_count","label":"District 2024 Student Membership: 2023 Mobility White Count","position":228,"publisher_description":"District 2024 Student Membership 2023 Mobility White Count","publisher_type":"Number"},{"code":"DPEMTWOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_two_or_more_races_count","label":"District 2024 Student Membership: 2023 Mobility Two or More Races Count","position":229,"publisher_description":"District 2024 Student Membership 2023 Mobility Two or More Races Count","publisher_type":"Number"},{"code":"DPEMECOC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_econ_disadv_count","label":"District 2024 Student Membership: 2023 Mobility Econ Disadv Count","position":230,"publisher_description":"District 2024 Student Membership 2023 Mobility Econ Disadv Count","publisher_type":"Number"},{"code":"DPEMLEPC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_eb_el_count","label":"District 2024 Student Membership: 2023 Mobility EB/EL Count","position":231,"publisher_description":"District 2024 Student Membership 2023 Mobility EB/EL Count","publisher_type":"Number"},{"code":"DPEMSPEC","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_special_ed_count","label":"District 2024 Student Membership: 2023 Mobility Special Ed Count","position":232,"publisher_description":"District 2024 Student Membership 2023 Mobility Special Ed Count","publisher_type":"Number"},{"code":"DPEMINDP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_american_indian_percent","label":"District 2024 Student Membership: 2023 Mobility American Indian Percent","position":233,"publisher_description":"District 2024 Student Membership 2023 Mobility American Indian Percent","publisher_type":"Number"},{"code":"DPEMASIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_asian_percent","label":"District 2024 Student Membership: 2023 Mobility Asian Percent","position":234,"publisher_description":"District 2024 Student Membership 2023 Mobility Asian Percent","publisher_type":"Number"},{"code":"DPEMPCIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_pacific_islander_percent","label":"District 2024 Student Membership: 2023 Mobility Pacific Islander Percent","position":235,"publisher_description":"District 2024 Student Membership 2023 Mobility Pacific Islander Percent","publisher_type":"Number"},{"code":"DPEMTWOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_two_or_more_races_percent","label":"District 2024 Student Membership: 2023 Mobility Two or More Races Percent","position":236,"publisher_description":"District 2024 Student Membership 2023 Mobility Two or More Races Percent","publisher_type":"Number"},{"code":"DPEMBLAP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_african_american_percent","label":"District 2024 Student Membership: 2023 Mobility African American Percent","position":237,"publisher_description":"District 2024 Student Membership 2023 Mobility African American Percent","publisher_type":"Number"},{"code":"DPEMHISP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_hispanic_percent","label":"District 2024 Student Membership: 2023 Mobility Hispanic Percent","position":238,"publisher_description":"District 2024 Student Membership 2023 Mobility Hispanic Percent","publisher_type":"Number"},{"code":"DPEMWHIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_white_percent","label":"District 2024 Student Membership: 2023 Mobility White Percent","position":239,"publisher_description":"District 2024 Student Membership 2023 Mobility White Percent","publisher_type":"Number"},{"code":"DPEMECOP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_econ_disadv_percent","label":"District 2024 Student Membership: 2023 Mobility Econ Disadv Percent","position":240,"publisher_description":"District 2024 Student Membership 2023 Mobility Econ Disadv Percent","publisher_type":"Number"},{"code":"DPEMLEPP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_eb_el_percent","label":"District 2024 Student Membership: 2023 Mobility EB/EL Percent","position":241,"publisher_description":"District 2024 Student Membership 2023 Mobility EB/EL Percent","publisher_type":"Number"},{"code":"DPEMSPEP","dictionary_status":"documented","disposition":"fact","field":"district_2024_student_membership_2023_mobility_special_ed_percent","label":"District 2024 Student Membership: 2023 Mobility Special Ed Percent","position":242,"publisher_description":"District 2024 Student Membership 2023 Mobility Special Ed Percent","publisher_type":"Number"}],"input_sha256":"f595728ad54e4e49986fc060ee8f492964127ebb8f6b262b725e1daf30c96984","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":1209},"metric_period":{"kind":"unknown"},"source_schema_sha256":"16baac7347a7458a1421cb7e927eabb409ef0e7e2091338ef78725b6ea5eeae4","table":"student_profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/scripts/build_tapr_profiles.py b/teadata/scripts/build_tapr_profiles.py index 9dc8700..c294909 100644 --- a/teadata/scripts/build_tapr_profiles.py +++ b/teadata/scripts/build_tapr_profiles.py @@ -72,14 +72,22 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | inputs = [contract_observation] selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, edition) if selected.get("source_only"): - if reference_store is None or not source.metadata.provenance_ids: + # Original HTTP observations may predate a source-family split. + # An explicit reviewed source-notes reference binds those exact + # bytes without relabeling the immutable acquisition's dataset. + raw_references = {identifier for ref in source.metadata.references + if ref.reference_id == "csv_headers" and ref.role == "source_notes" and ref.reviewed_sha256 in + {item.input_sha256 for item in sources} + for identifier in ref.provenance_ids} + if reference_store is None or not (source.metadata.provenance_ids or raw_references): raise ValueError("Source-only preparation requires original acquisition receipts in an explicit reference_store") acquired = set() expected = {item.input_sha256 for item in sources} - for identifier in source.metadata.provenance_ids: + for identifier in dict.fromkeys([*source.metadata.provenance_ids, *sorted(raw_references)]): store.copy_record_from(reference_store, identifier) record = store.read_record(identifier) - if (record["kind"] != "acquisition" or record["dataset"] != dataset + if (record["kind"] != "acquisition" + or (identifier in source.metadata.provenance_ids and record["dataset"] != dataset) or record["artifact"]["sha256"] not in expected): raise ValueError("Source acquisition receipt does not identify the selected raw input") acquired.add(record["artifact"]["sha256"]) diff --git a/teadata/tapr.py b/teadata/tapr.py index da18950..8b34c15 100644 --- a/teadata/tapr.py +++ b/teadata/tapr.py @@ -18,7 +18,7 @@ from .identifiers import canonical_source_identifiers -TAPR_PROFILE_FAMILIES = ("student_staff_profile", "graduation_profile") +TAPR_PROFILE_FAMILIES = ("student_staff_profile", "graduation_profile", "student_profile", "staff_profile") @dataclass(frozen=True) diff --git a/teadata/teadata_config.py b/teadata/teadata_config.py index 4f16ea7..5fea842 100644 --- a/teadata/teadata_config.py +++ b/teadata/teadata_config.py @@ -740,7 +740,7 @@ def column_schema( reader_profile: str | None = None, ) -> list[str] | None: """Derive ordered reader columns from the same reviewed resource.""" - from .column_schema import parse_column_schema, schema_columns + from .column_schema import header_records, parse_column_schema, schema_columns from .manifest import ContractError contract = self.column_contract(dataset, year, section=section, reader_profile=reader_profile) @@ -748,7 +748,13 @@ def column_schema( return None source = self.resolve_dataset(dataset, year, section=section) try: - return schema_columns(parse_column_schema(contract["text"].encode()), + document = parse_column_schema(contract["text"].encode()) + if document["schema_version"] == 2: + if source.metadata.version is None: + raise ValueError("Header crosswalk requires an explicit source edition") + header_records(document, dataset=source.dataset, edition=source.metadata.version, + metadata=source.metadata) + return schema_columns(document, dataset=source.dataset, edition=source.metadata.version) except ValueError as error: raise ContractError(f"Invalid column schema for {dataset}: {error}") from error @@ -770,12 +776,13 @@ def header_records(self, dataset: str, *, edition: str, if len(choices) != 1: raise ContractError(f"Source-contract header crosswalk edition unavailable or ambiguous: {dataset!r}, {edition!r}") section, year = choices[0] + source = self.resolve_dataset(dataset, year, section=section) contract = self.column_contract(dataset, year, section=section, reader_profile=reader_profile) if contract is None: raise ContractError(f"Source-contract header crosswalk unavailable: {dataset!r}") try: return header_records(parse_column_schema(contract["text"].encode()), - dataset=dataset, edition=edition, table=table) + dataset=dataset, edition=edition, table=table, metadata=source.metadata) except ValueError as error: raise ContractError(str(error)) from error @@ -843,6 +850,9 @@ def read_tapr_sources(self, dataset: str, year: int, *, input_dir: str | Path | if contract is None: raise ContractError("Full TAPR source preparation requires a reviewed crosswalk") selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, source.metadata.version) + # The same metadata-only projection used by discovery rejects field + # conflicts before opening any source table. + self.header_records(dataset, edition=source.metadata.version, reader_profile="source") if selected.get("source_only") and any(table["metric_period"] != source.metadata.period.to_dict() for table in selected["tables"]): raise ContractError("Source-only metric period differs from its declared source metadata") diff --git a/teadata/teadata_sources.yaml b/teadata/teadata_sources.yaml index 78bf7dc..0ae23ab 100644 --- a/teadata/teadata_sources.yaml +++ b/teadata/teadata_sources.yaml @@ -521,6 +521,354 @@ data_sources: link status: unreviewed provenance_ids: [] + campus_tapr_student_profile: + 2024: + path: data/tapr/raw/2024 Campus Student Information.csv + metadata: + title: 2023-2024 TAPR Campus Student Information + publisher: Texas Education Agency + version: '2024' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: 'Source-only independent STUD observation within publisher edition 2024. Mixed measurement periods: table period and undeclared field periods are explicitly unknown; edition and code suffixes do not establish a reference period. For STUD only, reviewed dictionary descriptions identify 2022-23 attrition and 2023 mobility; annual 2023-24 TAPR Glossary page 32 defines mobility in 2022-23 and attrition from fall 2022 to fall 2023, supporting the two qualified 2022-23 percent bindings. No other field period/unit is assigned except the bounded basic-total review below. CSV labels/code/order and complete original dictionary occurrences are retained, including identical duplicate rows. Dictionary-only codes are not fabricated CSV fields; conflicting definitions fail. Campus STAF CPSCTOFC has no dictionary definition; dictionary-only CPSCTOST/DPSCTOST are not aliases. Raw dots, blanks, zeros and positive numeric observations remain distinct; causes and status are not guessed. Original + HTTP receipts retain their original composite dataset names and are linked through csv_headers as source derivation history, not relabeled. Do not coalesce with retained PROF, other families or revisions, and do not fill absent fields from PROF. Historical keys/names/parents are source attributes independent of current GIS. No default released reader, semantic binding or entity hydration is activated.Bounded current-source review: annual glossary page 28 labels Student Information (2023-24), defines enrollment as the last-Friday-in-October snapshot and defines Total Students. The exact current CPNTALLC/DPNTALLC dictionary descriptions identify total enrollment count. Its 2023-24 school-year binding records that source context, not an annual cumulative measurement; exact as_of date is unrecorded and not invented. Annual glossary page 34 labels Staff Information (2023-24); exact current CPSATOFC/DPSATOFC descriptions identify All Staff Total Full Time Equiv Count. Only those staff + fields receive 2023-24; FTE is not headcount, the precise observation date is unspecified and unit stays unknown under the existing unit vocabulary. No blanket period assignment is made to other fields. ' + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Original 2024 Campus STUD CSV; exact POST controls and original acquisition dataset retained in receipt + status: available + provenance_ids: + - 9b115abb5b7c0f5ce4ebdd82f36fc14e06ab55658b496f31064776277b16658c + reviewed_sha256: 8dc181ee75c5da8451a45c8f405f8cbc8fe9987efb198d9ded90d7d512f161a0 + - reference_id: selection + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STUD + title: 2023-24 TAPR Campus STUD original selection controls + status: available + provenance_ids: + - 873673ddd77f0272a9b27d6b35f105b3841b517dc70cf01441f8644d231baa3c + reviewed_sha256: 1b97e003c153c6102b740180959050d162afbf52e85d28170a3879376248352b + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + title: 2023-24 TAPR Campus STUD publisher code/type/description dictionary; ordered duplicate occurrences retained + status: available + provenance_ids: + - af099020dae0691ae9cb783daaf00ec3610d3a14935ad794ae58f5e6e1434a1e + reviewed_sha256: 71b163012db6b6b8c59e247be815428627dec22e7d0c6c7ca8d48cad02145ad7 + - reference_id: glossary + role: glossary + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf + title: 2023-24 TAPR Glossary; Student Information p28, lagged mobility/attrition p32, Staff Information p34 + status: available + provenance_ids: + - 0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb + reviewed_sha256: e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html + title: Explanation of 2023-24 TAPR Masking Rules; reference only, no new token rule inferred + status: available + provenance_ids: + - 27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595 + reviewed_sha256: f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a + metrics: + student_membership_attrition_all_students_percent: + field: campus_2024_student_membership_2022_23_attrition_all_students_percent + period: + kind: school_year + start_year: 2022 + end_year: 2023 + unit: percent + student_membership_mobility_all_students_percent: + field: campus_2024_student_membership_2023_mobility_all_students_percent + period: + kind: school_year + start_year: 2022 + end_year: 2023 + unit: percent + student_enrollment_all_students_count: + field: campus_2024_student_enrollment_all_students_count + period: + kind: school_year + start_year: 2023 + end_year: 2024 + unit: count + reader: + profiles: + source: + column_schema: schemas/tapr--2024--student-profile-crosswalk.json + tapr_source: + scope: campus + tables: + student_profile: data/tapr/raw/2024 Campus Student Information.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--student-profile-crosswalk.json + title: Reviewed complete 2024 student_profile source-only header/layout and ordered dictionary-occurrence contract + status: available + provenance_ids: [] + reviewed_sha256: abb6196de760d6156af23d31f32b91ce3599350d8b53259feb60cb96b37792cd + campus_tapr_staff_profile: + 2024: + path: data/tapr/raw/2024 Campus Staff Information.csv + metadata: + title: 2023-2024 TAPR Campus Staff Information + publisher: Texas Education Agency + version: '2024' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: 'Source-only independent STAF observation within publisher edition 2024. Mixed measurement periods: table period and undeclared field periods are explicitly unknown; edition and code suffixes do not establish a reference period. For STUD only, reviewed dictionary descriptions identify 2022-23 attrition and 2023 mobility; annual 2023-24 TAPR Glossary page 32 defines mobility in 2022-23 and attrition from fall 2022 to fall 2023, supporting the two qualified 2022-23 percent bindings. No other field period/unit is assigned except the bounded basic-total review below. CSV labels/code/order and complete original dictionary occurrences are retained, including identical duplicate rows. Dictionary-only codes are not fabricated CSV fields; conflicting definitions fail. Campus STAF CPSCTOFC has no dictionary definition; dictionary-only CPSCTOST/DPSCTOST are not aliases. Raw dots, blanks, zeros and positive numeric observations remain distinct; causes and status are not guessed. Original + HTTP receipts retain their original composite dataset names and are linked through csv_headers as source derivation history, not relabeled. Do not coalesce with retained PROF, other families or revisions, and do not fill absent fields from PROF. Historical keys/names/parents are source attributes independent of current GIS. No default released reader, semantic binding or entity hydration is activated.Bounded current-source review: annual glossary page 28 labels Student Information (2023-24), defines enrollment as the last-Friday-in-October snapshot and defines Total Students. The exact current CPNTALLC/DPNTALLC dictionary descriptions identify total enrollment count. Its 2023-24 school-year binding records that source context, not an annual cumulative measurement; exact as_of date is unrecorded and not invented. Annual glossary page 34 labels Staff Information (2023-24); exact current CPSATOFC/DPSATOFC descriptions identify All Staff Total Full Time Equiv Count. Only those staff + fields receive 2023-24; FTE is not headcount, the precise observation date is unspecified and unit stays unknown under the existing unit vocabulary. No blanket period assignment is made to other fields. ' + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Original 2024 Campus STAF CSV; exact POST controls and original acquisition dataset retained in receipt + status: available + provenance_ids: + - 02df3081b6b7178e8d536ee5ceb8313cc68af7ef8e8204a246bc2a2fd8de0509 + reviewed_sha256: bead14bbdc54396c8e41e5b744c2aeccf8728df3b819981a9f4270b225c2ea16 + - reference_id: selection + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_c&ccyy=2024&step=3&bylev=All+Campuses&level=Campus&sumlev=C&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STAF + title: 2023-24 TAPR Campus STAF original selection controls + status: available + provenance_ids: + - 3bb286b5cd21ee5776ca8269c47c06e91b2c6c63f18245519677f8b7164684ab + reviewed_sha256: 5026de1af092315800f80e81fb05ee1dba82bca6a15490d35f5150c20d5f73c8 + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=C&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + title: 2023-24 TAPR Campus STAF publisher code/type/description dictionary; ordered duplicate occurrences retained + status: available + provenance_ids: + - 747c65c197c2f8a298d2c0d13c2c7e5abad777c87cdca80e5d1a39a2d7150d1e + reviewed_sha256: e25bc3ae475bbd756b324ccefa839ded1f7e7106aee9e5bbf2990193fea4a4be + - reference_id: glossary + role: glossary + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf + title: 2023-24 TAPR Glossary; Student Information p28, lagged mobility/attrition p32, Staff Information p34 + status: available + provenance_ids: + - 0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb + reviewed_sha256: e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html + title: Explanation of 2023-24 TAPR Masking Rules; reference only, no new token rule inferred + status: available + provenance_ids: + - 27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595 + reviewed_sha256: f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a + metrics: + staff_all_staff_total_full_time_equiv_count: + field: campus_2024_staff_all_staff_total_full_time_equiv_count + period: + kind: school_year + start_year: 2023 + end_year: 2024 + unit: null + reader: + profiles: + source: + column_schema: schemas/tapr--2024--staff-profile-crosswalk.json + tapr_source: + scope: campus + tables: + staff_profile: data/tapr/raw/2024 Campus Staff Information.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--staff-profile-crosswalk.json + title: Reviewed complete 2024 staff_profile source-only header/layout and ordered dictionary-occurrence contract + status: available + provenance_ids: [] + reviewed_sha256: 73b50ad614f998f5f19b725143f80f2b1faf045b2836a3f1bf9e8d261a8fd928 + district_tapr_student_profile: + 2024: + path: data/tapr/raw/2024 District Student Information.csv + metadata: + title: 2023-2024 TAPR District Student Information + publisher: Texas Education Agency + version: '2024' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: 'Source-only independent STUD observation within publisher edition 2024. Mixed measurement periods: table period and undeclared field periods are explicitly unknown; edition and code suffixes do not establish a reference period. For STUD only, reviewed dictionary descriptions identify 2022-23 attrition and 2023 mobility; annual 2023-24 TAPR Glossary page 32 defines mobility in 2022-23 and attrition from fall 2022 to fall 2023, supporting the two qualified 2022-23 percent bindings. No other field period/unit is assigned except the bounded basic-total review below. CSV labels/code/order and complete original dictionary occurrences are retained, including identical duplicate rows. Dictionary-only codes are not fabricated CSV fields; conflicting definitions fail. Campus STAF CPSCTOFC has no dictionary definition; dictionary-only CPSCTOST/DPSCTOST are not aliases. Raw dots, blanks, zeros and positive numeric observations remain distinct; causes and status are not guessed. Original + HTTP receipts retain their original composite dataset names and are linked through csv_headers as source derivation history, not relabeled. Do not coalesce with retained PROF, other families or revisions, and do not fill absent fields from PROF. Historical keys/names/parents are source attributes independent of current GIS. No default released reader, semantic binding or entity hydration is activated.Bounded current-source review: annual glossary page 28 labels Student Information (2023-24), defines enrollment as the last-Friday-in-October snapshot and defines Total Students. The exact current CPNTALLC/DPNTALLC dictionary descriptions identify total enrollment count. Its 2023-24 school-year binding records that source context, not an annual cumulative measurement; exact as_of date is unrecorded and not invented. Annual glossary page 34 labels Staff Information (2023-24); exact current CPSATOFC/DPSATOFC descriptions identify All Staff Total Full Time Equiv Count. Only those staff + fields receive 2023-24; FTE is not headcount, the precise observation date is unspecified and unit stays unknown under the existing unit vocabulary. No blanket period assignment is made to other fields. ' + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Original 2024 District STUD CSV; exact POST controls and original acquisition dataset retained in receipt + status: available + provenance_ids: + - 7751ad5be1a4b99a80902d2d8370dbbfc4c4d7c620a1498b1ed965c0bf66aaa7 + reviewed_sha256: f595728ad54e4e49986fc060ee8f492964127ebb8f6b262b725e1daf30c96984 + - reference_id: selection + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STUD + title: 2023-24 TAPR District STUD original selection controls + status: available + provenance_ids: + - bbcdf5e655c1a2a1e37534a3d42eac233940c006607dc3192dd7e58503029864 + reviewed_sha256: df9388b25d3fa9db851028a12284b7b83179248b1bd79da9fa39df91d6680b82 + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + title: 2023-24 TAPR District STUD publisher code/type/description dictionary; ordered duplicate occurrences retained + status: available + provenance_ids: + - 457b51f5da28051f04166675ffca42fedfd480044110da323f310bd20bcd45b7 + reviewed_sha256: b38d8255e5717bc82a8b7083d2fbc34cd8be9f19c88fc2d65807552ecf97934b + - reference_id: glossary + role: glossary + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf + title: 2023-24 TAPR Glossary; Student Information p28, lagged mobility/attrition p32, Staff Information p34 + status: available + provenance_ids: + - 0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb + reviewed_sha256: e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html + title: Explanation of 2023-24 TAPR Masking Rules; reference only, no new token rule inferred + status: available + provenance_ids: + - 27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595 + reviewed_sha256: f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a + metrics: + student_membership_attrition_all_students_percent: + field: district_2024_student_membership_2022_23_attrition_all_students_percent + period: + kind: school_year + start_year: 2022 + end_year: 2023 + unit: percent + student_membership_mobility_all_students_percent: + field: district_2024_student_membership_2023_mobility_all_students_percent + period: + kind: school_year + start_year: 2022 + end_year: 2023 + unit: percent + student_enrollment_all_students_count: + field: district_2024_student_enrollment_all_students_count + period: + kind: school_year + start_year: 2023 + end_year: 2024 + unit: count + reader: + profiles: + source: + column_schema: schemas/tapr--2024--student-profile-crosswalk.json + tapr_source: + scope: district + tables: + student_profile: data/tapr/raw/2024 District Student Information.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--student-profile-crosswalk.json + title: Reviewed complete 2024 student_profile source-only header/layout and ordered dictionary-occurrence contract + status: available + provenance_ids: [] + reviewed_sha256: abb6196de760d6156af23d31f32b91ce3599350d8b53259feb60cb96b37792cd + district_tapr_staff_profile: + 2024: + path: data/tapr/raw/2024 District Staff Information.csv + metadata: + title: 2023-2024 TAPR District Staff Information + publisher: Texas Education Agency + version: '2024' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: 'Source-only independent STAF observation within publisher edition 2024. Mixed measurement periods: table period and undeclared field periods are explicitly unknown; edition and code suffixes do not establish a reference period. For STUD only, reviewed dictionary descriptions identify 2022-23 attrition and 2023 mobility; annual 2023-24 TAPR Glossary page 32 defines mobility in 2022-23 and attrition from fall 2022 to fall 2023, supporting the two qualified 2022-23 percent bindings. No other field period/unit is assigned except the bounded basic-total review below. CSV labels/code/order and complete original dictionary occurrences are retained, including identical duplicate rows. Dictionary-only codes are not fabricated CSV fields; conflicting definitions fail. Campus STAF CPSCTOFC has no dictionary definition; dictionary-only CPSCTOST/DPSCTOST are not aliases. Raw dots, blanks, zeros and positive numeric observations remain distinct; causes and status are not guessed. Original + HTTP receipts retain their original composite dataset names and are linked through csv_headers as source derivation history, not relabeled. Do not coalesce with retained PROF, other families or revisions, and do not fill absent fields from PROF. Historical keys/names/parents are source attributes independent of current GIS. No default released reader, semantic binding or entity hydration is activated.Bounded current-source review: annual glossary page 28 labels Student Information (2023-24), defines enrollment as the last-Friday-in-October snapshot and defines Total Students. The exact current CPNTALLC/DPNTALLC dictionary descriptions identify total enrollment count. Its 2023-24 school-year binding records that source context, not an annual cumulative measurement; exact as_of date is unrecorded and not invented. Annual glossary page 34 labels Staff Information (2023-24); exact current CPSATOFC/DPSATOFC descriptions identify All Staff Total Full Time Equiv Count. Only those staff + fields receive 2023-24; FTE is not headcount, the precise observation date is unspecified and unit stays unknown under the existing unit vocabulary. No blanket period assignment is made to other fields. ' + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Original 2024 District STAF CSV; exact POST controls and original acquisition dataset retained in receipt + status: available + provenance_ids: + - b79b0b56bab1386c7e12c64e6373303efacd4b5322b431243db42f50b26f07a5 + reviewed_sha256: f1107353cdaacc78085fbc0621f1696cd14faf276052d8c9d879f29e53f281c3 + - reference_id: selection + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&tapr=all_d&ccyy=2024&step=3&bylev=All+Districts&level=District&sumlev=D&id=&prgopt=reports%2Ftapr%2Fdd%2Fdd_tapr_step_6.sas&dsname=STAF + title: 2023-24 TAPR District STAF original selection controls + status: available + provenance_ids: + - 15de5c0052e59b903fa812bd5c62849dec2b5a0d969dacde56f7e5e383aba18c + reviewed_sha256: a5d682dde8c30afc955f3693e6a7911fa165b3acd8055a0cfb640a017932c840 + - reference_id: dictionary + role: data_dictionary + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2024&sumlev=D&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + title: 2023-24 TAPR District STAF publisher code/type/description dictionary; ordered duplicate occurrences retained + status: available + provenance_ids: + - fdaea8543aff26c718af0d4f7ced6d77e1ed9656b29d83644ac4d021a51074b6 + reviewed_sha256: 64c41ab6871956220100fbe6006b569a1187965420429d1144d9d31756a1dc6a + - reference_id: glossary + role: glossary + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/glossary.pdf + title: 2023-24 TAPR Glossary; Student Information p28, lagged mobility/attrition p32, Staff Information p34 + status: available + provenance_ids: + - 0c7bf8fcad671a0fe5181bfe59a6c63d6a7682d167a3e87e9361f14f8912fabb + reviewed_sha256: e92631bfd01e9e2e5f4197bfe996069822c852dd5db423fe3faeea5ab7aa62e8 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html + title: Explanation of 2023-24 TAPR Masking Rules; reference only, no new token rule inferred + status: available + provenance_ids: + - 27c1d3cebf8added00184ca8a86910dbfc47a1264d7fd216adb25499d1906595 + reviewed_sha256: f85b2ef340b07b721e12717fc0dc0f7f5e8290a022391e89de8b65664bdb860a + metrics: + staff_all_staff_total_full_time_equiv_count: + field: district_2024_staff_all_staff_total_full_time_equiv_count + period: + kind: school_year + start_year: 2023 + end_year: 2024 + unit: null + reader: + profiles: + source: + column_schema: schemas/tapr--2024--staff-profile-crosswalk.json + tapr_source: + scope: district + tables: + staff_profile: data/tapr/raw/2024 District Staff Information.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2024--staff-profile-crosswalk.json + title: Reviewed complete 2024 staff_profile source-only header/layout and ordered dictionary-occurrence contract + status: available + provenance_ids: [] + reviewed_sha256: 73b50ad614f998f5f19b725143f80f2b1faf045b2836a3f1bf9e8d261a8fd928 campus_tapr_graduation_profile: 2024: path: data/tapr/raw/2024 Campus Graduation Profile.csv @@ -2041,6 +2389,14 @@ schema: - csv campus_tapr_student_staff_profile: - xlsx + campus_tapr_student_profile: + - csv + campus_tapr_staff_profile: + - csv + district_tapr_student_profile: + - csv + district_tapr_staff_profile: + - csv campus_tapr_graduation_profile: - csv district_tapr_graduation_profile: diff --git a/tests/test_tapr_student_staff_sources.py b/tests/test_tapr_student_staff_sources.py new file mode 100644 index 0000000..055dff4 --- /dev/null +++ b/tests/test_tapr_student_staff_sources.py @@ -0,0 +1,424 @@ +"""Independent publisher families preserve revisions, periods and raw tokens.""" + +from copy import deepcopy +from dataclasses import replace +from datetime import datetime, timezone +from hashlib import sha256 +import csv +from pathlib import Path +import subprocess +import sys + +import pytest +import yaml + +from teadata.column_schema import header_records, parse_column_schema, source_schema_fingerprint +from teadata.dataset_metadata import DataPeriod, DatasetMetadata, MetricDefinition, ResolvedDataset +from teadata.manifest import BuildRecorder, ContractError, DatasetCatalog, canonical_json +from teadata.provenance import ProvenanceStore +from teadata.scripts.build_tapr_profiles import prepare_profiles +from teadata.tapr import merge_tapr_tables +from teadata.teadata_config import Config, load_config + + +ROOT = Path(__file__).resolve().parents[1] +UNKNOWN = {'kind': 'unknown'} +LAGGED = {'kind': 'school_year', 'start_year': 2022, 'end_year': 2023} +REPORT = {'kind': 'school_year', 'start_year': 2023, 'end_year': 2024} +NUMERIC_GOLDEN_ORIGIN = { + 'raw_sha256': '8dc181ee75c5da8451a45c8f405f8cbc8fe9987efb198d9ded90d7d512f161a0', + 'acquisition_id': '9b115abb5b7c0f5ce4ebdd82f36fc14e06ab55658b496f31064776277b16658c', + 'six_change_audit_sha256': '451de1dd1119eed1066e51ea157c06b123da505d65ad19fd9155877ec696929f', +} + + +@pytest.mark.parametrize('scope,widths', [('campus', [243, 106]), ('district', [242, 118])]) +def test_four_natural_source_leaves_are_complete_independent_and_have_no_default(scope, widths): + cfg = load_config() + for family, width in zip(['student_profile', 'staff_profile'], widths, strict=True): + dataset = scope + '_tapr_' + family + source = cfg.resolve_dataset(dataset, 2024) + records = cfg.header_records(dataset, edition='2024', reader_profile='source') + assert len(records) == width and cfg.column_schema(dataset, 2024) is None + assert cfg.availability_report()['data_sources'][dataset]['years'] == [2024] + assert cfg.is_source_only(dataset, 2024) + assert source.metadata.version == '2024' and source.metadata.period.to_dict() == UNKNOWN + assert source.metadata.value_policy is None and not source.metadata.provenance_ids + assert len({r['code'] for r in records}) == width == len({r['field'] for r in records}) + expected = {scope[0].upper() + suffix for suffix in ['PETATTP', 'PEMALLP', 'PNTALLC']} if family == 'student_profile' else {scope[0].upper() + 'PSATOFC'} + assert {r['code'] for r in records if r['period'] != UNKNOWN} == expected + for record in records: + if record['code'] in expected: + assert record['period'] == (LAGGED if record['code'].endswith(('PETATTP', 'PEMALLP')) else REPORT) + units = {name: metric.unit for name, metric in source.metadata.metrics.items()} + assert units == ({'student_membership_attrition_all_students_percent': 'percent', + 'student_membership_mobility_all_students_percent': 'percent', + 'student_enrollment_all_students_count': 'count'} if family == 'student_profile' + else {'staff_all_staff_total_full_time_equiv_count': None}) + assert source.metadata.notes and 'snapshot' in source.metadata.notes and 'FTE is not headcount' in source.metadata.notes + assert all(r['period'] == UNKNOWN for r in records if r['disposition'] == 'identity') + assert all(r['table'] == family for r in records) + with pytest.raises(ContractError, match='Reader profile is required'): + cfg.load_df(dataset, 2024) + with pytest.raises(ContractError, match='edition unavailable'): + cfg.header_records(dataset, edition='2025', reader_profile='source') + with pytest.raises(ContractError, match='exact declared edition'): + cfg.read_tapr_sources(dataset, 2025) + + +def test_dictionary_gaps_unused_codes_and_identical_occurrences_are_preserved(): + cfg = load_config() + campus = cfg.header_records('campus_tapr_staff_profile', edition='2024', reader_profile='source') + field = next(r for r in campus if r['code'] == 'CPSCTOFC') + assert field['dictionary_status'] == 'not_documented' + assert field['publisher_type'] is None and field['publisher_description'] is None + assert field['dictionary_occurrences'] == [] and field['period'] == UNKNOWN + assert 'CPSCTOST' not in {r['code'] for r in campus} + for family, codes in [('student_profile', ['DAUND23C']), ('staff_profile', ['DPSETOFC', 'DPSXTOFC'])]: + records = cfg.header_records('district_tapr_' + family, edition='2024', reader_profile='source') + for code in codes: + records = cfg.header_records('district_tapr_' + family, edition='2024', reader_profile='source') + record = next(r for r in records if r['code'] == code) + occurrences = record['dictionary_occurrences'] + original = deepcopy(records) + assert len(occurrences) == 2 and occurrences[0]['ordinal'] != occurrences[1]['ordinal'] + assert {r['publisher_description'] for r in occurrences} == {record['publisher_description']} + occurrences[0]['publisher_description'] = 'Caller mutation' + assert cfg.header_records('district_tapr_' + family, edition='2024', reader_profile='source') == original + document = parse_column_schema((ROOT / 'teadata/schemas/tapr--2024--staff-profile-crosswalk.json').read_bytes()) + for dataset in document['datasets']: + table = dataset['tables'][0] + assert dataset['dataset'][0].upper() + 'PSCTOST' in {r['code'] for r in table['dictionary_records']} + assert dataset['dataset'][0].upper() + 'PSCTOST' not in {r['code'] for r in table['fields']} + + +def test_real_dictionary_projection_uses_linear_work_and_detaches_ordered_duplicates(): + class CountingRows(list): + visits = 0 + + def __iter__(self): + for row in super().__iter__(): + self.visits += 1 + yield row + + cfg = load_config() + resource = ROOT / 'teadata/schemas/tapr--2024--staff-profile-crosswalk.json' + for scope in ['campus', 'district']: + dataset = scope + '_tapr_staff_profile' + document = parse_column_schema(resource.read_bytes()) + table = next(d['tables'][0] for d in document['datasets'] if d['dataset'] == dataset) + original_rows = deepcopy(table['dictionary_records']) + counted = CountingRows(original_rows) + table['dictionary_records'] = counted + metadata = cfg.resolve_dataset(dataset, 2024).metadata + expected = cfg.header_records(dataset, edition='2024', reader_profile='source') + records = header_records(document, dataset=dataset, edition='2024', metadata=metadata) + # Count actual dictionary-row visits rather than timing small fixtures. + # The bound allows linear passes over rows/fields and rejects C*D work. + assert counted.visits <= 2 * (len(original_rows) + len(table['fields'])) + assert records == expected + assert scope[0].upper() + 'PSCTOST' not in {r['code'] for r in records} + assert any(r['code'] == scope[0].upper() + 'PSCTOST' for r in original_rows) + if scope == 'district': + occurrences = next(r['dictionary_occurrences'] for r in records if r['code'] == 'DPSETOFC') + assert [r['ordinal'] for r in occurrences] == [r['ordinal'] for r in original_rows if r['code'] == 'DPSETOFC'] + assert len(occurrences) == 2 and occurrences[0] is not occurrences[1] + occurrences[0]['publisher_description'] = 'Caller mutation' + assert occurrences[1]['publisher_description'] != 'Caller mutation' + assert list(counted) == original_rows + assert header_records(document, dataset=dataset, edition='2024', metadata=metadata) == expected + + +@pytest.mark.parametrize('problem', ['conflicting_duplicate', 'invented_code', 'false_documented']) +def test_dictionary_conflicts_and_silent_gap_aliases_fail(problem): + document = parse_column_schema((ROOT / 'teadata/schemas/tapr--2024--staff-profile-crosswalk.json').read_bytes()) + table = document['datasets'][0]['tables'][0] + if problem == 'conflicting_duplicate': + duplicate = {**table['dictionary_records'][0], 'ordinal': len(table['dictionary_records']) + 1, + 'publisher_description': 'Different definition'} + table['dictionary_records'].append(duplicate) + else: + field = next(f for f in table['fields'] if f['code'] == 'CPSCTOFC') + unused = next(r for r in table['dictionary_records'] if r['code'] == 'CPSCTOST') + field.update(dictionary_status='documented', publisher_type=unused['publisher_type'], + publisher_description=unused['publisher_description']) + if problem == 'invented_code': + field['code'] = 'CPSCTOST' + with pytest.raises(ValueError, match='dictionary|checksum'): + parse_column_schema(canonical_json(document).encode()) + + +def test_exact_registered_field_projection_refines_unknowns_and_preserves_explicit_unknowns(): + cfg = load_config() + dataset = 'campus_tapr_student_staff_profile' + records = cfg.header_records(dataset, edition='2024', reader_profile='source') + period_by_code = {r['code']: r['period'] for r in records} + assert period_by_code['CPETATTP'] == period_by_code['CPEMALLP'] == LAGGED + assert period_by_code['CPNTALLC'] == REPORT # registered enrollment inherits selected metadata + assert period_by_code['CPETBLAC'] == UNKNOWN # report/year prefix is insufficient + assert period_by_code['CAMPUS'] == UNKNOWN + contract = cfg.column_contract(dataset, 2024, reader_profile='source') + assert contract is not None + document = parse_column_schema(contract['text'].encode()) + name = next(r['field'] for r in records if r['code'] == 'CPNTALLC') + metadata = DatasetMetadata(period=DataPeriod.from_dict(REPORT), field_year=2024, metrics={ + 'unrelated_selector': MetricDefinition(name, DataPeriod()), + 'student_membership_attrition_all_students_percent': MetricDefinition('some_other_field', DataPeriod.from_dict(LAGGED)), + }) + projected = header_records(document, dataset=dataset, edition='2024', metadata=metadata) + assert all(r['period'] == UNKNOWN for r in projected) + + +def period_fixture(tmp_path): + """One prepared tiny input binds a source crosswalk into a real frozen catalog.""" + dataset = 'campus_tapr_student_profile' + names = ['campus_number', 'campus_2024_attrition', 'campus_2024_enrollment', 'campus_2024_undeclared'] + labels = ['ID', 'Attrition', 'Enrollment', 'Undeclared'] + codes = ['CAMPUS', 'ATTR', 'ENROLL', 'OPAQUE'] + prepared = tmp_path / 'prepared.csv' + with prepared.open('w', newline='') as stream: + csv.writer(stream).writerows([names, ['001902001', '1', '12', '0']]) + table = {'table': 'student_profile', 'metric_period': UNKNOWN, + 'input_sha256': 'a' * 64, 'source_schema_sha256': source_schema_fingerprint(labels, codes), + 'fields': [{'position': i, 'code': code, 'label': label, 'field': name, + 'disposition': 'identity' if i == 1 else 'fact'} + for i, (code, label, name) in enumerate(zip(codes, labels, names, strict=True), 1)]} + document = {'schema_version': 2, 'mapping_version': 1, 'datasets': [ + {'dataset': dataset, 'edition': '2024', 'prepared_input_sha256': sha256(prepared.read_bytes()).hexdigest(), + 'tables': [table]}]} + schema = tmp_path / 'schema.json' + schema.write_text(canonical_json(document) + '\n') + store = ProvenanceStore(tmp_path / 'provenance') + schema_id = store.record_acquisition(schema, ResolvedDataset('reference:schema', 'reference', None, None, + str(schema), DatasetMetadata(title='Tiny reviewed schema'))) + entry = {'path': str(prepared), 'metadata': {'version': '2024', 'period': REPORT, 'field_year': 2024, + 'metrics': {'attrition': {'field': names[1], 'period': LAGGED}, + 'enrollment': {'field': names[2]}}, + 'references': [{'reference_id': 'schema', 'role': 'schema', 'path': schema.name, + 'reviewed_sha256': sha256(schema.read_bytes()).hexdigest(), 'provenance_ids': [schema_id]}]}, + 'reader': {'dtype': 'str', 'column_schema': schema.name}} + cfg = Config.from_dict({'data_sources': {dataset: {2024: entry}}}) + cfg.base_dir = tmp_path + source = cfg.resolve_dataset(dataset, 2024) + raw_id = store.record_acquisition(prepared, source) + definition = cfg.data_sources[dataset].entries[2024] + cfg.data_sources[dataset].entries[2024] = replace(definition, + metadata=replace(definition.metadata, provenance_ids=(raw_id,))) + return cfg, store, dataset, schema, document + + +def test_config_and_frozen_catalog_share_period_projection_without_current_config_io(tmp_path, monkeypatch): + cfg, store, dataset, _, _ = period_fixture(tmp_path) + records = cfg.header_records(dataset, edition='2024') + with BuildRecorder(cfg, store) as recorder: + cfg.load_df(dataset, 2024) + catalog = recorder.catalog() + assert catalog.header_records(dataset) == records + definition = cfg.data_sources[dataset].entries[2024] + cfg.data_sources[dataset].entries[2024] = replace(definition, metadata=replace(definition.metadata, + metrics={'attrition': MetricDefinition('campus_2024_attrition', DataPeriod.from_dict(REPORT))})) + assert cfg.header_records(dataset, edition='2024') != records + monkeypatch.setattr(Path, 'open', lambda *a, **k: pytest.fail('Frozen catalog opened a file')) + monkeypatch.setattr(Config, 'resolve_dataset', lambda *a, **k: pytest.fail('Frozen catalog consulted current config')) + assert catalog.header_records(dataset) == records + records[1]['period']['start_year'] = 1900 + assert catalog.header_records(dataset)[1]['period'] == LAGGED + + +@pytest.mark.parametrize('problem', ['table_conflict', 'duplicate_field_conflict']) +def test_conflicting_reviewed_periods_fail_before_source_reads(tmp_path, monkeypatch, problem): + cfg = load_config() + dataset = 'campus_tapr_student_profile' + definition = cfg.data_sources[dataset].entries[2024] + if problem == 'table_conflict': + contract = cfg.column_contract(dataset, 2024, reader_profile='source') + assert contract is not None + document = parse_column_schema(contract['text'].encode()) + document['datasets'][0]['tables'][0]['metric_period'] = REPORT + schema = tmp_path / 'schema.json' + schema.write_text(canonical_json(document) + '\n') + reader = deepcopy(definition.reader) + reader['profiles']['source']['column_schema'] = schema.name + reference = reader['profiles']['source']['references'][0] + reference.update(path=schema.name, reviewed_sha256=sha256(schema.read_bytes()).hexdigest()) + cfg.base_dir = tmp_path + definition = replace(definition, reader=reader) + else: + metrics = dict(definition.metadata.metrics) + first = next(iter(metrics.values())) + metrics['contradictory'] = replace(first, period=DataPeriod.from_dict(REPORT)) + definition = replace(definition, metadata=replace(definition.metadata, metrics=metrics)) + cfg.data_sources[dataset].entries[2024] = definition + monkeypatch.setattr('teadata.tapr.read_tapr_table', lambda *a, **k: pytest.fail('Contradictory metadata read rows')) + for operation in [lambda: cfg.header_records(dataset, edition='2024', reader_profile='source'), + lambda: cfg.read_tapr_sources(dataset, 2024)]: + with pytest.raises(ContractError, match='Conflicting.*periods'): + operation() + + +def test_frozen_catalog_rejects_period_conflict_on_construction(tmp_path): + cfg, store, dataset, _, _ = period_fixture(tmp_path) + with BuildRecorder(cfg, store) as recorder: + cfg.load_df(dataset, 2024) + document = recorder.catalog().to_dict() + source = document['datasets'][dataset] + source['metadata']['metrics']['contradictory'] = {'field': 'campus_2024_attrition', 'period': REPORT} + identifier = source['metadata']['provenance_ids'][0] + record = document['provenance'].pop(identifier) + record['source_metadata']['metrics'] = deepcopy(source['metadata']['metrics']) + replacement = sha256((canonical_json(record) + '\n').encode()).hexdigest() + document['provenance'][replacement] = record + source['metadata']['provenance_ids'] = [replacement] + with pytest.raises(ContractError, match='Conflicting reviewed field periods'): + DatasetCatalog.create(datasets=document['datasets'], records=document['provenance'], + value_policies=document['value_policies'], metric_bindings=document['metric_bindings'], + column_schemas=document['column_schemas'], processor=document['processor_sha256']) + + +def source_fixture(tmp_path): + cfg = load_config() + dataset = 'campus_tapr_student_profile' + contract = cfg.column_contract(dataset, 2024, reader_profile='source') + assert contract is not None + document = parse_column_schema(contract['text'].encode()) + selected = document['datasets'][0] + document['datasets'] = [selected] + table = selected['tables'][0] + assert table['input_sha256'] == NUMERIC_GOLDEN_ORIGIN['raw_sha256'] + reference = next(r for r in cfg.resolve_dataset(dataset, 2024).metadata.references if r.reference_id == 'csv_headers') + assert reference.provenance_ids == (NUMERIC_GOLDEN_ORIGIN['acquisition_id'],) + path = tmp_path / 'source.csv' + fields = table['fields'] + # Six observed nonzero lexical goldens, plus dot, blank and zero. These are + # synthetic historical identities; the real acquisition retains exact IDs. + # Exact public-input custody is pinned in NUMERIC_GOLDEN_ORIGIN above. + examples = [('CPCTENGA', '7.5'), ('CPCTENGA', '2'), ('CPCTENGA', '1'), + ('CPCTFLAA', '1'), ('CPCTG01A', '7.5'), ('CPCTGKGA', '7')] + rows = [] + for index, (code, value) in enumerate(examples, 1): + row = [''] * len(fields) + for f in fields: + row[f['position'] - 1] = {'CAMPUS': f'001902{index:03d}', 'CAMPNAME': 'Historical campus', + 'DISTRICT': '001902', 'DISTNAME': 'Historical district'}.get(f['code'], '') + row[next(f['position'] - 1 for f in fields if f['code'] == code)] = value + row[4:7] = ['.', '', '0'] + rows.append(row) + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([[f['label'] for f in fields], [f['code'] for f in fields], *rows]) + table['input_sha256'] = sha256(path.read_bytes()).hexdigest() + table['layout']['last_data_record'] = len(rows) + 2 + schema = tmp_path / 'schema.json' + schema.write_text(canonical_json(document) + '\n') + original = ProvenanceStore(tmp_path / 'original') + raw_id = original.record_acquisition(path, ResolvedDataset('campus_tapr_student_staff_profile', + 'data_sources', 2024, 2024, str(path), DatasetMetadata(version='2024')), + downloaded_at=datetime(2026, 10, 30, tzinfo=timezone.utc), + requested_url='https://example.test/original.csv') + entry = {'path': str(path), 'metadata': {'version': '2024', 'period': UNKNOWN, 'references': [{ + 'reference_id': 'csv_headers', 'role': 'source_notes', 'url': 'https://example.test/original.csv', + 'reviewed_sha256': table['input_sha256'], 'provenance_ids': [raw_id]}]}, + 'reader': {'profiles': {'source': {'column_schema': schema.name, + 'references': [{'reference_id': 'schema', 'role': 'schema', 'path': schema.name, + 'reviewed_sha256': sha256(schema.read_bytes()).hexdigest()}], + 'tapr_source': {'scope': 'campus', 'tables': {'student_profile': str(path)}}}}}} + cfg = Config.from_dict({'data_sources': {dataset: {2024: entry}}}) + cfg.base_dir = tmp_path + return cfg, original, raw_id, path, table, examples + + +def test_raw_revision_goldens_preserve_dot_blank_zero_six_values_and_historical_keys(tmp_path): + cfg, _, _, _, _, examples = source_fixture(tmp_path) + source = cfg.read_tapr_sources('campus_tapr_student_profile', 2024)[0] + result = source.table + assert result.num_rows == 6 and result['campus_number'].to_pylist() == [f'001902{i:03d}' for i in range(1, 7)] + assert result.column(4).to_pylist() == ['.'] * 6 + assert result.column(5).to_pylist() == [''] * 6 + assert result.column(6).to_pylist() == ['0'] * 6 + by_code = {f['code']: f['field'] for f in source.mapping['fields']} + assert [result[by_code[code]][i].as_py() for i, (code, _) in enumerate(examples)] == [v for _, v in examples] + with pytest.raises(ValueError, match='different qualified datasets'): + merge_tapr_tables([source, replace(source, dataset='campus_tapr_staff_profile')], key_field='campus_number') + + +@pytest.mark.parametrize('problem', [None, 'missing_binding', 'wrong_sha', 'wrong_url', 'wrong_kind', + 'unrelated_reference', 'wrong_role', 'foreign_direct_observation']) +def test_explicit_raw_derivation_reference_preserves_original_receipt_and_rejects_unbound_events(tmp_path, problem): + cfg, original, raw_id, path, _, _ = source_fixture(tmp_path) + dataset = 'campus_tapr_student_profile' + definition = cfg.data_sources[dataset].entries[2024] + reference = definition.metadata.references[0] + if problem == 'missing_binding': + refs = () + else: + if problem == 'wrong_sha': + reference = replace(reference, reviewed_sha256='0' * 64) + elif problem == 'wrong_url': + reference = replace(reference, url='https://example.test/wrong.csv') + elif problem == 'unrelated_reference': + reference = replace(reference, reference_id='unrelated') + elif problem == 'wrong_role': + reference = replace(reference, role='data_dictionary') + elif problem == 'wrong_kind': + processing = original.record_processing(dataset='some_source', inputs=[raw_id], outputs={'raw': path}, + processor='tiny test', code_version='1', parameters={}) + reference = replace(reference, provenance_ids=(processing,)) + refs = (reference,) + cfg.data_sources[dataset].entries[2024] = replace(definition, metadata=replace(definition.metadata, + references=refs, provenance_ids=(raw_id,) if problem == 'foreign_direct_observation' else ())) + output = tmp_path / 'output' + before = original.read_record(raw_id) + if problem is not None: + with pytest.raises((ValueError, ContractError), match='acquisition|receipt|reference|different document'): + prepare_profiles(cfg, edition='2024', family='student_profile', scopes=['campus'], + input_dir=tmp_path, output_dir=output, reference_store=original) + assert not output.exists() and not list(tmp_path.glob('.tapr-preparation-*')) + return + receipt = prepare_profiles(cfg, edition='2024', family='student_profile', scopes=['campus'], + input_dir=tmp_path, output_dir=output, reference_store=original) + store = ProvenanceStore(output / 'provenance') + closure = store.verify_record_closure([receipt['scopes']['campus']['processing_record_id']]) + assert closure[raw_id] == before and closure[raw_id]['dataset'] == 'campus_tapr_student_staff_profile' + qualified = [r for r in closure.values() if r.get('dataset') == dataset and r.get('kind') == 'acquisition'] + assert len(qualified) == 1 and qualified[0]['downloaded_at'] is None + assert receipt['scopes']['campus']['rows'] == 6 + + +def test_all_prior_dataset_contracts_bindings_options_and_defaults_stay_pinned(): + after = yaml.safe_load((ROOT / 'teadata/teadata_sources.yaml').read_bytes()) + new = {scope + '_tapr_' + family for scope in ['campus', 'district'] + for family in ['student_profile', 'staff_profile']} + previous = {key: after[key] for key in ['spatial', 'metric_bindings', 'options']} + previous['data_sources'] = {key: value for key, value in after['data_sources'].items() if key not in new} + assert sha256(canonical_json(previous).encode()).hexdigest() == 'b81466d6c461979f483b406b3685d04d6e3146704e10896f0645c6ae12baff65' + + +def test_current_family_discovery_is_metadata_only_in_a_fresh_process(): + code = ''' +import importlib.abc,pathlib,socket,sys,urllib.request +heavy=('teadata.engine','teadata.entities','teadata.geometry','pyarrow','duckdb','pandas','numpy','sqlalchemy','geopandas','shapely') +class Trap(importlib.abc.MetaPathFinder): + def find_spec(self,fullname,path=None,target=None): + if any(fullname==n or fullname.startswith(n+'.') for n in heavy): raise AssertionError(fullname) +sys.meta_path.insert(0,Trap()) +from teadata.teadata_config import load_config +import teadata.teadata_config as module +root=pathlib.Path(module.__file__).parent +allowed={(root/'teadata_sources.yaml').resolve(),(root/'schemas/tapr--2024--student-profile-crosswalk.json').resolve(),(root/'schemas/tapr--2024--staff-profile-crosswalk.json').resolve()} +original=pathlib.Path.open +def guarded(self,*a,**k): + if self.resolve() not in allowed: raise AssertionError('Non-metadata open: '+str(self)) + return original(self,*a,**k) +pathlib.Path.open=guarded +def forbidden(*a,**k): raise AssertionError('Data/network I/O') +socket.create_connection=forbidden +urllib.request.urlopen=forbidden +cfg=load_config() +for scope in ['campus','district']: + for family in ['student_profile','staff_profile']: + dataset=scope+'_tapr_'+family + assert cfg.header_records(dataset,edition='2024',reader_profile='source') + assert cfg.is_source_only(dataset,2024) +assert not any(n==p or n.startswith(p+'.') for n in sys.modules for p in heavy) +''' + result = subprocess.run([sys.executable, '-B', '-c', code], cwd=ROOT, capture_output=True, text=True) + assert result.returncode == 0, result.stdout + result.stderr From c6c11829ea8ee86c52867ea51f073f7ca3014fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 13:51:32 -0500 Subject: [PATCH 07/11] Require explicit unknown periods in detached header metadata --- tests/test_header_crosswalk.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_header_crosswalk.py b/tests/test_header_crosswalk.py index 48bc741..d0d03eb 100644 --- a/tests/test_header_crosswalk.py +++ b/tests/test_header_crosswalk.py @@ -94,10 +94,14 @@ def test_catalog_persists_exact_resource_and_returns_detached_records(bound_cata records = catalog.header_records("sample", edition="2025", table="student") assert records[0] == {"dataset": "sample", "edition": "2025", "table": "student", "mapping_version": 1, "position": 1, "code": "CAMPUS", "label": "9 Digit Campus Number", "field": "campus_number", + "period": {"kind": "unknown"}, "input_sha256": "1" * 64, "source_schema_sha256": source_schema_fingerprint( ["9 Digit Campus Number", "Example Value"], ["CAMPUS", "VALUE"])} records[0]["field"] = "changed" + records[0]["period"]["kind"] = "changed" assert catalog.header_mapping("sample", table="student") == {"CAMPUS": "campus_number", "VALUE": "example_value"} + assert catalog.header_records("sample", table="student")[0]["period"] == {"kind": "unknown"} + assert cfg.header_records("sample", edition="2025", table="student")[0]["period"] == {"kind": "unknown"} def test_query_uses_only_catalog_bound_bytes_after_files_are_gone(bound_catalog, monkeypatch): From 10fd73d3553940f6f56bfccd73bdc5d254dc46c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 15:00:17 -0500 Subject: [PATCH 08/11] Add provenance-preserving TAPR refresh and comparison tools --- docs/config.md | 65 +++++ teadata/acquisition.py | 105 +++++++- teadata/scripts/refresh_tapr.py | 201 ++++++++++++++ teadata/tapr.py | 116 +++++++- teadata/values.py | 22 ++ tests/test_tapr_refresh.py | 451 ++++++++++++++++++++++++++++++++ 6 files changed, 958 insertions(+), 2 deletions(-) create mode 100644 teadata/scripts/refresh_tapr.py create mode 100644 tests/test_tapr_refresh.py diff --git a/docs/config.md b/docs/config.md index 1be4344..bcc9624 100644 --- a/docs/config.md +++ b/docs/config.md @@ -412,6 +412,71 @@ not start processing. Explicit relative paths are resolved from the invoking working directory. Download and geocoding commands make network requests when run normally. +Historical refresh uses one explicit CLI and the same acquisition/provenance +store. It never updates Config or replaces originals. A public GET, for example: + +```bash +uv run python -m teadata.scripts.refresh_tapr acquire \ + --url https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html \ + --method GET --dataset tapr_2024_masking_reference --edition 2024 \ + --filename masking.html --store provenance + +uv run python -m teadata.scripts.refresh_tapr replay \ + --record ORIGINAL_RECORD_ID --store provenance +``` + +`acquire` and `replay` are the only network commands. Defaults are one attempt, +20 seconds and 32 MiB per response. For POST, supply the observed content type +and repeat `--field NAME VALUE` in original source order, including repeated +names and empty values. The command records these controls and request limits. +POST controls use UTF-8; other charset declarations are rejected before HTTP. +It never invents form parameters, counts flags or private/authentication +headers. Legacy POST receipts missing request content type require an explicit +`--content-type application/x-www-form-urlencoded`. Replay retains predecessor +history through the same provenance reference graph, even when bytes change. +Reconstructed form URLs must exactly match the original requested URL. A legacy +GET without form metadata reuses its exact retained URL. + +Compare two retained originals offline using their exact acquisition IDs and +independently reviewed crosswalks. Substitute the actual IDs and reviewed SHAs: + +```bash +uv run python -m teadata.scripts.refresh_tapr compare \ + --scope district --store comparison-provenance --output comparison.json \ + --old-store original-provenance --old-record OLD_RECORD_ID \ + --old-schema contracts/old-student.json --old-schema-sha256 OLD_SCHEMA_SHA256 \ + --old-dataset district_tapr_student_profile --old-edition 2024 \ + --old-table student_profile \ + --new-store refreshed-provenance --new-record NEW_RECORD_ID \ + --new-schema contracts/new-student.json --new-schema-sha256 NEW_SCHEMA_SHA256 \ + --new-dataset district_tapr_student_profile --new-edition 2024 \ + --new-table student_profile +``` + +Original input drift against either reviewed contract blocks keyed comparison +and retains a diagnostic report and original bytes. Reviewed header/layout, +dictionary, period and historical-key changes are reported separately from +cell differences. Old-only/new-only fields are source-schema absence, distinct +from blank, masked, missing or not-applicable cells. A shared annual code or +similar name/value does not establish a rename or methodological equivalence. +Retained PROF and its unmatched 38/42 campus/district fields remain independent. + +Raw tokens are preserved, and scientific statuses default to unbound. Optional +`--old-policy CODE POLICY_ID` / `--new-policy CODE POLICY_ID` select individual +publisher fields from a SHA-pinned `--policy-config` and +`--policy-config-sha256`. A caller selection does not establish applicability; +the exact policy and its reference are recorded. Status projection uses the +existing scalar authority once per distinct token, capped at 4096 per field, +then native gathering. Decimal-spelling equality uses native exact decimals, +without floats or rounding, inside a 38-integer/38-fraction-digit envelope. +Other spellings remain unclassified. Selected non-observed statuses are never +used in numeric comparison; unbound spelling equality is not measured-value +equality or arithmetic. Reports publish atomically to new paths and retain +their processing/closure identity. Key/token examples are bounded and disclose +when the complete set is not emitted. Changed-observation examples include the +canonical entity key, old/new raw tokens and statuses, in key order within each +publisher code; exact totals and originals remain available. + Relative `data/...` paths in the source contract also honor `TEADATA_DATA_DIR`. Other relative paths remain relative to the configuration file. `uv run python -m teadata.load_data` reads the selected contracts, stages a complete release, and activates `teadata/.cache/release.json` after validation. There is no second cache mirror or developer-checkout copy. The Excel styling example takes a workbook path rather than referring to an diff --git a/teadata/acquisition.py b/teadata/acquisition.py index 756422f..13247da 100644 --- a/teadata/acquisition.py +++ b/teadata/acquisition.py @@ -9,9 +9,10 @@ from pathlib import Path import tempfile import time -from typing import Callable, Mapping +from typing import Callable, Mapping, Sequence from urllib.error import HTTPError, URLError from urllib.request import Request, build_opener +from urllib.parse import urlencode from .dataset_metadata import ResolvedDataset, validate_http_url from .provenance import ProvenanceStore @@ -153,3 +154,105 @@ def _retry_delay(self, retry_after: str | None, attempt: int) -> float: if delay > self.max_retry_wait: raise AcquisitionError("Retry-After exceeds the local wait limit; acquisition deferred") return delay + + +def _form_request(url: str, method: str, fields: Sequence[Sequence[str]], + content_type: str | None) -> tuple[str, bytes | None, list[tuple[str, str]]]: + """Validate and encode the one supported UTF-8 public form contract.""" + if method not in {"GET", "POST"}: + raise ValueError("Public form acquisition requires explicit GET or POST") + if (isinstance(fields, (str, bytes)) or any(isinstance(pair, (str, bytes)) + or len(pair) != 2 or any(not isinstance(v, str) for v in pair) or not pair[0] + for pair in fields)): + raise ValueError("Form controls must be ordered nonempty-name/string-value pairs") + if content_type is not None and (not isinstance(content_type, str) or not content_type + or '\r' in content_type or '\n' in content_type): + raise ValueError("Invalid public form content type") + if method == "POST" and (content_type is None or content_type.split(';', 1)[0].strip().lower() != "application/x-www-form-urlencoded"): + raise ValueError("POST form replay requires explicit application/x-www-form-urlencoded") + if method == "POST" and content_type is not None: + parameters = content_type.split(';')[1:] + if parameters: + name, separator, value = parameters[0].partition('=') + if (len(parameters) != 1 or not separator or name.strip().lower() != 'charset' + or value.strip().lower() not in {'utf-8', '"utf-8"'}): + raise ValueError("POST form controls support only UTF-8, with no other content-type parameters") + validate_http_url(url) + if '#' in url: + raise ValueError("Public acquisition URLs cannot contain a fragment") + controls = [(pair[0], pair[1]) for pair in fields] + encoded = urlencode(controls).encode("utf-8") + requested = url + if method == "GET" and controls: + requested += ('&' if '?' in url else '?') + encoded.decode("ascii") + return requested, encoded if method == "POST" else None, controls + + +def acquire_form(client: AcquisitionClient, url: str, dataset: ResolvedDataset, *, + filename: str, method: str, fields: Sequence[Sequence[str]] = (), + content_type: str | None = None, replayed_from: str | None = None) -> AcquiredSource: + """Acquire explicit public controls, preserving order and repeated names. + + POST controls use UTF-8; only an absent or explicit UTF-8 charset is supported. + Only a supplied content type becomes a request header. Authentication, + cookies, arbitrary headers and configuration activation are not replayed. + Transport bounds and immutable publication remain client/store concerns. + """ + requested, body, controls = _form_request(url, method, fields, content_type) + return client.fetch(requested, dataset, filename=filename, + body=body, + headers={"Content-Type": content_type} if content_type is not None else {}, + parameters={"form_url": url, "form_controls": controls, "form_content_type": content_type, + "transport_limits": {"timeout": client.timeout, "attempts": client.attempts, + "max_bytes": client.max_bytes, "max_retry_wait": client.max_retry_wait}, + **({"replayed_from": replayed_from} if replayed_from is not None else {})}) + + +def replay_acquisition(client: AcquisitionClient, record_id: str, *, content_type: str | None = None) -> AcquiredSource: + """Repeat one retained public request as a new immutable observation. + + Older GET receipts need no form reconstruction. Older POST receipts must + already retain explicit controls; labels never supply missing request data. + """ + record = client.store.read_record(record_id) + if record["kind"] != "acquisition" or record.get("method") != "download": + raise ValueError("Replay requires an original HTTP acquisition receipt") + parameters = record.get("parameters", {}) + method = parameters.get("http_method") + if method not in {"GET", "POST"} or not record.get("requested_url"): + raise ValueError("Original receipt lacks an explicit public request method/URL") + if method == "POST" and "form_controls" not in parameters: + raise ValueError("Original POST receipt lacks explicit public form controls") + retained_type = parameters.get("form_content_type") + if "form_content_type" in parameters and content_type is not None and retained_type != content_type: + raise ValueError("Replay cannot change the retained request content type") + content_type = retained_type if "form_content_type" in parameters else content_type + if method == "POST" and content_type is None: + raise ValueError("Legacy POST receipt needs an explicit request content type") + if method == "GET" and "form_controls" in parameters and "form_url" not in parameters: + raise ValueError("GET form controls need their original form URL for exact replay") + url = parameters.get("form_url", record["requested_url"]) + fields = parameters.get("form_controls", ()) + requested, _, _ = _form_request(url, method, fields, content_type) + if requested != record["requested_url"]: + raise ValueError("Reconstructed form request differs from the original observed request URL") + from .dataset_metadata import DatasetMetadata, ReferenceDocument + + client.store.verify_record_closure([record_id]) + metadata = DatasetMetadata.from_dict(record["source_metadata"]) + retained_previous = next((r for r in metadata.references if r.reference_id == "previous_acquisition"), None) + if retained_previous is not None and (retained_previous.role != "source_notes" + or retained_previous.provenance_ids != (parameters.get("replayed_from"),)): + raise ValueError("Existing previous_acquisition reference is not this request's replay history") + previous = ReferenceDocument(reference_id="previous_acquisition", role="source_notes", + url=record["requested_url"], title="Previous exact public acquisition; no revision equivalence asserted", + provenance_ids=(record_id,), reviewed_sha256=record["artifact"]["sha256"]) + metadata = replace(metadata, references=tuple(r for r in metadata.references + if r.reference_id != previous.reference_id) + (previous,)) + source = ResolvedDataset(record["dataset"], record["section"], record["requested_year"], + record["resolved_year"], "", metadata) + return acquire_form(client, url, source, + filename=record["artifact"]["filename"], method=method, + fields=fields, + content_type=content_type, + replayed_from=record_id) diff --git a/teadata/scripts/refresh_tapr.py b/teadata/scripts/refresh_tapr.py new file mode 100644 index 0000000..eec60ed --- /dev/null +++ b/teadata/scripts/refresh_tapr.py @@ -0,0 +1,201 @@ +"""Explicit append-only public acquisition/replay and pinned TAPR comparison. + +No command changes source configuration or activates acquired/prepared data. +""" + +from __future__ import annotations + +import argparse +from hashlib import sha256 +from importlib.metadata import version +import json +import os +from pathlib import Path +import sys +import tempfile + +from teadata.acquisition import AcquisitionClient, acquire_form, replay_acquisition +from teadata.column_schema import crosswalk_dataset, parse_column_schema +from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset +from teadata.provenance import ProvenanceStore +from teadata.tapr import compare_tapr_tables, read_tapr_table + + +def compare_inputs(args) -> dict: + """Retain selected history and a new report, including blocked drift reports.""" + output = args.output + if output.exists() or output.is_symlink(): + raise FileExistsError("Comparison output already exists; select a new observation path") + archive = ProvenanceStore(args.store) + inputs, selected, descriptions = [], [], {} + secrets = [str(getattr(args, side + '_' + name)) for side in ['old', 'new'] + for name in ['store', 'schema', 'dictionary'] if getattr(args, side + '_' + name) is not None] + if args.policy_config is not None: + secrets.append(str(args.policy_config)) + policies = {'old': {}, 'new': {}} + report = {'schema_version': 1, 'status': 'blocked_contract_drift', 'source_activation': False, + 'inputs': descriptions, 'toolchain': {'python': sys.version, 'pyarrow': version('pyarrow')}} + phase = 'input_contracts' + try: + if args.old_policy or args.new_policy: + if args.policy_config is None or args.policy_config_sha256 is None: + raise ValueError("Field policies require an explicit SHA-pinned existing policy configuration") + from teadata.teadata_config import load_config + + observation = archive.record_acquisition(args.policy_config, ResolvedDataset( + 'reference:caller_selected_field_policies', 'reference', None, None, '', + DatasetMetadata(title='Explicit caller-selected field policy configuration; applicability unassessed'))) + inputs.append(observation) + policy_artifact = archive.read_record(observation)['artifact'] + if policy_artifact['sha256'] != args.policy_config_sha256: + raise ValueError("Policy configuration differs from the pinned bytes") + cfg = load_config(archive.verify_artifact(policy_artifact['sha256'])) + for side in policies: + for code, name in getattr(args, side + '_policy'): + if code in policies[side]: + raise ValueError("Repeated field policy selection is ambiguous") + policies[side][code] = cfg.value_policies[name] + report['policy_configuration_sha256'] = args.policy_config_sha256 + for side in ['old', 'new']: + store = ProvenanceStore(getattr(args, side + '_store')) + identifier = getattr(args, side + '_record') + record = store.read_record(identifier) + if record['kind'] != 'acquisition': + raise ValueError("Pinned raw source must be an acquisition observation") + archive.copy_record_from(store, identifier) + inputs.append(identifier) + schema = getattr(args, side + '_schema') + observation = archive.record_acquisition(schema, ResolvedDataset( + getattr(args, side + '_dataset') + ':reviewed_crosswalk', 'reference', None, None, '', + DatasetMetadata(title='Explicit SHA-pinned comparison crosswalk; validation recorded in report', + version=getattr(args, side + '_edition')))) + inputs.append(observation) + digest = archive.read_record(observation)['artifact']['sha256'] + descriptions[side] = {'record_id': identifier, 'artifact': record['artifact'], + 'original_dataset': record['dataset'], 'original_metadata': record['source_metadata'], + 'schema': {'filename': schema.name, 'sha256': digest, + 'reviewed_sha256': getattr(args, side + '_schema_sha256')}, + 'dataset': getattr(args, side + '_dataset'), 'edition': getattr(args, side + '_edition'), + 'table': getattr(args, side + '_table')} + if digest != getattr(args, side + '_schema_sha256'): + raise ValueError(side + ' crosswalk differs from the pinned resource SHA') + raw = archive.verify_artifact(digest).read_bytes() + document = parse_column_schema(raw) + dataset, edition = descriptions[side]['dataset'], descriptions[side]['edition'] + tables = crosswalk_dataset(document, dataset, edition)['tables'] + choices = [t for t in tables if t['table'] == descriptions[side]['table']] + if len(choices) != 1: + raise ValueError(side + ' selected source table is unavailable or ambiguous') + mapping = choices[0] + if mapping['input_sha256'] != record['artifact']['sha256']: + raise ValueError(side + ' acquired revision differs from the reviewed crosswalk input') + original_version = record['source_metadata'].get('version') + if original_version != edition: + raise ValueError(side + ' original source edition differs from the selected crosswalk') + path = store.verify_artifact(record['artifact']['sha256']) + secrets.extend([str(path), str(store.root)]) + dictionary = getattr(args, side + '_dictionary') + if (dictionary is None) != (mapping.get('dictionary') is None): + raise ValueError(side + ' explicit dictionary file must match its reviewed dictionary descriptor') + if dictionary is not None: + secrets.append(str(dictionary)) + observation = archive.record_acquisition(dictionary, ResolvedDataset( + dataset + ':dictionary', 'reference', None, None, '', + DatasetMetadata(title='Explicit comparison dictionary local observation'))) + inputs.append(observation) + dictionary_sha = archive.read_record(observation)['artifact']['sha256'] + if dictionary_sha != mapping['dictionary']['sha256']: + raise ValueError(side + ' dictionary differs from the reviewed descriptor') + dictionary = archive.verify_artifact(dictionary_sha) + secrets.append(str(dictionary)) + scope = dataset.split('_', 1)[0] + selected.append(read_tapr_table(path, mapping=mapping, key_field=scope + '_number', + dataset=dataset, edition=edition, dictionary_path=dictionary)) + phase = 'comparison' + report['comparison'] = compare_tapr_tables(*selected, key_field=args.scope + '_number', + old_policies=policies['old'], new_policies=policies['new'], max_examples=args.max_examples) + report['status'] = 'compared' + report['keyed_comparison_completed'] = True + except (OSError, ValueError, KeyError) as error: + diagnostic = str(error) + for value in sorted(secrets, key=len, reverse=True): + diagnostic = diagnostic.replace(value, '[selected input]') + report['diagnostic'] = diagnostic + report['keyed_comparison_attempted'] = phase == 'comparison' + report['keyed_comparison_completed'] = False + if phase == 'comparison': + report['status'] = 'blocked_comparison' + if not inputs: + raise ValueError(report.get('diagnostic', 'No valid pinned comparison inputs')) + output.parent.mkdir(parents=True, exist_ok=True) + root = Path(__file__).resolve().parents[1] + report['implementation_sha256'] = {name: sha256((root / name).read_bytes()).hexdigest() + for name in ['scripts/refresh_tapr.py', 'tapr.py', 'values.py', 'column_schema.py', + 'identifiers.py', 'provenance.py']} + code = sha256(json.dumps(report['implementation_sha256'], sort_keys=True).encode()).hexdigest() + with tempfile.TemporaryDirectory(prefix='.tapr-comparison-', dir=output.parent) as directory: + staged = Path(directory) / output.name + staged.write_text(json.dumps(report, indent=2, ensure_ascii=True, allow_nan=False) + '\n') + staged.chmod(0o600) + processing = archive.record_processing(dataset='tapr_explicit_source_comparison', inputs=list(dict.fromkeys(inputs)), + outputs={'comparison_report': staged}, processor='teadata.scripts.refresh_tapr', code_version=code, + parameters={'scope': args.scope, 'no_config_activation': True, 'max_examples': args.max_examples}, + validation={'status': report['status'], 'scientific_equivalence_claimed': False}) + archive.verify_record_closure([processing]) + os.link(staged, output) # Complete, verified publication; never replace an old report. + return {'status': report['status'], 'processing_record_id': processing, + 'report_sha256': sha256(output.read_bytes()).hexdigest()} + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + commands = parser.add_subparsers(dest='command', required=True) + acquire = commands.add_parser('acquire', help='Explicit bounded public GET/POST acquisition; never change Config') + acquire.add_argument('--url', required=True) + acquire.add_argument('--dataset', required=True) + acquire.add_argument('--edition', required=True) + acquire.add_argument('--filename', required=True) + acquire.add_argument('--method', required=True, choices=['GET', 'POST']) + acquire.add_argument('--field', action='append', nargs=2, default=[], metavar=('NAME', 'VALUE')) + acquire.add_argument('--content-type') + replay = commands.add_parser('replay', help='Repeat one retained public HTTP observation; do not infer missing controls') + replay.add_argument('--record', required=True) + replay.add_argument('--content-type', help='Explicit type for a legacy receipt that did not retain it') + for command in [acquire, replay]: + command.add_argument('--store', type=Path, required=True) + command.add_argument('--timeout', type=float, default=20) + command.add_argument('--max-bytes', type=int, default=32 * 1024 * 1024) + compare = commands.add_parser('compare', help='Compare two pinned reviewed original inputs offline') + compare.add_argument('--store', type=Path, required=True, help='Append-only report/provenance archive') + compare.add_argument('--output', type=Path, required=True, help='New report path; never overwritten') + compare.add_argument('--scope', required=True, choices=['campus', 'district']) + compare.add_argument('--max-examples', type=int, default=20) + for side in ['old', 'new']: + for name in ['store', 'schema', 'dictionary']: + compare.add_argument('--' + side + '-' + name, type=Path, required=name != 'dictionary') + for name in ['record', 'schema-sha256', 'dataset', 'edition', 'table']: + compare.add_argument('--' + side + '-' + name, required=True) + compare.add_argument('--' + side + '-policy', action='append', nargs=2, default=[], metavar=('CODE', 'POLICY_ID')) + compare.add_argument('--policy-config', type=Path) + compare.add_argument('--policy-config-sha256') + args = parser.parse_args(argv) + if args.command == 'compare': + result = compare_inputs(args) + else: + archive = ProvenanceStore(args.store) + client = AcquisitionClient(archive, timeout=args.timeout, attempts=1, max_bytes=args.max_bytes, max_retry_wait=0) + if args.command == 'replay': + acquired = replay_acquisition(client, args.record, content_type=args.content_type) + else: + source = ResolvedDataset(args.dataset, 'data_sources', None, None, '', + DatasetMetadata(version=args.edition)) + acquired = acquire_form(client, args.url, source, filename=args.filename, method=args.method, + fields=args.field, content_type=args.content_type) + record = archive.read_record(acquired.record_id) + result = {'status': 'acquired', 'record_id': acquired.record_id, 'artifact': record['artifact']} + print(json.dumps(result, sort_keys=True)) + return 0 if result['status'] in {'compared', 'acquired'} else 2 + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/teadata/tapr.py b/teadata/tapr.py index 8b34c15..8291c8e 100644 --- a/teadata/tapr.py +++ b/teadata/tapr.py @@ -12,15 +12,129 @@ import io from pathlib import Path import re -from typing import Any, Mapping +from typing import TYPE_CHECKING, Any, Mapping from .column_schema import validate_header_table from .identifiers import canonical_source_identifiers +if TYPE_CHECKING: + from .values import ValuePolicy + TAPR_PROFILE_FAMILIES = ("student_staff_profile", "graduation_profile", "student_profile", "staff_profile") +def compare_tapr_tables(old: TaprSourceTable, new: TaprSourceTable, *, key_field: str, + old_policies: Mapping[str, ValuePolicy] | None = None, + new_policies: Mapping[str, ValuePolicy] | None = None, + max_examples: int = 20) -> dict[str, Any]: + """Compare pinned source observations by exact publisher code and strict key. + + Code alignment is descriptive, never a rename, equivalence or default-source + binding. Native kernels own joins, lexical differences, decimal equality and + aggregation; only fields and bounded summaries are visited in Python. + """ + import pyarrow as pa + import pyarrow.compute as arrow_compute + from .values import source_token_statuses + + pc: Any = arrow_compute + if key_field not in {"campus_number", "district_number"} or type(max_examples) is not int or max_examples < 0: + raise ValueError("Comparison needs a strict source key and nonnegative example bound") + scope = key_field.removesuffix("_number") + policies = [dict(old_policies or {}), dict(new_policies or {})] + fields, identities = [], [] + for source, selected_policy in zip([old, new], policies, strict=True): + validate_header_table(source.mapping) + if (not source.dataset.startswith(scope + "_tapr_") + or source.table.column_names != [f["field"] for f in source.mapping["fields"]] + or key_field not in source.table.column_names + or any(not pa.types.is_string(c.type) or c.null_count for c in source.table.columns)): + raise ValueError("Comparison requires complete exact-string source tables in one scope") + definitions = {f["code"]: f for f in source.mapping["fields"]} + if set(selected_policy) - {code for code, f in definitions.items() if f.get("disposition", "fact") != "identity"}: + raise ValueError("Policies must explicitly select actual non-identity publisher codes") + fields.append(definitions) + identity = canonical_source_identifiers(source.table[key_field], width=9 if scope == "campus" else 6) + if pc.any(pc.is_null(identity)).as_py() or pc.count_distinct(identity).as_py() != source.table.num_rows: + raise ValueError("Comparison cannot skip missing or duplicate source keys") + identities.append(identity) + common = [code for code in fields[0] if code in fields[1]] + left = old.table.select([fields[0][c]["field"] for c in common]).rename_columns(['a' + str(i) for i in range(len(common))]).append_column('__key', identities[0]) + right = new.table.select([fields[1][c]["field"] for c in common]).rename_columns(['b' + str(i) for i in range(len(common))]).append_column('__key', identities[1]) + joined = left.join(right, keys='__key', join_type='inner') + def count(mask): + return pc.sum(pc.cast(pc.fill_null(mask, False), pa.int64())).as_py() or 0 + def key_difference(a, b): + difference = pa.table({'key': a}).join(pa.table({'key': b}), keys='key', join_type='left anti').sort_by([('key', 'ascending')]) + return {'count': difference.num_rows, 'examples': difference.slice(0, max_examples)['key'].to_pylist(), + 'all_keys_emitted': difference.num_rows <= max_examples} + def classes(values): + result = pc.if_else(pc.match_substring_regex(values, r'^[+-]?[0-9]+(\.[0-9]+)?$'), 'decimal_lexeme', 'other_text') + for token, label in [('', 'blank'), ('0', 'zero'), ('.', 'literal_dot'), ('-1', 'literal_-1'), + ('-2', 'literal_-2'), ('-3', 'literal_-3'), ('•', 'literal_bullet'), ('n/a', 'literal_n/a')]: + result = pc.if_else(pc.equal(values, token), label, result) + return result + results = [] + for i, code in enumerate(common): + a, b = joined['a' + str(i)], joined['b' + str(i)] + changed = pc.not_equal(a, b) + statuses = [source_token_statuses(values, selected[code]) if code in selected + else pa.repeat('unbound', len(values)) for values, selected in zip([a, b], policies, strict=True)] + eligible = pc.and_(pc.match_substring_regex(a, r'^[+-]?[0-9]{1,38}(\.[0-9]{1,38})?$'), + pc.match_substring_regex(b, r'^[+-]?[0-9]{1,38}(\.[0-9]{1,38})?$')) + # Unbound equality describes decimal spelling only, not measurements. + # Only the selected canonical policy can exclude scientific statuses. + for status, selected in zip(statuses, policies, strict=True): + if code in selected: + eligible = pc.and_(eligible, pc.equal(status, 'observed')) + decimal_a = pc.cast(pc.if_else(eligible, a, None), pa.decimal256(76, 38), safe=True) + decimal_b = pc.cast(pc.if_else(eligible, b, None), pa.decimal256(76, 38), safe=True) + equal = pc.fill_null(pc.equal(decimal_a, decimal_b), False) + decimal_state = pc.if_else(eligible, pc.if_else(equal, 'equal', 'unequal'), 'unclassified') + changes = pc.filter(pa.table({'entity_key': joined['__key'], 'old_raw': a, 'new_raw': b, 'old_class': classes(a), 'new_class': classes(b), + 'old_status': statuses[0], 'new_status': statuses[1], 'decimal_lexeme_equivalence': decimal_state}), changed) + transition_keys = ['old_class', 'new_class', 'old_status', 'new_status', 'decimal_lexeme_equivalence'] + transitions = changes.group_by(transition_keys).aggregate([('old_raw', 'count')]).sort_by([(k, 'ascending') for k in transition_keys]) + pairs = changes.group_by(['old_raw', 'new_raw', 'old_status', 'new_status', 'decimal_lexeme_equivalence']).aggregate([('old_class', 'count')]).sort_by([('old_raw', 'ascending'), ('new_raw', 'ascending')]) + results.append({'code': code, 'old_header': dict(fields[0][code]), 'new_header': dict(fields[1][code]), + 'header_equal': all(fields[0][code].get(k) == fields[1][code].get(k) for k in ['position', 'code', 'label']), + 'canonical_field_equal': fields[0][code]['field'] == fields[1][code]['field'], + 'dictionary_definition_equal': all(fields[0][code].get(k) == fields[1][code].get(k) + for k in ['publisher_type', 'publisher_length', 'publisher_description', 'dictionary_status']), + 'overlap_cells': joined.num_rows, + 'lexical_changes': changes.num_rows, 'decimal_equal_changes': count(pc.and_(changed, pc.and_(eligible, equal))), + 'decimal_unequal_changes': count(pc.and_(changed, pc.and_(eligible, pc.invert(equal)))), + 'unclassified_changes': count(pc.and_(changed, pc.invert(eligible))), + 'changed_observations': {'count': changes.num_rows, + 'examples': changes.sort_by([('entity_key', 'ascending')]).slice(0, max_examples).to_pylist(), + 'truncated': changes.num_rows > max_examples}, + 'raw_class_status_transitions': transitions.to_pylist(), 'distinct_raw_transition_pairs': pairs.num_rows, + 'raw_transition_examples': pairs.slice(0, max_examples).to_pylist(), 'all_raw_pairs_emitted': pairs.num_rows <= max_examples}) + return {'status': 'exact_reviewed_sources_compared', 'scope': scope, 'key_field': key_field, + 'old': {'dataset': old.dataset, 'edition': old.edition, 'input_sha256': old.input_sha256, + 'table': old.mapping['table'], 'rows': old.table.num_rows, 'columns': old.table.num_columns}, + 'new': {'dataset': new.dataset, 'edition': new.edition, 'input_sha256': new.input_sha256, + 'table': new.mapping['table'], 'rows': new.table.num_rows, 'columns': new.table.num_columns}, + 'keysets': {'overlap': joined.num_rows, 'old_only': key_difference(identities[0], identities[1]), + 'new_only': key_difference(identities[1], identities[0]), 'raw_order_equal': identities[0].equals(identities[1])}, + 'source_structure': {side: {'layout': source.mapping.get('layout'), 'annotations': list(source.annotations), + 'metric_period': source.mapping.get('metric_period', {'kind': 'unknown'}), + 'dictionary': source.mapping.get('dictionary'), 'dictionary_records': source.mapping.get('dictionary_records')} + for side, source in [('old', old), ('new', new)]}, + 'columns': {'old_only': [dict(f) for c, f in fields[0].items() if c not in fields[1]], + 'new_only': [dict(f) for c, f in fields[1].items() if c not in fields[0]], 'common': results}, + 'selected_field_policies': {side: {code: policy.to_dict() for code, policy in selected.items()} + for side, selected in zip(['old', 'new'], policies, strict=True)}, + 'limits': ['Exact publisher-code alignment is not scientific equivalence, a rename or methodology/comparability review.', + 'Absent source columns are schema absence, not null/missing/masked/NA observations or retirement. All historical members remain independent.', + 'Default statuses are unbound; an explicit caller-selected field policy does not establish applicability. No units/causes are inferred.', + 'Unbound decimal lexeme equality is a spelling relation, not measured-value equality or arithmetic. Selected non-observed statuses are excluded; no sign/token is a universal masking policy.', + 'Decimal equality uses no floats or rounding, within 38 integer and 38 fractional digits. Other spellings are unclassified.', + 'Changed-observation examples are ordered by canonical entity key within each publisher code; examples are bounded, with exact totals and truncation flags.', + 'Transition/key examples are bounded; exact totals and original inputs are retained. No currentGIS filtering, coalescing or Config activation.']} + + @dataclass(frozen=True) class TaprSourceTable: table: Any diff --git a/teadata/values.py b/teadata/values.py index 7f0d065..9204bcc 100644 --- a/teadata/values.py +++ b/teadata/values.py @@ -205,6 +205,28 @@ def presentation_value(value: Any) -> Any: PLAIN_NUMERIC = ValuePolicy("numeric") +def source_token_statuses(values: Any, policy: ValuePolicy, *, max_distinct: int = 4096): + """Use the scalar authority once per distinct token, with a hard work bound. + + Arrow performs dictionary selection and projection; no Python cell loop + or independent masking/numeric rules are introduced. Callers must select + the source's policy explicitly. This does not establish its applicability. + """ + import pyarrow as pa + import pyarrow.compute as arrow_compute + + pc: Any = arrow_compute + if (type(max_distinct) is not int or max_distinct < 1 + or not isinstance(values, (pa.Array, pa.ChunkedArray)) + or not (pa.types.is_string(values.type) or pa.types.is_large_string(values.type))): + raise ValueError("Token status projection requires Arrow strings and a positive distinct-token bound") + unique = pc.unique(values) + if len(unique) > max_distinct: + raise ValueError("Selected policy exceeds the bounded distinct-token interpretation limit") + statuses = pa.array([measure(raw, policy).status.value for raw in unique.to_pylist()], type=pa.string()) + return pc.take(statuses, pc.index_in(values, value_set=unique)) + + def _json_scalar(raw: Any) -> str | int | float | bool | None: if raw is None or isinstance(raw, (str, bool)): return raw diff --git a/tests/test_tapr_refresh.py b/tests/test_tapr_refresh.py new file mode 100644 index 0000000..458bb81 --- /dev/null +++ b/tests/test_tapr_refresh.py @@ -0,0 +1,451 @@ +from argparse import Namespace +from dataclasses import replace +from datetime import datetime, timezone +from hashlib import sha256 +from io import BytesIO +import csv +import json +from pathlib import Path +from types import SimpleNamespace + +import pyarrow as pa +import pytest + +from teadata.acquisition import AcquisitionClient, acquire_form, replay_acquisition +from teadata.column_schema import source_schema_fingerprint +from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset +from teadata.manifest import canonical_json +from teadata.provenance import ProvenanceStore +from teadata.scripts.refresh_tapr import compare_inputs, main +from teadata.tapr import compare_tapr_tables, read_tapr_table +from teadata.values import ValuePolicy, measure, source_token_statuses + + +class Response(BytesIO): + status = 200 + url = 'https://example.test/source.csv' + headers = {'ETag': 'publisher-tag', 'Last-Modified': 'Thu, 01 Jan 2026 00:00:00 GMT'} + + +def test_explicit_post_replay_keeps_repeated_controls_closed_history_and_old_bytes(tmp_path): + requests = [] + payloads = iter([b'old original', b'new original', b'third original']) + def opened(request, timeout): + requests.append((request, timeout)) + return Response(next(payloads)) + store = ProvenanceStore(tmp_path / 'store') + client = AcquisitionClient(store, opener=SimpleNamespace(open=opened), attempts=1, timeout=20, max_bytes=1024) + source = ResolvedDataset('campus_tapr_student_profile', 'data_sources', None, None, '', DatasetMetadata(version='2024')) + controls = [('key', 'A|B'), ('key', 'C'), ('empty', ''), ('datafmt', 'csv')] + first = acquire_form(client, 'https://example.test/form', source, filename='public.csv', method='POST', + fields=controls, content_type='application/x-www-form-urlencoded; charset=UTF-8') + original = store.read_record(first.record_id) + second = replay_acquisition(client, first.record_id) + third = replay_acquisition(client, second.record_id) + assert len(requests) == 3 and all(timeout == 20 for _, timeout in requests) + assert all(request.data == b'key=A%7CB&key=C&empty=&datafmt=csv' for request, _ in requests) + assert all(request.get_method() == 'POST' for request, _ in requests) + assert all(request.get_header('Content-type') == 'application/x-www-form-urlencoded; charset=UTF-8' for request, _ in requests) + assert all(not request.has_header('Authorization') and not request.has_header('Cookie') for request, _ in requests) + assert store.read_record(first.record_id) == original and first.path.read_bytes() == b'old original' + assert second.path.read_bytes() == b'new original' and third.path.read_bytes() == b'third original' + closure = store.verify_record_closure([third.record_id]) + assert set(closure) == {first.record_id, second.record_id, third.record_id} + assert original['parameters']['form_controls'] == [list(p) for p in controls] + assert original['response_headers']['etag'] == 'publisher-tag' + assert original['parameters']['transport_limits'] == {'timeout': 20, 'attempts': 1, 'max_bytes': 1024, 'max_retry_wait': 30} + + +def test_get_replay_preserves_exact_query_and_legacy_post_requires_explicit_controls_and_type(tmp_path): + requests = [] + def opened(request, timeout): + requests.append(request) + return Response(b'original') + store = ProvenanceStore(tmp_path / 'store') + client = AcquisitionClient(store, opener=SimpleNamespace(open=opened), attempts=1) + source = ResolvedDataset('sample', 'data_sources', None, None, '') + first = acquire_form(client, 'https://example.test/form?edition=2024', source, filename='sample.csv', + method='GET', fields=[('key', 'a'), ('key', 'b')]) + replay_acquisition(client, first.record_id) + assert [r.full_url for r in requests] == ['https://example.test/form?edition=2024&key=a&key=b'] * 2 + with pytest.raises(ValueError, match='cannot change'): + replay_acquisition(client, first.record_id, content_type='text/csv') + path = tmp_path / 'legacy.csv' + path.write_bytes(b'legacy') + identifier = store.record_acquisition(path, source, requested_url='https://example.test/legacy', + downloaded_at=datetime(2026, 1, 1, tzinfo=timezone.utc), parameters={'http_method': 'POST', 'form_controls': [['key', 'A']]}) + with pytest.raises(ValueError, match='explicit request content type'): + replay_acquisition(client, identifier) + repeated = replay_acquisition(client, identifier, content_type='application/x-www-form-urlencoded') + assert requests[-1].data == b'key=A' + local = store.record_acquisition(path, source) + with pytest.raises(ValueError, match='original HTTP'): + replay_acquisition(client, local) + no_controls = store.record_acquisition(path, source, requested_url='https://example.test/legacy', + downloaded_at=datetime(2026, 1, 1, tzinfo=timezone.utc), parameters={'http_method': 'POST'}) + with pytest.raises(ValueError, match='explicit public form controls'): + replay_acquisition(client, no_controls, content_type='application/x-www-form-urlencoded') + with pytest.raises(ValueError, match='cannot change'): + replay_acquisition(client, repeated.record_id, content_type='text/csv') + + +@pytest.mark.parametrize('method,fields,content_type', [('PUT', [], None), ('POST', [], None), + ('POST', [], 'text/csv'), ('GET', {'key': 'value'}, None), ('GET', [['', 'v']], None)]) +def test_invalid_or_implicit_form_requests_fail_before_network(tmp_path, method, fields, content_type): + client = AcquisitionClient(ProvenanceStore(tmp_path), opener=SimpleNamespace(open=lambda *a, **k: pytest.fail('network'))) + with pytest.raises((ValueError, TypeError)): + acquire_form(client, 'https://example.test/form', ResolvedDataset('x', 'data_sources', None, None, ''), + filename='x.csv', method=method, fields=fields, content_type=content_type) + + +@pytest.mark.parametrize('method,form_url,controls,observed', [ + ('GET', 'https://example.test/different', [['key', 'B']], 'https://example.test/observed?key=A'), + ('POST', 'https://example.test/different', [['key', 'B']], 'https://example.test/observed?key=A'), + ('GET', 'https://example.test/form', [['key', 'B'], ['key', 'A']], 'https://example.test/form?key=A&key=B'), + ('GET', None, [['key', 'A']], 'https://example.test/form?key=A'), +]) +def test_replay_rejects_auxiliary_request_drift_before_http(tmp_path, method, form_url, controls, observed): + store = ProvenanceStore(tmp_path / 'store') + path = tmp_path / 'original.csv' + path.write_bytes(b'retained original') + parameters = {'http_method': method, 'form_controls': controls, + 'form_content_type': 'application/x-www-form-urlencoded' if method == 'POST' else None} + if form_url is not None: + parameters['form_url'] = form_url + identifier = store.record_acquisition(path, ResolvedDataset('sample', 'data_sources', None, None, ''), + requested_url=observed, downloaded_at=datetime(2026, 1, 1, tzinfo=timezone.utc), parameters=parameters) + original = (store.root / 'records' / (identifier + '.json')).read_bytes() + client = AcquisitionClient(store, opener=SimpleNamespace(open=lambda *a, **k: pytest.fail('HTTP'))) + with pytest.raises(ValueError, match='original|observed'): + replay_acquisition(client, identifier) + assert (store.root / 'records' / (identifier + '.json')).read_bytes() == original + + +def test_legacy_get_replays_observed_url_without_reconstructing_controls(tmp_path): + store = ProvenanceStore(tmp_path / 'store') + path = tmp_path / 'original.csv' + path.write_bytes(b'retained original') + url = 'https://example.test/form?key=A&key=B&empty=&spelling=%2f' + identifier = store.record_acquisition(path, ResolvedDataset('sample', 'data_sources', None, None, ''), + requested_url=url, downloaded_at=datetime(2026, 1, 1, tzinfo=timezone.utc), parameters={'http_method': 'GET'}) + requests = [] + def opened(request, timeout): + requests.append(request) + return Response(b'replayed bytes') + acquired = replay_acquisition(AcquisitionClient(store, opener=SimpleNamespace(open=opened)), identifier) + assert len(requests) == 1 and requests[0].full_url == url and requests[0].data is None + assert set(store.verify_record_closure([acquired.record_id])) == {identifier, acquired.record_id} + + +@pytest.mark.parametrize('parameters', ['charset=ISO-8859-1', 'charset=utf8', + 'charset=UTF-8; charset=ISO-8859-1', 'charset=UTF-8; charset=UTF-8', 'charset="UTF-8', 'boundary=anything']) +def test_post_rejects_unsupported_or_ambiguous_encoding_before_http(tmp_path, parameters): + client = AcquisitionClient(ProvenanceStore(tmp_path), opener=SimpleNamespace(open=lambda *a, **k: pytest.fail('HTTP'))) + with pytest.raises(ValueError, match='only UTF-8'): + acquire_form(client, 'https://example.test/form', ResolvedDataset('sample', 'data_sources', None, None, ''), + filename='sample.csv', method='POST', fields=[('name', 'é')], + content_type='application/x-www-form-urlencoded; ' + parameters) + + +@pytest.mark.parametrize('content_type', ['application/x-www-form-urlencoded', + 'application/x-www-form-urlencoded; charset=UTF-8', 'application/x-www-form-urlencoded; Charset = "utf-8"']) +def test_unicode_post_and_replay_use_explicit_utf8_control_bytes(tmp_path, content_type): + requests = [] + def opened(request, timeout): + requests.append(request) + return Response(b'original') + client = AcquisitionClient(ProvenanceStore(tmp_path), opener=SimpleNamespace(open=opened)) + first = acquire_form(client, 'https://example.test/form', ResolvedDataset('sample', 'data_sources', None, None, ''), + filename='sample.csv', method='POST', fields=[('name', 'é'), ('name', '東京')], content_type=content_type) + replay_acquisition(client, first.record_id) + assert len(requests) == 2 + assert all(r.data == b'name=%C3%A9&name=%E6%9D%B1%E4%BA%AC' for r in requests) + assert all(r.get_header('Content-type') == content_type for r in requests) + + +def source(tmp_path, name, rows, *, code='VALUE', label='Value', field='value', period=None): + dataset = 'campus_tapr_student_profile' + path = tmp_path / (name + '.csv') + labels, codes = ['Campus Number', label], ['CAMPUS', code] + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([labels, codes, *rows]) + mapping = {'table': 'student_profile', 'metric_period': period or {'kind': 'unknown'}, + 'input_sha256': sha256(path.read_bytes()).hexdigest(), 'source_schema_sha256': source_schema_fingerprint(labels, codes), + 'fields': [{'position': i, 'code': c, 'label': human, 'field': canonical, + 'disposition': 'identity' if i == 1 else 'fact', 'dictionary_status': 'not_applicable' if i == 1 else 'not_documented', + 'publisher_type': None, 'publisher_description': None} + for i, (c, human, canonical) in enumerate(zip(codes, labels, ['campus_number', field], strict=True), 1)]} + schema = tmp_path / (name + '.json') + schema.write_text(canonical_json({'schema_version': 2, 'mapping_version': 1, + 'datasets': [{'dataset': dataset, 'edition': '2024', 'source_only': True, 'tables': [mapping]}]}) + '\n') + store = ProvenanceStore(tmp_path / (name + '-store')) + identifier = store.record_acquisition(path, ResolvedDataset(dataset, 'data_sources', None, None, str(path), DatasetMetadata(version='2024'))) + native = read_tapr_table(path, mapping=mapping, key_field='campus_number', dataset=dataset, edition='2024') + return native, store, identifier, schema + + +def test_keyed_native_diff_keeps_historical_members_schema_absence_and_independent_definitions(tmp_path): + old, *_ = source(tmp_path, 'old', [['001902041', '7'], ['001902001', '.']], label='Old definition') + new, *_ = source(tmp_path, 'new', [['001902099', '9'], ['001902001', '']], label='Changed definition', field='changed_value', + period={'kind': 'school_year', 'start_year': 2023, 'end_year': 2024}) + result = compare_tapr_tables(old, new, key_field='campus_number') + assert result['keysets']['overlap'] == 1 + assert result['keysets']['old_only']['examples'] == ["'001902041"] + assert result['keysets']['new_only']['examples'] == ["'001902099"] + value = result['columns']['common'][1] + assert not value['header_equal'] and value['lexical_changes'] == 1 + assert value['raw_transition_examples'][0]['old_raw'] == '.' + assert value['raw_transition_examples'][0]['new_raw'] == '' + assert value['raw_transition_examples'][0]['new_status'] == 'unbound' + assert result['source_structure']['old']['metric_period'] != result['source_structure']['new']['metric_period'] + other, *_ = source(tmp_path, 'other', [['001902001', '0']], code='NEW_CODE', label='Old definition') + result = compare_tapr_tables(old, other, key_field='campus_number') + assert [f['code'] for f in result['columns']['old_only']] == ['VALUE'] + assert [f['code'] for f in result['columns']['new_only']] == ['NEW_CODE'] + assert [f['code'] for f in result['columns']['common']] == ['CAMPUS'] + + +def test_decimal_spelling_equivalence_is_exact_beyond_float_precision_and_unsupported_is_unknown(tmp_path): + old_tokens = ['9007199254740993', '001', '1e3', '', '-1', '0'] + new_tokens = ['9007199254740992', '1.0', '1000', '0', '-1.0', '0.0'] + old, *_ = source(tmp_path, 'old', [[f'001902{i:03d}', v] for i, v in enumerate(old_tokens, 1)]) + new, *_ = source(tmp_path, 'new', [[f'001902{i:03d}', v] for i, v in enumerate(new_tokens, 1)]) + value = compare_tapr_tables(old, new, key_field='campus_number')['columns']['common'][1] + assert value['lexical_changes'] == 6 and value['decimal_equal_changes'] == 3 + assert value['decimal_unequal_changes'] == 1 and value['unclassified_changes'] == 2 + assert all(p['old_status'] == p['new_status'] == 'unbound' for p in value['raw_transition_examples']) + + +def test_dictionary_only_changes_remain_dictionary_observations_not_fabricated_fields(tmp_path): + old, *_ = source(tmp_path, 'old', [['001902001', '1']]) + new, *_ = source(tmp_path, 'new', [['001902001', '1']]) + dictionary = [{'ordinal': 1, 'code': 'UNUSED', 'publisher_type': 'Number', 'publisher_description': 'Available dictionary field'}] + new = replace(new, mapping={**new.mapping, 'dictionary_records': dictionary}) + result = compare_tapr_tables(old, new, key_field='campus_number') + assert result['source_structure']['new']['dictionary_records'] == dictionary + assert not result['columns']['new_only'] and not result['columns']['old_only'] + assert [f['code'] for f in result['columns']['common']] == ['CAMPUS', 'VALUE'] + + +def test_negative_observed_and_suppressed_policies_have_one_canonical_authority(tmp_path): + old, *_ = source(tmp_path, 'old', [['001902001', '-1']]) + new, *_ = source(tmp_path, 'new', [['001902001', '-1.0']]) + observed = ValuePolicy.from_dict({'policy_id': 'numeric'}) + suppressed = ValuePolicy.from_dict({'policy_id': 'reviewed', 'reference_id': 'masking', + 'tokens': {'-1': {'status': 'suppressed', 'reason': 'explicit reviewed source rule'}}}) + for policy, expected in [(observed, 1), (suppressed, 0)]: + result = compare_tapr_tables(old, new, key_field='campus_number', old_policies={'VALUE': policy}, new_policies={'VALUE': policy}) + value = result['columns']['common'][1] + assert value['decimal_equal_changes'] == expected + assert value['raw_transition_examples'][0]['old_status'] == measure('-1', policy).status.value + assert result['selected_field_policies']['old']['VALUE'] == policy.to_dict() + with pytest.raises(ValueError, match='actual non-identity'): + compare_tapr_tables(old, new, key_field='campus_number', old_policies={'*': suppressed}) + + +@pytest.mark.parametrize('bound', [0, 2, 10]) +def test_changed_observation_examples_are_keyed_deterministic_bounded_and_policy_qualified(tmp_path, bound): + old, *_ = source(tmp_path, 'old', [['001902003', '1'], ['001902001', '1'], ['001902004', '7'], ['001902002', '-1']]) + new, *_ = source(tmp_path, 'new', [['001902002', '0'], ['001902004', '7'], ['001902001', '2'], ['001902003', '1.0']]) + policy = ValuePolicy.from_dict({'policy_id': 'explicit', 'tokens': {'-1': {'status': 'suppressed', 'reason': 'source-specific rule'}}}) + result = compare_tapr_tables(old, new, key_field='campus_number', old_policies={'VALUE': policy}, + new_policies={'VALUE': policy}, max_examples=bound) + field = result['columns']['common'][1] + observations = field['changed_observations'] + assert result['key_field'] == 'campus_number' + assert observations['count'] == field['lexical_changes'] == 3 + assert observations['truncated'] == (bound < 3) + examples = observations['examples'] + assert [e['entity_key'] for e in examples] == ["'001902001", "'001902002", "'001902003"][:bound] + assert len(examples) == min(bound, 3) + if examples: + assert (examples[0]['old_raw'], examples[0]['new_raw']) == ('1', '2') + assert examples[0]['old_status'] == examples[0]['new_status'] == 'observed' + assert examples[0]['decimal_lexeme_equivalence'] == 'unequal' + assert examples[1]['old_status'] == 'suppressed' and examples[1]['new_status'] == 'observed' + assert examples[1]['decimal_lexeme_equivalence'] == 'unclassified' + if bound > 3: + assert examples[2]['decimal_lexeme_equivalence'] == 'equal' + + +def test_changed_observation_examples_do_not_invent_cells_without_overlapping_keys(tmp_path): + old, *_ = source(tmp_path, 'old', [['001902001', '1']]) + new, *_ = source(tmp_path, 'new', [['001902002', '2']]) + result = compare_tapr_tables(old, new, key_field='campus_number', max_examples=1) + assert result['keysets']['overlap'] == 0 + assert result['columns']['common'][1]['changed_observations'] == {'count': 0, 'examples': [], 'truncated': False} + + +def test_status_bridge_matches_scalar_and_has_an_explicit_distinct_work_bound(): + policy = ValuePolicy.from_dict({'policy_id': 'explicit', 'tokens': {'-1': {'status': 'suppressed', 'reason': 'documented'}}}) + tokens = ['-1', '-1.00', ' -1 ', '0', '.', '', None, '9007199254740993', 'n/a'] + assert source_token_statuses(pa.array(tokens), policy).to_pylist() == [measure(t, policy).status.value for t in tokens] + with pytest.raises(ValueError, match='distinct-token'): + source_token_statuses(pa.array(['1', '2', '3']), policy, max_distinct=2) + + +@pytest.mark.parametrize('outside', ['1' * 39, '0.' + '1' * 39]) +def test_outside_exact_decimal_envelope_is_unclassified_without_rounding(tmp_path, outside): + old, *_ = source(tmp_path, 'old', [['001902001', outside]]) + new, *_ = source(tmp_path, 'new', [['001902001', '1']]) + field = compare_tapr_tables(old, new, key_field='campus_number', max_examples=0)['columns']['common'][1] + assert field['unclassified_changes'] == 1 + assert field['decimal_equal_changes'] == field['decimal_unequal_changes'] == 0 + assert field['raw_transition_examples'] == [] and not field['all_raw_pairs_emitted'] + + +def compare_args(tmp_path, old, new): + args = Namespace(store=tmp_path / 'result-store', output=tmp_path / 'result.json', scope='campus', max_examples=2, + old_policy=[], new_policy=[], policy_config=None, policy_config_sha256=None) + for side, (_, store, identifier, schema) in [('old', old), ('new', new)]: + for key, value in {'store': store.root, 'record': identifier, 'schema': schema, + 'schema_sha256': sha256(schema.read_bytes()).hexdigest(), 'dictionary': None, + 'dataset': 'campus_tapr_student_profile', 'edition': '2024', 'table': 'student_profile'}.items(): + setattr(args, side + '_' + key, value) + return args + + +def test_offline_cli_reports_and_closed_history_are_append_only_without_config_activation(tmp_path, monkeypatch): + old = source(tmp_path, 'old', [['001902001', '.']]) + new = source(tmp_path, 'new', [['001902001', '0']]) + args = compare_args(tmp_path, old, new) + monkeypatch.setattr('teadata.scripts.refresh_tapr.AcquisitionClient', lambda *a, **k: pytest.fail('HTTP client')) + result = compare_inputs(args) + assert result['status'] == 'compared' + store = ProvenanceStore(args.store) + closure = store.verify_record_closure([result['processing_record_id']]) + assert old[2] in closure and new[2] in closure + assert closure[old[2]] == old[1].read_record(old[2]) + before = args.output.read_bytes() + with pytest.raises(FileExistsError): + compare_inputs(args) + assert args.output.read_bytes() == before + + +def test_explicit_policy_capacity_limit_is_reported_as_comparison_block_not_source_drift(tmp_path): + rows = [[str(100000000 + i), str(i)] for i in range(4097)] + old, new = source(tmp_path, 'old', rows), source(tmp_path, 'new', rows) + args = compare_args(tmp_path, old, new) + config = tmp_path / 'policy.yaml' + config.write_text('value_policies:\n numeric:\n tokens: {}\n') + args.policy_config, args.policy_config_sha256 = config, sha256(config.read_bytes()).hexdigest() + args.old_policy = [['VALUE', 'numeric']] + result = compare_inputs(args) + report = json.loads(args.output.read_bytes()) + assert result['status'] == 'blocked_comparison' + assert report['keyed_comparison_attempted'] and not report['keyed_comparison_completed'] + assert 'distinct-token' in report['diagnostic'] + + +@pytest.mark.parametrize('drift', ['source_sha', 'header', 'layout', 'schema_sha', 'edition', 'unexpected_dictionary', 'dictionary_definitions']) +def test_structural_or_pin_drift_preserves_bytes_and_blocked_report_without_keyed_comparison(tmp_path, monkeypatch, drift): + old = source(tmp_path, 'old', [['001902001', '.']]) + new = source(tmp_path, 'new', [['001902001', '0']]) + args = compare_args(tmp_path, old, new) + schema = args.new_schema + document = json.loads(schema.read_bytes()) + table = document['datasets'][0]['tables'][0] + if drift == 'source_sha': + table['input_sha256'] = '0' * 64 + elif drift == 'header': + table['fields'][1]['label'] = 'Unreviewed actual header' + table['source_schema_sha256'] = source_schema_fingerprint([f['label'] for f in table['fields']], [f['code'] for f in table['fields']]) + elif drift == 'layout': + table['layout'] = {'label_record': 1, 'code_record': 2, 'first_data_record': 3, 'last_data_record': 4, 'annotations': []} + elif drift == 'edition': + args.new_edition = '2025' + elif drift == 'unexpected_dictionary': + args.new_dictionary = tmp_path / 'unbound-dictionary.html' + args.new_dictionary.write_text('Not declared by this source contract') + elif drift == 'dictionary_definitions': + table['dictionary_records'] = [ + {'ordinal': 1, 'code': 'UNUSED', 'publisher_type': 'Number', 'publisher_description': 'Definition A'}, + {'ordinal': 2, 'code': 'UNUSED', 'publisher_type': 'Number', 'publisher_description': 'Definition B'}] + schema.write_text(canonical_json(document)) + args.new_schema_sha256 = '0' * 64 if drift == 'schema_sha' else sha256(schema.read_bytes()).hexdigest() + monkeypatch.setattr('teadata.scripts.refresh_tapr.compare_tapr_tables', lambda *a, **k: pytest.fail('Unreviewed keyed comparison')) + result = compare_inputs(args) + report = json.loads(args.output.read_bytes()) + assert result['status'] == 'blocked_contract_drift' and report['keyed_comparison_attempted'] is False + assert report['keyed_comparison_completed'] is False + assert not report.get('comparison') and '/Users/' not in report['diagnostic'] + archive = ProvenanceStore(args.store) + closure = archive.verify_record_closure([result['processing_record_id']]) + assert old[2] in closure and new[2] in closure + assert archive.verify_artifact(sha256(schema.read_bytes()).hexdigest()).read_bytes() == schema.read_bytes() + + +@pytest.mark.parametrize('target', ['crosswalk', 'policy']) +def test_comparison_parses_retained_pinned_bytes_after_operator_metadata_changes(tmp_path, monkeypatch, target): + old, new = source(tmp_path, 'old', [['001902001', '-1']]), source(tmp_path, 'new', [['001902001', '-1.0']]) + args = compare_args(tmp_path, old, new) + if target == 'policy': + selected = tmp_path / 'policy.yaml' + selected.write_text('value_policies:\n reviewed:\n tokens:\n "-1":\n status: suppressed\n reason: explicit source rule\n') + args.policy_config, args.policy_config_sha256 = selected, sha256(selected.read_bytes()).hexdigest() + args.old_policy, args.new_policy = [['VALUE', 'reviewed']], [['VALUE', 'reviewed']] + else: + selected = args.new_schema + original_bytes = selected.read_bytes() + original = ProvenanceStore.record_acquisition + def observe_then_change(self, path, *a, **k): + identifier = original(self, path, *a, **k) + if Path(path) == selected: + selected.write_text('operator file changed after its immutable snapshot') + return identifier + monkeypatch.setattr(ProvenanceStore, 'record_acquisition', observe_then_change) + result = compare_inputs(args) + assert result['status'] == 'compared' and selected.read_bytes() != original_bytes + archive = ProvenanceStore(args.store) + assert archive.verify_artifact(sha256(original_bytes).hexdigest()).read_bytes() == original_bytes + if target == 'policy': + report = json.loads(args.output.read_bytes()) + field = report['comparison']['columns']['common'][1] + assert field['decimal_equal_changes'] == 0 + assert field['raw_transition_examples'][0]['old_status'] == 'suppressed' + + +def test_comparison_decodes_the_retained_dictionary_snapshot(tmp_path, monkeypatch): + from openpyxl import Workbook + + old, new = source(tmp_path, 'old', [['001902001', '1']]), source(tmp_path, 'new', [['001902001', '2']]) + args = compare_args(tmp_path, old, new) + dictionary = tmp_path / 'dictionary.xlsx' + book = Workbook() + sheet = book.active + assert sheet is not None + sheet.append(['Name', 'Type', 'Length', 'Label']) + sheet.append(['CAMPUS', 'Character', '9', 'Campus Number']) + sheet.append(['VALUE', 'Number', '8', 'Value']) + book.save(dictionary) + original_bytes = dictionary.read_bytes() + document = json.loads(args.old_schema.read_bytes()) + dataset = document['datasets'][0] + dataset.pop('source_only') + dataset['prepared_input_sha256'] = old[0].input_sha256 + table = dataset['tables'][0] + table['dictionary'] = {'filename': dictionary.name, 'sha256': sha256(original_bytes).hexdigest(), 'sheet_name': sheet.title} + for field, kind, length in zip(table['fields'], ['Character', 'Number'], ['9', '8'], strict=True): + field.pop('dictionary_status') + field.pop('publisher_description') + field.update(publisher_type=kind, publisher_length=length) + args.old_schema.write_text(canonical_json(document)) + args.old_schema_sha256, args.old_dictionary = sha256(args.old_schema.read_bytes()).hexdigest(), dictionary + original = ProvenanceStore.record_acquisition + def observe_then_change(self, path, *a, **k): + identifier = original(self, path, *a, **k) + if Path(path) == dictionary: + dictionary.write_bytes(b'changed after immutable observation') + return identifier + monkeypatch.setattr(ProvenanceStore, 'record_acquisition', observe_then_change) + result = compare_inputs(args) + assert result['status'] == 'compared' + assert dictionary.read_bytes() != original_bytes + assert ProvenanceStore(args.store).verify_artifact(sha256(original_bytes).hexdigest()).read_bytes() == original_bytes + + +def test_cli_help_is_offline_and_acquisition_requires_explicit_subcommand(capsys): + with pytest.raises(SystemExit) as caught: + main(['--help']) + assert caught.value.code == 0 + assert 'acquire' in capsys.readouterr().out From 0d64be777d8b0d93d8c2b9eaff3592040797ed76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 17:06:30 -0500 Subject: [PATCH 09/11] Retain partial TAPR dictionaries and prepare Staff sources --- docs/config.md | 36 ++++ .../tapr--2025--staff-profile-crosswalk.json | 1 + teadata/column_schema.py | 26 ++- teadata/scripts/refresh_tapr.py | 68 ++++++- teadata/tapr_dictionary.py | 184 ++++++++++++++++++ tests/test_tapr_2025_staff.py | 71 +++++++ tests/test_tapr_dictionary.py | 164 ++++++++++++++++ tests/test_tapr_refresh.py | 178 ++++++++++++++++- 8 files changed, 718 insertions(+), 10 deletions(-) create mode 100644 docs/source-contracts/tapr--2025--staff-profile-crosswalk.json create mode 100644 teadata/tapr_dictionary.py create mode 100644 tests/test_tapr_2025_staff.py create mode 100644 tests/test_tapr_dictionary.py diff --git a/docs/config.md b/docs/config.md index bcc9624..cd02e5b 100644 --- a/docs/config.md +++ b/docs/config.md @@ -437,6 +437,42 @@ history through the same provenance reference graph, even when bytes change. Reconstructed form URLs must exactly match the original requested URL. A legacy GET without form metadata reuses its exact retained URL. +Inspect a retained TAPR HTML dictionary offline through the same command owner: + +```bash +uv run python -m teadata.scripts.refresh_tapr dictionary \ + --source-store provenance --record DICTIONARY_ACQUISITION_ID \ + --encoding iso-8859-1 --store provenance --output dictionary-observations.json +``` + +This appends a processing receipt without changing Config or acquiring data. +`--max-bytes` is a positive retained-input limit (default 2 MiB); a separately +reviewed larger dictionary can use an explicit larger value. Advertised and +actual sizes are bounded before copying, and the capped parsed bytes must +match the selected acquisition's SHA and length. +The typed `teadata.tapr_dictionary.extract_tapr_dictionary()` API retains every +ordered occurrence, including duplicate codes and independently unknown type +or description components. It preserves an exact decoded HTML slice; archived +raw bytes remain the identity authority. Rendered text normalizes presentation +whitespace only. Anchors bind the raw SHA to the outer tooltip start tag using +one-based lines and zero-based decoded-character columns. +Supported `p`, `div` and `br` boundaries separate rendered text. Ambiguous +dictionary-relevant duplicate class attributes fail instead of hiding a code. + +The existing `dictionary_records` column contract retains these observations. +Only a complete occurrence can document a field; separate partial occurrences +are never combined into a definition. Conflicting known components fail review. +Dictionary-only codes do not become source columns or establish availability, +aliases, units or reference periods. Existing `header_records()` and +`header_rename_map()` remain the code/label/canonical-field mapping APIs. +The proposal at `docs/source-contracts/tapr--2025--staff-profile-crosswalk.json` +describes the retained 106/118-column observations. It is an unactivated source +review input, outside shipped/runtime schemas; it replaces neither Config nor +the historical 2025 composite contract. It makes no key/value-comparison or +data-release claim. Later activation must move this same file into a referenced +runtime schema, update its references/tests, and remove the proposal path in +the same change. + Compare two retained originals offline using their exact acquisition IDs and independently reviewed crosswalks. Substitute the actual IDs and reviewed SHAs: diff --git a/docs/source-contracts/tapr--2025--staff-profile-crosswalk.json b/docs/source-contracts/tapr--2025--staff-profile-crosswalk.json new file mode 100644 index 0000000..7ff5391 --- /dev/null +++ b/docs/source-contracts/tapr--2025--staff-profile-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_staff_profile","edition":"2025","source_only":true,"tables":[{"dictionary_records":[{"code":"CPSATOFC","ordinal":1,"publisher_description":"Campus 2025 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number","source_column":65,"source_line":2253,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSPTOFC","ordinal":2,"publisher_description":"Campus 2025 Staff Professional Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2258,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSPTOFP","ordinal":3,"publisher_description":"Campus 2025 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2259,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTOFC","ordinal":4,"publisher_description":"Campus 2025 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2263,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTOFP","ordinal":5,"publisher_description":"Campus 2025 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2264,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSUTOFC","ordinal":6,"publisher_description":"Campus 2025 Staff Support Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2268,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSUTOFP","ordinal":7,"publisher_description":"Campus 2025 Staff Support Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2269,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSSTOFC","ordinal":8,"publisher_description":"Campus 2025 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2273,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSSTOFP","ordinal":9,"publisher_description":"Campus 2025 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2274,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSETOFC","ordinal":10,"publisher_description":"Campus 2025 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2278,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSETOFP","ordinal":11,"publisher_description":"Campus 2025 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2279,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSXTOFC","ordinal":12,"publisher_description":null,"publisher_type":null,"source_column":46,"source_line":2283,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSXTOFP","ordinal":13,"publisher_description":null,"publisher_type":null,"source_column":46,"source_line":2284,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSBTOFC","ordinal":14,"publisher_description":"Campus 2025 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2291,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSBTOPC","ordinal":15,"publisher_description":"Campus 2025 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2296,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSRTOFC","ordinal":16,"publisher_description":"Campus 2025 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2301,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSRTOPC","ordinal":17,"publisher_description":"Campus 2025 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2306,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSAMIFC","ordinal":18,"publisher_description":"Campus 2025 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number","source_column":65,"source_line":2311,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSAMIFP","ordinal":19,"publisher_description":"Campus 2025 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number","source_column":65,"source_line":2312,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTBLFC","ordinal":20,"publisher_description":"Campus 2025 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2319,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTBLFP","ordinal":21,"publisher_description":"Campus 2025 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2320,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTHIFC","ordinal":22,"publisher_description":"Campus 2025 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2324,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTHIFP","ordinal":23,"publisher_description":"Campus 2025 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2325,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTWHFC","ordinal":24,"publisher_description":"Campus 2025 Staff Teacher White Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2329,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTWHFP","ordinal":25,"publisher_description":"Campus 2025 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2330,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTINFC","ordinal":26,"publisher_description":"Campus 2025 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2334,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTINFP","ordinal":27,"publisher_description":"Campus 2025 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2335,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTASFC","ordinal":28,"publisher_description":"Campus 2025 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2339,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTASFP","ordinal":29,"publisher_description":"Campus 2025 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2340,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTPIFC","ordinal":30,"publisher_description":"Campus 2025 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2344,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTPIFP","ordinal":31,"publisher_description":"Campus 2025 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2345,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTWFC","ordinal":32,"publisher_description":"Campus 2025 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2349,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTWFP","ordinal":33,"publisher_description":"Campus 2025 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2350,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTMAFC","ordinal":34,"publisher_description":"Campus 2025 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2357,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTMAFP","ordinal":35,"publisher_description":"Campus 2025 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2358,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTFEFC","ordinal":36,"publisher_description":"Campus 2025 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2362,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTFEFP","ordinal":37,"publisher_description":"Campus 2025 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2363,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTNOFC","ordinal":38,"publisher_description":"Campus 2025 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2370,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTNOFP","ordinal":39,"publisher_description":"Campus 2025 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2371,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTBAFC","ordinal":40,"publisher_description":"Campus 2025 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2375,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTBAFP","ordinal":41,"publisher_description":"Campus 2025 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2376,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTMSFC","ordinal":42,"publisher_description":"Campus 2025 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2380,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTMSFP","ordinal":43,"publisher_description":"Campus 2025 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2381,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTPHFC","ordinal":44,"publisher_description":"Campus 2025 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2385,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTPHFP","ordinal":45,"publisher_description":"Campus 2025 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2386,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST00FC","ordinal":46,"publisher_description":"Campus 2025 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2393,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST00FP","ordinal":47,"publisher_description":"Campus 2025 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2394,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST01FC","ordinal":48,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2398,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST01FP","ordinal":49,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2399,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST06FC","ordinal":50,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2403,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST06FP","ordinal":51,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2404,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST11FC","ordinal":52,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2408,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST11FP","ordinal":53,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2409,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST21FC","ordinal":54,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2413,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST21FP","ordinal":55,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2414,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST30FC","ordinal":56,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2418,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST30FP","ordinal":57,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2419,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTKIDR","ordinal":58,"publisher_description":"Campus 2025 Staff Teacher Student Ratio","publisher_type":"Number","source_column":46,"source_line":2423,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSHEXPA","ordinal":59,"publisher_description":"Campus 2025 Staff Principal Experience Average","publisher_type":"Number","source_column":46,"source_line":2454,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSHEXPT","ordinal":60,"publisher_description":"Campus 2025 Staff Principal Experience Total","publisher_type":"Number","source_column":46,"source_line":2455,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSHTENA","ordinal":61,"publisher_description":"Campus 2025 Staff Average Years Experience of Principals with District","publisher_type":"Number","source_column":46,"source_line":2459,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSHTENT","ordinal":62,"publisher_description":"Campus 2025 Staff Total Years Experience of Principals with District","publisher_type":"Number","source_column":46,"source_line":2460,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSLEXPA","ordinal":63,"publisher_description":"Campus 2025 Staff Assistant Principal Experience Average","publisher_type":"Number","source_column":46,"source_line":2464,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSLEXPT","ordinal":64,"publisher_description":"Campus 2025 Staff Assistant Principal Experience Total","publisher_type":"Number","source_column":46,"source_line":2465,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSLTENA","ordinal":65,"publisher_description":"Campus 2025 Staff Average Years Experience of Assistant Principals with District","publisher_type":"Number","source_column":46,"source_line":2469,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSLTENT","ordinal":66,"publisher_description":"Campus 2025 Staff Total Years Experience of Assistant Principals with District","publisher_type":"Number","source_column":46,"source_line":2470,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTEXPA","ordinal":67,"publisher_description":"Campus 2025 Staff Teacher Experience Average","publisher_type":"Number","source_column":46,"source_line":2474,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTEXPT","ordinal":68,"publisher_description":"Campus 2025 Staff Teacher Experience Total","publisher_type":"Number","source_column":46,"source_line":2475,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTENA","ordinal":69,"publisher_description":"Campus 2025 Staff Average Years Experience of Teachers with District","publisher_type":"Number","source_column":46,"source_line":2479,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTENT","ordinal":70,"publisher_description":"Campus 2025 Staff Total Years Experience of Teachers with District","publisher_type":"Number","source_column":46,"source_line":2480,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST00SA","ordinal":71,"publisher_description":"Campus 2025 Staff Teacher Beginning Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2487,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST00ST","ordinal":72,"publisher_description":"Campus 2025 Staff Teacher Beginning Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2488,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST01SA","ordinal":73,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2492,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST01ST","ordinal":74,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2493,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST06SA","ordinal":75,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2497,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST06ST","ordinal":76,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2498,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST11SA","ordinal":77,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2502,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST11ST","ordinal":78,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2503,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST21SA","ordinal":79,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2507,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST21ST","ordinal":80,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2508,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST30SA","ordinal":81,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2512,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPST30ST","ordinal":82,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2513,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTOSA","ordinal":83,"publisher_description":"Campus 2025 Staff Teacher Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2520,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTTOST","ordinal":84,"publisher_description":"Campus 2025 Staff Teacher Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2521,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSUTOSA","ordinal":85,"publisher_description":"Campus 2025 Staff Support Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2525,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSUTOST","ordinal":86,"publisher_description":"Campus 2025 Staff Support Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2526,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSSTOSA","ordinal":87,"publisher_description":"Campus 2025 Staff School Admin Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2530,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSSTOST","ordinal":88,"publisher_description":"Campus 2025 Staff School Admin Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2531,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSCTOSA","ordinal":89,"publisher_description":"Campus 2025 Staff Central Admin Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2535,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSCTOST","ordinal":90,"publisher_description":"Campus 2025 Staff Central Admin Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2536,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTBIFC","ordinal":91,"publisher_description":"Campus 2025 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2576,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTBIFP","ordinal":92,"publisher_description":"Campus 2025 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2577,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTVOFC","ordinal":93,"publisher_description":"Campus 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2581,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTVOFP","ordinal":94,"publisher_description":"Campus 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2582,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTCOFC","ordinal":95,"publisher_description":"Campus 2025 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2586,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTCOFP","ordinal":96,"publisher_description":"Campus 2025 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2587,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTGIFC","ordinal":97,"publisher_description":"Campus 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2591,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTGIFP","ordinal":98,"publisher_description":"Campus 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2592,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTREFC","ordinal":99,"publisher_description":"Campus 2025 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2596,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTREFP","ordinal":100,"publisher_description":"Campus 2025 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2597,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTSPFC","ordinal":101,"publisher_description":"Campus 2025 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2601,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTSPFP","ordinal":102,"publisher_description":"Campus 2025 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2602,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTOPFC","ordinal":103,"publisher_description":"Campus 2025 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2606,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"},{"code":"CPSTOPFP","ordinal":104,"publisher_description":"Campus 2025 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2607,"source_sha256":"d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e"}],"fields":[{"code":"CAMPUS","dictionary_status":"not_applicable","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"CAMPNAME","dictionary_status":"not_applicable","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_description":null,"publisher_type":null},{"code":"CPSTTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_total_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Total Full Time Equiv Count","position":5,"publisher_description":"Campus 2025 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSUTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_support_total_full_time_equiv_count","label":"Campus 2025 Staff: Support Total Full Time Equiv Count","position":6,"publisher_description":"Campus 2025 Staff Support Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSSTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_school_admin_total_full_time_equiv_count","label":"Campus 2025 Staff: School Admin Total Full Time Equiv Count","position":7,"publisher_description":"Campus 2025 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSCTOFC","dictionary_status":"not_documented","disposition":"fact","field":"campus_2025_staff_central_admin_total_full_time_equiv_count","label":"Campus 2025 Staff: Central Admin Total Full Time Equiv Count","position":8,"publisher_description":null,"publisher_type":null},{"code":"CPSETOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_educ_aide_total_full_time_equiv_count","label":"Campus 2025 Staff: Educ Aide Total Full Time Equiv Count","position":9,"publisher_description":"Campus 2025 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTOST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_total_base_salary_total","label":"Campus 2025 Staff: Teacher Total Base Salary Total","position":10,"publisher_description":"Campus 2025 Staff Teacher Total Base Salary Total","publisher_type":"Number"},{"code":"CPSUTOST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_support_total_base_salary_total","label":"Campus 2025 Staff: Support Total Base Salary Total","position":11,"publisher_description":"Campus 2025 Staff Support Total Base Salary Total","publisher_type":"Number"},{"code":"CPSSTOST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_school_admin_total_base_salary_total","label":"Campus 2025 Staff: School Admin Total Base Salary Total","position":12,"publisher_description":"Campus 2025 Staff School Admin Total Base Salary Total","publisher_type":"Number"},{"code":"CPST00FC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_beginning_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Beginning Full Time Equiv Count","position":13,"publisher_description":"Campus 2025 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST01FC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_1_5_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 1-5 Years Full Time Equiv Count","position":14,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST06FC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_6_10_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 6-10 Years Full Time Equiv Count","position":15,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST11FC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_11_20_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 11-20 Years Full Time Equiv Count","position":16,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST21FC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_21_30_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher 21-30 Years Full Time Equiv Count","position":17,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST30FC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_gt_30_years_full_time_equiv_count","label":"Campus 2025 Staff: Teacher > 30 Years Full Time Equiv Count","position":18,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"CPST00ST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_beginning_base_salary_total","label":"Campus 2025 Staff: Teacher Beginning Base Salary Total","position":19,"publisher_description":"Campus 2025 Staff Teacher Beginning Base Salary Total","publisher_type":"Number"},{"code":"CPST01ST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_1_5_years_base_salary_total","label":"Campus 2025 Staff: Teacher 1-5 Years Base Salary Total","position":20,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST06ST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_6_10_years_base_salary_total","label":"Campus 2025 Staff: Teacher 6-10 Years Base Salary Total","position":21,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST11ST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_11_20_years_base_salary_total","label":"Campus 2025 Staff: Teacher 11-20 Years Base Salary Total","position":22,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST21ST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_21_30_years_base_salary_total","label":"Campus 2025 Staff: Teacher 21-30 Years Base Salary Total","position":23,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number"},{"code":"CPST30ST","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_gt_30_years_base_salary_total","label":"Campus 2025 Staff: Teacher > 30 Years Base Salary Total","position":24,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number"},{"code":"CPSTNOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_no_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher No Degree Full Time Equiv Count","position":25,"publisher_description":"Campus 2025 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBAFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_ba_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher BA Degree Full Time Equiv Count","position":26,"publisher_description":"Campus 2025 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTMSFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_ms_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher MS Degree Full Time Equiv Count","position":27,"publisher_description":"Campus 2025 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTPHFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_ph_degree_full_time_equiv_count","label":"Campus 2025 Staff: Teacher PH Degree Full Time Equiv Count","position":28,"publisher_description":"Campus 2025 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSPTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_professional_total_full_time_equiv_count","label":"Campus 2025 Staff: Professional Total Full Time Equiv Count","position":29,"publisher_description":"Campus 2025 Staff Professional Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSATOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_all_staff_total_full_time_equiv_count","label":"Campus 2025 Staff: All Staff Total Full Time Equiv Count","position":30,"publisher_description":"Campus 2025 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSRTOPC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_counselor_total_part_time_equiv_count","label":"Campus 2025 Staff: Counselor Total Part Time Equiv Count","position":31,"publisher_description":"Campus 2025 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number"},{"code":"CPSRTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_counselor_total_full_time_equiv_count","label":"Campus 2025 Staff: Counselor Total Full Time Equiv Count","position":32,"publisher_description":"Campus 2025 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSBTOPC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_librarian_total_part_time_equiv_count","label":"Campus 2025 Staff: Librarian Total Part Time Equiv Count","position":33,"publisher_description":"Campus 2025 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number"},{"code":"CPSBTOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_librarian_total_full_time_equiv_count","label":"Campus 2025 Staff: Librarian Total Full Time Equiv Count","position":34,"publisher_description":"Campus 2025 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSUTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_support_total_base_salary_average","label":"Campus 2025 Staff: Support Total Base Salary Average","position":35,"publisher_description":"Campus 2025 Staff Support Total Base Salary Average","publisher_type":"Number"},{"code":"CPSSTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_school_admin_total_base_salary_average","label":"Campus 2025 Staff: School Admin Total Base Salary Average","position":36,"publisher_description":"Campus 2025 Staff School Admin Total Base Salary Average","publisher_type":"Number"},{"code":"CPSCTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_central_admin_total_base_salary_average","label":"Campus 2025 Staff: Central Admin Total Base Salary Average","position":37,"publisher_description":"Campus 2025 Staff Central Admin Total Base Salary Average","publisher_type":"Number"},{"code":"CPSTTOSA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_total_base_salary_average","label":"Campus 2025 Staff: Teacher Total Base Salary Average","position":38,"publisher_description":"Campus 2025 Staff Teacher Total Base Salary Average","publisher_type":"Number"},{"code":"CPST00SA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_beginning_base_salary_average","label":"Campus 2025 Staff: Teacher Beginning Base Salary Average","position":39,"publisher_description":"Campus 2025 Staff Teacher Beginning Base Salary Average","publisher_type":"Number"},{"code":"CPST01SA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_1_5_years_base_salary_average","label":"Campus 2025 Staff: Teacher 1-5 Years Base Salary Average","position":40,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST06SA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_6_10_years_base_salary_average","label":"Campus 2025 Staff: Teacher 6-10 Years Base Salary Average","position":41,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST11SA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_11_20_years_base_salary_average","label":"Campus 2025 Staff: Teacher 11-20 Years Base Salary Average","position":42,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST21SA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_21_30_years_base_salary_average","label":"Campus 2025 Staff: Teacher 21-30 Years Base Salary Average","position":43,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number"},{"code":"CPST30SA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_gt_30_years_base_salary_average","label":"Campus 2025 Staff: Teacher > 30 Years Base Salary Average","position":44,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number"},{"code":"CPSTINFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_american_indian_full_time_equiv_count","label":"Campus 2025 Staff: Teacher American Indian Full Time Equiv Count","position":45,"publisher_description":"Campus 2025 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTPIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_pacific_islander_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Pacific Islander Full Time Equiv Count","position":46,"publisher_description":"Campus 2025 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTASFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_asian_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Asian Full Time Equiv Count","position":47,"publisher_description":"Campus 2025 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBLFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_african_american_full_time_equiv_count","label":"Campus 2025 Staff: Teacher African American Full Time Equiv Count","position":48,"publisher_description":"Campus 2025 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTHIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_hispanic_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Hispanic Full Time Equiv Count","position":49,"publisher_description":"Campus 2025 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTWHFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_white_full_time_equiv_count","label":"Campus 2025 Staff: Teacher White Full Time Equiv Count","position":50,"publisher_description":"Campus 2025 Staff Teacher White Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTWFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_two_or_more_races_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Two or more races Full Time Equiv Count","position":51,"publisher_description":"Campus 2025 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTMAFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_male_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Male Full Time Equiv Count","position":52,"publisher_description":"Campus 2025 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTFEFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_female_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Female Full Time Equiv Count","position":53,"publisher_description":"Campus 2025 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTTENA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_average_years_experience_of_teachers_with_district","label":"Campus 2025 Staff: Average Years Experience of Teachers with District","position":54,"publisher_description":"Campus 2025 Staff Average Years Experience of Teachers with District","publisher_type":"Number"},{"code":"CPSTEXPA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_experience_average","label":"Campus 2025 Staff: Teacher Experience Average","position":55,"publisher_description":"Campus 2025 Staff Teacher Experience Average","publisher_type":"Number"},{"code":"CPSTREFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_regular_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Regular Program Full Time Equiv Count","position":56,"publisher_description":"Campus 2025 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTVOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":57,"publisher_description":"Campus 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTBIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_bilingual_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Bilingual Program Full Time Equiv Count","position":58,"publisher_description":"Campus 2025 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTCOFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_compensatory_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Compensatory Program Full Time Equiv Count","position":59,"publisher_description":"Campus 2025 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTGIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":60,"publisher_description":"Campus 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTSPFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_special_education_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Special Education Full Time Equiv Count","position":61,"publisher_description":"Campus 2025 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTOPFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_other_full_time_equiv_count","label":"Campus 2025 Staff: Teacher Other Full Time Equiv Count","position":62,"publisher_description":"Campus 2025 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSHEXPA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_principal_experience_average","label":"Campus 2025 Staff: Principal Experience Average","position":63,"publisher_description":"Campus 2025 Staff Principal Experience Average","publisher_type":"Number"},{"code":"CPSHTENA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_average_years_experience_of_principals_with_district","label":"Campus 2025 Staff: Average Years Experience of Principals with District","position":64,"publisher_description":"Campus 2025 Staff Average Years Experience of Principals with District","publisher_type":"Number"},{"code":"CPSLEXPA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_assistant_principal_experience_average","label":"Campus 2025 Staff: Assistant Principal Experience Average","position":65,"publisher_description":"Campus 2025 Staff Assistant Principal Experience Average","publisher_type":"Number"},{"code":"CPSLTENA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_average_years_experience_of_assistant_principals_with_district","label":"Campus 2025 Staff: Average Years Experience of Assistant Principals with District","position":66,"publisher_description":"Campus 2025 Staff Average Years Experience of Assistant Principals with District","publisher_type":"Number"},{"code":"CPSHEXPT","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_principal_experience_total","label":"Campus 2025 Staff: Principal Experience Total","position":67,"publisher_description":"Campus 2025 Staff Principal Experience Total","publisher_type":"Number"},{"code":"CPSHTENT","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_total_years_experience_of_principals_with_district","label":"Campus 2025 Staff: Total Years Experience of Principals with District","position":68,"publisher_description":"Campus 2025 Staff Total Years Experience of Principals with District","publisher_type":"Number"},{"code":"CPSLEXPT","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_assistant_principal_experience_total","label":"Campus 2025 Staff: Assistant Principal Experience Total","position":69,"publisher_description":"Campus 2025 Staff Assistant Principal Experience Total","publisher_type":"Number"},{"code":"CPSLTENT","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_total_years_experience_of_assistant_principals_with_district","label":"Campus 2025 Staff: Total Years Experience of Assistant Principals with District","position":70,"publisher_description":"Campus 2025 Staff Total Years Experience of Assistant Principals with District","publisher_type":"Number"},{"code":"CPSAMIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_all_staff_minority_full_time_equiv_count","label":"Campus 2025 Staff: All Staff Minority Full Time Equiv Count","position":71,"publisher_description":"Campus 2025 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number"},{"code":"CPSTEXPT","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_experience_total","label":"Campus 2025 Staff: Teacher Experience Total","position":72,"publisher_description":"Campus 2025 Staff Teacher Experience Total","publisher_type":"Number"},{"code":"CPSTTENT","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_total_years_experience_of_teachers_with_district","label":"Campus 2025 Staff: Total Years Experience of Teachers with District","position":73,"publisher_description":"Campus 2025 Staff Total Years Experience of Teachers with District","publisher_type":"Number"},{"code":"CPSTTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_total_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Total Full Time Equiv Percent","position":74,"publisher_description":"Campus 2025 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSUTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_support_total_full_time_equiv_percent","label":"Campus 2025 Staff: Support Total Full Time Equiv Percent","position":75,"publisher_description":"Campus 2025 Staff Support Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSSTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_school_admin_total_full_time_equiv_percent","label":"Campus 2025 Staff: School Admin Total Full Time Equiv Percent","position":76,"publisher_description":"Campus 2025 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSETOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_educ_aide_total_full_time_equiv_percent","label":"Campus 2025 Staff: Educ Aide Total Full Time Equiv Percent","position":77,"publisher_description":"Campus 2025 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSPTOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_professional_total_full_time_equiv_percent","label":"Campus 2025 Staff: Professional Total Full Time Equiv Percent","position":78,"publisher_description":"Campus 2025 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSAMIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_all_staff_minority_full_time_equiv_percent","label":"Campus 2025 Staff: All Staff Minority Full Time Equiv Percent","position":79,"publisher_description":"Campus 2025 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST00FP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_beginning_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Beginning Full Time Equiv Percent","position":80,"publisher_description":"Campus 2025 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST01FP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_1_5_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":81,"publisher_description":"Campus 2025 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST06FP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_6_10_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":82,"publisher_description":"Campus 2025 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST11FP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_11_20_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":83,"publisher_description":"Campus 2025 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST21FP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_21_30_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":84,"publisher_description":"Campus 2025 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPST30FP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_gt_30_years_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher > 30 Years Full Time Equiv Percent","position":85,"publisher_description":"Campus 2025 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTREFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_regular_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Regular Program Full Time Equiv Percent","position":86,"publisher_description":"Campus 2025 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTVOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":87,"publisher_description":"Campus 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_bilingual_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":88,"publisher_description":"Campus 2025 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTCOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_compensatory_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":89,"publisher_description":"Campus 2025 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTGIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":90,"publisher_description":"Campus 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTSPFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_special_education_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Special Education Full Time Equiv Percent","position":91,"publisher_description":"Campus 2025 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTOPFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_other_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Other Full Time Equiv Percent","position":92,"publisher_description":"Campus 2025 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTNOFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_no_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher No Degree Full Time Equiv Percent","position":93,"publisher_description":"Campus 2025 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBAFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_ba_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher BA Degree Full Time Equiv Percent","position":94,"publisher_description":"Campus 2025 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTMSFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_ms_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher MS Degree Full Time Equiv Percent","position":95,"publisher_description":"Campus 2025 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTPHFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_ph_degree_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher PH Degree Full Time Equiv Percent","position":96,"publisher_description":"Campus 2025 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTWHFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_white_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher White Full Time Equiv Percent","position":97,"publisher_description":"Campus 2025 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTBLFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_african_american_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher African American Full Time Equiv Percent","position":98,"publisher_description":"Campus 2025 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTHIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_hispanic_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Hispanic Full Time Equiv Percent","position":99,"publisher_description":"Campus 2025 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTPIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_pacific_islander_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":100,"publisher_description":"Campus 2025 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTINFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_american_indian_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher American Indian Full Time Equiv Percent","position":101,"publisher_description":"Campus 2025 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTASFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_asian_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Asian Full Time Equiv Percent","position":102,"publisher_description":"Campus 2025 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTTWFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Two or more races Full Time Equiv Percent","position":103,"publisher_description":"Campus 2025 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTMAFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_male_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Male Full Time Equiv Percent","position":104,"publisher_description":"Campus 2025 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTFEFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_female_full_time_equiv_percent","label":"Campus 2025 Staff: Teacher Female Full Time Equiv Percent","position":105,"publisher_description":"Campus 2025 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number"},{"code":"CPSTKIDR","dictionary_status":"documented","disposition":"fact","field":"campus_2025_staff_teacher_student_ratio","label":"Campus 2025 Staff: Teacher Student Ratio","position":106,"publisher_description":"Campus 2025 Staff Teacher Student Ratio","publisher_type":"Number"}],"input_sha256":"ed29852dd7d7925963413b41c81a36508ccad83a4109a0aeebfa720bf90ff6ea","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":9086},"metric_period":{"kind":"unknown"},"source_schema_sha256":"3e6d490e85b3fb720e4089273f86913876f8545900935ed1de8873c256a73bc5","table":"staff_profile"}]},{"dataset":"district_tapr_staff_profile","edition":"2025","source_only":true,"tables":[{"dictionary_records":[{"code":"DPSATOFC","ordinal":1,"publisher_description":"District 2025 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number","source_column":65,"source_line":2253,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSPTOFC","ordinal":2,"publisher_description":"District 2025 Staff Professional Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2258,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSPTOFP","ordinal":3,"publisher_description":"District 2025 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2259,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTOFC","ordinal":4,"publisher_description":"District 2025 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2263,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTOFP","ordinal":5,"publisher_description":"District 2025 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2264,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSUTOFC","ordinal":6,"publisher_description":"District 2025 Staff Support Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2268,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSUTOFP","ordinal":7,"publisher_description":"District 2025 Staff Support Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2269,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSSTOFC","ordinal":8,"publisher_description":"District 2025 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2273,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSSTOFP","ordinal":9,"publisher_description":"District 2025 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2274,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSCTOFC","ordinal":10,"publisher_description":"District 2025 Staff Central Admin Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2278,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSCTOFP","ordinal":11,"publisher_description":"District 2025 Staff Central Admin Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2279,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSETOFC","ordinal":12,"publisher_description":"District 2025 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2283,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSETOFP","ordinal":13,"publisher_description":"District 2025 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2284,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSXTOFC","ordinal":14,"publisher_description":"District 2025 Staff Auxiliary Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2288,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSXTOFP","ordinal":15,"publisher_description":"District 2025 Staff Auxiliary Total Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2289,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSBTOFC","ordinal":16,"publisher_description":"District 2025 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2296,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSBTOPC","ordinal":17,"publisher_description":"District 2025 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2301,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSRTOFC","ordinal":18,"publisher_description":"District 2025 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2306,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSRTOPC","ordinal":19,"publisher_description":"District 2025 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2311,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSAMIFC","ordinal":20,"publisher_description":"District 2025 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number","source_column":65,"source_line":2316,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSAMIFP","ordinal":21,"publisher_description":"District 2025 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number","source_column":65,"source_line":2317,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTBLFC","ordinal":22,"publisher_description":"District 2025 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2324,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTBLFP","ordinal":23,"publisher_description":"District 2025 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2325,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTHIFC","ordinal":24,"publisher_description":"District 2025 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2329,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTHIFP","ordinal":25,"publisher_description":"District 2025 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2330,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTWHFC","ordinal":26,"publisher_description":"District 2025 Staff Teacher White Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2334,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTWHFP","ordinal":27,"publisher_description":"District 2025 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2335,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTINFC","ordinal":28,"publisher_description":"District 2025 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2339,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTINFP","ordinal":29,"publisher_description":"District 2025 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2340,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTASFC","ordinal":30,"publisher_description":"District 2025 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2344,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTASFP","ordinal":31,"publisher_description":"District 2025 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2345,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTPIFC","ordinal":32,"publisher_description":"District 2025 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2349,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTPIFP","ordinal":33,"publisher_description":"District 2025 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2350,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTWFC","ordinal":34,"publisher_description":"District 2025 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2354,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTWFP","ordinal":35,"publisher_description":"District 2025 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2355,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTMAFC","ordinal":36,"publisher_description":"District 2025 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2362,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTMAFP","ordinal":37,"publisher_description":"District 2025 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2363,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTFEFC","ordinal":38,"publisher_description":"District 2025 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2367,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTFEFP","ordinal":39,"publisher_description":"District 2025 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2368,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTNOFC","ordinal":40,"publisher_description":"District 2025 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2375,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTNOFP","ordinal":41,"publisher_description":"District 2025 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2376,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTBAFC","ordinal":42,"publisher_description":"District 2025 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2380,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTBAFP","ordinal":43,"publisher_description":"District 2025 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2381,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTMSFC","ordinal":44,"publisher_description":"District 2025 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2385,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTMSFP","ordinal":45,"publisher_description":"District 2025 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2386,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTPHFC","ordinal":46,"publisher_description":"District 2025 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2390,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTPHFP","ordinal":47,"publisher_description":"District 2025 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2391,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST00FC","ordinal":48,"publisher_description":"District 2025 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2398,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST00FP","ordinal":49,"publisher_description":"District 2025 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2399,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST01FC","ordinal":50,"publisher_description":"District 2025 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2403,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST01FP","ordinal":51,"publisher_description":"District 2025 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2404,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST06FC","ordinal":52,"publisher_description":"District 2025 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2408,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST06FP","ordinal":53,"publisher_description":"District 2025 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2409,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST11FC","ordinal":54,"publisher_description":"District 2025 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2413,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST11FP","ordinal":55,"publisher_description":"District 2025 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2414,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST21FC","ordinal":56,"publisher_description":"District 2025 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2418,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST21FP","ordinal":57,"publisher_description":"District 2025 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2419,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST30FC","ordinal":58,"publisher_description":"District 2025 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2423,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST30FP","ordinal":59,"publisher_description":"District 2025 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2424,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTKIDR","ordinal":60,"publisher_description":"District 2025 Staff Teacher Student Ratio","publisher_type":"Number","source_column":46,"source_line":2428,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSHEXPA","ordinal":61,"publisher_description":"District 2025 Staff Principal Experience Average","publisher_type":"Number","source_column":46,"source_line":2460,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSHEXPT","ordinal":62,"publisher_description":"District 2025 Staff Principal Experience Total","publisher_type":"Number","source_column":46,"source_line":2461,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSHTENA","ordinal":63,"publisher_description":"District 2025 Staff Average Years Experience of Principals with District","publisher_type":"Number","source_column":46,"source_line":2466,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSHTENT","ordinal":64,"publisher_description":"District 2025 Staff Total Years Experience of Principals with District","publisher_type":"Number","source_column":46,"source_line":2467,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSLEXPA","ordinal":65,"publisher_description":"District 2025 Staff Assistant Principal Experience Average","publisher_type":"Number","source_column":46,"source_line":2472,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSLEXPT","ordinal":66,"publisher_description":"District 2025 Staff Assistant Principal Experience Total","publisher_type":"Number","source_column":46,"source_line":2473,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSLTENA","ordinal":67,"publisher_description":"District 2025 Staff Average Years Experience of Assistant Principals with District","publisher_type":"Number","source_column":46,"source_line":2478,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSLTENT","ordinal":68,"publisher_description":"District 2025 Staff Total Years Experience of Assistant Principals with District","publisher_type":"Number","source_column":46,"source_line":2479,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTEXPA","ordinal":69,"publisher_description":"District 2025 Staff Teacher Experience Average","publisher_type":"Number","source_column":46,"source_line":2484,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTEXPT","ordinal":70,"publisher_description":"District 2025 Staff Teacher Experience Total","publisher_type":"Number","source_column":46,"source_line":2485,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTENA","ordinal":71,"publisher_description":"District 2025 Staff Average Years Experience of Teachers with District","publisher_type":"Number","source_column":46,"source_line":2490,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTENT","ordinal":72,"publisher_description":"District 2025 Staff Total Years Experience of Teachers with District","publisher_type":"Number","source_column":46,"source_line":2491,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST00SA","ordinal":73,"publisher_description":"District 2025 Staff Teacher Beginning Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2499,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST00ST","ordinal":74,"publisher_description":"District 2025 Staff Teacher Beginning Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2500,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST01SA","ordinal":75,"publisher_description":"District 2025 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2505,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST01ST","ordinal":76,"publisher_description":"District 2025 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2506,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST06SA","ordinal":77,"publisher_description":"District 2025 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2511,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST06ST","ordinal":78,"publisher_description":"District 2025 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2512,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST11SA","ordinal":79,"publisher_description":"District 2025 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2517,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST11ST","ordinal":80,"publisher_description":"District 2025 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2518,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST21SA","ordinal":81,"publisher_description":"District 2025 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2523,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST21ST","ordinal":82,"publisher_description":"District 2025 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2524,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST30SA","ordinal":83,"publisher_description":"District 2025 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2529,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPST30ST","ordinal":84,"publisher_description":"District 2025 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2530,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTOSA","ordinal":85,"publisher_description":"District 2025 Staff Teacher Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2538,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTTOST","ordinal":86,"publisher_description":"District 2025 Staff Teacher Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2539,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSUTOSA","ordinal":87,"publisher_description":"District 2025 Staff Support Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2544,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSUTOST","ordinal":88,"publisher_description":"District 2025 Staff Support Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2545,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSSTOSA","ordinal":89,"publisher_description":"District 2025 Staff School Admin Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2550,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSSTOST","ordinal":90,"publisher_description":"District 2025 Staff School Admin Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2551,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSCTOSA","ordinal":91,"publisher_description":"District 2025 Staff Central Admin Total Base Salary Average","publisher_type":"Number","source_column":46,"source_line":2556,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSCTOST","ordinal":92,"publisher_description":"District 2025 Staff Central Admin Total Base Salary Total","publisher_type":"Number","source_column":46,"source_line":2557,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTURNR","ordinal":93,"publisher_description":"District 2025 Staff Teacher Turnover Ratio","publisher_type":"Number","source_column":46,"source_line":2568,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTURNN","ordinal":94,"publisher_description":"District 2025 Staff Teacher Turnover Numerator","publisher_type":"Number","source_column":46,"source_line":2569,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTURND","ordinal":95,"publisher_description":"District 2025 Staff Teacher Turnover Denominator","publisher_type":"Number","source_column":46,"source_line":2570,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSECOFC","ordinal":96,"publisher_description":"District 2025 Staff SSA Educational Aides Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2578,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSETOFC","ordinal":97,"publisher_description":"District 2025 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2584,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSXTOFC","ordinal":98,"publisher_description":"District 2025 Staff Auxiliary Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2590,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSOTOFC","ordinal":99,"publisher_description":"District 2025 Staff Contract Serv Total Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2596,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DRECHCNT","ordinal":100,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Recognized Head Count","publisher_type":"Number","source_column":46,"source_line":2633,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DRECAVGP","ordinal":101,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Recognized Payout Average","publisher_type":"Number","source_column":46,"source_line":2634,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DEXPHCNT","ordinal":102,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Exemplary Head Count","publisher_type":"Number","source_column":46,"source_line":2638,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DEXPAVGP","ordinal":103,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Exemplary Payout Average","publisher_type":"Number","source_column":46,"source_line":2639,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DMSTHCNT","ordinal":104,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Master Head Count","publisher_type":"Number","source_column":46,"source_line":2643,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DMSTAVGP","ordinal":105,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Master Payout Average","publisher_type":"Number","source_column":46,"source_line":2644,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTBIFC","ordinal":106,"publisher_description":"District 2025 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2679,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTBIFP","ordinal":107,"publisher_description":"District 2025 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2680,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTVOFC","ordinal":108,"publisher_description":"District 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2684,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTVOFP","ordinal":109,"publisher_description":"District 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2685,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTCOFC","ordinal":110,"publisher_description":"District 2025 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2689,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTCOFP","ordinal":111,"publisher_description":"District 2025 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2690,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTGIFC","ordinal":112,"publisher_description":"District 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2694,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTGIFP","ordinal":113,"publisher_description":"District 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2695,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTREFC","ordinal":114,"publisher_description":"District 2025 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2699,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTREFP","ordinal":115,"publisher_description":"District 2025 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2700,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTSPFC","ordinal":116,"publisher_description":"District 2025 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2704,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTSPFP","ordinal":117,"publisher_description":"District 2025 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2705,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTOPFC","ordinal":118,"publisher_description":"District 2025 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number","source_column":46,"source_line":2709,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"},{"code":"DPSTOPFP","ordinal":119,"publisher_description":"District 2025 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number","source_column":46,"source_line":2710,"source_sha256":"fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6"}],"fields":[{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DPSTTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_total_full_time_equiv_count","label":"District 2025 Staff: Teacher Total Full Time Equiv Count","position":3,"publisher_description":"District 2025 Staff Teacher Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSUTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_support_total_full_time_equiv_count","label":"District 2025 Staff: Support Total Full Time Equiv Count","position":4,"publisher_description":"District 2025 Staff Support Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSSTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_school_admin_total_full_time_equiv_count","label":"District 2025 Staff: School Admin Total Full Time Equiv Count","position":5,"publisher_description":"District 2025 Staff School Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSCTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_central_admin_total_full_time_equiv_count","label":"District 2025 Staff: Central Admin Total Full Time Equiv Count","position":6,"publisher_description":"District 2025 Staff Central Admin Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSETOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_educ_aide_total_full_time_equiv_count","label":"District 2025 Staff: Educ Aide Total Full Time Equiv Count","position":7,"publisher_description":"District 2025 Staff Educ Aide Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTTOST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_total_base_salary_total","label":"District 2025 Staff: Teacher Total Base Salary Total","position":8,"publisher_description":"District 2025 Staff Teacher Total Base Salary Total","publisher_type":"Number"},{"code":"DPSUTOST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_support_total_base_salary_total","label":"District 2025 Staff: Support Total Base Salary Total","position":9,"publisher_description":"District 2025 Staff Support Total Base Salary Total","publisher_type":"Number"},{"code":"DPSSTOST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_school_admin_total_base_salary_total","label":"District 2025 Staff: School Admin Total Base Salary Total","position":10,"publisher_description":"District 2025 Staff School Admin Total Base Salary Total","publisher_type":"Number"},{"code":"DPST00FC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_beginning_full_time_equiv_count","label":"District 2025 Staff: Teacher Beginning Full Time Equiv Count","position":11,"publisher_description":"District 2025 Staff Teacher Beginning Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST01FC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_1_5_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 1-5 Years Full Time Equiv Count","position":12,"publisher_description":"District 2025 Staff Teacher 1-5 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST06FC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_6_10_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 6-10 Years Full Time Equiv Count","position":13,"publisher_description":"District 2025 Staff Teacher 6-10 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST11FC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_11_20_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 11-20 Years Full Time Equiv Count","position":14,"publisher_description":"District 2025 Staff Teacher 11-20 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST21FC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_21_30_years_full_time_equiv_count","label":"District 2025 Staff: Teacher 21-30 Years Full Time Equiv Count","position":15,"publisher_description":"District 2025 Staff Teacher 21-30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST30FC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_gt_30_years_full_time_equiv_count","label":"District 2025 Staff: Teacher > 30 Years Full Time Equiv Count","position":16,"publisher_description":"District 2025 Staff Teacher > 30 Years Full Time Equiv Count","publisher_type":"Number"},{"code":"DPST00ST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_beginning_base_salary_total","label":"District 2025 Staff: Teacher Beginning Base Salary Total","position":17,"publisher_description":"District 2025 Staff Teacher Beginning Base Salary Total","publisher_type":"Number"},{"code":"DPST01ST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_1_5_years_base_salary_total","label":"District 2025 Staff: Teacher 1-5 Years Base Salary Total","position":18,"publisher_description":"District 2025 Staff Teacher 1-5 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST06ST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_6_10_years_base_salary_total","label":"District 2025 Staff: Teacher 6-10 Years Base Salary Total","position":19,"publisher_description":"District 2025 Staff Teacher 6-10 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST11ST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_11_20_years_base_salary_total","label":"District 2025 Staff: Teacher 11-20 Years Base Salary Total","position":20,"publisher_description":"District 2025 Staff Teacher 11-20 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST21ST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_21_30_years_base_salary_total","label":"District 2025 Staff: Teacher 21-30 Years Base Salary Total","position":21,"publisher_description":"District 2025 Staff Teacher 21-30 Years Base Salary Total","publisher_type":"Number"},{"code":"DPST30ST","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_gt_30_years_base_salary_total","label":"District 2025 Staff: Teacher > 30 Years Base Salary Total","position":22,"publisher_description":"District 2025 Staff Teacher > 30 Years Base Salary Total","publisher_type":"Number"},{"code":"DPSTNOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_no_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher No Degree Full Time Equiv Count","position":23,"publisher_description":"District 2025 Staff Teacher No Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBAFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_ba_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher BA Degree Full Time Equiv Count","position":24,"publisher_description":"District 2025 Staff Teacher BA Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTMSFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_ms_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher MS Degree Full Time Equiv Count","position":25,"publisher_description":"District 2025 Staff Teacher MS Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTPHFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_ph_degree_full_time_equiv_count","label":"District 2025 Staff: Teacher PH Degree Full Time Equiv Count","position":26,"publisher_description":"District 2025 Staff Teacher PH Degree Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSECOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_ssa_educational_aides_full_time_equiv_count","label":"District 2025 Staff: SSA Educational Aides Full Time Equiv Count","position":27,"publisher_description":"District 2025 Staff SSA Educational Aides Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSPTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_professional_total_full_time_equiv_count","label":"District 2025 Staff: Professional Total Full Time Equiv Count","position":28,"publisher_description":"District 2025 Staff Professional Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSRTOPC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_counselor_total_part_time_equiv_count","label":"District 2025 Staff: Counselor Total Part Time Equiv Count","position":29,"publisher_description":"District 2025 Staff Counselor Total Part Time Equiv Count","publisher_type":"Number"},{"code":"DPSRTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_counselor_total_full_time_equiv_count","label":"District 2025 Staff: Counselor Total Full Time Equiv Count","position":30,"publisher_description":"District 2025 Staff Counselor Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSBTOPC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_librarian_total_part_time_equiv_count","label":"District 2025 Staff: Librarian Total Part Time Equiv Count","position":31,"publisher_description":"District 2025 Staff Librarian Total Part Time Equiv Count","publisher_type":"Number"},{"code":"DPSBTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_librarian_total_full_time_equiv_count","label":"District 2025 Staff: Librarian Total Full Time Equiv Count","position":32,"publisher_description":"District 2025 Staff Librarian Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSXTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_auxiliary_total_full_time_equiv_count","label":"District 2025 Staff: Auxiliary Total Full Time Equiv Count","position":33,"publisher_description":"District 2025 Staff Auxiliary Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSATOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_all_staff_total_full_time_equiv_count","label":"District 2025 Staff: All Staff Total Full Time Equiv Count","position":34,"publisher_description":"District 2025 Staff All Staff Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSOTOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_contract_serv_total_full_time_equiv_count","label":"District 2025 Staff: Contract Serv Total Full Time Equiv Count","position":35,"publisher_description":"District 2025 Staff Contract Serv Total Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTINFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_american_indian_full_time_equiv_count","label":"District 2025 Staff: Teacher American Indian Full Time Equiv Count","position":36,"publisher_description":"District 2025 Staff Teacher American Indian Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTPIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_pacific_islander_full_time_equiv_count","label":"District 2025 Staff: Teacher Pacific Islander Full Time Equiv Count","position":37,"publisher_description":"District 2025 Staff Teacher Pacific Islander Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTASFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_asian_full_time_equiv_count","label":"District 2025 Staff: Teacher Asian Full Time Equiv Count","position":38,"publisher_description":"District 2025 Staff Teacher Asian Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBLFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_african_american_full_time_equiv_count","label":"District 2025 Staff: Teacher African American Full Time Equiv Count","position":39,"publisher_description":"District 2025 Staff Teacher African American Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTHIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_hispanic_full_time_equiv_count","label":"District 2025 Staff: Teacher Hispanic Full Time Equiv Count","position":40,"publisher_description":"District 2025 Staff Teacher Hispanic Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTWHFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_white_full_time_equiv_count","label":"District 2025 Staff: Teacher White Full Time Equiv Count","position":41,"publisher_description":"District 2025 Staff Teacher White Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTTWFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_two_or_more_races_full_time_equiv_count","label":"District 2025 Staff: Teacher Two or more races Full Time Equiv Count","position":42,"publisher_description":"District 2025 Staff Teacher Two or more races Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTMAFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_male_full_time_equiv_count","label":"District 2025 Staff: Teacher Male Full Time Equiv Count","position":43,"publisher_description":"District 2025 Staff Teacher Male Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTFEFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_female_full_time_equiv_count","label":"District 2025 Staff: Teacher Female Full Time Equiv Count","position":44,"publisher_description":"District 2025 Staff Teacher Female Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTREFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_regular_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Regular Program Full Time Equiv Count","position":45,"publisher_description":"District 2025 Staff Teacher Regular Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTVOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_count","label":"District 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Count","position":46,"publisher_description":"District 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTBIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_bilingual_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Bilingual Program Full Time Equiv Count","position":47,"publisher_description":"District 2025 Staff Teacher Bilingual Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTCOFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_compensatory_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Compensatory Program Full Time Equiv Count","position":48,"publisher_description":"District 2025 Staff Teacher Compensatory Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTGIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_count","label":"District 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Count","position":49,"publisher_description":"District 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTSPFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_special_education_full_time_equiv_count","label":"District 2025 Staff: Teacher Special Education Full Time Equiv Count","position":50,"publisher_description":"District 2025 Staff Teacher Special Education Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTOPFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_other_full_time_equiv_count","label":"District 2025 Staff: Teacher Other Full Time Equiv Count","position":51,"publisher_description":"District 2025 Staff Teacher Other Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTURNN","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_turnover_numerator","label":"District 2025 Staff: Teacher Turnover Numerator","position":52,"publisher_description":"District 2025 Staff Teacher Turnover Numerator","publisher_type":"Number"},{"code":"DPSTURND","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_turnover_denominator","label":"District 2025 Staff: Teacher Turnover Denominator","position":53,"publisher_description":"District 2025 Staff Teacher Turnover Denominator","publisher_type":"Number"},{"code":"DPSTURNR","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_turnover_ratio","label":"District 2025 Staff: Teacher Turnover Ratio","position":54,"publisher_description":"District 2025 Staff Teacher Turnover Ratio","publisher_type":"Number"},{"code":"DPSTTENA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_average_years_experience_of_teachers_with_district","label":"District 2025 Staff: Average Years Experience of Teachers with District","position":55,"publisher_description":"District 2025 Staff Average Years Experience of Teachers with District","publisher_type":"Number"},{"code":"DPSTEXPA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_experience_average","label":"District 2025 Staff: Teacher Experience Average","position":56,"publisher_description":"District 2025 Staff Teacher Experience Average","publisher_type":"Number"},{"code":"DPSHEXPA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_principal_experience_average","label":"District 2025 Staff: Principal Experience Average","position":57,"publisher_description":"District 2025 Staff Principal Experience Average","publisher_type":"Number"},{"code":"DPSHTENA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_average_years_experience_of_principals_with_district","label":"District 2025 Staff: Average Years Experience of Principals with District","position":58,"publisher_description":"District 2025 Staff Average Years Experience of Principals with District","publisher_type":"Number"},{"code":"DPSLEXPA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_assistant_principal_experience_average","label":"District 2025 Staff: Assistant Principal Experience Average","position":59,"publisher_description":"District 2025 Staff Assistant Principal Experience Average","publisher_type":"Number"},{"code":"DPSLTENA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_average_years_experience_of_assistant_principals_with_district","label":"District 2025 Staff: Average Years Experience of Assistant Principals with District","position":60,"publisher_description":"District 2025 Staff Average Years Experience of Assistant Principals with District","publisher_type":"Number"},{"code":"DPSHEXPT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_principal_experience_total","label":"District 2025 Staff: Principal Experience Total","position":61,"publisher_description":"District 2025 Staff Principal Experience Total","publisher_type":"Number"},{"code":"DPSHTENT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_total_years_experience_of_principals_with_district","label":"District 2025 Staff: Total Years Experience of Principals with District","position":62,"publisher_description":"District 2025 Staff Total Years Experience of Principals with District","publisher_type":"Number"},{"code":"DPSLEXPT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_assistant_principal_experience_total","label":"District 2025 Staff: Assistant Principal Experience Total","position":63,"publisher_description":"District 2025 Staff Assistant Principal Experience Total","publisher_type":"Number"},{"code":"DPSLTENT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_total_years_experience_of_assistant_principals_with_district","label":"District 2025 Staff: Total Years Experience of Assistant Principals with District","position":64,"publisher_description":"District 2025 Staff Total Years Experience of Assistant Principals with District","publisher_type":"Number"},{"code":"DPSAMIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_all_staff_minority_full_time_equiv_count","label":"District 2025 Staff: All Staff Minority Full Time Equiv Count","position":65,"publisher_description":"District 2025 Staff All Staff Minority Full Time Equiv Count","publisher_type":"Number"},{"code":"DPSTEXPT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_experience_total","label":"District 2025 Staff: Teacher Experience Total","position":66,"publisher_description":"District 2025 Staff Teacher Experience Total","publisher_type":"Number"},{"code":"DPSTTENT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_total_years_experience_of_teachers_with_district","label":"District 2025 Staff: Total Years Experience of Teachers with District","position":67,"publisher_description":"District 2025 Staff Total Years Experience of Teachers with District","publisher_type":"Number"},{"code":"DPSPTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_professional_total_full_time_equiv_percent","label":"District 2025 Staff: Professional Total Full Time Equiv Percent","position":68,"publisher_description":"District 2025 Staff Professional Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_total_full_time_equiv_percent","label":"District 2025 Staff: Teacher Total Full Time Equiv Percent","position":69,"publisher_description":"District 2025 Staff Teacher Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSUTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_support_total_full_time_equiv_percent","label":"District 2025 Staff: Support Total Full Time Equiv Percent","position":70,"publisher_description":"District 2025 Staff Support Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSSTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_school_admin_total_full_time_equiv_percent","label":"District 2025 Staff: School Admin Total Full Time Equiv Percent","position":71,"publisher_description":"District 2025 Staff School Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSCTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_central_admin_total_full_time_equiv_percent","label":"District 2025 Staff: Central Admin Total Full Time Equiv Percent","position":72,"publisher_description":"District 2025 Staff Central Admin Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSETOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_educ_aide_total_full_time_equiv_percent","label":"District 2025 Staff: Educ Aide Total Full Time Equiv Percent","position":73,"publisher_description":"District 2025 Staff Educ Aide Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSXTOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_auxiliary_total_full_time_equiv_percent","label":"District 2025 Staff: Auxiliary Total Full Time Equiv Percent","position":74,"publisher_description":"District 2025 Staff Auxiliary Total Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSAMIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_all_staff_minority_full_time_equiv_percent","label":"District 2025 Staff: All Staff Minority Full Time Equiv Percent","position":75,"publisher_description":"District 2025 Staff All Staff Minority Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTNOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_no_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher No Degree Full Time Equiv Percent","position":76,"publisher_description":"District 2025 Staff Teacher No Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBAFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_ba_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher BA Degree Full Time Equiv Percent","position":77,"publisher_description":"District 2025 Staff Teacher BA Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTMSFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_ms_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher MS Degree Full Time Equiv Percent","position":78,"publisher_description":"District 2025 Staff Teacher MS Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTPHFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_ph_degree_full_time_equiv_percent","label":"District 2025 Staff: Teacher PH Degree Full Time Equiv Percent","position":79,"publisher_description":"District 2025 Staff Teacher PH Degree Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST00FP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_beginning_full_time_equiv_percent","label":"District 2025 Staff: Teacher Beginning Full Time Equiv Percent","position":80,"publisher_description":"District 2025 Staff Teacher Beginning Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST01FP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_1_5_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 1-5 Years Full Time Equiv Percent","position":81,"publisher_description":"District 2025 Staff Teacher 1-5 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST06FP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_6_10_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 6-10 Years Full Time Equiv Percent","position":82,"publisher_description":"District 2025 Staff Teacher 6-10 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST11FP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_11_20_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 11-20 Years Full Time Equiv Percent","position":83,"publisher_description":"District 2025 Staff Teacher 11-20 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST21FP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_21_30_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher 21-30 Years Full Time Equiv Percent","position":84,"publisher_description":"District 2025 Staff Teacher 21-30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPST30FP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_gt_30_years_full_time_equiv_percent","label":"District 2025 Staff: Teacher > 30 Years Full Time Equiv Percent","position":85,"publisher_description":"District 2025 Staff Teacher > 30 Years Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTREFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_regular_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Regular Program Full Time Equiv Percent","position":86,"publisher_description":"District 2025 Staff Teacher Regular Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTVOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_career_and_technical_prgms_full_time_equiv_percent","label":"District 2025 Staff: Teacher Career & Technical Prgms Full Time Equiv Percent","position":87,"publisher_description":"District 2025 Staff Teacher Career & Technical Prgms Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_bilingual_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Bilingual Program Full Time Equiv Percent","position":88,"publisher_description":"District 2025 Staff Teacher Bilingual Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTCOFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_compensatory_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Compensatory Program Full Time Equiv Percent","position":89,"publisher_description":"District 2025 Staff Teacher Compensatory Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTGIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_gifted_and_talented_program_full_time_equiv_percent","label":"District 2025 Staff: Teacher Gifted & Talented Program Full Time Equiv Percent","position":90,"publisher_description":"District 2025 Staff Teacher Gifted & Talented Program Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTSPFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_special_education_full_time_equiv_percent","label":"District 2025 Staff: Teacher Special Education Full Time Equiv Percent","position":91,"publisher_description":"District 2025 Staff Teacher Special Education Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTOPFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_other_full_time_equiv_percent","label":"District 2025 Staff: Teacher Other Full Time Equiv Percent","position":92,"publisher_description":"District 2025 Staff Teacher Other Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTBLFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_african_american_full_time_equiv_percent","label":"District 2025 Staff: Teacher African American Full Time Equiv Percent","position":93,"publisher_description":"District 2025 Staff Teacher African American Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTWHFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_white_full_time_equiv_percent","label":"District 2025 Staff: Teacher White Full Time Equiv Percent","position":94,"publisher_description":"District 2025 Staff Teacher White Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTHIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_hispanic_full_time_equiv_percent","label":"District 2025 Staff: Teacher Hispanic Full Time Equiv Percent","position":95,"publisher_description":"District 2025 Staff Teacher Hispanic Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTPIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_pacific_islander_full_time_equiv_percent","label":"District 2025 Staff: Teacher Pacific Islander Full Time Equiv Percent","position":96,"publisher_description":"District 2025 Staff Teacher Pacific Islander Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTINFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_american_indian_full_time_equiv_percent","label":"District 2025 Staff: Teacher American Indian Full Time Equiv Percent","position":97,"publisher_description":"District 2025 Staff Teacher American Indian Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTASFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_asian_full_time_equiv_percent","label":"District 2025 Staff: Teacher Asian Full Time Equiv Percent","position":98,"publisher_description":"District 2025 Staff Teacher Asian Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTTWFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_two_or_more_races_full_time_equiv_percent","label":"District 2025 Staff: Teacher Two or more races Full Time Equiv Percent","position":99,"publisher_description":"District 2025 Staff Teacher Two or more races Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTMAFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_male_full_time_equiv_percent","label":"District 2025 Staff: Teacher Male Full Time Equiv Percent","position":100,"publisher_description":"District 2025 Staff Teacher Male Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTFEFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_female_full_time_equiv_percent","label":"District 2025 Staff: Teacher Female Full Time Equiv Percent","position":101,"publisher_description":"District 2025 Staff Teacher Female Full Time Equiv Percent","publisher_type":"Number"},{"code":"DPSTKIDR","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_student_ratio","label":"District 2025 Staff: Teacher Student Ratio","position":102,"publisher_description":"District 2025 Staff Teacher Student Ratio","publisher_type":"Number"},{"code":"DPST00SA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_beginning_base_salary_average","label":"District 2025 Staff: Teacher Beginning Base Salary Average","position":103,"publisher_description":"District 2025 Staff Teacher Beginning Base Salary Average","publisher_type":"Number"},{"code":"DPST01SA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_1_5_years_base_salary_average","label":"District 2025 Staff: Teacher 1-5 Years Base Salary Average","position":104,"publisher_description":"District 2025 Staff Teacher 1-5 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST06SA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_6_10_years_base_salary_average","label":"District 2025 Staff: Teacher 6-10 Years Base Salary Average","position":105,"publisher_description":"District 2025 Staff Teacher 6-10 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST11SA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_11_20_years_base_salary_average","label":"District 2025 Staff: Teacher 11-20 Years Base Salary Average","position":106,"publisher_description":"District 2025 Staff Teacher 11-20 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST21SA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_21_30_years_base_salary_average","label":"District 2025 Staff: Teacher 21-30 Years Base Salary Average","position":107,"publisher_description":"District 2025 Staff Teacher 21-30 Years Base Salary Average","publisher_type":"Number"},{"code":"DPST30SA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_gt_30_years_base_salary_average","label":"District 2025 Staff: Teacher > 30 Years Base Salary Average","position":108,"publisher_description":"District 2025 Staff Teacher > 30 Years Base Salary Average","publisher_type":"Number"},{"code":"DPSTTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_total_base_salary_average","label":"District 2025 Staff: Teacher Total Base Salary Average","position":109,"publisher_description":"District 2025 Staff Teacher Total Base Salary Average","publisher_type":"Number"},{"code":"DPSUTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_support_total_base_salary_average","label":"District 2025 Staff: Support Total Base Salary Average","position":110,"publisher_description":"District 2025 Staff Support Total Base Salary Average","publisher_type":"Number"},{"code":"DPSSTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_school_admin_total_base_salary_average","label":"District 2025 Staff: School Admin Total Base Salary Average","position":111,"publisher_description":"District 2025 Staff School Admin Total Base Salary Average","publisher_type":"Number"},{"code":"DPSCTOSA","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_central_admin_total_base_salary_average","label":"District 2025 Staff: Central Admin Total Base Salary Average","position":112,"publisher_description":"District 2025 Staff Central Admin Total Base Salary Average","publisher_type":"Number"},{"code":"DMSTHCNT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_incentive_allotment_master_head_count","label":"District 2025 Staff: Teacher Incentive Allotment Master Head Count","position":113,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Master Head Count","publisher_type":"Number"},{"code":"DEXPHCNT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_incentive_allotment_exemplary_head_count","label":"District 2025 Staff: Teacher Incentive Allotment Exemplary Head Count","position":114,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Exemplary Head Count","publisher_type":"Number"},{"code":"DRECHCNT","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_incentive_allotment_recognized_head_count","label":"District 2025 Staff: Teacher Incentive Allotment Recognized Head Count","position":115,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Recognized Head Count","publisher_type":"Number"},{"code":"DRECAVGP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_incentive_allotment_recognized_payout_average","label":"District 2025 Staff: Teacher Incentive Allotment Recognized Payout Average","position":116,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Recognized Payout Average","publisher_type":"Number"},{"code":"DEXPAVGP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_incentive_allotment_exemplary_payout_average","label":"District 2025 Staff: Teacher Incentive Allotment Exemplary Payout Average","position":117,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Exemplary Payout Average","publisher_type":"Number"},{"code":"DMSTAVGP","dictionary_status":"documented","disposition":"fact","field":"district_2025_staff_teacher_incentive_allotment_master_payout_average","label":"District 2025 Staff: Teacher Incentive Allotment Master Payout Average","position":118,"publisher_description":"District 2025 Staff Teacher Incentive Allotment Master Payout Average","publisher_type":"Number"}],"input_sha256":"29921c748875f91cc123c22dc5a295f1e61d1754842209bd86e56ad9f7c7abb1","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":1210},"metric_period":{"kind":"unknown"},"source_schema_sha256":"9a9af6039f0fb738b07e507b8e76e7188a241d4898c5dca9bbaf8e68ba077b90","table":"staff_profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/column_schema.py b/teadata/column_schema.py index dd4d39e..0009f12 100644 --- a/teadata/column_schema.py +++ b/teadata/column_schema.py @@ -104,20 +104,34 @@ def validate_header_table(table: Mapping[str, Any]) -> None: raise ValueError("Invalid source dictionary reference") _adjacent_filename(dictionary["filename"]) definitions: dict[str, tuple[str, str]] = {} + observed_components: dict[tuple[str, str], str] = {} if "dictionary_records" in table: records = table["dictionary_records"] if not isinstance(records, list) or not records: raise ValueError("Publisher dictionary records must retain their ordered occurrences") for ordinal, record in enumerate(records, 1): if (not isinstance(record, dict) - or set(record) != {"ordinal", "code", "publisher_type", "publisher_description"} + or not {"ordinal", "code", "publisher_type", "publisher_description"} <= set(record) + or set(record) - {"ordinal", "code", "publisher_type", "publisher_description", + "source_sha256", "source_line", "source_column"} or type(record["ordinal"]) is not int or record["ordinal"] != ordinal - or any(not isinstance(record[key], str) or not record[key].strip() - for key in ("code", "publisher_type", "publisher_description"))): + or not isinstance(record["code"], str) or not record["code"].strip() + or any(record[key] is not None and (not isinstance(record[key], str) or not record[key].strip()) + for key in ("publisher_type", "publisher_description"))): raise ValueError("Invalid publisher dictionary occurrence") - definition = record["publisher_type"], record["publisher_description"] - if definitions.setdefault(record["code"], definition) != definition: - raise ValueError(f"Conflicting publisher dictionary definitions for {record['code']!r}") + anchors = {"source_sha256", "source_line", "source_column"} & set(record) + if anchors and (anchors != {"source_sha256", "source_line", "source_column"} + or not _checksum(record["source_sha256"]) + or type(record["source_line"]) is not int or record["source_line"] < 1 + or type(record["source_column"]) is not int or record["source_column"] < 0): + raise ValueError("Invalid publisher dictionary source anchor") + for key in ("publisher_type", "publisher_description"): + value = record[key] + if value is not None and observed_components.setdefault((record["code"], key), value) != value: + raise ValueError(f"Conflicting publisher dictionary definitions for {record['code']!r}") + if record["publisher_type"] is not None and record["publisher_description"] is not None: + # Partial observations never combine to manufacture a definition. + definitions[record["code"]] = record["publisher_type"], record["publisher_description"] seen_codes, seen_fields = set(), set() for position, field in enumerate(table["fields"], 1): if (not isinstance(field, dict) diff --git a/teadata/scripts/refresh_tapr.py b/teadata/scripts/refresh_tapr.py index eec60ed..f718bd8 100644 --- a/teadata/scripts/refresh_tapr.py +++ b/teadata/scripts/refresh_tapr.py @@ -17,7 +17,7 @@ from teadata.acquisition import AcquisitionClient, acquire_form, replay_acquisition from teadata.column_schema import crosswalk_dataset, parse_column_schema from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset -from teadata.provenance import ProvenanceStore +from teadata.provenance import ProvenanceStore, _identifier from teadata.tapr import compare_tapr_tables, read_tapr_table @@ -147,6 +147,60 @@ def compare_inputs(args) -> dict: 'report_sha256': sha256(output.read_bytes()).hexdigest()} +def inspect_dictionary(args) -> dict: + """Inspect one retained HTML artifact offline, preserving its exact history.""" + from teadata.tapr_dictionary import extract_tapr_dictionary + + if args.output.exists() or args.output.is_symlink(): + raise FileExistsError("Dictionary output already exists; select a new observation path") + if type(args.max_bytes) is not int or args.max_bytes < 1: + raise ValueError('Dictionary max-bytes must be a positive integer') + source, archive = ProvenanceStore(args.source_store), ProvenanceStore(args.store) + record = source.read_record(args.record) + if record['kind'] != 'acquisition': + raise ValueError('Dictionary input must be a retained acquisition observation') + artifact = record['artifact'] + expected_size = artifact['size_bytes'] + if type(expected_size) is not int or expected_size < 0: + raise ValueError('Invalid retained dictionary size') + if expected_size > args.max_bytes: + raise ValueError('Retained dictionary exceeds max-bytes') + selected = source.root / 'objects' / _identifier(artifact['sha256']) + with selected.open('rb') as stream: + if os.fstat(stream.fileno()).st_size > args.max_bytes: + raise ValueError('Retained dictionary exceeds max-bytes') + raw = stream.read(args.max_bytes + 1) + if len(raw) > args.max_bytes: + raise ValueError('Retained dictionary exceeds max-bytes') + if len(raw) != expected_size or sha256(raw).hexdigest() != artifact['sha256']: + raise ValueError('Parsed dictionary bytes differ from the selected acquisition') + archive.copy_record_from(source, args.record) + occurrences = extract_tapr_dictionary(raw, encoding=args.encoding) + root = Path(__file__).resolve().parents[1] + implementation = {name: sha256((root / name).read_bytes()).hexdigest() + for name in ['tapr_dictionary.py', 'scripts/refresh_tapr.py']} + report = {'schema_version': 1, 'source_record_id': args.record, + 'source_artifact': artifact, 'encoding': args.encoding, 'max_bytes': args.max_bytes, + 'coordinate_semantics': 'Outer tooltip start tag; one-based line, zero-based decoded-character column', + 'text_projection': 'Decoded rendered text; presentation whitespace only is normalized. Raw artifact owns original bytes.', + 'dictionary_records': [row.column_record() for row in occurrences], + 'implementation_sha256': implementation, 'source_activation': False} + args.output.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix='.tapr-dictionary-', dir=args.output.parent) as directory: + staged = Path(directory) / args.output.name + staged.write_text(json.dumps(report, indent=2, ensure_ascii=True, allow_nan=False) + '\n') + staged.chmod(0o600) + processing = archive.record_processing(dataset='tapr_explicit_dictionary_inspection', inputs=[args.record], + outputs={'dictionary_occurrences': staged}, processor='teadata.scripts.refresh_tapr', + code_version=sha256(json.dumps(implementation, sort_keys=True).encode()).hexdigest(), + parameters={'encoding': args.encoding, 'max_bytes': args.max_bytes, 'no_config_activation': True}, + validation={'occurrences': len(occurrences), 'scientific_equivalence_claimed': False}) + archive.verify_record_closure([processing]) + os.link(staged, args.output) + return {'status': 'inspected_dictionary', 'processing_record_id': processing, + 'report_sha256': sha256(args.output.read_bytes()).hexdigest()} + + def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser(description=__doc__) commands = parser.add_subparsers(dest='command', required=True) @@ -165,6 +219,14 @@ def main(argv: list[str] | None = None) -> int: command.add_argument('--store', type=Path, required=True) command.add_argument('--timeout', type=float, default=20) command.add_argument('--max-bytes', type=int, default=32 * 1024 * 1024) + dictionary = commands.add_parser('dictionary', help='Inspect one retained HTML dictionary offline; keep partial ordered occurrences') + dictionary.add_argument('--source-store', type=Path, required=True) + dictionary.add_argument('--record', required=True) + dictionary.add_argument('--encoding', required=True, help='Explicit decoding of the retained publisher bytes') + dictionary.add_argument('--max-bytes', type=int, default=2 * 1024 * 1024, + help='Positive retained HTML byte limit; default 2 MiB') + dictionary.add_argument('--store', type=Path, required=True, help='Append-only output provenance archive') + dictionary.add_argument('--output', type=Path, required=True, help='New occurrence report; never overwritten') compare = commands.add_parser('compare', help='Compare two pinned reviewed original inputs offline') compare.add_argument('--store', type=Path, required=True, help='Append-only report/provenance archive') compare.add_argument('--output', type=Path, required=True, help='New report path; never overwritten') @@ -181,6 +243,8 @@ def main(argv: list[str] | None = None) -> int: args = parser.parse_args(argv) if args.command == 'compare': result = compare_inputs(args) + elif args.command == 'dictionary': + result = inspect_dictionary(args) else: archive = ProvenanceStore(args.store) client = AcquisitionClient(archive, timeout=args.timeout, attempts=1, max_bytes=args.max_bytes, max_retry_wait=0) @@ -194,7 +258,7 @@ def main(argv: list[str] | None = None) -> int: record = archive.read_record(acquired.record_id) result = {'status': 'acquired', 'record_id': acquired.record_id, 'artifact': record['artifact']} print(json.dumps(result, sort_keys=True)) - return 0 if result['status'] in {'compared', 'acquired'} else 2 + return 0 if result['status'] in {'compared', 'acquired', 'inspected_dictionary'} else 2 if __name__ == '__main__': diff --git a/teadata/tapr_dictionary.py b/teadata/tapr_dictionary.py new file mode 100644 index 0000000..8431a2f --- /dev/null +++ b/teadata/tapr_dictionary.py @@ -0,0 +1,184 @@ +"""Ordered publisher HTML dictionary observations, without scientific inference.""" + +from __future__ import annotations + +from dataclasses import dataclass +from hashlib import sha256 +from html.parser import HTMLParser +from typing import Any + + +@dataclass(frozen=True) +class TaprDictionaryOccurrence: + ordinal: int + code: str + publisher_type: str | None + publisher_description: str | None + source_sha256: str + source_line: int + source_column: int + source_html: str + + def column_record(self) -> dict[str, Any]: + """Project into the existing column-schema occurrence contract. + + Coordinates locate the outer tooltip start tag: one-based line and + zero-based character column in the explicitly decoded source. The raw + artifact checksum, rather than this decoded slice, owns byte identity. + """ + return {name: getattr(self, name) for name in ( + 'ordinal', 'code', 'publisher_type', 'publisher_description', + 'source_sha256', 'source_line', 'source_column')} + + +def _rendered(parts: list[str]) -> str: + # HTML presentation whitespace only; punctuation/case/identifiers stay exact. + return ' '.join(''.join(parts).split()) + + +class _DictionaryParser(HTMLParser): + def __init__(self, text: str, source_sha256: str): + super().__init__(convert_charrefs=True) + self.text, self.source_sha256 = text, source_sha256 + self.lines = [0, *(i + 1 for i, char in enumerate(text) if char == '\n')] + self.occurrences: list[TaprDictionaryOccurrence] = [] + self.span_depth = 0 + self.div_depth = 0 + self.inner_depth: int | None = None + self.seen_inner = False + self.capture: tuple[str, int, list[str]] | None = None + self.pending: str | None = None + self.values: dict[str, str | None] = {} + self.display: list[str] = [] + self.loose: list[str] = [] + self.start = (0, 0) + + def source_offset(self, position: tuple[int, int]) -> int: + return self.lines[position[0] - 1] + position[1] + + def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None: + class_values = [value or '' for name, value in attrs if name == 'class'] + relevant = {'tooltip', 'tooltiptext', 'dd_hdr', 'dd_desc'} + if len(class_values) > 1 and any(relevant & set(value.split()) for value in class_values): + raise ValueError('Ambiguous dictionary class attributes') + classes = (dict(attrs).get('class') or '').split() + if tag == 'span' and 'tooltip' in classes: + if self.span_depth: + raise ValueError('Nested dictionary tooltip') + self.span_depth = 1 + self.div_depth, self.inner_depth, self.seen_inner = 0, None, False + self.capture, self.pending = None, None + self.values, self.display, self.loose = {}, [], [] + self.start = self.getpos() + return + if not self.span_depth: + return + if tag == 'span': + self.span_depth += 1 + if 'tooltiptext' in classes: + if self.seen_inner: + raise ValueError('Repeated dictionary tooltip body') + self.inner_depth, self.seen_inner = self.span_depth, True + if tag == 'div': + self.handle_data(' ') + self.div_depth += 1 + kinds = [kind for kind in ('dd_hdr', 'dd_desc') if kind in classes] + if kinds: + if len(kinds) != 1 or self.inner_depth is None or self.capture is not None: + raise ValueError('Ambiguous dictionary field structure') + if kinds[0] == 'dd_hdr' and self.pending is not None: + raise ValueError('Dictionary heading lacks its value') + if kinds[0] == 'dd_desc' and self.pending is None: + raise ValueError('Dictionary value lacks its heading') + self.capture = kinds[0], self.div_depth, [] + if tag in {'br', 'p'}: + self.handle_data(' ') + + def handle_endtag(self, tag: str) -> None: + if not self.span_depth: + return + if tag in {'br', 'p'}: # Publisher also emits the literal
spelling. + self.handle_data(' ') + return + if tag == 'div': + if self.div_depth < 1: + raise ValueError('Unbalanced dictionary field') + if self.capture is not None and self.capture[1] == self.div_depth: + kind, _, parts = self.capture + value = _rendered(parts) + self.capture = None + if kind == 'dd_hdr': + if value not in {'Name:', 'Type:', 'Description:'}: + raise ValueError('Unsupported dictionary heading') + self.pending = value[:-1] + else: + if self.pending is None or self.pending in self.values: + raise ValueError('Repeated dictionary field') + self.values[self.pending] = value or None + self.pending = None + self.div_depth -= 1 + self.handle_data(' ') + if tag == 'span': + if self.inner_depth == self.span_depth: + self.inner_depth = None + self.span_depth -= 1 + if not self.span_depth: + self.finish_occurrence() + + def handle_data(self, data: str) -> None: + if not self.span_depth: + return + if self.capture is not None: + self.capture[2].append(data) + elif self.inner_depth is not None: + self.loose.append(data) + elif not self.seen_inner: + self.display.append(data) + elif data.strip(): + raise ValueError('Unexpected text after dictionary tooltip body') + + def finish_occurrence(self) -> None: + if not self.seen_inner or self.capture is not None or self.pending is not None or self.div_depth: + raise ValueError('Incomplete dictionary field structure') + code = _rendered(self.display) + if not code: + raise ValueError('Dictionary occurrence lacks its displayed code') + if self.values: + if self.values.get('Name') != code: + raise ValueError('Dictionary displayed code and Name differ') + if _rendered(self.loose): + raise ValueError('Unexpected text outside dictionary fields') + elif _rendered(self.loose) != code: + raise ValueError('Code-only dictionary body differs from displayed code') + end = self.text.find('>', self.source_offset(self.getpos())) + if end < 0: + raise ValueError('Truncated dictionary tooltip') + self.occurrences.append(TaprDictionaryOccurrence( + ordinal=len(self.occurrences) + 1, code=code, + publisher_type=self.values.get('Type'), + publisher_description=self.values.get('Description'), + source_sha256=self.source_sha256, + source_line=self.start[0], source_column=self.start[1], + source_html=self.text[self.source_offset(self.start):end + 1], + )) + + +def extract_tapr_dictionary(raw: bytes, *, encoding: str) -> tuple[TaprDictionaryOccurrence, ...]: + """Extract exact ordered complete/partial observations from retained bytes. + + Encoding is explicit; decoding errors and ambiguous/truncated tooltip + structure fail. Rendered text normalizes presentation whitespace only. + Original decoded HTML slices and raw SHA remain available. Duplicate codes + and conflicting definitions remain separate observations; column_schema + owns whether those observations can document reviewed source fields. + """ + if not isinstance(raw, bytes) or not isinstance(encoding, str) or not encoding: + raise ValueError('Dictionary requires retained bytes and an explicit encoding') + parser = _DictionaryParser(raw.decode(encoding), sha256(raw).hexdigest()) + parser.feed(parser.text) + parser.close() + if parser.span_depth: + raise ValueError('Truncated dictionary tooltip') + if not parser.occurrences: + raise ValueError('No publisher dictionary occurrences found') + return tuple(parser.occurrences) diff --git a/tests/test_tapr_2025_staff.py b/tests/test_tapr_2025_staff.py new file mode 100644 index 0000000..80fb89b --- /dev/null +++ b/tests/test_tapr_2025_staff.py @@ -0,0 +1,71 @@ +from hashlib import sha256 +from pathlib import Path + +import pytest + +from teadata.column_schema import header_records, header_rename_map, parse_column_schema +from teadata.manifest import ContractError +from teadata.teadata_config import load_config + + +ROOT = Path(__file__).resolve().parents[1] +RESOURCE = ROOT / 'docs/source-contracts/tapr--2025--staff-profile-crosswalk.json' + + +@pytest.mark.parametrize('scope,columns,rows,raw_sha,dictionary_sha,new_count', [ + ('campus', 106, 9084, 'ed29852dd7d7925963413b41c81a36508ccad83a4109a0aeebfa720bf90ff6ea', + 'd5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e', 15), + ('district', 118, 1208, '29921c748875f91cc123c22dc5a295f1e61d1754842209bd86e56ad9f7c7abb1', + 'fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6', 17), +]) +def test_new_crosswalk_retains_every_actual_column_without_activating_config(scope, columns, rows, raw_sha, dictionary_sha, new_count): + document = parse_column_schema(RESOURCE.read_bytes()) + assert not (ROOT / 'teadata/schemas' / RESOURCE.name).exists() + dataset = next(d for d in document['datasets'] if d['dataset'] == scope + '_tapr_staff_profile') + assert dataset['edition'] == '2025' and dataset['source_only'] is True + table, = dataset['tables'] + assert table['input_sha256'] == raw_sha and table['table'] == 'staff_profile' + assert table['layout'] == {'label_record': 1, 'code_record': 2, 'first_data_record': 3, + 'last_data_record': rows + 2, 'annotations': []} + records = header_records(document, dataset=dataset['dataset'], edition='2025') + assert len(records) == columns == len(header_rename_map(records, from_='code', to='label')) + assert all(record['period'] == {'kind': 'unknown'} for record in records) + assert table['metric_period'] == {'kind': 'unknown'} + expected_identity = {'district_number', 'district_name'} + if scope == 'campus': + expected_identity |= {'campus_number', 'campus_name'} + assert {r['field'] for r in records if r['disposition'] == 'identity'} == expected_identity + assert len([r for r in records if r['disposition'] == 'identity']) == len(expected_identity) + assert {r['source_sha256'] for r in table['dictionary_records']} == {dictionary_sha} + assert all(type(r['source_line']) is int and r['source_line'] > 0 + and type(r['source_column']) is int and r['source_column'] >= 0 for r in table['dictionary_records']) + historical_path = ROOT / 'teadata/schemas/tapr--2025--header-crosswalk.json' + assert sha256(historical_path.read_bytes()).hexdigest() == 'fdbdbb24ab218063d46cb5d4781ef9cca55b9e448020f01b8b7264e8c292e339' + old_dataset = next(d for d in parse_column_schema(historical_path.read_bytes())['datasets'] if d['dataset'].startswith(scope + '_')) + old_codes = {f['code'] for t in old_dataset['tables'] if t['table'] == 'staff' for f in t['fields']} + assert old_codes < {r['code'] for r in records} + assert len({r['code'] for r in records} - old_codes) == new_count + cfg = load_config() + assert cfg.availability_report()['data_sources'][dataset['dataset']]['years'] == [2024] + with pytest.raises(ContractError, match='edition unavailable'): + cfg.header_records(dataset['dataset'], edition='2025', reader_profile='source') + + +def test_code_only_and_dictionary_only_codes_do_not_become_input_fields_or_aliases(): + document = parse_column_schema(RESOURCE.read_bytes()) + campus = next(d for d in document['datasets'] if d['dataset'] == 'campus_tapr_staff_profile') + table, = campus['tables'] + codes = {field['code'] for field in table['fields']} + assert {'CPSXTOFC', 'CPSXTOFP', 'CPSCTOST'}.isdisjoint(codes) + partial = [r for r in table['dictionary_records'] if r['publisher_type'] is None or r['publisher_description'] is None] + assert [r['code'] for r in partial] == ['CPSXTOFC', 'CPSXTOFP'] + field = next(f for f in table['fields'] if f['code'] == 'CPSCTOFC') + assert field['dictionary_status'] == 'not_documented' + assert field['publisher_type'] is None and field['publisher_description'] is None + assert field['label'] == 'Campus 2025 Staff: Central Admin Total Full Time Equiv Count' + district = next(d for d in document['datasets'] if d['dataset'] == 'district_tapr_staff_profile') + records = district['tables'][0]['dictionary_records'] + for code in ('DPSETOFC', 'DPSXTOFC'): + occurrences = [r for r in records if r['code'] == code] + assert len(occurrences) == 2 and occurrences[0]['ordinal'] != occurrences[1]['ordinal'] + assert len({(r['publisher_type'], r['publisher_description']) for r in occurrences}) == 1 diff --git a/tests/test_tapr_dictionary.py b/tests/test_tapr_dictionary.py new file mode 100644 index 0000000..80e1a4f --- /dev/null +++ b/tests/test_tapr_dictionary.py @@ -0,0 +1,164 @@ +from copy import deepcopy +from hashlib import sha256 + +import pytest + +from teadata.column_schema import header_records, source_schema_fingerprint, validate_header_table +from teadata.tapr_dictionary import extract_tapr_dictionary + + +# Tiny public markup from the retained2025 STAF source; source rendering includes +# the publisher's literal
spelling even inside its quoted style attribute. +COMPLETE = '''CPSATOFC
Name:
CPSATOFC
Type:
Number
Description:
Campus 2025 Staff
All Staff Total Full Time Equiv Count
''' +CODE_ONLY = '''CPSXTOFCCPSXTOFC ''' + + +def test_public_markup_keeps_order_duplicates_unknowns_and_original_source_spans(): + text = '\n ' + COMPLETE + '\n' + CODE_ONLY + '\n' + COMPLETE + '
' + raw = text.encode('iso-8859-1') + rows = extract_tapr_dictionary(raw, encoding='iso-8859-1') + assert [(r.ordinal, r.code) for r in rows] == [(1, 'CPSATOFC'), (2, 'CPSXTOFC'), (3, 'CPSATOFC')] + assert rows[0].publisher_type == 'Number' + assert rows[0].publisher_description == 'Campus 2025 Staff All Staff Total Full Time Equiv Count' + assert rows[1].publisher_type is None and rows[1].publisher_description is None + assert (rows[0].source_line, rows[0].source_column) == (2, 2) + assert (rows[1].source_line, rows[1].source_column) == (3, 0) + assert [r.source_html for r in rows] == [COMPLETE, CODE_ONLY, COMPLETE] + assert {r.source_sha256 for r in rows} == {sha256(raw).hexdigest()} + assert rows[1].column_record() == {'ordinal': 2, 'code': 'CPSXTOFC', + 'publisher_type': None, 'publisher_description': None, + 'source_sha256': sha256(raw).hexdigest(), 'source_line': 3, 'source_column': 0} + + +def test_partial_components_are_independent_and_never_filled_from_another_occurrence(): + type_only = COMPLETE.replace('
Description:
Campus 2025 Staff
All Staff Total Full Time Equiv Count
', '') + description_only = COMPLETE.replace('
Type:
Number
', '') + rows = extract_tapr_dictionary((type_only + description_only).encode(), encoding='utf-8') + assert rows[0].publisher_type == 'Number' and rows[0].publisher_description is None + assert rows[1].publisher_type is None and rows[1].publisher_description is not None + + +def test_conflicting_occurrences_remain_distinct_observations_for_schema_review(): + changed = COMPLETE.replace('All Staff Total Full Time Equiv Count', 'Different publisher description') + rows = extract_tapr_dictionary((COMPLETE + changed).encode(), encoding='utf-8') + assert len(rows) == 2 and rows[0].code == rows[1].code + assert rows[0].publisher_description != rows[1].publisher_description + + +def test_encoding_entity_text_and_crlf_anchors_do_not_replace_raw_byte_identity(): + source = ('é\r\n ' + COMPLETE.replace('All Staff', 'Staff & pédagogie')).encode('iso-8859-1') + row, = extract_tapr_dictionary(source, encoding='iso-8859-1') + assert (row.source_line, row.source_column) == (2, 1) + assert 'Staff & pédagogie' in row.publisher_description + assert '&' in row.source_html and 'pédagogie' in row.source_html + assert row.source_sha256 == sha256(source).hexdigest() + with pytest.raises(UnicodeDecodeError): + extract_tapr_dictionary(source, encoding='utf-8') + + +@pytest.mark.parametrize('description', ['A

B

C', 'A
B
C']) +def test_supported_block_boundaries_separate_rendered_text_without_changing_source(description): + text = COMPLETE.replace('Campus 2025 Staff
All Staff Total Full Time Equiv Count', description) + row, = extract_tapr_dictionary(text.encode(), encoding='utf-8') + assert row.publisher_description == 'A B C' + assert row.source_html == text + + +@pytest.mark.parametrize('old,new', [ + ('class="tooltip"', 'class="tooltip" class="other"'), + ('class="tooltip"', 'class="other" class="tooltip"'), + ('class="tooltiptext"', 'class="tooltiptext" class="other"'), + ('class="dd_hdr"', 'class="dd_hdr" class="other"'), + ('class="dd_desc"', 'class="dd_desc" class="other"'), +]) +def test_duplicate_dictionary_class_attributes_cannot_hide_an_occurrence(old, new): + with pytest.raises(ValueError, match='Ambiguous dictionary class attributes'): + extract_tapr_dictionary((COMPLETE + COMPLETE.replace(old, new, 1)).encode(), encoding='utf-8') + + +@pytest.mark.parametrize('markup,reason', [ + (COMPLETE.replace('>CPSATOFC', '>OTHER', 1), 'code and Name differ'), + (COMPLETE.replace('
Type:
', '
Name:
'), 'Repeated dictionary field'), + (COMPLETE.replace('Type:', 'Length:'), 'Unsupported dictionary heading'), + (COMPLETE.replace('
Number
', ''), 'heading lacks its value'), + (COMPLETE.replace('
Type:
', ''), 'value lacks its heading'), + (COMPLETE[:-7], 'Truncated dictionary tooltip'), + (CODE_ONLY.replace('CPSXTOFC ', 'OTHER'), 'Code-only dictionary body differs'), + (COMPLETE.replace('
Name:', CODE_ONLY + '
Name:'), 'Nested dictionary tooltip'), + ('Not a publisher dictionary', 'No publisher dictionary occurrences'), +]) +def test_ambiguous_or_incomplete_markup_fails_instead_of_falling_back(markup, reason): + with pytest.raises(ValueError, match=reason): + extract_tapr_dictionary(markup.encode(), encoding='utf-8') + + +def table_with(records, *, documented=False): + field = {'position': 1, 'code': 'CPSXTOFC', 'field': 'source_fact', 'label': 'Publisher source label', + 'disposition': 'fact', 'dictionary_status': 'documented' if documented else 'not_documented', + 'publisher_type': 'Number' if documented else None, + 'publisher_description': 'Description' if documented else None} + return {'table': 'staff_profile', 'input_sha256': 'a' * 64, + 'source_schema_sha256': source_schema_fingerprint([field['label']], [field['code']]), + 'fields': [field], 'dictionary_records': records} + + +def occurrence(ordinal, kind, description): + return {'ordinal': ordinal, 'code': 'CPSXTOFC', 'publisher_type': kind, + 'publisher_description': description} + + +def test_same_occurrence_list_keeps_partials_without_manufacturing_a_definition(): + records = [occurrence(1, 'Number', None), occurrence(2, None, 'Description')] + table = table_with(records) + validate_header_table(table) + document = {'schema_version': 2, 'mapping_version': 1, + 'datasets': [{'dataset': 'campus_tapr_staff_profile', 'edition': '2025', + 'source_only': True, 'tables': [table]}]} + result, = header_records(document, dataset='campus_tapr_staff_profile', edition='2025') + assert result['dictionary_status'] == 'not_documented' and result['publisher_type'] is None + assert result['dictionary_occurrences'] == records + result['dictionary_occurrences'][0]['publisher_type'] = 'Caller mutation' + assert records[0]['publisher_type'] == 'Number' + with pytest.raises(ValueError, match='differs from its publisher dictionary'): + validate_header_table(table_with(records, documented=True)) + records.append(occurrence(3, 'Number', 'Description')) + validate_header_table(table_with(records, documented=True)) + with pytest.raises(ValueError, match='differs from its publisher dictionary'): + validate_header_table(table_with(records)) + + +@pytest.mark.parametrize('records', [ + [occurrence(1, 'Number', 'Description'), occurrence(2, 'Text', 'Description')], + [occurrence(1, 'Number', 'Description'), occurrence(2, None, 'Conflicting')], + [occurrence(1, 'Number', None), occurrence(2, 'Text', None)], +]) +def test_complete_and_partial_known_component_conflicts_still_fail(records): + with pytest.raises(ValueError, match='Conflicting publisher dictionary definitions'): + validate_header_table(table_with(records, documented=True)) + + +@pytest.mark.parametrize('change', [ + {'source_sha256': 'a' * 64}, + {'source_sha256': 'invalid', 'source_line': 1, 'source_column': 0}, + {'source_sha256': 'a' * 64, 'source_line': 0, 'source_column': 0}, + {'source_sha256': 'a' * 64, 'source_line': True, 'source_column': 0}, + {'source_sha256': 'a' * 64, 'source_line': 1, 'source_column': -1}, + {'source_sha256': 'a' * 64, 'source_line': 1, 'source_column': False}, + {'source_sha256': 'a' * 64, 'source_line': 1.0, 'source_column': 0}, +]) +def test_occurrence_anchor_is_all_or_none_with_exact_scalar_coordinate_types(change): + record = {**occurrence(1, None, None), **change} + with pytest.raises(ValueError, match='dictionary source anchor'): + validate_header_table(table_with([record])) + + +def test_anchored_unknowns_and_legacy_complete_records_share_one_validation_owner(): + unknown, = extract_tapr_dictionary(CODE_ONLY.encode(), encoding='utf-8') + table = table_with([unknown.column_record()]) + validate_header_table(table) + legacy = table_with([occurrence(1, 'Number', 'Description')], documented=True) + validate_header_table(legacy) + invalid = deepcopy(table) + invalid['dictionary_records'][0]['publisher_type'] = '' + with pytest.raises(ValueError, match='Invalid publisher dictionary occurrence'): + validate_header_table(invalid) diff --git a/tests/test_tapr_refresh.py b/tests/test_tapr_refresh.py index 458bb81..1b9b549 100644 --- a/tests/test_tapr_refresh.py +++ b/tests/test_tapr_refresh.py @@ -13,14 +13,188 @@ from teadata.acquisition import AcquisitionClient, acquire_form, replay_acquisition from teadata.column_schema import source_schema_fingerprint -from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset +from teadata.dataset_metadata import DatasetMetadata, ReferenceDocument, ResolvedDataset from teadata.manifest import canonical_json from teadata.provenance import ProvenanceStore -from teadata.scripts.refresh_tapr import compare_inputs, main +from teadata.scripts.refresh_tapr import compare_inputs, inspect_dictionary, main from teadata.tapr import compare_tapr_tables, read_tapr_table from teadata.values import ValuePolicy, measure, source_token_statuses +def test_dictionary_cli_keeps_partial_occurrences_and_exact_retained_history_offline(tmp_path, monkeypatch, capsys): + def forbidden(*args, **kwargs): + pytest.fail('Dictionary inspection attempted HTTP') + monkeypatch.setattr('teadata.scripts.refresh_tapr.AcquisitionClient', forbidden) + source_store = ProvenanceStore(tmp_path / 'original') + selection = tmp_path / 'selection.html' + selection.write_text('
Original source controls
') + parent = source_store.record_acquisition(selection, ResolvedDataset('reference:selection', 'reference', + None, None, '', DatasetMetadata(title='Original selection', source_url='https://example.test/selection'))) + original = tmp_path / 'dictionary.html' + raw = (b'X
Name:
' + b'
X
Type:
Number
' + b'
Description:
Original
description
\n' + b'YY') + original.write_bytes(raw) + metadata = DatasetMetadata(version='2025', references=(ReferenceDocument(reference_id='selection', url='https://example.test/selection', + role='source_notes', provenance_ids=(parent,), reviewed_sha256=sha256(selection.read_bytes()).hexdigest()),)) + identifier = source_store.record_acquisition(original, + ResolvedDataset('reference:dictionary', 'reference', 2025, 2025, '', metadata), + downloaded_at=datetime(2025, 12, 1, tzinfo=timezone.utc), + requested_url='https://example.test/dictionary', parameters={'http_method': 'GET'}) + before = source_store.read_record(identifier) + archive, output = tmp_path / 'observations', tmp_path / 'dictionary-report.json' + args = ['dictionary', '--source-store', str(source_store.root), '--record', identifier, + '--encoding', 'utf-8', '--store', str(archive), '--output', str(output)] + assert main(args) == 0 + result = json.loads(capsys.readouterr().out) + report = json.loads(output.read_text()) + assert result['status'] == 'inspected_dictionary' + assert report['max_bytes'] == 2 * 1024 * 1024 + assert [row['code'] for row in report['dictionary_records']] == ['X', 'Y'] + assert report['dictionary_records'][0]['publisher_description'] == 'Original description' + assert report['dictionary_records'][1]['publisher_type'] is None + assert report['dictionary_records'][1]['publisher_description'] is None + assert report['dictionary_records'][1]['source_line'] == 2 + assert report['dictionary_records'][1]['source_column'] == 0 + assert {r['source_sha256'] for r in report['dictionary_records']} == {sha256(raw).hexdigest()} + closure = ProvenanceStore(archive).verify_record_closure([result['processing_record_id']]) + assert set(closure) == {parent, identifier, result['processing_record_id']} + assert source_store.read_record(identifier) == before == closure[identifier] + assert original.read_bytes() == raw and not report['source_activation'] + published = output.read_bytes() + with pytest.raises(FileExistsError, match='already exists'): + main(args) + assert output.read_bytes() == published + + +@pytest.mark.parametrize('raw,encoding,error', [ + (b'XX', 'utf-8', ValueError), + ('é'.encode('iso-8859-1'), 'utf-8', UnicodeDecodeError), +]) +def test_dictionary_cli_failure_does_not_publish_a_successful_report(tmp_path, raw, encoding, error): + source_store = ProvenanceStore(tmp_path / 'original') + original = tmp_path / 'dictionary.html' + original.write_bytes(raw) + identifier = source_store.record_acquisition(original, + ResolvedDataset('reference:dictionary', 'reference', None, None, '', DatasetMetadata())) + output = tmp_path / 'report.json' + archive = tmp_path / 'archive' + with pytest.raises(error): + main(['dictionary', '--source-store', str(source_store.root), '--record', identifier, + '--encoding', encoding, '--store', str(archive), '--output', str(output)]) + assert not output.exists() and original.read_bytes() == raw + assert len(list((archive / 'records').glob('*.json'))) == 1 + + +def dictionary_input(tmp_path): + raw = b'XX' + original = tmp_path / 'dictionary.html' + original.write_bytes(raw) + store = ProvenanceStore(tmp_path / 'source') + identifier = store.record_acquisition(original, + ResolvedDataset('reference:dictionary', 'reference', None, None, '', DatasetMetadata())) + return raw, store, identifier, Namespace(source_store=store.root, record=identifier, + encoding='utf-8', store=tmp_path / 'archive', output=tmp_path / 'report.json', max_bytes=len(raw)) + + +@pytest.mark.parametrize('actual_growth', [False, True]) +def test_dictionary_size_guard_precedes_bulk_read_and_closure_copy(tmp_path, monkeypatch, actual_growth): + raw, store, identifier, args = dictionary_input(tmp_path) + path = store.verify_artifact(sha256(raw).hexdigest()) + if actual_growth: + path.write_bytes(raw + b' ') + else: + args.max_bytes = len(raw) - 1 + original_open = Path.open + class NoBodyRead: + def __init__(self, stream): + self.stream = stream + def __enter__(self): + return self + def __exit__(self, *unused): + self.stream.close() + def fileno(self): + return self.stream.fileno() + def read(self, *unused): + pytest.fail('Oversized dictionary body was read') + def guarded_open(selected, *positional, **keywords): + if selected == path and positional == ('rb',): + assert actual_growth, 'Advertised oversize should fail before opening its body' + return NoBodyRead(original_open(selected, *positional, **keywords)) + return original_open(selected, *positional, **keywords) + monkeypatch.setattr(Path, 'open', guarded_open) + def forbidden_copy(*unused): + pytest.fail('Oversized dictionary reached bulk closure copy') + monkeypatch.setattr(ProvenanceStore, 'copy_record_from', forbidden_copy) + with pytest.raises(ValueError, match='exceeds max-bytes'): + inspect_dictionary(args) + assert not args.output.exists() and not (args.store / 'records').exists() + + +def test_dictionary_capped_read_binds_actual_bytes_before_any_processing_receipt(tmp_path, monkeypatch): + raw, store, identifier, args = dictionary_input(tmp_path) + selected = store.verify_artifact(sha256(raw).hexdigest()) + original_open = Path.open + class ChangedRead: + def __init__(self, stream): + self.stream = stream + def __enter__(self): + return self + def __exit__(self, *unused): + self.stream.close() + def fileno(self): + return self.stream.fileno() + def read(self, maximum): + # Equivalent to same-length source mutation after stat/verification. + assert maximum == args.max_bytes + 1 + return self.stream.read(maximum).replace(b'>X<', b'>Y<') + def changed_open(path, *positional, **keywords): + stream = original_open(path, *positional, **keywords) + return ChangedRead(stream) if path == selected and positional == ('rb',) else stream + monkeypatch.setattr(Path, 'open', changed_open) + with pytest.raises(ValueError, match='bytes differ from the selected acquisition'): + inspect_dictionary(args) + assert not args.output.exists() and not (args.store / 'records').exists() + + +def test_dictionary_does_not_parse_a_later_unbound_read_after_verification(tmp_path, monkeypatch): + raw, store, identifier, args = dictionary_input(tmp_path) + original_read = Path.read_bytes + def changed_read(path): + if path == args.store / 'objects' / sha256(raw).hexdigest(): + return raw.replace(b'>X<', b'>Y<') + return original_read(path) + monkeypatch.setattr(Path, 'read_bytes', changed_read) + result = inspect_dictionary(args) + report = json.loads(args.output.read_text()) + assert [row['code'] for row in report['dictionary_records']] == ['X'] + assert {row['source_sha256'] for row in report['dictionary_records']} == {sha256(raw).hexdigest()} + assert ProvenanceStore(args.store).verify_record_closure([result['processing_record_id']]) + + +@pytest.mark.parametrize('maximum', [0, -1]) +def test_dictionary_limit_must_be_positive_before_loading_any_input(tmp_path, maximum): + args = ['dictionary', '--source-store', str(tmp_path / 'missing'), '--record', 'a' * 64, + '--encoding', 'utf-8', '--store', str(tmp_path / 'archive'), + '--output', str(tmp_path / 'report.json'), '--max-bytes', str(maximum)] + with pytest.raises(ValueError, match='positive integer'): + main(args) + assert not (tmp_path / 'archive').exists() + + +def test_dictionary_cli_accepts_an_explicit_reviewed_larger_limit(tmp_path, capsys): + raw, store, identifier, args = dictionary_input(tmp_path) + assert main(['dictionary', '--source-store', str(store.root), '--record', identifier, + '--encoding', 'utf-8', '--store', str(args.store), '--output', str(args.output), + '--max-bytes', '4194304']) == 0 + result = json.loads(capsys.readouterr().out) + report = json.loads(args.output.read_text()) + assert report['max_bytes'] == 4194304 + assert report['source_artifact']['sha256'] == sha256(raw).hexdigest() + assert ProvenanceStore(args.store).read_record(result['processing_record_id'])['parameters']['max_bytes'] == 4194304 + + class Response(BytesIO): status = 200 url = 'https://example.test/source.csv' From 84c2eee3aed1e688e53aea62c68e1d3a66380595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 18:25:37 -0500 Subject: [PATCH 10/11] Bind TAPR acquisition to explicit source metadata --- docs/config.md | 31 +++++- teadata/scripts/refresh_tapr.py | 89 ++++++++++++++- teadata/teadata_config.py | 21 +++- tests/test_tapr_refresh.py | 189 ++++++++++++++++++++++++++++++++ tests/test_teadata_config.py | 24 +++- 5 files changed, 343 insertions(+), 11 deletions(-) diff --git a/docs/config.md b/docs/config.md index cd02e5b..db91820 100644 --- a/docs/config.md +++ b/docs/config.md @@ -418,7 +418,8 @@ store. It never updates Config or replaces originals. A public GET, for example: ```bash uv run python -m teadata.scripts.refresh_tapr acquire \ --url https://rptsvr1.tea.texas.gov/perfreport/tapr/2024/masking.html \ - --method GET --dataset tapr_2024_masking_reference --edition 2024 \ + --method GET --section reference --dataset tapr_2024_masking_reference --edition 2024 \ + --metadata masking-metadata.json --metadata-sha256 METADATA_SHA256 --no-redirects \ --filename masking.html --store provenance uv run python -m teadata.scripts.refresh_tapr replay \ @@ -437,6 +438,34 @@ history through the same provenance reference graph, even when bytes change. Reconstructed form URLs must exactly match the original requested URL. A legacy GET without form metadata reuses its exact retained URL. +Every new `acquire` requires explicit SHA-pinned `DatasetMetadata` JSON. For +example, `masking-metadata.json` can contain +`{"title":"2024 TAPR masking reference","version":"2024","period":{"kind":"unknown"}}`. +Its version must exactly equal `--edition`. `--section reference` explicitly +labels a documentation observation; it does not select a configured dataset. +Data acquisitions use the default `--section data_sources` and additionally +require `--config CONFIG --config-sha256 CONFIG_SHA256 --year YEAR`. The dataset +must exist in that Config, resolve to exactly that year, and have the exact +edition. Prior-year fallback is rejected by this acquisition consumer; ordinary +Config selection semantics are unchanged. Config validates identity/year/version +only: its period, metrics, policies, references and source rows are never +inherited or loaded. The supplied observation metadata remains independent. + +Metadata and Config inputs are each capped at 2 MiB; their captured bytes are +SHA-checked, parsed and retained without rereading the original file. Config +format and relative-base handling use the same canonical loader as `load_config`. +The input files become local-observation receipts linked through the acquired +record's metadata `provenance_ids`; this adds input lineage, not a replacement +download date. Supply `--reference-store STORE` when selected reference receipts +live elsewhere, or retain them in `--store`. Only explicitly claimed metadata +and reference closures are verified and copied before HTTP. Missing, changed, +wrong-URL or wrong-SHA documentation fails before the request. No reference is +fetched implicitly. Use `--no-redirects` when authorization covers only the +literal request URL. These are socket/response bounds, not a whole-batch deadline; +an operator's separately selected outer deadline still applies. `replay` retains +the original observation metadata and is unchanged; it does not apply aliases or +silently correct historical labels. + Inspect a retained TAPR HTML dictionary offline through the same command owner: ```bash diff --git a/teadata/scripts/refresh_tapr.py b/teadata/scripts/refresh_tapr.py index f718bd8..a41b61c 100644 --- a/teadata/scripts/refresh_tapr.py +++ b/teadata/scripts/refresh_tapr.py @@ -6,6 +6,7 @@ from __future__ import annotations import argparse +from dataclasses import replace from hashlib import sha256 from importlib.metadata import version import json @@ -13,6 +14,8 @@ from pathlib import Path import sys import tempfile +from urllib.error import HTTPError +from urllib.request import HTTPRedirectHandler, build_opener from teadata.acquisition import AcquisitionClient, acquire_form, replay_acquisition from teadata.column_schema import crosswalk_dataset, parse_column_schema @@ -21,6 +24,75 @@ from teadata.tapr import compare_tapr_tables, read_tapr_table +def _read_pinned_input(path: Path, expected_sha256: str) -> bytes: + """Capture one small explicit input; the same bytes are parsed and retained.""" + _identifier(expected_sha256) + limit = 2 * 1024 * 1024 + with path.open('rb') as stream: + size = os.fstat(stream.fileno()).st_size + if size > limit: + raise ValueError('Acquisition metadata/config input exceeds 2 MiB') + raw = stream.read(limit + 1) + if len(raw) > limit or len(raw) != size or sha256(raw).hexdigest() != expected_sha256: + raise ValueError('Captured acquisition input differs from its pinned SHA/size') + return raw + + +def acquisition_source(args, archive: ProvenanceStore) -> ResolvedDataset: + """Validate explicit observation metadata and selected documentation before HTTP.""" + from teadata.manifest import verify_reference_receipts + from teadata.teadata_config import load_config_bytes + + metadata_raw = _read_pinned_input(args.metadata, args.metadata_sha256) + metadata = DatasetMetadata.from_dict(json.loads(metadata_raw)) + if not args.edition.strip() or metadata.version != args.edition: + raise ValueError('Explicit acquisition metadata version must equal edition') + inputs = [('metadata', args.metadata.name, metadata_raw)] + if args.section == 'data_sources': + if args.config is None or args.config_sha256 is None or args.year is None: + raise ValueError('Data-source acquisition requires pinned config and explicit year') + config_raw = _read_pinned_input(args.config, args.config_sha256) + cfg = load_config_bytes(config_raw, path=args.config) + selected = cfg.resolve_dataset(args.dataset, args.year, strict=True) + if selected.resolved_year != args.year or selected.metadata.version != args.edition: + raise ValueError('Acquisition requires an exact configured year and edition; no fallback') + inputs.append(('config', args.config.name, config_raw)) + source = replace(selected, metadata=metadata) + else: + if args.config is not None or args.config_sha256 is not None or args.year is not None: + raise ValueError('Reference acquisition does not select a Config/year') + if not args.dataset.strip(): + raise ValueError('Reference acquisition requires an explicit dataset label') + source = ResolvedDataset(args.dataset, 'reference', None, None, '', metadata) + reference_store = ProvenanceStore(args.reference_store) if args.reference_store is not None else archive + identifiers = list(dict.fromkeys([*metadata.provenance_ids, + *(identifier for ref in metadata.references for identifier in ref.provenance_ids)])) + reference_store.verify_record_closure(identifiers) + verify_reference_receipts(source, reference_store, check_local_paths=False, verify_all_claimed=True) + for identifier in identifiers: + archive.copy_record_from(reference_store, identifier) + # Retain the actual captured contract inputs, not later rereads of mutable paths. + with tempfile.TemporaryDirectory(prefix='teadata-acquire-inputs-') as directory: + input_ids = [] + for role, filename, raw in inputs: + staged = Path(directory) / role / filename + staged.parent.mkdir() + staged.write_bytes(raw) + input_ids.append(archive.record_acquisition(staged, ResolvedDataset( + 'reference:acquire_' + role, 'reference', None, None, '', + DatasetMetadata(title='Explicit SHA-pinned acquisition ' + role + ' input')))) + source = replace(source, metadata=replace(metadata, + provenance_ids=tuple([*metadata.provenance_ids, *input_ids]))) + archive.verify_record_closure(source.metadata.provenance_ids) + verify_reference_receipts(source, archive, check_local_paths=False, verify_all_claimed=True) + return source + + +class _NoRedirect(HTTPRedirectHandler): + def redirect_request(self, req, fp, code, msg, headers, newurl): + raise HTTPError(req.full_url, code, 'Acquisition redirect blocked', headers, fp) + + def compare_inputs(args) -> dict: """Retain selected history and a new report, including blocked drift reports.""" output = args.output @@ -208,6 +280,14 @@ def main(argv: list[str] | None = None) -> int: acquire.add_argument('--url', required=True) acquire.add_argument('--dataset', required=True) acquire.add_argument('--edition', required=True) + acquire.add_argument('--section', choices=['data_sources', 'reference'], default='data_sources') + acquire.add_argument('--metadata', type=Path, required=True, help='Explicit DatasetMetadata JSON; never inherited from Config') + acquire.add_argument('--metadata-sha256', required=True) + acquire.add_argument('--config', type=Path, help='Data-source identity/year/version authority; required for data_sources') + acquire.add_argument('--config-sha256') + acquire.add_argument('--year', type=int) + acquire.add_argument('--reference-store', type=Path, help='Existing selected reference closures; defaults to --store') + acquire.add_argument('--no-redirects', action='store_true', help='Reject redirects without another HTTP request') acquire.add_argument('--filename', required=True) acquire.add_argument('--method', required=True, choices=['GET', 'POST']) acquire.add_argument('--field', action='append', nargs=2, default=[], metavar=('NAME', 'VALUE')) @@ -247,14 +327,17 @@ def main(argv: list[str] | None = None) -> int: result = inspect_dictionary(args) else: archive = ProvenanceStore(args.store) - client = AcquisitionClient(archive, timeout=args.timeout, attempts=1, max_bytes=args.max_bytes, max_retry_wait=0) if args.command == 'replay': + client = AcquisitionClient(archive, timeout=args.timeout, attempts=1, max_bytes=args.max_bytes, max_retry_wait=0) acquired = replay_acquisition(client, args.record, content_type=args.content_type) else: - source = ResolvedDataset(args.dataset, 'data_sources', None, None, '', - DatasetMetadata(version=args.edition)) + source = acquisition_source(args, archive) + client = AcquisitionClient(archive, timeout=args.timeout, attempts=1, + max_bytes=args.max_bytes, max_retry_wait=0, + opener=build_opener(_NoRedirect()) if args.no_redirects else None) acquired = acquire_form(client, args.url, source, filename=args.filename, method=args.method, fields=args.field, content_type=args.content_type) + archive.verify_record_closure([acquired.record_id]) record = archive.read_record(acquired.record_id) result = {'status': 'acquired', 'record_id': acquired.record_id, 'artifact': record['artifact']} print(json.dumps(result, sort_keys=True)) diff --git a/teadata/teadata_config.py b/teadata/teadata_config.py index 5fea842..987e181 100644 --- a/teadata/teadata_config.py +++ b/teadata/teadata_config.py @@ -72,9 +72,9 @@ def _load_toml(text: str) -> dict: return data -def _detect_and_load(path: Path) -> dict: - suffix = path.suffix.lower() - text = path.read_text(encoding="utf-8") +def _decode_config(raw: bytes, suffix: str) -> dict: + # Match read_text's universal-newline behavior for both captured and file input. + text = raw.decode("utf-8").replace("\r\n", "\n").replace("\r", "\n") if suffix in (".yaml", ".yml"): return _load_yaml(text) if suffix == ".toml": @@ -1380,9 +1380,18 @@ def load_config(path: str | Path | None = None) -> Config: p = Path(path) if path is not None else Path(__file__).with_name("teadata_sources.yaml") if not p.exists(): raise FileNotFoundError(p) - raw = _detect_and_load(p) - raw = _rewrite_relative_paths(raw, p.resolve().parent) - cfg = Config.from_dict(raw) + return load_config_bytes(p.read_bytes(), path=p) + + +def load_config_bytes(raw: bytes, *, path: str | Path) -> Config: + """Parse captured contract bytes using the original format and relative base. + + ``path`` supplies the format suffix and original contract directory only; + the file is never reopened. Selection and metadata semantics match load_config. + """ + p = Path(path) + document = _rewrite_relative_paths(_decode_config(raw, p.suffix.lower()), p.resolve().parent) + cfg = Config.from_dict(document) cfg.base_dir = p.resolve().parent return cfg diff --git a/tests/test_tapr_refresh.py b/tests/test_tapr_refresh.py index 1b9b549..b5fcbc4 100644 --- a/tests/test_tapr_refresh.py +++ b/tests/test_tapr_refresh.py @@ -21,6 +21,195 @@ from teadata.values import ValuePolicy, measure, source_token_statuses +def acquisition_inputs(tmp_path, *, edition='2025'): + """A configured identity and real-shaped selected documentation closure.""" + references = ProvenanceStore(tmp_path / 'references') + index = tmp_path / 'index.html' + index.write_bytes(b'Retained publisher index') + index_id = references.record_acquisition(index, ResolvedDataset('reference:index', 'reference', None, None, '', + DatasetMetadata(source_url='https://example.test/index'))) + selected = [] + for role in ['selection', 'dictionary']: + path = tmp_path / (role + '.html') + path.write_text('Retained ' + role + '') + url = 'https://example.test/' + role + source = ResolvedDataset('reference:' + role, 'reference', None, None, '', DatasetMetadata( + source_url=url, provenance_ids=(index_id,), version=edition)) + identifier = references.record_acquisition(path, source, requested_url=url, + downloaded_at=datetime(2025, 1, 1, tzinfo=timezone.utc)) + selected.append({'reference_id': role, 'role': 'data_dictionary' if role == 'dictionary' else 'source_notes', + 'url': url, 'provenance_ids': [identifier], 'reviewed_sha256': sha256(path.read_bytes()).hexdigest()}) + metadata = tmp_path / 'observation-metadata.json' + metadata.write_text(json.dumps({'title': '2025 Campus STUD all-checked observation', 'version': edition, + 'period': {'kind': 'unknown'}, 'references': selected})) + config = tmp_path / 'catalog.yaml' + config.write_text('''value_policies: {config_policy: {tokens: {}}} +data_sources: + campus_tapr_student_staff_profile: + 2025: + path: nonexistent-source.xlsx + metadata: + version: '2025' + period: {kind: school_year, start_year: 2024, end_year: 2025} + field_year: 2025 + value_policy: config_policy + metrics: {enrollment: {field: enrollment, unit: count}} + references: [{reference_id: config_only, role: source_notes, status: unreviewed}] +''') + args = ['acquire', '--url', 'https://rptsvr1.tea.texas.gov/cgi/sas/broker/', + '--dataset', 'campus_tapr_student_staff_profile', '--edition', edition, + '--method', 'POST', '--filename', '2025-campus-STUD.csv', + '--content-type', 'application/x-www-form-urlencoded', '--no-redirects', + '--metadata', str(metadata), '--metadata-sha256', sha256(metadata.read_bytes()).hexdigest(), + '--config', str(config), '--config-sha256', sha256(config.read_bytes()).hexdigest(), '--year', '2025', + '--reference-store', str(references.root), '--store', str(tmp_path / 'observations')] + return args, metadata, config, references + + +@pytest.mark.parametrize('failure', ['dataset_typo', 'prior_year', 'edition', 'metadata_version', + 'metadata_sha', 'config_sha', 'missing_config', 'missing_year', 'missing_closure', + 'wrong_reference_sha', 'wrong_reference_url', 'configured_edition', 'oversized_metadata', 'oversized_config']) +def test_acquire_invalid_bound_inputs_fail_before_http(tmp_path, monkeypatch, failure): + args, metadata, config, references = acquisition_inputs(tmp_path) + monkeypatch.setattr('teadata.scripts.refresh_tapr.AcquisitionClient', + lambda *a, **k: pytest.fail('Invalid preflight constructed HTTP client')) + def option(name, value): + args[args.index(name) + 1] = value + if failure == 'dataset_typo': + option('--dataset', 'campus_tapr_student_studf_profile') + elif failure == 'prior_year': + option('--year', '2026') + elif failure == 'edition': + option('--edition', '2024') + elif failure == 'metadata_version': + raw = json.loads(metadata.read_text()) + raw['version'] = '2024' + metadata.write_text(json.dumps(raw)) + option('--metadata-sha256', sha256(metadata.read_bytes()).hexdigest()) + elif failure in {'metadata_sha', 'config_sha'}: + option('--' + failure.replace('_', '-') + '256', '0' * 64) + elif failure in {'missing_config', 'missing_year'}: + name = '--config' if failure == 'missing_config' else '--year' + index = args.index(name) + del args[index:index + 2] + elif failure == 'missing_closure': + next((references.root / 'records').glob('*.json')).unlink() + elif failure in {'wrong_reference_sha', 'wrong_reference_url'}: + raw = json.loads(metadata.read_text()) + if failure == 'wrong_reference_sha': + raw['references'][0]['reviewed_sha256'] = '0' * 64 + else: + raw['references'][0]['url'] = 'https://example.test/not-the-selected-source' + metadata.write_text(json.dumps(raw)) + option('--metadata-sha256', sha256(metadata.read_bytes()).hexdigest()) + elif failure == 'configured_edition': + config.write_text(config.read_text().replace("version: '2025'", "version: '2024'")) + option('--config-sha256', sha256(config.read_bytes()).hexdigest()) + else: + selected = metadata if failure == 'oversized_metadata' else config + selected.write_bytes(b' ' * (2 * 1024 * 1024 + 1)) + option('--metadata-sha256' if selected == metadata else '--config-sha256', sha256(selected.read_bytes()).hexdigest()) + with pytest.raises((ValueError, KeyError, FileNotFoundError, RuntimeError)): + main(args) + assert not (tmp_path / 'observations' / 'records').exists() + + +def test_acquire_cli_captures_actual_shape_metadata_config_controls_and_closed_history(tmp_path, monkeypatch, capsys): + from urllib.parse import urlencode + import teadata.scripts.refresh_tapr as refresh + + args, metadata_path, config_path, references = acquisition_inputs(tmp_path) + original_metadata, original_config = metadata_path.read_bytes(), config_path.read_bytes() + original_records = {path.name: path.read_bytes() for path in (references.root / 'records').glob('*.json')} + controls = [('_service', 'marykay'), ('_program', 'perfrept.perfmast.sas'), ('_debug', '0'), + ('tapr', 'all_c'), ('ccyy', '2025'), ('dsname', 'STUD'), ('sumlev', 'C'), ('level', 'Campus'), + ('id', ''), ('prgopt', 'reports/tapr/dd/dd_tapr_step_7.sas'), ('key', 'ETALL|NTALL'), + ('key', 'ETSIM|ETSIN|ETSIN|ETSPH|ETSPH|ETSAU|ETSAU|ETSBH|ETSBH|ETSNO|ETSNO'), ('datafmt', 'csv')] + for name, value in controls: + args.extend(['--field', name, value]) + read = refresh._read_pinned_input + def captured(path, expected): + raw = read(path, expected) + path.write_bytes(b'changed after capture') + return raw + monkeypatch.setattr(refresh, '_read_pinned_input', captured) + observed = [] + def opened(request, timeout): + observed.append(request) + assert timeout == 20 + assert request.full_url == 'https://rptsvr1.tea.texas.gov/cgi/sas/broker/' + assert request.get_method() == 'POST' and request.data == urlencode(controls).encode() + response = Response(b'complete original public CSV bytes') + response.url = request.full_url + return response + def client(store, **kwargs): + assert kwargs['attempts'] == 1 and kwargs['max_retry_wait'] == 0 + assert any(isinstance(handler, refresh._NoRedirect) for handler in kwargs['opener'].handlers) + kwargs['opener'] = SimpleNamespace(open=opened) + return AcquisitionClient(store, **kwargs) + monkeypatch.setattr(refresh, 'AcquisitionClient', client) + monkeypatch.setattr('socket.socket', lambda *a, **k: pytest.fail('Real socket attempted')) + assert main(args) == 0 + result = json.loads(capsys.readouterr().out) + archive = ProvenanceStore(tmp_path / 'observations') + record = archive.read_record(result['record_id']) + assert len(observed) == 1 and record['dataset'] == 'campus_tapr_student_staff_profile' + assert record['section'] == 'data_sources' and record['requested_year'] == record['resolved_year'] == 2025 + actual = DatasetMetadata.from_dict(record['source_metadata']) + expected = DatasetMetadata.from_dict(json.loads(original_metadata)) + assert replace(actual, provenance_ids=()).to_dict() == expected.to_dict() + assert actual.period.kind == 'unknown' and actual.value_policy is None and not actual.metrics + retained_inputs = {archive.read_record(identifier)['dataset']: archive.read_record(identifier) + for identifier in actual.provenance_ids} + for role, raw in [('metadata', original_metadata), ('config', original_config)]: + source = retained_inputs['reference:acquire_' + role] + assert source['method'] == 'local_observation' and source['downloaded_at'] is None + assert archive.verify_artifact(source['artifact']['sha256']).read_bytes() == raw + assert record['parameters']['form_controls'] == [list(pair) for pair in controls] + assert len(archive.verify_record_closure([result['record_id']])) == 6 + assert {path.name: path.read_bytes() for path in (references.root / 'records').glob('*.json')} == original_records + + +def test_acquire_reference_section_is_explicit_and_does_not_require_config(tmp_path, monkeypatch, capsys): + args, metadata, _config, _references = acquisition_inputs(tmp_path, edition='2024') + for name in ['--config', '--config-sha256', '--year']: + index = args.index(name) + del args[index:index + 2] + args.extend(['--section', 'reference']) + args[args.index('--dataset') + 1] = 'tapr_2024_masking_reference' + args[args.index('--method') + 1] = 'GET' + def client(store, **kwargs): + kwargs['opener'] = SimpleNamespace(open=lambda *a, **k: Response(b'masking document')) + return AcquisitionClient(store, **kwargs) + monkeypatch.setattr('teadata.scripts.refresh_tapr.AcquisitionClient', client) + assert main(args) == 0 + archive = ProvenanceStore(tmp_path / 'observations') + record = archive.read_record(json.loads(capsys.readouterr().out)['record_id']) + assert record['section'] == 'reference' and record['dataset'] == 'tapr_2024_masking_reference' + assert record['requested_year'] is record['resolved_year'] is None + assert replace(DatasetMetadata.from_dict(record['source_metadata']), provenance_ids=()).to_dict() == DatasetMetadata.from_dict(json.loads(metadata.read_bytes())).to_dict() + + +def test_acquire_reference_section_rejects_config_flags_and_old_unbound_cli(tmp_path, monkeypatch): + args, _metadata, _config, _references = acquisition_inputs(tmp_path) + monkeypatch.setattr('teadata.scripts.refresh_tapr.AcquisitionClient', lambda *a, **k: pytest.fail('HTTP client')) + with pytest.raises(ValueError, match='does not select'): + main([*args, '--section', 'reference']) + with pytest.raises(SystemExit): + main(['acquire', '--url', 'https://example.test/reference', '--dataset', 'unregistered', + '--edition', '2025', '--filename', 'reference.html', '--method', 'GET', '--store', str(tmp_path / 'archive')]) + + +def test_acquire_no_redirect_handler_rejects_followup(): + from urllib.error import HTTPError + from urllib.request import Request + from teadata.scripts.refresh_tapr import _NoRedirect + + with pytest.raises(HTTPError, match='redirect blocked'): + _NoRedirect().redirect_request(Request('https://example.test/original'), None, + 302, 'Found', {}, 'https://example.test/not-authorized') + + def test_dictionary_cli_keeps_partial_occurrences_and_exact_retained_history_offline(tmp_path, monkeypatch, capsys): def forbidden(*args, **kwargs): pytest.fail('Dictionary inspection attempted HTTP') diff --git a/tests/test_teadata_config.py b/tests/test_teadata_config.py index feeeca3..a584b02 100644 --- a/tests/test_teadata_config.py +++ b/tests/test_teadata_config.py @@ -1,4 +1,6 @@ -from teadata.teadata_config import Config +import pytest + +from teadata.teadata_config import Config, load_config, load_config_bytes def test_load_table_json_respects_explicit_lines_kwarg(tmp_path): @@ -9,3 +11,23 @@ def test_load_table_json_respects_explicit_lines_kwarg(tmp_path): df = cfg._load_table(str(path), lines=False) assert list(df["alpha"]) == [1, 2] + + +@pytest.mark.parametrize('suffix,raw', [ + ('.yaml', b'data_sources:\r\n sample:\r\n 2025:\r\n path: inputs/old.csv\r\n metadata: {version: "2025"}\r\n'), + ('.toml', b'[data_sources.sample.2025]\r\npath = "inputs/old.csv"\r\n[data_sources.sample.2025.metadata]\r\nversion = "2025"\r\n'), + ('', b'data_sources: {sample: {2025: {path: inputs/old.csv, metadata: {version: "2025"}}}}'), +]) +def test_captured_config_uses_same_format_original_base_and_fallback_without_reopening(tmp_path, monkeypatch, suffix, raw): + path = tmp_path / ('original' + suffix) + path.write_bytes(raw) + original = load_config(path) + path.unlink() + monkeypatch.setattr(type(path), 'read_bytes', lambda self: pytest.fail('Captured Config reopened a path')) + monkeypatch.setattr(type(path), 'read_text', lambda self, *a, **k: pytest.fail('Captured Config reopened a path')) + captured = load_config_bytes(raw, path=path) + assert captured.to_json() == original.to_json() + assert captured.base_dir == tmp_path.resolve() + source = captured.resolve_dataset('sample', 2026, strict=True) + assert source.path == str(tmp_path / 'inputs/old.csv') + assert source.requested_year == 2026 and source.resolved_year == 2025 From d27553c1200975eac5189b32e8243180127e0902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pe=C3=B1a?= Date: Sat, 31 Oct 2026 18:55:49 -0500 Subject: [PATCH 11/11] Register complete 2025 TAPR source preparations --- docs/config.md | 49 +++- .../tapr--2025--staff-profile-crosswalk.json | 0 ...tapr--2025--student-profile-crosswalk.json | 1 + teadata/scripts/build_tapr_profiles.py | 54 +++- teadata/teadata_sources.yaml | 276 ++++++++++++++++++ tests/test_tapr_2025_staff.py | 247 +++++++++++++++- tests/test_tapr_student_staff_sources.py | 18 +- 7 files changed, 608 insertions(+), 37 deletions(-) rename {docs/source-contracts => teadata/schemas}/tapr--2025--staff-profile-crosswalk.json (100%) create mode 100644 teadata/schemas/tapr--2025--student-profile-crosswalk.json diff --git a/docs/config.md b/docs/config.md index db91820..fe73279 100644 --- a/docs/config.md +++ b/docs/config.md @@ -494,13 +494,48 @@ are never combined into a definition. Conflicting known components fail review. Dictionary-only codes do not become source columns or establish availability, aliases, units or reference periods. Existing `header_records()` and `header_rename_map()` remain the code/label/canonical-field mapping APIs. -The proposal at `docs/source-contracts/tapr--2025--staff-profile-crosswalk.json` -describes the retained 106/118-column observations. It is an unactivated source -review input, outside shipped/runtime schemas; it replaces neither Config nor -the historical 2025 composite contract. It makes no key/value-comparison or -data-release claim. Later activation must move this same file into a referenced -runtime schema, update its references/tests, and remove the proposal path in -the same change. +The 2025 `student_profile` and `staff_profile` branches are declared independently +for both scopes through the same explicit `source` profile and preparation +command. Student retains 243/242 campus/district columns and the exact pinned +raw revision; Staff retains the fresh 106/118-column observations, including all +15/17 additional columns. The reviewed Staff proposal moved unchanged to +`schemas/tapr--2025--staff-profile-crosswalk.json`; its proposal path was removed. +The Student contract derives its code/label/canonical-field mapping from the +unchanged historical crosswalk and adds the actual ordered 2025 dictionary +observations. Neither branch inherits 2024 periods, policies or metric bindings: +table/field periods and scientific units remain unknown. Identity/history +attributes stay lossless without creating extra entity metadata keys. + +Use `--edition 2025 --family student_profile` or `--family staff_profile` with +the existing producer. Raw paths remain portable and `--input-dir` selects a +local retained-input directory; provenance stores remain explicit local inputs. +These Config declarations do not qualify a real preparation run, new data +release, released defaults, app activation or schema3. The historical 2025 +composite and its older Staff revision remain independent reproducible evidence, +without fallback, replacement or a current-source alias. An unavailable route +for 2025 PROF does not establish that the source never existed. + +The selected raw, form, annual dictionary, glossary and masking references bind +genuine immutable acquisition receipts. Fresh HTTP dates remain known; earlier +local-download dates remain unknown. The original STUD logical-label typo is +preserved alongside its explicit correction processing receipt; it is not an +automatic alias or replacement acquisition. Config's acquisition-only fields do +not express a processing-input edge. Pass a reviewed dependency explicitly with +repeatable `--processing-input DATASET RECORD_ID` to the existing producer; each +dataset must be selected by that invocation's family/scopes. The producer verifies +that each root is a processing receipt with a complete closure before reading +source rows, then copies that closure and includes the typed ID in that dataset's +new processing inputs. It neither infers applicability nor converts processing +records into acquisitions. The same STUD correction can be explicitly selected +for each affected scope; its complete original graph remains intact. Real +producer qualification still requires separately reviewed selected inputs and +execution evidence; these declarations and synthetic tests do not supply it. + +Preparation accepts canonical annual integer editions exactly registered in +Config, rather than a fixed year allowlist. The existing reader requires the +resolved year and metadata version to match exactly before opening source rows; +nearest-prior fallback remains prohibited. This does not declare or acquire real +2026 inputs or introduce a general opaque-edition model. Compare two retained originals offline using their exact acquisition IDs and independently reviewed crosswalks. Substitute the actual IDs and reviewed SHAs: diff --git a/docs/source-contracts/tapr--2025--staff-profile-crosswalk.json b/teadata/schemas/tapr--2025--staff-profile-crosswalk.json similarity index 100% rename from docs/source-contracts/tapr--2025--staff-profile-crosswalk.json rename to teadata/schemas/tapr--2025--staff-profile-crosswalk.json diff --git a/teadata/schemas/tapr--2025--student-profile-crosswalk.json b/teadata/schemas/tapr--2025--student-profile-crosswalk.json new file mode 100644 index 0000000..0f6a85d --- /dev/null +++ b/teadata/schemas/tapr--2025--student-profile-crosswalk.json @@ -0,0 +1 @@ +{"datasets":[{"dataset":"campus_tapr_student_profile","edition":"2025","source_only":true,"tables":[{"dictionary_records":[{"code":"CPETALLC","ordinal":1,"publisher_description":"Campus 2025 Student Membership All Students Count","publisher_type":"Number","source_column":46,"source_line":2263,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTALLC","ordinal":2,"publisher_description":"Campus 2025 Student Enrollment All Students Count","publisher_type":"Number","source_column":46,"source_line":2265,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGEEC","ordinal":3,"publisher_description":"Campus 2025 Student Membership EE Count","publisher_type":"Number","source_column":46,"source_line":2273,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGEEP","ordinal":4,"publisher_description":"Campus 2025 Student Membership EE Percent","publisher_type":"Number","source_column":46,"source_line":2274,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGEEC","ordinal":5,"publisher_description":"Campus 2025 Student Enrollment Early Childhood Education Count","publisher_type":"Number","source_column":46,"source_line":2275,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGEEP","ordinal":6,"publisher_description":"Campus 2025 Student Enrollment Early Childhood Education Percent","publisher_type":"Number","source_column":46,"source_line":2276,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGPKC","ordinal":7,"publisher_description":"Campus 2025 Student Membership PK Count","publisher_type":"Number","source_column":46,"source_line":2280,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGPKP","ordinal":8,"publisher_description":"Campus 2025 Student Membership PK Percent","publisher_type":"Number","source_column":46,"source_line":2281,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGPKC","ordinal":9,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten Count","publisher_type":"Number","source_column":46,"source_line":2282,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGPKP","ordinal":10,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten Percent","publisher_type":"Number","source_column":46,"source_line":2283,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGP3C","ordinal":11,"publisher_description":"Campus 2025 Student Membership PK Ages 3 and Under Count","publisher_type":"Number","source_column":46,"source_line":2287,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGP3P","ordinal":12,"publisher_description":"Campus 2025 Student Membership PK Ages 3 and Under Percent","publisher_type":"Number","source_column":46,"source_line":2288,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGP3C","ordinal":13,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 3-Year Old Count","publisher_type":"Number","source_column":46,"source_line":2289,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGP3P","ordinal":14,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 3-Year Old Percent","publisher_type":"Number","source_column":46,"source_line":2290,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGP4C","ordinal":15,"publisher_description":"Campus 2025 Student Membership PK Ages 4 and Over Count","publisher_type":"Number","source_column":46,"source_line":2294,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGP4P","ordinal":16,"publisher_description":"Campus 2025 Student Membership PK Ages 4 and Over Percent","publisher_type":"Number","source_column":46,"source_line":2295,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGP4C","ordinal":17,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 4-Year Old Count","publisher_type":"Number","source_column":46,"source_line":2296,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGP4P","ordinal":18,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 4-Year Old Percent","publisher_type":"Number","source_column":46,"source_line":2297,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGKNC","ordinal":19,"publisher_description":"Campus 2025 Student Membership KG Count","publisher_type":"Number","source_column":46,"source_line":2301,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGKNP","ordinal":20,"publisher_description":"Campus 2025 Student Membership KG Percent","publisher_type":"Number","source_column":46,"source_line":2302,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGKNC","ordinal":21,"publisher_description":"Campus 2025 Student Enrollment Kindergarten Count","publisher_type":"Number","source_column":46,"source_line":2303,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGKNP","ordinal":22,"publisher_description":"Campus 2025 Student Enrollment Kindergarten Percent","publisher_type":"Number","source_column":46,"source_line":2304,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG01C","ordinal":23,"publisher_description":"Campus 2025 Student Membership 01 Count","publisher_type":"Number","source_column":46,"source_line":2308,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG01P","ordinal":24,"publisher_description":"Campus 2025 Student Membership 01 Percent","publisher_type":"Number","source_column":46,"source_line":2309,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG01C","ordinal":25,"publisher_description":"Campus 2025 Student Enrollment Grade 1 Count","publisher_type":"Number","source_column":46,"source_line":2310,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG01P","ordinal":26,"publisher_description":"Campus 2025 Student Enrollment Grade 1 Percent","publisher_type":"Number","source_column":46,"source_line":2311,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG02C","ordinal":27,"publisher_description":"Campus 2025 Student Membership 02 Count","publisher_type":"Number","source_column":46,"source_line":2315,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG02P","ordinal":28,"publisher_description":"Campus 2025 Student Membership 02 Percent","publisher_type":"Number","source_column":46,"source_line":2316,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG02C","ordinal":29,"publisher_description":"Campus 2025 Student Enrollment Grade 2 Count","publisher_type":"Number","source_column":46,"source_line":2317,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG02P","ordinal":30,"publisher_description":"Campus 2025 Student Enrollment Grade 2 Percent","publisher_type":"Number","source_column":46,"source_line":2318,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG03C","ordinal":31,"publisher_description":"Campus 2025 Student Membership 03 Count","publisher_type":"Number","source_column":46,"source_line":2322,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG03P","ordinal":32,"publisher_description":"Campus 2025 Student Membership 03 Percent","publisher_type":"Number","source_column":46,"source_line":2323,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG03C","ordinal":33,"publisher_description":"Campus 2025 Student Enrollment Grade 3 Count","publisher_type":"Number","source_column":46,"source_line":2324,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG03P","ordinal":34,"publisher_description":"Campus 2025 Student Enrollment Grade 3 Percent","publisher_type":"Number","source_column":46,"source_line":2325,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG04C","ordinal":35,"publisher_description":"Campus 2025 Student Membership 04 Count","publisher_type":"Number","source_column":46,"source_line":2329,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG04P","ordinal":36,"publisher_description":"Campus 2025 Student Membership 04 Percent","publisher_type":"Number","source_column":46,"source_line":2330,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG04C","ordinal":37,"publisher_description":"Campus 2025 Student Enrollment Grade 4 Count","publisher_type":"Number","source_column":46,"source_line":2331,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG04P","ordinal":38,"publisher_description":"Campus 2025 Student Enrollment Grade 4 Percent","publisher_type":"Number","source_column":46,"source_line":2332,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG05C","ordinal":39,"publisher_description":"Campus 2025 Student Membership 05 Count","publisher_type":"Number","source_column":46,"source_line":2336,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG05P","ordinal":40,"publisher_description":"Campus 2025 Student Membership 05 Percent","publisher_type":"Number","source_column":46,"source_line":2337,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG05C","ordinal":41,"publisher_description":"Campus 2025 Student Enrollment Grade 5 Count","publisher_type":"Number","source_column":46,"source_line":2338,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG05P","ordinal":42,"publisher_description":"Campus 2025 Student Enrollment Grade 5 Percent","publisher_type":"Number","source_column":46,"source_line":2339,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG06C","ordinal":43,"publisher_description":"Campus 2025 Student Membership 06 Count","publisher_type":"Number","source_column":46,"source_line":2343,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG06P","ordinal":44,"publisher_description":"Campus 2025 Student Membership 06 Percent","publisher_type":"Number","source_column":46,"source_line":2344,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG06C","ordinal":45,"publisher_description":"Campus 2025 Student Enrollment Grade 6 Count","publisher_type":"Number","source_column":46,"source_line":2345,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG06P","ordinal":46,"publisher_description":"Campus 2025 Student Enrollment Grade 6 Percent","publisher_type":"Number","source_column":46,"source_line":2346,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG07C","ordinal":47,"publisher_description":"Campus 2025 Student Membership 07 Count","publisher_type":"Number","source_column":46,"source_line":2350,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG07P","ordinal":48,"publisher_description":"Campus 2025 Student Membership 07 Percent","publisher_type":"Number","source_column":46,"source_line":2351,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG07C","ordinal":49,"publisher_description":"Campus 2025 Student Enrollment Grade 7 Count","publisher_type":"Number","source_column":46,"source_line":2352,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG07P","ordinal":50,"publisher_description":"Campus 2025 Student Enrollment Grade 7 Percent","publisher_type":"Number","source_column":46,"source_line":2353,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG08C","ordinal":51,"publisher_description":"Campus 2025 Student Membership 08 Count","publisher_type":"Number","source_column":46,"source_line":2357,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG08P","ordinal":52,"publisher_description":"Campus 2025 Student Membership 08 Percent","publisher_type":"Number","source_column":46,"source_line":2358,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG08C","ordinal":53,"publisher_description":"Campus 2025 Student Enrollment Grade 8 Count","publisher_type":"Number","source_column":46,"source_line":2359,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG08P","ordinal":54,"publisher_description":"Campus 2025 Student Enrollment Grade 8 Percent","publisher_type":"Number","source_column":46,"source_line":2360,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG09C","ordinal":55,"publisher_description":"Campus 2025 Student Membership 09 Count","publisher_type":"Number","source_column":46,"source_line":2364,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG09P","ordinal":56,"publisher_description":"Campus 2025 Student Membership 09 Percent","publisher_type":"Number","source_column":46,"source_line":2365,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG09C","ordinal":57,"publisher_description":"Campus 2025 Student Enrollment Grade 9 Count","publisher_type":"Number","source_column":46,"source_line":2366,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG09P","ordinal":58,"publisher_description":"Campus 2025 Student Enrollment Grade 9 Percent","publisher_type":"Number","source_column":46,"source_line":2367,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG10C","ordinal":59,"publisher_description":"Campus 2025 Student Membership 10 Count","publisher_type":"Number","source_column":46,"source_line":2371,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG10P","ordinal":60,"publisher_description":"Campus 2025 Student Membership 10 Percent","publisher_type":"Number","source_column":46,"source_line":2372,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG10C","ordinal":61,"publisher_description":"Campus 2025 Student Enrollment Grade 10 Count","publisher_type":"Number","source_column":46,"source_line":2373,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG10P","ordinal":62,"publisher_description":"Campus 2025 Student Enrollment Grade 10 Percent","publisher_type":"Number","source_column":46,"source_line":2374,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG11C","ordinal":63,"publisher_description":"Campus 2025 Student Membership 11 Count","publisher_type":"Number","source_column":46,"source_line":2378,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG11P","ordinal":64,"publisher_description":"Campus 2025 Student Membership 11 Percent","publisher_type":"Number","source_column":46,"source_line":2379,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG11C","ordinal":65,"publisher_description":"Campus 2025 Student Enrollment Grade 11 Count","publisher_type":"Number","source_column":46,"source_line":2380,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG11P","ordinal":66,"publisher_description":"Campus 2025 Student Enrollment Grade 11 Percent","publisher_type":"Number","source_column":46,"source_line":2381,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG12C","ordinal":67,"publisher_description":"Campus 2025 Student Membership 12 Count","publisher_type":"Number","source_column":46,"source_line":2385,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETG12P","ordinal":68,"publisher_description":"Campus 2025 Student Membership 12 Percent","publisher_type":"Number","source_column":46,"source_line":2386,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG12C","ordinal":69,"publisher_description":"Campus 2025 Student Enrollment Grade 12 Count","publisher_type":"Number","source_column":46,"source_line":2387,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTG12P","ordinal":70,"publisher_description":"Campus 2025 Student Enrollment Grade 12 Percent","publisher_type":"Number","source_column":46,"source_line":2388,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETBLAC","ordinal":71,"publisher_description":"Campus 2025 Student Membership African American Count","publisher_type":"Number","source_column":46,"source_line":2395,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETBLAP","ordinal":72,"publisher_description":"Campus 2025 Student Membership African American Percent","publisher_type":"Number","source_column":46,"source_line":2396,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTBLAC","ordinal":73,"publisher_description":"Campus 2025 Student Enrollment African American Count","publisher_type":"Number","source_column":46,"source_line":2397,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTBLAP","ordinal":74,"publisher_description":"Campus 2025 Student Enrollment African American Percent","publisher_type":"Number","source_column":46,"source_line":2398,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETHISC","ordinal":75,"publisher_description":"Campus 2025 Student Membership Hispanic Count","publisher_type":"Number","source_column":46,"source_line":2402,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETHISP","ordinal":76,"publisher_description":"Campus 2025 Student Membership Hispanic Percent","publisher_type":"Number","source_column":46,"source_line":2403,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTHISC","ordinal":77,"publisher_description":"Campus 2025 Student Enrollment Hispanic Count","publisher_type":"Number","source_column":46,"source_line":2404,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTHISP","ordinal":78,"publisher_description":"Campus 2025 Student Enrollment Hispanic Percent","publisher_type":"Number","source_column":46,"source_line":2405,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETWHIC","ordinal":79,"publisher_description":"Campus 2025 Student Membership White Count","publisher_type":"Number","source_column":46,"source_line":2409,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETWHIP","ordinal":80,"publisher_description":"Campus 2025 Student Membership White Percent","publisher_type":"Number","source_column":46,"source_line":2410,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTWHIC","ordinal":81,"publisher_description":"Campus 2025 Student Enrollment White Count","publisher_type":"Number","source_column":46,"source_line":2411,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTWHIP","ordinal":82,"publisher_description":"Campus 2025 Student Enrollment White Percent","publisher_type":"Number","source_column":46,"source_line":2412,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETINDC","ordinal":83,"publisher_description":"Campus 2025 Student Membership American Indian Count","publisher_type":"Number","source_column":46,"source_line":2416,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETINDP","ordinal":84,"publisher_description":"Campus 2025 Student Membership American Indian Percent","publisher_type":"Number","source_column":46,"source_line":2417,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTINDC","ordinal":85,"publisher_description":"Campus 2025 Student Enrollment Asian Count","publisher_type":"Number","source_column":46,"source_line":2418,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTINDP","ordinal":86,"publisher_description":"Campus 2025 Student Enrollment Asian Percent","publisher_type":"Number","source_column":46,"source_line":2419,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETASIC","ordinal":87,"publisher_description":"Campus 2025 Student Membership Asian Count","publisher_type":"Number","source_column":46,"source_line":2423,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETASIP","ordinal":88,"publisher_description":"Campus 2025 Student Membership Asian Percent","publisher_type":"Number","source_column":46,"source_line":2424,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTASIC","ordinal":89,"publisher_description":"Campus 2024-25 Asian Students Count","publisher_type":"Number","source_column":46,"source_line":2425,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTASIP","ordinal":90,"publisher_description":"Campus 2024-25 Asian Students Percent","publisher_type":"Number","source_column":46,"source_line":2426,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETPCIC","ordinal":91,"publisher_description":"Campus 2025 Student Membership Pacific Islander Count","publisher_type":"Number","source_column":46,"source_line":2430,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETPCIP","ordinal":92,"publisher_description":"Campus 2025 Student Membership Pacific Islander Percent","publisher_type":"Number","source_column":46,"source_line":2431,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTPCIC","ordinal":93,"publisher_description":"Campus 2025 Student Enrollment Pacific Islander Count","publisher_type":"Number","source_column":46,"source_line":2432,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTPCIP","ordinal":94,"publisher_description":"Campus 2025 Student Enrollment Pacific Islander Percent","publisher_type":"Number","source_column":46,"source_line":2433,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETTWOC","ordinal":95,"publisher_description":"Campus 2025 Student Membership Two or More Races Count","publisher_type":"Number","source_column":46,"source_line":2437,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETTWOP","ordinal":96,"publisher_description":"Campus 2025 Student Membership Two or More Races Percent","publisher_type":"Number","source_column":46,"source_line":2438,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTTWOC","ordinal":97,"publisher_description":"Campus 2025 Student Enrollment Two or More Races Count","publisher_type":"Number","source_column":46,"source_line":2439,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTTWOP","ordinal":98,"publisher_description":"Campus 2025 Student Enrollment Two or More Races Percent","publisher_type":"Number","source_column":46,"source_line":2440,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETFEMC","ordinal":99,"publisher_description":"Campus 2025 Student Membership Female Count","publisher_type":"Number","source_column":46,"source_line":2447,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETFEMP","ordinal":100,"publisher_description":"Campus 2025 Student Membership Female Percent","publisher_type":"Number","source_column":46,"source_line":2448,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTFEMC","ordinal":101,"publisher_description":"Campus 2025 Student Enrollment Female: Count","publisher_type":"Number","source_column":46,"source_line":2449,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTFEMP","ordinal":102,"publisher_description":"Campus 2025 Student Enrollment Female: Percent","publisher_type":"Number","source_column":46,"source_line":2450,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETMALC","ordinal":103,"publisher_description":"Campus 2025 Student Membership Male Count","publisher_type":"Number","source_column":46,"source_line":2454,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETMALP","ordinal":104,"publisher_description":"Campus 2025 Student Membership Male Percent","publisher_type":"Number","source_column":46,"source_line":2455,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTMALC","ordinal":105,"publisher_description":"Campus 2025 Student Enrollment Male Count","publisher_type":"Number","source_column":46,"source_line":2456,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTMALP","ordinal":106,"publisher_description":"Campus 2025 Student Enrollment Male Percent","publisher_type":"Number","source_column":46,"source_line":2457,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETECOC","ordinal":107,"publisher_description":"Campus 2025 Student Membership Econ Disadv Count","publisher_type":"Number","source_column":46,"source_line":2464,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETECOP","ordinal":108,"publisher_description":"Campus 2025 Student Membership Econ Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2465,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTECOC","ordinal":109,"publisher_description":"Campus 2025 Student Enrollment Economically Disadvantaged Count","publisher_type":"Number","source_column":46,"source_line":2466,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTECOP","ordinal":110,"publisher_description":"Campus 2025 Student Enrollment Economically Disadvantaged Percent","publisher_type":"Number","source_column":46,"source_line":2467,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETNEDC","ordinal":111,"publisher_description":"Campus 2025 Student Membership Non-Educationally Disadv Count","publisher_type":"Number","source_column":46,"source_line":2471,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETNEDP","ordinal":112,"publisher_description":"Campus 2025 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2472,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTNEDC","ordinal":113,"publisher_description":"Campus 2025 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number","source_column":46,"source_line":2473,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTNEDP","ordinal":114,"publisher_description":"Campus 2025 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2474,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPET504C","ordinal":115,"publisher_description":"Campus 2025 Student Membership Section 504 Count","publisher_type":"Number","source_column":46,"source_line":2478,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPET504P","ordinal":116,"publisher_description":"Campus 2025 Student Membership Section 504 Percent","publisher_type":"Number","source_column":46,"source_line":2479,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNT504C","ordinal":117,"publisher_description":"Campus 2025 Student Enrollment Section 504 Count","publisher_type":"Number","source_column":46,"source_line":2480,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNT504P","ordinal":118,"publisher_description":"Campus 2025 Student Enrollment Section 504 Percent","publisher_type":"Number","source_column":46,"source_line":2481,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETLEPC","ordinal":119,"publisher_description":"Campus 2025 Student Membership EB/EL Count","publisher_type":"Number","source_column":46,"source_line":2485,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETLEPP","ordinal":120,"publisher_description":"Campus 2025 Student Membership EB/EL Percent","publisher_type":"Number","source_column":46,"source_line":2486,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTLEPC","ordinal":121,"publisher_description":"Campus 2025 Student Enrollment English Learner Count","publisher_type":"Number","source_column":46,"source_line":2487,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTLEPP","ordinal":122,"publisher_description":"Campus 2025 Student Enrollment English Learner Percent","publisher_type":"Number","source_column":46,"source_line":2488,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETDISC","ordinal":123,"publisher_description":"Campus 2024 DAEP Count","publisher_type":"Number","source_column":46,"source_line":2492,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETDISP","ordinal":124,"publisher_description":"Campus 2024 DAEP Percent","publisher_type":"Number","source_column":46,"source_line":2493,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETDSLC","ordinal":125,"publisher_description":"Campus 2025 Student Membership Dyslexia Count","publisher_type":"Number","source_column":46,"source_line":2499,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETDSLP","ordinal":126,"publisher_description":"Campus 2025 Student Membership Dyslexia Percent","publisher_type":"Number","source_column":46,"source_line":2500,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTDSLC","ordinal":127,"publisher_description":"Campus 2025 Student Enrollment Dyslexia Count","publisher_type":"Number","source_column":46,"source_line":2501,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTDSLP","ordinal":128,"publisher_description":"Campus 2025 Student Enrollment Dyslexia Percent","publisher_type":"Number","source_column":46,"source_line":2502,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETFOSC","ordinal":129,"publisher_description":"Campus 2025 Student Membership Foster Care Count","publisher_type":"Number","source_column":46,"source_line":2506,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETFOSP","ordinal":130,"publisher_description":"Campus 2025 Student Membership Foster Care Percent","publisher_type":"Number","source_column":46,"source_line":2507,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTFOSC","ordinal":131,"publisher_description":"Campus 2025 Student Enrollment Foster Care Count","publisher_type":"Number","source_column":46,"source_line":2508,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTFOSP","ordinal":132,"publisher_description":"Campus 2025 Student Enrollment Foster Care Percent","publisher_type":"Number","source_column":46,"source_line":2509,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETHOMC","ordinal":133,"publisher_description":"Campus 2025 Student Membership Homeless Count","publisher_type":"Number","source_column":46,"source_line":2513,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETHOMP","ordinal":134,"publisher_description":"Campus 2025 Student Membership Homeless Percent","publisher_type":"Number","source_column":46,"source_line":2514,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTHOMC","ordinal":135,"publisher_description":"Campus 2025 Student Enrollment Homeless Count","publisher_type":"Number","source_column":46,"source_line":2515,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTHOMP","ordinal":136,"publisher_description":"Campus 2025 Student Enrollment Homeless Percent","publisher_type":"Number","source_column":46,"source_line":2516,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETIMMC","ordinal":137,"publisher_description":"Campus 2025 Student Membership Immigrant Count","publisher_type":"Number","source_column":46,"source_line":2520,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETIMMP","ordinal":138,"publisher_description":"Campus 2025 Student Membership Immigrant Percent","publisher_type":"Number","source_column":46,"source_line":2521,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTIMMC","ordinal":139,"publisher_description":"Campus 2025 Student Enrollment Immigrant Count","publisher_type":"Number","source_column":46,"source_line":2522,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTIMMP","ordinal":140,"publisher_description":"Campus 2025 Student Enrollment Immigrant Percent","publisher_type":"Number","source_column":46,"source_line":2523,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETMIGC","ordinal":141,"publisher_description":"Campus 2025 Student Membership Migrant Count","publisher_type":"Number","source_column":46,"source_line":2527,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETMIGP","ordinal":142,"publisher_description":"Campus 2025 Student Membership Migrant Percent","publisher_type":"Number","source_column":46,"source_line":2528,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTMIGC","ordinal":143,"publisher_description":"Campus 2025 Student Enrollment Migrant Count","publisher_type":"Number","source_column":46,"source_line":2529,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTMIGP","ordinal":144,"publisher_description":"Campus 2025 Student Enrollment Migrant Percent","publisher_type":"Number","source_column":46,"source_line":2530,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETTT1C","ordinal":145,"publisher_description":"Campus 2025 Student Membership Title I Count","publisher_type":"Number","source_column":46,"source_line":2534,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETTT1P","ordinal":146,"publisher_description":"Campus 2025 Student Membership Title I Percent","publisher_type":"Number","source_column":46,"source_line":2535,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTTT1C","ordinal":147,"publisher_description":"Campus 2025 Student Enrollment Title I Count","publisher_type":"Number","source_column":46,"source_line":2536,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTTT1P","ordinal":148,"publisher_description":"Campus 2025 Student Enrollment Title I Percent","publisher_type":"Number","source_column":46,"source_line":2537,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETMLCC","ordinal":149,"publisher_description":"Campus 2025 Student Membership Military-Connected Count","publisher_type":"Number","source_column":46,"source_line":2541,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETMLCP","ordinal":150,"publisher_description":"Campus 2025 Student Membership Military-Connected Percent","publisher_type":"Number","source_column":46,"source_line":2542,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTMLCC","ordinal":151,"publisher_description":"Campus 2025 Student Enrollment Military-Connected Count","publisher_type":"Number","source_column":46,"source_line":2543,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTMLCP","ordinal":152,"publisher_description":"Campus 2025 Student Enrollment Military-Connected Percent","publisher_type":"Number","source_column":46,"source_line":2544,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETRSKC","ordinal":153,"publisher_description":"Campus 2025 Student Membership At Risk Count","publisher_type":"Number","source_column":46,"source_line":2548,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETRSKP","ordinal":154,"publisher_description":"Campus 2025 Student Membership At Risk Percent","publisher_type":"Number","source_column":46,"source_line":2549,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTRSKC","ordinal":155,"publisher_description":"Campus 2025 Student Enrollment At Risk Count","publisher_type":"Number","source_column":46,"source_line":2550,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTRSKP","ordinal":156,"publisher_description":"Campus 2025 Student Enrollment At Risk Percent","publisher_type":"Number","source_column":46,"source_line":2551,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETBILC","ordinal":157,"publisher_description":"Campus 2025 Student Membership Bilingual/ESL Count","publisher_type":"Number","source_column":46,"source_line":2558,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETBILP","ordinal":158,"publisher_description":"Campus 2025 Student Membership Bilingual/ESL Percent","publisher_type":"Number","source_column":46,"source_line":2559,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTBILC","ordinal":159,"publisher_description":"Campus 2025 Student Enrollment Bilingual/ESL Count","publisher_type":"Number","source_column":46,"source_line":2560,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTBILP","ordinal":160,"publisher_description":"Campus 2025 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number","source_column":46,"source_line":2561,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETVOCC","ordinal":161,"publisher_description":"Campus 2025 Student Membership Career & Technical Education Count","publisher_type":"Number","source_column":46,"source_line":2565,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETVOCP","ordinal":162,"publisher_description":"Campus 2025 Student Membership Career & Technical Education Percent","publisher_type":"Number","source_column":46,"source_line":2566,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETVHSC","ordinal":163,"publisher_description":"Campus 2025 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number","source_column":46,"source_line":2572,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETVHSP","ordinal":164,"publisher_description":"Campus 2025 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number","source_column":46,"source_line":2573,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGIFC","ordinal":165,"publisher_description":"Campus 2025 Student Membership Gifted & Talented Count","publisher_type":"Number","source_column":46,"source_line":2579,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETGIFP","ordinal":166,"publisher_description":"Campus 2025 Student Membership Gifted & Talented Percent","publisher_type":"Number","source_column":46,"source_line":2580,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGIFC","ordinal":167,"publisher_description":"Campus 2025 Student Enrollment Gifted and Talented Count","publisher_type":"Number","source_column":46,"source_line":2581,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTGIFP","ordinal":168,"publisher_description":"Campus 2025 Student Enrollment Gifted and Talented Percent","publisher_type":"Number","source_column":46,"source_line":2582,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSPEC","ordinal":169,"publisher_description":"Campus 2025 Student Membership Special Ed Count","publisher_type":"Number","source_column":46,"source_line":2586,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSPEP","ordinal":170,"publisher_description":"Campus 2025 Student Membership Special Ed Percent","publisher_type":"Number","source_column":46,"source_line":2587,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTSPEC","ordinal":171,"publisher_description":"Campus 2025 Student Enrollment Special Ed Count","publisher_type":"Number","source_column":46,"source_line":2588,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPNTSPEP","ordinal":172,"publisher_description":"Campus 2025 Student Enrollment Special Ed Percent","publisher_type":"Number","source_column":46,"source_line":2589,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSIMC","ordinal":173,"publisher_description":"Campus 2025 Student Membership Total Students with Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2596,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSINC","ordinal":174,"publisher_description":"Campus 2025 Student Membership Intellectual Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2603,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSINP","ordinal":175,"publisher_description":"Campus 2025 Student Membership Intellectual Disabilities Percent","publisher_type":"Number","source_column":46,"source_line":2604,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSPHC","ordinal":176,"publisher_description":"Campus 2025 Student Membership Physical Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2610,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSPHP","ordinal":177,"publisher_description":"Campus 2025 Student Membership Physical Disabilities Percent","publisher_type":"Number","source_column":46,"source_line":2611,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSAUC","ordinal":178,"publisher_description":"Campus 2025 Student Membership Autism Count","publisher_type":"Number","source_column":46,"source_line":2617,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSAUP","ordinal":179,"publisher_description":"Campus 2025 Student Membership Autism Percent","publisher_type":"Number","source_column":46,"source_line":2618,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSBHC","ordinal":180,"publisher_description":"Campus 2025 Student Membership Behavioral Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2624,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSBHP","ordinal":181,"publisher_description":"Campus 2025 Student Membership Behavioral Disabilities Percent","publisher_type":"Number","source_column":46,"source_line":2625,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSNOC","ordinal":182,"publisher_description":"Campus 2025 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number","source_column":46,"source_line":2631,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETSNOP","ordinal":183,"publisher_description":"Campus 2025 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number","source_column":46,"source_line":2632,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMBLAC","ordinal":184,"publisher_description":"Campus 2025 Student Membership 2024 Mobility African American Count","publisher_type":"Number","source_column":46,"source_line":2641,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMBLAP","ordinal":185,"publisher_description":"Campus 2025 Student Membership 2024 Mobility African American Percent","publisher_type":"Number","source_column":46,"source_line":2642,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMHISC","ordinal":186,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Hispanic Count","publisher_type":"Number","source_column":46,"source_line":2648,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMHISP","ordinal":187,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Hispanic Percent","publisher_type":"Number","source_column":46,"source_line":2649,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMWHIC","ordinal":188,"publisher_description":"Campus 2025 Student Membership 2024 Mobility White Count","publisher_type":"Number","source_column":46,"source_line":2655,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMWHIP","ordinal":189,"publisher_description":"Campus 2025 Student Membership 2024 Mobility White Percent","publisher_type":"Number","source_column":46,"source_line":2656,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMINDC","ordinal":190,"publisher_description":"Campus 2025 Student Membership 2024 Mobility American Indian Count","publisher_type":"Number","source_column":46,"source_line":2662,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMINDP","ordinal":191,"publisher_description":"Campus 2025 Student Membership 2024 Mobility American Indian Percent","publisher_type":"Number","source_column":46,"source_line":2663,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMASIC","ordinal":192,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Asian Count","publisher_type":"Number","source_column":46,"source_line":2669,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMASIP","ordinal":193,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Asian Percent","publisher_type":"Number","source_column":46,"source_line":2670,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMPCIC","ordinal":194,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Pacific Islander Count","publisher_type":"Number","source_column":46,"source_line":2676,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMPCIP","ordinal":195,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Pacific Islander Percent","publisher_type":"Number","source_column":46,"source_line":2677,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMTWOC","ordinal":196,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Two or More Races Count","publisher_type":"Number","source_column":46,"source_line":2683,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMTWOP","ordinal":197,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Two or More Races Percent","publisher_type":"Number","source_column":46,"source_line":2684,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMALLC","ordinal":198,"publisher_description":"Campus 2025 Student Membership 2024 Mobility All Students Count","publisher_type":"Number","source_column":46,"source_line":2690,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMALLP","ordinal":199,"publisher_description":"Campus 2025 Student Membership 2024 Mobility All Students Percent","publisher_type":"Number","source_column":46,"source_line":2691,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMSPEC","ordinal":200,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Special Ed Count","publisher_type":"Number","source_column":46,"source_line":2697,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMSPEP","ordinal":201,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Special Ed Percent","publisher_type":"Number","source_column":46,"source_line":2698,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMLEPC","ordinal":202,"publisher_description":"Campus 2025 Student Membership 2024 Mobility EB/EL Count","publisher_type":"Number","source_column":46,"source_line":2704,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMLEPP","ordinal":203,"publisher_description":"Campus 2025 Student Membership 2024 Mobility EB/EL Percent","publisher_type":"Number","source_column":46,"source_line":2705,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMECOC","ordinal":204,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Econ Disadv Count","publisher_type":"Number","source_column":46,"source_line":2711,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPEMECOP","ordinal":205,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Econ Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2712,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETATTC","ordinal":206,"publisher_description":"Campus 2025 Student Membership 2023-24 Attrition All Students Count","publisher_type":"Number","source_column":46,"source_line":2721,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPETATTP","ordinal":207,"publisher_description":"Campus 2025 Student Membership 2023-24 Attrition All Students Percent","publisher_type":"Number","source_column":46,"source_line":2722,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRAKR","ordinal":208,"publisher_description":"Campus 2024 Retention Regular Ed KG Rate","publisher_type":"Number","source_column":46,"source_line":2760,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSAKR","ordinal":209,"publisher_description":"Campus 2024 Retention Special Ed KG Rate","publisher_type":"Number","source_column":46,"source_line":2761,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA1R","ordinal":210,"publisher_description":"Campus 2024 Retention Regular Ed 01 Rate","publisher_type":"Number","source_column":46,"source_line":2765,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA1R","ordinal":211,"publisher_description":"Campus 2024 Retention Special Ed 01 Rate","publisher_type":"Number","source_column":46,"source_line":2766,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA2R","ordinal":212,"publisher_description":"Campus 2024 Retention Regular Ed 02 Rate","publisher_type":"Number","source_column":46,"source_line":2770,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA2R","ordinal":213,"publisher_description":"Campus 2024 Retention Special Ed 02 Rate","publisher_type":"Number","source_column":46,"source_line":2771,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA3R","ordinal":214,"publisher_description":"Campus 2024 Retention Regular Ed 03 Rate","publisher_type":"Number","source_column":46,"source_line":2775,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA3R","ordinal":215,"publisher_description":"Campus 2024 Retention Special Ed 03 Rate","publisher_type":"Number","source_column":46,"source_line":2776,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA4R","ordinal":216,"publisher_description":"Campus 2024 Retention Regular Ed 04 Rate","publisher_type":"Number","source_column":46,"source_line":2780,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA4R","ordinal":217,"publisher_description":"Campus 2024 Retention Special Ed 04 Rate","publisher_type":"Number","source_column":46,"source_line":2781,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA5R","ordinal":218,"publisher_description":"Campus 2024 Retention Regular Ed 05 Rate","publisher_type":"Number","source_column":46,"source_line":2785,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA5R","ordinal":219,"publisher_description":"Campus 2024 Retention Special Ed 05 Rate","publisher_type":"Number","source_column":46,"source_line":2786,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA6R","ordinal":220,"publisher_description":"Campus 2024 Retention Regular Ed 06 Rate","publisher_type":"Number","source_column":46,"source_line":2790,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA6R","ordinal":221,"publisher_description":"Campus 2024 Retention Special Ed 06 Rate","publisher_type":"Number","source_column":46,"source_line":2791,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA7R","ordinal":222,"publisher_description":"Campus 2024 Retention Regular Ed 07 Rate","publisher_type":"Number","source_column":46,"source_line":2795,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA7R","ordinal":223,"publisher_description":"Campus 2024 Retention Special Ed 07 Rate","publisher_type":"Number","source_column":46,"source_line":2796,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA8R","ordinal":224,"publisher_description":"Campus 2024 Retention Regular Ed 08 Rate","publisher_type":"Number","source_column":46,"source_line":2800,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA8R","ordinal":225,"publisher_description":"Campus 2024 Retention Special Ed 08 Rate","publisher_type":"Number","source_column":46,"source_line":2801,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERRA9R","ordinal":226,"publisher_description":"Campus 2024 Retention Regular Ed 09 Rate","publisher_type":"Number","source_column":46,"source_line":2805,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPERSA9R","ordinal":227,"publisher_description":"Campus 2024 Retention Special Ed 09 Rate","publisher_type":"Number","source_column":46,"source_line":2806,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTGKGA","ordinal":228,"publisher_description":"Campus 2025 Class Size Kindergarten- Avg Size","publisher_type":"Number","source_column":46,"source_line":2835,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTG01A","ordinal":229,"publisher_description":"Campus 2025 Class Size Grade 1 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2839,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTG02A","ordinal":230,"publisher_description":"Campus 2025 Class Size Grade 2 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2843,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTG03A","ordinal":231,"publisher_description":"Campus 2025 Class Size Grade 3 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2847,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTG04A","ordinal":232,"publisher_description":"Campus 2025 Class Size Grade 4 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2851,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTG05A","ordinal":233,"publisher_description":"Campus 2025 Class Size Grade 5 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2855,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTG06A","ordinal":234,"publisher_description":"Campus 2025 Class Size Grade 6 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2859,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTENGA","ordinal":235,"publisher_description":"Campus 2025 Class Size Sec English - Avg Size","publisher_type":"Number","source_column":46,"source_line":2866,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTFLAA","ordinal":236,"publisher_description":"Campus 2025 Class Size Sec For Lng - Avg Size","publisher_type":"Number","source_column":46,"source_line":2870,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTMATA","ordinal":237,"publisher_description":"Campus 2025 Class Size Sec Math - Avg Size","publisher_type":"Number","source_column":46,"source_line":2874,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTSCIA","ordinal":238,"publisher_description":"Campus 2025 Class Size Sec Sci - Avg Size","publisher_type":"Number","source_column":46,"source_line":2878,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"},{"code":"CPCTSOCA","ordinal":239,"publisher_description":"Campus 2025 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number","source_column":46,"source_line":2882,"source_sha256":"01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209"}],"fields":[{"code":"CAMPUS","dictionary_status":"not_applicable","disposition":"identity","field":"campus_number","label":"9 Digit Campus Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"CAMPNAME","dictionary_status":"not_applicable","disposition":"identity","field":"campus_name","label":"Campus Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":3,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":4,"publisher_description":null,"publisher_type":null},{"code":"CPCTENGA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_sec_english_avg_size","label":"Campus 2025 Class Size: Sec English - Avg Size","position":5,"publisher_description":"Campus 2025 Class Size Sec English - Avg Size","publisher_type":"Number"},{"code":"CPCTMATA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_sec_math_avg_size","label":"Campus 2025 Class Size: Sec Math - Avg Size","position":6,"publisher_description":"Campus 2025 Class Size Sec Math - Avg Size","publisher_type":"Number"},{"code":"CPCTSCIA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_sec_sci_avg_size","label":"Campus 2025 Class Size: Sec Sci - Avg Size","position":7,"publisher_description":"Campus 2025 Class Size Sec Sci - Avg Size","publisher_type":"Number"},{"code":"CPCTSOCA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_sec_soc_stud_avg_size","label":"Campus 2025 Class Size: Sec Soc Stud- Avg Size","position":8,"publisher_description":"Campus 2025 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number"},{"code":"CPCTFLAA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_sec_for_lng_avg_size","label":"Campus 2025 Class Size: Sec For Lng - Avg Size","position":9,"publisher_description":"Campus 2025 Class Size Sec For Lng - Avg Size","publisher_type":"Number"},{"code":"CPCTGKGA","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_kindergarten_avg_size","label":"Campus 2025 Class Size: Kindergarten- Avg Size","position":10,"publisher_description":"Campus 2025 Class Size Kindergarten- Avg Size","publisher_type":"Number"},{"code":"CPCTG01A","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_grade_1_avg_size","label":"Campus 2025 Class Size: Grade 1 - Avg Size","position":11,"publisher_description":"Campus 2025 Class Size Grade 1 - Avg Size","publisher_type":"Number"},{"code":"CPCTG02A","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_grade_2_avg_size","label":"Campus 2025 Class Size: Grade 2 - Avg Size","position":12,"publisher_description":"Campus 2025 Class Size Grade 2 - Avg Size","publisher_type":"Number"},{"code":"CPCTG03A","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_grade_3_avg_size","label":"Campus 2025 Class Size: Grade 3 - Avg Size","position":13,"publisher_description":"Campus 2025 Class Size Grade 3 - Avg Size","publisher_type":"Number"},{"code":"CPCTG04A","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_grade_4_avg_size","label":"Campus 2025 Class Size: Grade 4 - Avg Size","position":14,"publisher_description":"Campus 2025 Class Size Grade 4 - Avg Size","publisher_type":"Number"},{"code":"CPCTG05A","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_grade_5_avg_size","label":"Campus 2025 Class Size: Grade 5 - Avg Size","position":15,"publisher_description":"Campus 2025 Class Size Grade 5 - Avg Size","publisher_type":"Number"},{"code":"CPCTG06A","dictionary_status":"documented","disposition":"fact","field":"campus_2025_class_size_grade_6_avg_size","label":"Campus 2025 Class Size: Grade 6 - Avg Size","position":16,"publisher_description":"Campus 2025 Class Size Grade 6 - Avg Size","publisher_type":"Number"},{"code":"CPERRAKR","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_kg_rate","label":"Campus 2024 Retention: Regular Ed KG Rate","position":17,"publisher_description":"Campus 2024 Retention Regular Ed KG Rate","publisher_type":"Number"},{"code":"CPERRA1R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_01_rate","label":"Campus 2024 Retention: Regular Ed 01 Rate","position":18,"publisher_description":"Campus 2024 Retention Regular Ed 01 Rate","publisher_type":"Number"},{"code":"CPERRA2R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_02_rate","label":"Campus 2024 Retention: Regular Ed 02 Rate","position":19,"publisher_description":"Campus 2024 Retention Regular Ed 02 Rate","publisher_type":"Number"},{"code":"CPERRA3R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_03_rate","label":"Campus 2024 Retention: Regular Ed 03 Rate","position":20,"publisher_description":"Campus 2024 Retention Regular Ed 03 Rate","publisher_type":"Number"},{"code":"CPERRA4R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_04_rate","label":"Campus 2024 Retention: Regular Ed 04 Rate","position":21,"publisher_description":"Campus 2024 Retention Regular Ed 04 Rate","publisher_type":"Number"},{"code":"CPERRA5R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_05_rate","label":"Campus 2024 Retention: Regular Ed 05 Rate","position":22,"publisher_description":"Campus 2024 Retention Regular Ed 05 Rate","publisher_type":"Number"},{"code":"CPERRA6R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_06_rate","label":"Campus 2024 Retention: Regular Ed 06 Rate","position":23,"publisher_description":"Campus 2024 Retention Regular Ed 06 Rate","publisher_type":"Number"},{"code":"CPERRA7R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_07_rate","label":"Campus 2024 Retention: Regular Ed 07 Rate","position":24,"publisher_description":"Campus 2024 Retention Regular Ed 07 Rate","publisher_type":"Number"},{"code":"CPERRA8R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_08_rate","label":"Campus 2024 Retention: Regular Ed 08 Rate","position":25,"publisher_description":"Campus 2024 Retention Regular Ed 08 Rate","publisher_type":"Number"},{"code":"CPERRA9R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_regular_ed_09_rate","label":"Campus 2024 Retention: Regular Ed 09 Rate","position":26,"publisher_description":"Campus 2024 Retention Regular Ed 09 Rate","publisher_type":"Number"},{"code":"CPERSAKR","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_kg_rate","label":"Campus 2024 Retention: Special Ed KG Rate","position":27,"publisher_description":"Campus 2024 Retention Special Ed KG Rate","publisher_type":"Number"},{"code":"CPERSA1R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_01_rate","label":"Campus 2024 Retention: Special Ed 01 Rate","position":28,"publisher_description":"Campus 2024 Retention Special Ed 01 Rate","publisher_type":"Number"},{"code":"CPERSA2R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_02_rate","label":"Campus 2024 Retention: Special Ed 02 Rate","position":29,"publisher_description":"Campus 2024 Retention Special Ed 02 Rate","publisher_type":"Number"},{"code":"CPERSA3R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_03_rate","label":"Campus 2024 Retention: Special Ed 03 Rate","position":30,"publisher_description":"Campus 2024 Retention Special Ed 03 Rate","publisher_type":"Number"},{"code":"CPERSA4R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_04_rate","label":"Campus 2024 Retention: Special Ed 04 Rate","position":31,"publisher_description":"Campus 2024 Retention Special Ed 04 Rate","publisher_type":"Number"},{"code":"CPERSA5R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_05_rate","label":"Campus 2024 Retention: Special Ed 05 Rate","position":32,"publisher_description":"Campus 2024 Retention Special Ed 05 Rate","publisher_type":"Number"},{"code":"CPERSA6R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_06_rate","label":"Campus 2024 Retention: Special Ed 06 Rate","position":33,"publisher_description":"Campus 2024 Retention Special Ed 06 Rate","publisher_type":"Number"},{"code":"CPERSA7R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_07_rate","label":"Campus 2024 Retention: Special Ed 07 Rate","position":34,"publisher_description":"Campus 2024 Retention Special Ed 07 Rate","publisher_type":"Number"},{"code":"CPERSA8R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_08_rate","label":"Campus 2024 Retention: Special Ed 08 Rate","position":35,"publisher_description":"Campus 2024 Retention Special Ed 08 Rate","publisher_type":"Number"},{"code":"CPERSA9R","dictionary_status":"documented","disposition":"fact","field":"campus_2024_retention_special_ed_09_rate","label":"Campus 2024 Retention: Special Ed 09 Rate","position":36,"publisher_description":"Campus 2024 Retention Special Ed 09 Rate","publisher_type":"Number"},{"code":"CPETSIMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_total_students_with_disabilities_count","label":"Campus 2025 Student Membership: Total Students with Disabilities Count","position":37,"publisher_description":"Campus 2025 Student Membership Total Students with Disabilities Count","publisher_type":"Number"},{"code":"CPETSINC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_intellectual_disabilities_count","label":"Campus 2025 Student Membership: Intellectual Disabilities Count","position":38,"publisher_description":"Campus 2025 Student Membership Intellectual Disabilities Count","publisher_type":"Number"},{"code":"CPETSPHC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_physical_disabilities_count","label":"Campus 2025 Student Membership: Physical Disabilities Count","position":39,"publisher_description":"Campus 2025 Student Membership Physical Disabilities Count","publisher_type":"Number"},{"code":"CPETSBHC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_behavioral_disabilities_count","label":"Campus 2025 Student Membership: Behavioral Disabilities Count","position":40,"publisher_description":"Campus 2025 Student Membership Behavioral Disabilities Count","publisher_type":"Number"},{"code":"CPETSAUC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_autism_count","label":"Campus 2025 Student Membership: Autism Count","position":41,"publisher_description":"Campus 2025 Student Membership Autism Count","publisher_type":"Number"},{"code":"CPETSNOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_non_categorical_early_childhood_count","label":"Campus 2025 Student Membership: Non-Categorical Early Childhood Count","position":42,"publisher_description":"Campus 2025 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number"},{"code":"CPETSINP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_intellectual_disabilities_percent","label":"Campus 2025 Student Membership: Intellectual Disabilities Percent","position":43,"publisher_description":"Campus 2025 Student Membership Intellectual Disabilities Percent","publisher_type":"Number"},{"code":"CPETSPHP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_physical_disabilities_percent","label":"Campus 2025 Student Membership: Physical Disabilities Percent","position":44,"publisher_description":"Campus 2025 Student Membership Physical Disabilities Percent","publisher_type":"Number"},{"code":"CPETSBHP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_behavioral_disabilities_percent","label":"Campus 2025 Student Membership: Behavioral Disabilities Percent","position":45,"publisher_description":"Campus 2025 Student Membership Behavioral Disabilities Percent","publisher_type":"Number"},{"code":"CPETSAUP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_autism_percent","label":"Campus 2025 Student Membership: Autism Percent","position":46,"publisher_description":"Campus 2025 Student Membership Autism Percent","publisher_type":"Number"},{"code":"CPETSNOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_non_categorical_early_childhood_percent","label":"Campus 2025 Student Membership: Non-Categorical Early Childhood Percent","position":47,"publisher_description":"Campus 2025 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number"},{"code":"CPETDISC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_daep_count","label":"Campus 2024 DAEP: Count","position":48,"publisher_description":"Campus 2024 DAEP Count","publisher_type":"Number"},{"code":"CPETDISP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_daep_percent","label":"Campus 2024 DAEP: Percent","position":49,"publisher_description":"Campus 2024 DAEP Percent","publisher_type":"Number"},{"code":"CPETATTC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2023_24_attrition_all_students_count","label":"Campus 2025 Student Membership: 2023-24 Attrition All Students Count","position":50,"publisher_description":"Campus 2025 Student Membership 2023-24 Attrition All Students Count","publisher_type":"Number"},{"code":"CPETATTP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2023_24_attrition_all_students_percent","label":"Campus 2025 Student Membership: 2023-24 Attrition All Students Percent","position":51,"publisher_description":"Campus 2025 Student Membership 2023-24 Attrition All Students Percent","publisher_type":"Number"},{"code":"CPETLEPP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_eb_el_percent","label":"Campus 2025 Student Membership: EB/EL Percent","position":52,"publisher_description":"Campus 2025 Student Membership EB/EL Percent","publisher_type":"Number"},{"code":"CPETECOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_econ_disadv_percent","label":"Campus 2025 Student Membership: Econ Disadv Percent","position":53,"publisher_description":"Campus 2025 Student Membership Econ Disadv Percent","publisher_type":"Number"},{"code":"CPETRSKP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_at_risk_percent","label":"Campus 2025 Student Membership: At Risk Percent","position":54,"publisher_description":"Campus 2025 Student Membership At Risk Percent","publisher_type":"Number"},{"code":"CPETNEDP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_non_educationally_disadv_percent","label":"Campus 2025 Student Membership: Non-Educationally Disadv Percent","position":55,"publisher_description":"Campus 2025 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"CPETECOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_econ_disadv_count","label":"Campus 2025 Student Membership: Econ Disadv Count","position":56,"publisher_description":"Campus 2025 Student Membership Econ Disadv Count","publisher_type":"Number"},{"code":"CPETRSKC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_at_risk_count","label":"Campus 2025 Student Membership: At Risk Count","position":57,"publisher_description":"Campus 2025 Student Membership At Risk Count","publisher_type":"Number"},{"code":"CPETLEPC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_eb_el_count","label":"Campus 2025 Student Membership: EB/EL Count","position":58,"publisher_description":"Campus 2025 Student Membership EB/EL Count","publisher_type":"Number"},{"code":"CPETNEDC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_non_educationally_disadv_count","label":"Campus 2025 Student Membership: Non-Educationally Disadv Count","position":59,"publisher_description":"Campus 2025 Student Membership Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"CPETSPEC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_special_ed_count","label":"Campus 2025 Student Membership: Special Ed Count","position":60,"publisher_description":"Campus 2025 Student Membership Special Ed Count","publisher_type":"Number"},{"code":"CPETGIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_gifted_and_talented_count","label":"Campus 2025 Student Membership: Gifted & Talented Count","position":61,"publisher_description":"Campus 2025 Student Membership Gifted & Talented Count","publisher_type":"Number"},{"code":"CPETALLC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_all_students_count","label":"Campus 2025 Student Membership: All Students Count","position":62,"publisher_description":"Campus 2025 Student Membership All Students Count","publisher_type":"Number"},{"code":"CPETTT1C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_title_i_count","label":"Campus 2025 Student Membership: Title I Count","position":63,"publisher_description":"Campus 2025 Student Membership Title I Count","publisher_type":"Number"},{"code":"CPETHOMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_homeless_count","label":"Campus 2025 Student Membership: Homeless Count","position":64,"publisher_description":"Campus 2025 Student Membership Homeless Count","publisher_type":"Number"},{"code":"CPETIMMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_immigrant_count","label":"Campus 2025 Student Membership: Immigrant Count","position":65,"publisher_description":"Campus 2025 Student Membership Immigrant Count","publisher_type":"Number"},{"code":"CPET504C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_section_504_count","label":"Campus 2025 Student Membership: Section 504 Count","position":66,"publisher_description":"Campus 2025 Student Membership Section 504 Count","publisher_type":"Number"},{"code":"CPETDSLC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_dyslexia_count","label":"Campus 2025 Student Membership: Dyslexia Count","position":67,"publisher_description":"Campus 2025 Student Membership Dyslexia Count","publisher_type":"Number"},{"code":"CPETMIGC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_migrant_count","label":"Campus 2025 Student Membership: Migrant Count","position":68,"publisher_description":"Campus 2025 Student Membership Migrant Count","publisher_type":"Number"},{"code":"CPETMLCC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_military_connected_count","label":"Campus 2025 Student Membership: Military-Connected Count","position":69,"publisher_description":"Campus 2025 Student Membership Military-Connected Count","publisher_type":"Number"},{"code":"CPETFOSC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_foster_care_count","label":"Campus 2025 Student Membership: Foster Care Count","position":70,"publisher_description":"Campus 2025 Student Membership Foster Care Count","publisher_type":"Number"},{"code":"CPETGP3C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pk_ages_3_and_under_count","label":"Campus 2025 Student Membership: PK Ages 3 and Under Count","position":71,"publisher_description":"Campus 2025 Student Membership PK Ages 3 and Under Count","publisher_type":"Number"},{"code":"CPETGP4C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pk_ages_4_and_over_count","label":"Campus 2025 Student Membership: PK Ages 4 and Over Count","position":72,"publisher_description":"Campus 2025 Student Membership PK Ages 4 and Over Count","publisher_type":"Number"},{"code":"CPETBILC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_bilingual_esl_count","label":"Campus 2025 Student Membership: Bilingual/ESL Count","position":73,"publisher_description":"Campus 2025 Student Membership Bilingual/ESL Count","publisher_type":"Number"},{"code":"CPETINDC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_american_indian_count","label":"Campus 2025 Student Membership: American Indian Count","position":74,"publisher_description":"Campus 2025 Student Membership American Indian Count","publisher_type":"Number"},{"code":"CPETASIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_asian_count","label":"Campus 2025 Student Membership: Asian Count","position":75,"publisher_description":"Campus 2025 Student Membership Asian Count","publisher_type":"Number"},{"code":"CPETPCIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pacific_islander_count","label":"Campus 2025 Student Membership: Pacific Islander Count","position":76,"publisher_description":"Campus 2025 Student Membership Pacific Islander Count","publisher_type":"Number"},{"code":"CPETTWOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_two_or_more_races_count","label":"Campus 2025 Student Membership: Two or More Races Count","position":77,"publisher_description":"Campus 2025 Student Membership Two or More Races Count","publisher_type":"Number"},{"code":"CPETBLAC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_african_american_count","label":"Campus 2025 Student Membership: African American Count","position":78,"publisher_description":"Campus 2025 Student Membership African American Count","publisher_type":"Number"},{"code":"CPETHISC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_hispanic_count","label":"Campus 2025 Student Membership: Hispanic Count","position":79,"publisher_description":"Campus 2025 Student Membership Hispanic Count","publisher_type":"Number"},{"code":"CPETWHIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_white_count","label":"Campus 2025 Student Membership: White Count","position":80,"publisher_description":"Campus 2025 Student Membership White Count","publisher_type":"Number"},{"code":"CPETGEEC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_ee_count","label":"Campus 2025 Student Membership: EE Count","position":81,"publisher_description":"Campus 2025 Student Membership EE Count","publisher_type":"Number"},{"code":"CPETGPKC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pk_count","label":"Campus 2025 Student Membership: PK Count","position":82,"publisher_description":"Campus 2025 Student Membership PK Count","publisher_type":"Number"},{"code":"CPETGKNC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_kg_count","label":"Campus 2025 Student Membership: KG Count","position":83,"publisher_description":"Campus 2025 Student Membership KG Count","publisher_type":"Number"},{"code":"CPETG01C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_01_count","label":"Campus 2025 Student Membership: 01 Count","position":84,"publisher_description":"Campus 2025 Student Membership 01 Count","publisher_type":"Number"},{"code":"CPETG02C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_02_count","label":"Campus 2025 Student Membership: 02 Count","position":85,"publisher_description":"Campus 2025 Student Membership 02 Count","publisher_type":"Number"},{"code":"CPETG03C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_03_count","label":"Campus 2025 Student Membership: 03 Count","position":86,"publisher_description":"Campus 2025 Student Membership 03 Count","publisher_type":"Number"},{"code":"CPETG04C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_04_count","label":"Campus 2025 Student Membership: 04 Count","position":87,"publisher_description":"Campus 2025 Student Membership 04 Count","publisher_type":"Number"},{"code":"CPETG05C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_05_count","label":"Campus 2025 Student Membership: 05 Count","position":88,"publisher_description":"Campus 2025 Student Membership 05 Count","publisher_type":"Number"},{"code":"CPETG06C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_06_count","label":"Campus 2025 Student Membership: 06 Count","position":89,"publisher_description":"Campus 2025 Student Membership 06 Count","publisher_type":"Number"},{"code":"CPETG07C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_07_count","label":"Campus 2025 Student Membership: 07 Count","position":90,"publisher_description":"Campus 2025 Student Membership 07 Count","publisher_type":"Number"},{"code":"CPETG08C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_08_count","label":"Campus 2025 Student Membership: 08 Count","position":91,"publisher_description":"Campus 2025 Student Membership 08 Count","publisher_type":"Number"},{"code":"CPETG09C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_09_count","label":"Campus 2025 Student Membership: 09 Count","position":92,"publisher_description":"Campus 2025 Student Membership 09 Count","publisher_type":"Number"},{"code":"CPETG10C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_10_count","label":"Campus 2025 Student Membership: 10 Count","position":93,"publisher_description":"Campus 2025 Student Membership 10 Count","publisher_type":"Number"},{"code":"CPETG11C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_11_count","label":"Campus 2025 Student Membership: 11 Count","position":94,"publisher_description":"Campus 2025 Student Membership 11 Count","publisher_type":"Number"},{"code":"CPETG12C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_12_count","label":"Campus 2025 Student Membership: 12 Count","position":95,"publisher_description":"Campus 2025 Student Membership 12 Count","publisher_type":"Number"},{"code":"CPETMALC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_male_count","label":"Campus 2025 Student Membership: Male Count","position":96,"publisher_description":"Campus 2025 Student Membership Male Count","publisher_type":"Number"},{"code":"CPETFEMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_female_count","label":"Campus 2025 Student Membership: Female Count","position":97,"publisher_description":"Campus 2025 Student Membership Female Count","publisher_type":"Number"},{"code":"CPETWHIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_white_percent","label":"Campus 2025 Student Membership: White Percent","position":98,"publisher_description":"Campus 2025 Student Membership White Percent","publisher_type":"Number"},{"code":"CPETBLAP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_african_american_percent","label":"Campus 2025 Student Membership: African American Percent","position":99,"publisher_description":"Campus 2025 Student Membership African American Percent","publisher_type":"Number"},{"code":"CPETHISP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_hispanic_percent","label":"Campus 2025 Student Membership: Hispanic Percent","position":100,"publisher_description":"Campus 2025 Student Membership Hispanic Percent","publisher_type":"Number"},{"code":"CPETINDP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_american_indian_percent","label":"Campus 2025 Student Membership: American Indian Percent","position":101,"publisher_description":"Campus 2025 Student Membership American Indian Percent","publisher_type":"Number"},{"code":"CPETASIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_asian_percent","label":"Campus 2025 Student Membership: Asian Percent","position":102,"publisher_description":"Campus 2025 Student Membership Asian Percent","publisher_type":"Number"},{"code":"CPETPCIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pacific_islander_percent","label":"Campus 2025 Student Membership: Pacific Islander Percent","position":103,"publisher_description":"Campus 2025 Student Membership Pacific Islander Percent","publisher_type":"Number"},{"code":"CPETTWOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_two_or_more_races_percent","label":"Campus 2025 Student Membership: Two or More Races Percent","position":104,"publisher_description":"Campus 2025 Student Membership Two or More Races Percent","publisher_type":"Number"},{"code":"CPETSPEP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_special_ed_percent","label":"Campus 2025 Student Membership: Special Ed Percent","position":105,"publisher_description":"Campus 2025 Student Membership Special Ed Percent","publisher_type":"Number"},{"code":"CPETBILP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_bilingual_esl_percent","label":"Campus 2025 Student Membership: Bilingual/ESL Percent","position":106,"publisher_description":"Campus 2025 Student Membership Bilingual/ESL Percent","publisher_type":"Number"},{"code":"CPETGIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_gifted_and_talented_percent","label":"Campus 2025 Student Membership: Gifted & Talented Percent","position":107,"publisher_description":"Campus 2025 Student Membership Gifted & Talented Percent","publisher_type":"Number"},{"code":"CPETDSLP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_dyslexia_percent","label":"Campus 2025 Student Membership: Dyslexia Percent","position":108,"publisher_description":"Campus 2025 Student Membership Dyslexia Percent","publisher_type":"Number"},{"code":"CPET504P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_section_504_percent","label":"Campus 2025 Student Membership: Section 504 Percent","position":109,"publisher_description":"Campus 2025 Student Membership Section 504 Percent","publisher_type":"Number"},{"code":"CPETTT1P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_title_i_percent","label":"Campus 2025 Student Membership: Title I Percent","position":110,"publisher_description":"Campus 2025 Student Membership Title I Percent","publisher_type":"Number"},{"code":"CPETHOMP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_homeless_percent","label":"Campus 2025 Student Membership: Homeless Percent","position":111,"publisher_description":"Campus 2025 Student Membership Homeless Percent","publisher_type":"Number"},{"code":"CPETIMMP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_immigrant_percent","label":"Campus 2025 Student Membership: Immigrant Percent","position":112,"publisher_description":"Campus 2025 Student Membership Immigrant Percent","publisher_type":"Number"},{"code":"CPETFOSP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_foster_care_percent","label":"Campus 2025 Student Membership: Foster Care Percent","position":113,"publisher_description":"Campus 2025 Student Membership Foster Care Percent","publisher_type":"Number"},{"code":"CPETMIGP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_migrant_percent","label":"Campus 2025 Student Membership: Migrant Percent","position":114,"publisher_description":"Campus 2025 Student Membership Migrant Percent","publisher_type":"Number"},{"code":"CPETMLCP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_military_connected_percent","label":"Campus 2025 Student Membership: Military-Connected Percent","position":115,"publisher_description":"Campus 2025 Student Membership Military-Connected Percent","publisher_type":"Number"},{"code":"CPETGEEP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_ee_percent","label":"Campus 2025 Student Membership: EE Percent","position":116,"publisher_description":"Campus 2025 Student Membership EE Percent","publisher_type":"Number"},{"code":"CPETGPKP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pk_percent","label":"Campus 2025 Student Membership: PK Percent","position":117,"publisher_description":"Campus 2025 Student Membership PK Percent","publisher_type":"Number"},{"code":"CPETGP3P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pk_ages_3_and_under_percent","label":"Campus 2025 Student Membership: PK Ages 3 and Under Percent","position":118,"publisher_description":"Campus 2025 Student Membership PK Ages 3 and Under Percent","publisher_type":"Number"},{"code":"CPETGP4P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_pk_ages_4_and_over_percent","label":"Campus 2025 Student Membership: PK Ages 4 and Over Percent","position":119,"publisher_description":"Campus 2025 Student Membership PK Ages 4 and Over Percent","publisher_type":"Number"},{"code":"CPETGKNP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_kg_percent","label":"Campus 2025 Student Membership: KG Percent","position":120,"publisher_description":"Campus 2025 Student Membership KG Percent","publisher_type":"Number"},{"code":"CPETG01P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_01_percent","label":"Campus 2025 Student Membership: 01 Percent","position":121,"publisher_description":"Campus 2025 Student Membership 01 Percent","publisher_type":"Number"},{"code":"CPETG02P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_02_percent","label":"Campus 2025 Student Membership: 02 Percent","position":122,"publisher_description":"Campus 2025 Student Membership 02 Percent","publisher_type":"Number"},{"code":"CPETG03P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_03_percent","label":"Campus 2025 Student Membership: 03 Percent","position":123,"publisher_description":"Campus 2025 Student Membership 03 Percent","publisher_type":"Number"},{"code":"CPETG04P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_04_percent","label":"Campus 2025 Student Membership: 04 Percent","position":124,"publisher_description":"Campus 2025 Student Membership 04 Percent","publisher_type":"Number"},{"code":"CPETG05P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_05_percent","label":"Campus 2025 Student Membership: 05 Percent","position":125,"publisher_description":"Campus 2025 Student Membership 05 Percent","publisher_type":"Number"},{"code":"CPETG06P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_06_percent","label":"Campus 2025 Student Membership: 06 Percent","position":126,"publisher_description":"Campus 2025 Student Membership 06 Percent","publisher_type":"Number"},{"code":"CPETG07P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_07_percent","label":"Campus 2025 Student Membership: 07 Percent","position":127,"publisher_description":"Campus 2025 Student Membership 07 Percent","publisher_type":"Number"},{"code":"CPETG08P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_08_percent","label":"Campus 2025 Student Membership: 08 Percent","position":128,"publisher_description":"Campus 2025 Student Membership 08 Percent","publisher_type":"Number"},{"code":"CPETG09P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_09_percent","label":"Campus 2025 Student Membership: 09 Percent","position":129,"publisher_description":"Campus 2025 Student Membership 09 Percent","publisher_type":"Number"},{"code":"CPETG10P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_10_percent","label":"Campus 2025 Student Membership: 10 Percent","position":130,"publisher_description":"Campus 2025 Student Membership 10 Percent","publisher_type":"Number"},{"code":"CPETG11P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_11_percent","label":"Campus 2025 Student Membership: 11 Percent","position":131,"publisher_description":"Campus 2025 Student Membership 11 Percent","publisher_type":"Number"},{"code":"CPETG12P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_12_percent","label":"Campus 2025 Student Membership: 12 Percent","position":132,"publisher_description":"Campus 2025 Student Membership 12 Percent","publisher_type":"Number"},{"code":"CPETMALP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_male_percent","label":"Campus 2025 Student Membership: Male Percent","position":133,"publisher_description":"Campus 2025 Student Membership Male Percent","publisher_type":"Number"},{"code":"CPETFEMP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_female_percent","label":"Campus 2025 Student Membership: Female Percent","position":134,"publisher_description":"Campus 2025 Student Membership Female Percent","publisher_type":"Number"},{"code":"CPETVOCC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_career_and_technical_education_count","label":"Campus 2025 Student Membership: Career & Technical Education Count","position":135,"publisher_description":"Campus 2025 Student Membership Career & Technical Education Count","publisher_type":"Number"},{"code":"CPETVHSC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_career_and_technical_9_12_education_count","label":"Campus 2025 Student Membership: Career & Technical (9-12) Education Count","position":136,"publisher_description":"Campus 2025 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number"},{"code":"CPETVOCP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_career_and_technical_education_percent","label":"Campus 2025 Student Membership: Career & Technical Education Percent","position":137,"publisher_description":"Campus 2025 Student Membership Career & Technical Education Percent","publisher_type":"Number"},{"code":"CPETVHSP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_career_and_technical_9_12_education_percent","label":"Campus 2025 Student Membership: Career & Technical (9-12) Education Percent","position":138,"publisher_description":"Campus 2025 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number"},{"code":"CPNTALLC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_all_students_count","label":"Campus 2025 Student Enrollment: All Students Count","position":139,"publisher_description":"Campus 2025 Student Enrollment All Students Count","publisher_type":"Number"},{"code":"CPNTGEEC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_early_childhood_education_count","label":"Campus 2025 Student Enrollment: Early Childhood Education Count","position":140,"publisher_description":"Campus 2025 Student Enrollment Early Childhood Education Count","publisher_type":"Number"},{"code":"CPNTGEEP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_early_childhood_education_percent","label":"Campus 2025 Student Enrollment: Early Childhood Education Percent","position":141,"publisher_description":"Campus 2025 Student Enrollment Early Childhood Education Percent","publisher_type":"Number"},{"code":"CPNTGPKC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pre_kindergarten_count","label":"Campus 2025 Student Enrollment: Pre-Kindergarten Count","position":142,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten Count","publisher_type":"Number"},{"code":"CPNTGPKP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pre_kindergarten_percent","label":"Campus 2025 Student Enrollment: Pre-Kindergarten Percent","position":143,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten Percent","publisher_type":"Number"},{"code":"CPNTGP3C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pre_kindergarten_3_year_old_count","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Count","position":144,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 3-Year Old Count","publisher_type":"Number"},{"code":"CPNTGP3P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pre_kindergarten_3_year_old_percent","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Percent","position":145,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 3-Year Old Percent","publisher_type":"Number"},{"code":"CPNTGP4C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pre_kindergarten_4_year_old_count","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Count","position":146,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 4-Year Old Count","publisher_type":"Number"},{"code":"CPNTGP4P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pre_kindergarten_4_year_old_percent","label":"Campus 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Percent","position":147,"publisher_description":"Campus 2025 Student Enrollment Pre-Kindergarten 4-Year Old Percent","publisher_type":"Number"},{"code":"CPNTGKNC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_kindergarten_count","label":"Campus 2025 Student Enrollment: Kindergarten Count","position":148,"publisher_description":"Campus 2025 Student Enrollment Kindergarten Count","publisher_type":"Number"},{"code":"CPNTGKNP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_kindergarten_percent","label":"Campus 2025 Student Enrollment: Kindergarten Percent","position":149,"publisher_description":"Campus 2025 Student Enrollment Kindergarten Percent","publisher_type":"Number"},{"code":"CPNTG01C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_1_count","label":"Campus 2025 Student Enrollment: Grade 1 Count","position":150,"publisher_description":"Campus 2025 Student Enrollment Grade 1 Count","publisher_type":"Number"},{"code":"CPNTG01P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_1_percent","label":"Campus 2025 Student Enrollment: Grade 1 Percent","position":151,"publisher_description":"Campus 2025 Student Enrollment Grade 1 Percent","publisher_type":"Number"},{"code":"CPNTG02C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_2_count","label":"Campus 2025 Student Enrollment: Grade 2 Count","position":152,"publisher_description":"Campus 2025 Student Enrollment Grade 2 Count","publisher_type":"Number"},{"code":"CPNTG02P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_2_percent","label":"Campus 2025 Student Enrollment: Grade 2 Percent","position":153,"publisher_description":"Campus 2025 Student Enrollment Grade 2 Percent","publisher_type":"Number"},{"code":"CPNTG03C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_3_count","label":"Campus 2025 Student Enrollment: Grade 3 Count","position":154,"publisher_description":"Campus 2025 Student Enrollment Grade 3 Count","publisher_type":"Number"},{"code":"CPNTG03P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_3_percent","label":"Campus 2025 Student Enrollment: Grade 3 Percent","position":155,"publisher_description":"Campus 2025 Student Enrollment Grade 3 Percent","publisher_type":"Number"},{"code":"CPNTG04C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_4_count","label":"Campus 2025 Student Enrollment: Grade 4 Count","position":156,"publisher_description":"Campus 2025 Student Enrollment Grade 4 Count","publisher_type":"Number"},{"code":"CPNTG04P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_4_percent","label":"Campus 2025 Student Enrollment: Grade 4 Percent","position":157,"publisher_description":"Campus 2025 Student Enrollment Grade 4 Percent","publisher_type":"Number"},{"code":"CPNTG05C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_5_count","label":"Campus 2025 Student Enrollment: Grade 5 Count","position":158,"publisher_description":"Campus 2025 Student Enrollment Grade 5 Count","publisher_type":"Number"},{"code":"CPNTG05P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_5_percent","label":"Campus 2025 Student Enrollment: Grade 5 Percent","position":159,"publisher_description":"Campus 2025 Student Enrollment Grade 5 Percent","publisher_type":"Number"},{"code":"CPNTG06C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_6_count","label":"Campus 2025 Student Enrollment: Grade 6 Count","position":160,"publisher_description":"Campus 2025 Student Enrollment Grade 6 Count","publisher_type":"Number"},{"code":"CPNTG06P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_6_percent","label":"Campus 2025 Student Enrollment: Grade 6 Percent","position":161,"publisher_description":"Campus 2025 Student Enrollment Grade 6 Percent","publisher_type":"Number"},{"code":"CPNTG07C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_7_count","label":"Campus 2025 Student Enrollment: Grade 7 Count","position":162,"publisher_description":"Campus 2025 Student Enrollment Grade 7 Count","publisher_type":"Number"},{"code":"CPNTG07P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_7_percent","label":"Campus 2025 Student Enrollment: Grade 7 Percent","position":163,"publisher_description":"Campus 2025 Student Enrollment Grade 7 Percent","publisher_type":"Number"},{"code":"CPNTG08C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_8_count","label":"Campus 2025 Student Enrollment: Grade 8 Count","position":164,"publisher_description":"Campus 2025 Student Enrollment Grade 8 Count","publisher_type":"Number"},{"code":"CPNTG08P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_8_percent","label":"Campus 2025 Student Enrollment: Grade 8 Percent","position":165,"publisher_description":"Campus 2025 Student Enrollment Grade 8 Percent","publisher_type":"Number"},{"code":"CPNTG09C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_9_count","label":"Campus 2025 Student Enrollment: Grade 9 Count","position":166,"publisher_description":"Campus 2025 Student Enrollment Grade 9 Count","publisher_type":"Number"},{"code":"CPNTG09P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_9_percent","label":"Campus 2025 Student Enrollment: Grade 9 Percent","position":167,"publisher_description":"Campus 2025 Student Enrollment Grade 9 Percent","publisher_type":"Number"},{"code":"CPNTG10C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_10_count","label":"Campus 2025 Student Enrollment: Grade 10 Count","position":168,"publisher_description":"Campus 2025 Student Enrollment Grade 10 Count","publisher_type":"Number"},{"code":"CPNTG10P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_10_percent","label":"Campus 2025 Student Enrollment: Grade 10 Percent","position":169,"publisher_description":"Campus 2025 Student Enrollment Grade 10 Percent","publisher_type":"Number"},{"code":"CPNTG11C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_11_count","label":"Campus 2025 Student Enrollment: Grade 11 Count","position":170,"publisher_description":"Campus 2025 Student Enrollment Grade 11 Count","publisher_type":"Number"},{"code":"CPNTG11P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_11_percent","label":"Campus 2025 Student Enrollment: Grade 11 Percent","position":171,"publisher_description":"Campus 2025 Student Enrollment Grade 11 Percent","publisher_type":"Number"},{"code":"CPNTG12C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_12_count","label":"Campus 2025 Student Enrollment: Grade 12 Count","position":172,"publisher_description":"Campus 2025 Student Enrollment Grade 12 Count","publisher_type":"Number"},{"code":"CPNTG12P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_grade_12_percent","label":"Campus 2025 Student Enrollment: Grade 12 Percent","position":173,"publisher_description":"Campus 2025 Student Enrollment Grade 12 Percent","publisher_type":"Number"},{"code":"CPNTBLAC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_african_american_count","label":"Campus 2025 Student Enrollment: African American Count","position":174,"publisher_description":"Campus 2025 Student Enrollment African American Count","publisher_type":"Number"},{"code":"CPNTBLAP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_african_american_percent","label":"Campus 2025 Student Enrollment: African American Percent","position":175,"publisher_description":"Campus 2025 Student Enrollment African American Percent","publisher_type":"Number"},{"code":"CPNTHISC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_hispanic_count","label":"Campus 2025 Student Enrollment: Hispanic Count","position":176,"publisher_description":"Campus 2025 Student Enrollment Hispanic Count","publisher_type":"Number"},{"code":"CPNTHISP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_hispanic_percent","label":"Campus 2025 Student Enrollment: Hispanic Percent","position":177,"publisher_description":"Campus 2025 Student Enrollment Hispanic Percent","publisher_type":"Number"},{"code":"CPNTWHIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_white_count","label":"Campus 2025 Student Enrollment: White Count","position":178,"publisher_description":"Campus 2025 Student Enrollment White Count","publisher_type":"Number"},{"code":"CPNTWHIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_white_percent","label":"Campus 2025 Student Enrollment: White Percent","position":179,"publisher_description":"Campus 2025 Student Enrollment White Percent","publisher_type":"Number"},{"code":"CPNTINDC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_asian_count","label":"Campus 2025 Student Enrollment: Asian Count","position":180,"publisher_description":"Campus 2025 Student Enrollment Asian Count","publisher_type":"Number"},{"code":"CPNTINDP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_asian_percent","label":"Campus 2025 Student Enrollment: Asian Percent","position":181,"publisher_description":"Campus 2025 Student Enrollment Asian Percent","publisher_type":"Number"},{"code":"CPNTASIC","dictionary_status":"documented","disposition":"fact","field":"campus_2024_25_asian_students_count","label":"Campus 2024-25 Asian Students Count","position":182,"publisher_description":"Campus 2024-25 Asian Students Count","publisher_type":"Number"},{"code":"CPNTASIP","dictionary_status":"documented","disposition":"fact","field":"campus_2024_25_asian_students_percent","label":"Campus 2024-25 Asian Students Percent","position":183,"publisher_description":"Campus 2024-25 Asian Students Percent","publisher_type":"Number"},{"code":"CPNTPCIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pacific_islander_count","label":"Campus 2025 Student Enrollment: Pacific Islander Count","position":184,"publisher_description":"Campus 2025 Student Enrollment Pacific Islander Count","publisher_type":"Number"},{"code":"CPNTPCIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_pacific_islander_percent","label":"Campus 2025 Student Enrollment: Pacific Islander Percent","position":185,"publisher_description":"Campus 2025 Student Enrollment Pacific Islander Percent","publisher_type":"Number"},{"code":"CPNTTWOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_two_or_more_races_count","label":"Campus 2025 Student Enrollment: Two or More Races Count","position":186,"publisher_description":"Campus 2025 Student Enrollment Two or More Races Count","publisher_type":"Number"},{"code":"CPNTTWOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_two_or_more_races_percent","label":"Campus 2025 Student Enrollment: Two or More Races Percent","position":187,"publisher_description":"Campus 2025 Student Enrollment Two or More Races Percent","publisher_type":"Number"},{"code":"CPNTFEMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_female_count","label":"Campus 2025 Student Enrollment: Female~ Count","position":188,"publisher_description":"Campus 2025 Student Enrollment Female: Count","publisher_type":"Number"},{"code":"CPNTFEMP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_female_percent","label":"Campus 2025 Student Enrollment: Female~ Percent","position":189,"publisher_description":"Campus 2025 Student Enrollment Female: Percent","publisher_type":"Number"},{"code":"CPNTMALC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_male_count","label":"Campus 2025 Student Enrollment: Male Count","position":190,"publisher_description":"Campus 2025 Student Enrollment Male Count","publisher_type":"Number"},{"code":"CPNTMALP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_male_percent","label":"Campus 2025 Student Enrollment: Male Percent","position":191,"publisher_description":"Campus 2025 Student Enrollment Male Percent","publisher_type":"Number"},{"code":"CPNTECOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_economically_disadvantaged_count","label":"Campus 2025 Student Enrollment: Economically Disadvantaged Count","position":192,"publisher_description":"Campus 2025 Student Enrollment Economically Disadvantaged Count","publisher_type":"Number"},{"code":"CPNTECOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_economically_disadvantaged_percent","label":"Campus 2025 Student Enrollment: Economically Disadvantaged Percent","position":193,"publisher_description":"Campus 2025 Student Enrollment Economically Disadvantaged Percent","publisher_type":"Number"},{"code":"CPNTNEDC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_non_educationally_disadv_count","label":"Campus 2025 Student Enrollment: Non-Educationally Disadv Count","position":194,"publisher_description":"Campus 2025 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"CPNTNEDP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_non_educationally_disadv_percent","label":"Campus 2025 Student Enrollment: Non-Educationally Disadv Percent","position":195,"publisher_description":"Campus 2025 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"CPNT504C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_section_504_count","label":"Campus 2025 Student Enrollment: Section 504 Count","position":196,"publisher_description":"Campus 2025 Student Enrollment Section 504 Count","publisher_type":"Number"},{"code":"CPNT504P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_section_504_percent","label":"Campus 2025 Student Enrollment: Section 504 Percent","position":197,"publisher_description":"Campus 2025 Student Enrollment Section 504 Percent","publisher_type":"Number"},{"code":"CPNTLEPC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_english_learner_count","label":"Campus 2025 Student Enrollment: English Learner Count","position":198,"publisher_description":"Campus 2025 Student Enrollment English Learner Count","publisher_type":"Number"},{"code":"CPNTLEPP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_english_learner_percent","label":"Campus 2025 Student Enrollment: English Learner Percent","position":199,"publisher_description":"Campus 2025 Student Enrollment English Learner Percent","publisher_type":"Number"},{"code":"CPNTDSLC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_dyslexia_count","label":"Campus 2025 Student Enrollment: Dyslexia Count","position":200,"publisher_description":"Campus 2025 Student Enrollment Dyslexia Count","publisher_type":"Number"},{"code":"CPNTDSLP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_dyslexia_percent","label":"Campus 2025 Student Enrollment: Dyslexia Percent","position":201,"publisher_description":"Campus 2025 Student Enrollment Dyslexia Percent","publisher_type":"Number"},{"code":"CPNTFOSC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_foster_care_count","label":"Campus 2025 Student Enrollment: Foster Care Count","position":202,"publisher_description":"Campus 2025 Student Enrollment Foster Care Count","publisher_type":"Number"},{"code":"CPNTFOSP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_foster_care_percent","label":"Campus 2025 Student Enrollment: Foster Care Percent","position":203,"publisher_description":"Campus 2025 Student Enrollment Foster Care Percent","publisher_type":"Number"},{"code":"CPNTHOMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_homeless_count","label":"Campus 2025 Student Enrollment: Homeless Count","position":204,"publisher_description":"Campus 2025 Student Enrollment Homeless Count","publisher_type":"Number"},{"code":"CPNTHOMP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_homeless_percent","label":"Campus 2025 Student Enrollment: Homeless Percent","position":205,"publisher_description":"Campus 2025 Student Enrollment Homeless Percent","publisher_type":"Number"},{"code":"CPNTIMMC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_immigrant_count","label":"Campus 2025 Student Enrollment: Immigrant Count","position":206,"publisher_description":"Campus 2025 Student Enrollment Immigrant Count","publisher_type":"Number"},{"code":"CPNTIMMP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_immigrant_percent","label":"Campus 2025 Student Enrollment: Immigrant Percent","position":207,"publisher_description":"Campus 2025 Student Enrollment Immigrant Percent","publisher_type":"Number"},{"code":"CPNTMIGC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_migrant_count","label":"Campus 2025 Student Enrollment: Migrant Count","position":208,"publisher_description":"Campus 2025 Student Enrollment Migrant Count","publisher_type":"Number"},{"code":"CPNTMIGP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_migrant_percent","label":"Campus 2025 Student Enrollment: Migrant Percent","position":209,"publisher_description":"Campus 2025 Student Enrollment Migrant Percent","publisher_type":"Number"},{"code":"CPNTTT1C","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_title_i_count","label":"Campus 2025 Student Enrollment: Title I Count","position":210,"publisher_description":"Campus 2025 Student Enrollment Title I Count","publisher_type":"Number"},{"code":"CPNTTT1P","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_title_i_percent","label":"Campus 2025 Student Enrollment: Title I Percent","position":211,"publisher_description":"Campus 2025 Student Enrollment Title I Percent","publisher_type":"Number"},{"code":"CPNTMLCC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_military_connected_count","label":"Campus 2025 Student Enrollment: Military-Connected Count","position":212,"publisher_description":"Campus 2025 Student Enrollment Military-Connected Count","publisher_type":"Number"},{"code":"CPNTMLCP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_military_connected_percent","label":"Campus 2025 Student Enrollment: Military-Connected Percent","position":213,"publisher_description":"Campus 2025 Student Enrollment Military-Connected Percent","publisher_type":"Number"},{"code":"CPNTRSKC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_at_risk_count","label":"Campus 2025 Student Enrollment: At Risk Count","position":214,"publisher_description":"Campus 2025 Student Enrollment At Risk Count","publisher_type":"Number"},{"code":"CPNTRSKP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_at_risk_percent","label":"Campus 2025 Student Enrollment: At Risk Percent","position":215,"publisher_description":"Campus 2025 Student Enrollment At Risk Percent","publisher_type":"Number"},{"code":"CPNTBILC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_bilingual_esl_count","label":"Campus 2025 Student Enrollment: Bilingual/ESL Count","position":216,"publisher_description":"Campus 2025 Student Enrollment Bilingual/ESL Count","publisher_type":"Number"},{"code":"CPNTBILP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_bilingual_esl_percent","label":"Campus 2025 Student Enrollment: Bilingual/ESL Percent","position":217,"publisher_description":"Campus 2025 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number"},{"code":"CPNTGIFC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_gifted_and_talented_count","label":"Campus 2025 Student Enrollment: Gifted and Talented Count","position":218,"publisher_description":"Campus 2025 Student Enrollment Gifted and Talented Count","publisher_type":"Number"},{"code":"CPNTGIFP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_gifted_and_talented_percent","label":"Campus 2025 Student Enrollment: Gifted and Talented Percent","position":219,"publisher_description":"Campus 2025 Student Enrollment Gifted and Talented Percent","publisher_type":"Number"},{"code":"CPNTSPEC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_special_ed_count","label":"Campus 2025 Student Enrollment: Special Ed Count","position":220,"publisher_description":"Campus 2025 Student Enrollment Special Ed Count","publisher_type":"Number"},{"code":"CPNTSPEP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_enrollment_special_ed_percent","label":"Campus 2025 Student Enrollment: Special Ed Percent","position":221,"publisher_description":"Campus 2025 Student Enrollment Special Ed Percent","publisher_type":"Number"},{"code":"CPEMALLC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_all_students_count","label":"Campus 2025 Student Membership: 2024 Mobility All Students Count","position":222,"publisher_description":"Campus 2025 Student Membership 2024 Mobility All Students Count","publisher_type":"Number"},{"code":"CPEMINDC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_american_indian_count","label":"Campus 2025 Student Membership: 2024 Mobility American Indian Count","position":223,"publisher_description":"Campus 2025 Student Membership 2024 Mobility American Indian Count","publisher_type":"Number"},{"code":"CPEMASIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_asian_count","label":"Campus 2025 Student Membership: 2024 Mobility Asian Count","position":224,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Asian Count","publisher_type":"Number"},{"code":"CPEMPCIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_pacific_islander_count","label":"Campus 2025 Student Membership: 2024 Mobility Pacific Islander Count","position":225,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Pacific Islander Count","publisher_type":"Number"},{"code":"CPEMTWOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_two_or_more_races_count","label":"Campus 2025 Student Membership: 2024 Mobility Two or More Races Count","position":226,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Two or More Races Count","publisher_type":"Number"},{"code":"CPEMBLAC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_african_american_count","label":"Campus 2025 Student Membership: 2024 Mobility African American Count","position":227,"publisher_description":"Campus 2025 Student Membership 2024 Mobility African American Count","publisher_type":"Number"},{"code":"CPEMHISC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_hispanic_count","label":"Campus 2025 Student Membership: 2024 Mobility Hispanic Count","position":228,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Hispanic Count","publisher_type":"Number"},{"code":"CPEMWHIC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_white_count","label":"Campus 2025 Student Membership: 2024 Mobility White Count","position":229,"publisher_description":"Campus 2025 Student Membership 2024 Mobility White Count","publisher_type":"Number"},{"code":"CPEMECOC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_econ_disadv_count","label":"Campus 2025 Student Membership: 2024 Mobility Econ Disadv Count","position":230,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Econ Disadv Count","publisher_type":"Number"},{"code":"CPEMLEPC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_eb_el_count","label":"Campus 2025 Student Membership: 2024 Mobility EB/EL Count","position":231,"publisher_description":"Campus 2025 Student Membership 2024 Mobility EB/EL Count","publisher_type":"Number"},{"code":"CPEMSPEC","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_special_ed_count","label":"Campus 2025 Student Membership: 2024 Mobility Special Ed Count","position":232,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Special Ed Count","publisher_type":"Number"},{"code":"CPEMALLP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_all_students_percent","label":"Campus 2025 Student Membership: 2024 Mobility All Students Percent","position":233,"publisher_description":"Campus 2025 Student Membership 2024 Mobility All Students Percent","publisher_type":"Number"},{"code":"CPEMBLAP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_african_american_percent","label":"Campus 2025 Student Membership: 2024 Mobility African American Percent","position":234,"publisher_description":"Campus 2025 Student Membership 2024 Mobility African American Percent","publisher_type":"Number"},{"code":"CPEMHISP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_hispanic_percent","label":"Campus 2025 Student Membership: 2024 Mobility Hispanic Percent","position":235,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Hispanic Percent","publisher_type":"Number"},{"code":"CPEMINDP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_american_indian_percent","label":"Campus 2025 Student Membership: 2024 Mobility American Indian Percent","position":236,"publisher_description":"Campus 2025 Student Membership 2024 Mobility American Indian Percent","publisher_type":"Number"},{"code":"CPEMWHIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_white_percent","label":"Campus 2025 Student Membership: 2024 Mobility White Percent","position":237,"publisher_description":"Campus 2025 Student Membership 2024 Mobility White Percent","publisher_type":"Number"},{"code":"CPEMASIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_asian_percent","label":"Campus 2025 Student Membership: 2024 Mobility Asian Percent","position":238,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Asian Percent","publisher_type":"Number"},{"code":"CPEMPCIP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_pacific_islander_percent","label":"Campus 2025 Student Membership: 2024 Mobility Pacific Islander Percent","position":239,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Pacific Islander Percent","publisher_type":"Number"},{"code":"CPEMTWOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_two_or_more_races_percent","label":"Campus 2025 Student Membership: 2024 Mobility Two or More Races Percent","position":240,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Two or More Races Percent","publisher_type":"Number"},{"code":"CPEMECOP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_econ_disadv_percent","label":"Campus 2025 Student Membership: 2024 Mobility Econ Disadv Percent","position":241,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Econ Disadv Percent","publisher_type":"Number"},{"code":"CPEMLEPP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_eb_el_percent","label":"Campus 2025 Student Membership: 2024 Mobility EB/EL Percent","position":242,"publisher_description":"Campus 2025 Student Membership 2024 Mobility EB/EL Percent","publisher_type":"Number"},{"code":"CPEMSPEP","dictionary_status":"documented","disposition":"fact","field":"campus_2025_student_membership_2024_mobility_special_ed_percent","label":"Campus 2025 Student Membership: 2024 Mobility Special Ed Percent","position":243,"publisher_description":"Campus 2025 Student Membership 2024 Mobility Special Ed Percent","publisher_type":"Number"}],"input_sha256":"7e0e762a8f2ba50687fd8c6a59e8052d5740ba57abbedecddfca064bbd77548e","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":9086},"metric_period":{"kind":"unknown"},"source_schema_sha256":"ebf5b5ce1a0b88979d307f0911bdb7887911701c8624afb62ef8e45c373f0fed","table":"student_profile"}]},{"dataset":"district_tapr_student_profile","edition":"2025","source_only":true,"tables":[{"dictionary_records":[{"code":"DPETALLC","ordinal":1,"publisher_description":"District 2025 Student Membership All Students Count","publisher_type":"Number","source_column":46,"source_line":2263,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTALLC","ordinal":2,"publisher_description":"District 2025 Student Enrollment All Students Count","publisher_type":"Number","source_column":46,"source_line":2265,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGEEC","ordinal":3,"publisher_description":"District 2025 Student Membership EE Count","publisher_type":"Number","source_column":46,"source_line":2273,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGEEP","ordinal":4,"publisher_description":"District 2025 Student Membership EE Percent","publisher_type":"Number","source_column":46,"source_line":2274,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGEEC","ordinal":5,"publisher_description":"District 2025 Student Enrollment Early Childhood Education Count","publisher_type":"Number","source_column":46,"source_line":2275,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGEEP","ordinal":6,"publisher_description":"District 2025 Student Enrollment Early Childhood Education Percent","publisher_type":"Number","source_column":46,"source_line":2276,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGPKC","ordinal":7,"publisher_description":"District 2025 Student Membership PK Count","publisher_type":"Number","source_column":46,"source_line":2280,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGPKP","ordinal":8,"publisher_description":"District 2025 Student Membership PK Percent","publisher_type":"Number","source_column":46,"source_line":2281,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGPKC","ordinal":9,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten Count","publisher_type":"Number","source_column":46,"source_line":2282,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGPKP","ordinal":10,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten Percent","publisher_type":"Number","source_column":46,"source_line":2283,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGP3C","ordinal":11,"publisher_description":"District 2025 Student Membership PK Count Ages 3 and Under Count","publisher_type":"Number","source_column":46,"source_line":2287,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGP3P","ordinal":12,"publisher_description":"District 2025 Student Membership PK Count Ages 3 and Under Percent","publisher_type":"Number","source_column":46,"source_line":2288,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGP3C","ordinal":13,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 3-Year Old Count","publisher_type":"Number","source_column":46,"source_line":2289,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGP3P","ordinal":14,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 3-Year Old Percent","publisher_type":"Number","source_column":46,"source_line":2290,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGP4C","ordinal":15,"publisher_description":"District 2025 Student Membership PK Count Ages 4 and Over Count","publisher_type":"Number","source_column":46,"source_line":2294,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGP4P","ordinal":16,"publisher_description":"District 2025 Student Membership PK Count Ages 4 and Over Percent","publisher_type":"Number","source_column":46,"source_line":2295,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGP4C","ordinal":17,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 4-Year Old Count","publisher_type":"Number","source_column":46,"source_line":2296,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGP4P","ordinal":18,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 4-Year Old Percent","publisher_type":"Number","source_column":46,"source_line":2297,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGKNC","ordinal":19,"publisher_description":"District 2025 Student Membership KG Count","publisher_type":"Number","source_column":46,"source_line":2301,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGKNP","ordinal":20,"publisher_description":"District 2025 Student Membership KG Percent","publisher_type":"Number","source_column":46,"source_line":2302,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGKNC","ordinal":21,"publisher_description":"District 2025 Student Enrollment Kindergarten Count","publisher_type":"Number","source_column":46,"source_line":2303,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGKNP","ordinal":22,"publisher_description":"District 2025 Student Enrollment Kindergarten Percent","publisher_type":"Number","source_column":46,"source_line":2304,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG01C","ordinal":23,"publisher_description":"District 2025 Student Membership 01 Count","publisher_type":"Number","source_column":46,"source_line":2308,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG01P","ordinal":24,"publisher_description":"District 2025 Student Membership 01 Percent","publisher_type":"Number","source_column":46,"source_line":2309,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG01C","ordinal":25,"publisher_description":"District 2025 Student Enrollment Grade 1 Count","publisher_type":"Number","source_column":46,"source_line":2310,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG01P","ordinal":26,"publisher_description":"District 2025 Student Enrollment Grade 1 Percent","publisher_type":"Number","source_column":46,"source_line":2311,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG02C","ordinal":27,"publisher_description":"District 2025 Student Membership 02 Count","publisher_type":"Number","source_column":46,"source_line":2315,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG02P","ordinal":28,"publisher_description":"District 2025 Student Membership 02 Percent","publisher_type":"Number","source_column":46,"source_line":2316,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG02C","ordinal":29,"publisher_description":"District 2025 Student Enrollment Grade 2 Count","publisher_type":"Number","source_column":46,"source_line":2317,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG02P","ordinal":30,"publisher_description":"District 2025 Student Enrollment Grade 2 Percent","publisher_type":"Number","source_column":46,"source_line":2318,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG03C","ordinal":31,"publisher_description":"District 2025 Student Membership 03 Count","publisher_type":"Number","source_column":46,"source_line":2322,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG03P","ordinal":32,"publisher_description":"District 2025 Student Membership 03 Percent","publisher_type":"Number","source_column":46,"source_line":2323,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG03C","ordinal":33,"publisher_description":"District 2025 Student Enrollment Grade 3 Count","publisher_type":"Number","source_column":46,"source_line":2324,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG03P","ordinal":34,"publisher_description":"District 2025 Student Enrollment Grade 3 Percent","publisher_type":"Number","source_column":46,"source_line":2325,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG04C","ordinal":35,"publisher_description":"District 2025 Student Membership 04 Count","publisher_type":"Number","source_column":46,"source_line":2329,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG04P","ordinal":36,"publisher_description":"District 2025 Student Membership 04 Percent","publisher_type":"Number","source_column":46,"source_line":2330,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG04C","ordinal":37,"publisher_description":"District 2025 Student Enrollment Grade 4 Count","publisher_type":"Number","source_column":46,"source_line":2331,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG04P","ordinal":38,"publisher_description":"District 2025 Student Enrollment Grade 4 Percent","publisher_type":"Number","source_column":46,"source_line":2332,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG05C","ordinal":39,"publisher_description":"District 2025 Student Membership 05 Count","publisher_type":"Number","source_column":46,"source_line":2336,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG05P","ordinal":40,"publisher_description":"District 2025 Student Membership 05 Percent","publisher_type":"Number","source_column":46,"source_line":2337,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG05C","ordinal":41,"publisher_description":"District 2025 Student Enrollment Grade 5 Count","publisher_type":"Number","source_column":46,"source_line":2338,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG05P","ordinal":42,"publisher_description":"District 2025 Student Enrollment Grade 5 Percent","publisher_type":"Number","source_column":46,"source_line":2339,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG06C","ordinal":43,"publisher_description":"District 2025 Student Membership 06 Count","publisher_type":"Number","source_column":46,"source_line":2343,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG06P","ordinal":44,"publisher_description":"District 2025 Student Membership 06 Percent","publisher_type":"Number","source_column":46,"source_line":2344,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG06C","ordinal":45,"publisher_description":"District 2025 Student Enrollment Grade 6 Count","publisher_type":"Number","source_column":46,"source_line":2345,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG06P","ordinal":46,"publisher_description":"District 2025 Student Enrollment Grade 6 Percent","publisher_type":"Number","source_column":46,"source_line":2346,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG07C","ordinal":47,"publisher_description":"District 2025 Student Membership 07 Count","publisher_type":"Number","source_column":46,"source_line":2350,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG07P","ordinal":48,"publisher_description":"District 2025 Student Membership 07 Percent","publisher_type":"Number","source_column":46,"source_line":2351,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG07C","ordinal":49,"publisher_description":"District 2025 Student Enrollment Grade 7 Count","publisher_type":"Number","source_column":46,"source_line":2352,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG07P","ordinal":50,"publisher_description":"District 2025 Student Enrollment Grade 7 Percent","publisher_type":"Number","source_column":46,"source_line":2353,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG08C","ordinal":51,"publisher_description":"District 2025 Student Membership 08 Count","publisher_type":"Number","source_column":46,"source_line":2357,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG08P","ordinal":52,"publisher_description":"District 2025 Student Membership 08 Percent","publisher_type":"Number","source_column":46,"source_line":2358,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG08C","ordinal":53,"publisher_description":"District 2025 Student Enrollment Grade 8 Count","publisher_type":"Number","source_column":46,"source_line":2359,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG08P","ordinal":54,"publisher_description":"District 2025 Student Enrollment Grade 8 Percent","publisher_type":"Number","source_column":46,"source_line":2360,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG09C","ordinal":55,"publisher_description":"District 2025 Student Membership 09 Count","publisher_type":"Number","source_column":46,"source_line":2364,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG09P","ordinal":56,"publisher_description":"District 2025 Student Membership 09 Percent","publisher_type":"Number","source_column":46,"source_line":2365,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG09C","ordinal":57,"publisher_description":"District 2025 Student Enrollment Grade 9 Count","publisher_type":"Number","source_column":46,"source_line":2366,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG09P","ordinal":58,"publisher_description":"District 2025 Student Enrollment Grade 9 Percent","publisher_type":"Number","source_column":46,"source_line":2367,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG10C","ordinal":59,"publisher_description":"District 2025 Student Membership 10 Count","publisher_type":"Number","source_column":46,"source_line":2371,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG10P","ordinal":60,"publisher_description":"District 2025 Student Membership 10 Percent","publisher_type":"Number","source_column":46,"source_line":2372,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG10C","ordinal":61,"publisher_description":"District 2025 Student Enrollment Grade 10 Count","publisher_type":"Number","source_column":46,"source_line":2373,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG10P","ordinal":62,"publisher_description":"District 2025 Student Enrollment Grade 10 Percent","publisher_type":"Number","source_column":46,"source_line":2374,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG11C","ordinal":63,"publisher_description":"District 2025 Student Membership 11 Count","publisher_type":"Number","source_column":46,"source_line":2378,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG11P","ordinal":64,"publisher_description":"District 2025 Student Membership 11 Percent","publisher_type":"Number","source_column":46,"source_line":2379,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG11C","ordinal":65,"publisher_description":"District 2025 Student Enrollment Grade 11 Count","publisher_type":"Number","source_column":46,"source_line":2380,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG11P","ordinal":66,"publisher_description":"District 2025 Student Enrollment Grade 11 Percent","publisher_type":"Number","source_column":46,"source_line":2381,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG12C","ordinal":67,"publisher_description":"District 2025 Student Membership 12 Count","publisher_type":"Number","source_column":46,"source_line":2385,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETG12P","ordinal":68,"publisher_description":"District 2025 Student Membership 12 Percent","publisher_type":"Number","source_column":46,"source_line":2386,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG12C","ordinal":69,"publisher_description":"District 2025 Student Enrollment Grade 12 Count","publisher_type":"Number","source_column":46,"source_line":2387,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTG12P","ordinal":70,"publisher_description":"District 2025 Student Enrollment Grade 12 Percent","publisher_type":"Number","source_column":46,"source_line":2388,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETBLAC","ordinal":71,"publisher_description":"District 2025 Student Membership African American Count","publisher_type":"Number","source_column":46,"source_line":2395,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETBLAP","ordinal":72,"publisher_description":"District 2025 Student Membership African American Percent","publisher_type":"Number","source_column":46,"source_line":2396,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTBLAC","ordinal":73,"publisher_description":"District 2025 Student Enrollment African American Count","publisher_type":"Number","source_column":46,"source_line":2397,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTBLAP","ordinal":74,"publisher_description":"District 2025 Student Enrollment African American Percent","publisher_type":"Number","source_column":46,"source_line":2398,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETHISC","ordinal":75,"publisher_description":"District 2025 Student Membership Hispanic Count","publisher_type":"Number","source_column":46,"source_line":2402,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETHISP","ordinal":76,"publisher_description":"District 2025 Student Membership Hispanic Percent","publisher_type":"Number","source_column":46,"source_line":2403,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTHISC","ordinal":77,"publisher_description":"District 2025 Student Enrollment Hispanic Count","publisher_type":"Number","source_column":46,"source_line":2404,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTHISP","ordinal":78,"publisher_description":"District 2025 Student Enrollment Hispanic Percent","publisher_type":"Number","source_column":46,"source_line":2405,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETWHIC","ordinal":79,"publisher_description":"District 2025 Student Membership White Count","publisher_type":"Number","source_column":46,"source_line":2409,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETWHIP","ordinal":80,"publisher_description":"District 2025 Student Membership White Percent","publisher_type":"Number","source_column":46,"source_line":2410,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTWHIC","ordinal":81,"publisher_description":"District 2025 Student Enrollment White Count","publisher_type":"Number","source_column":46,"source_line":2411,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTWHIP","ordinal":82,"publisher_description":"District 2025 Student Enrollment White Percent","publisher_type":"Number","source_column":46,"source_line":2412,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETINDC","ordinal":83,"publisher_description":"District 2025 Student Membership American Indian Count","publisher_type":"Number","source_column":46,"source_line":2416,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETINDP","ordinal":84,"publisher_description":"District 2025 Student Membership American Indian Percent","publisher_type":"Number","source_column":46,"source_line":2417,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTINDC","ordinal":85,"publisher_description":"District 2025 Student Enrollment Asian Count","publisher_type":"Number","source_column":46,"source_line":2418,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTINDP","ordinal":86,"publisher_description":"District 2025 Student Enrollment Asian Percent","publisher_type":"Number","source_column":46,"source_line":2419,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETASIC","ordinal":87,"publisher_description":"District 2025 Student Membership Asian Count","publisher_type":"Number","source_column":46,"source_line":2423,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETASIP","ordinal":88,"publisher_description":"District 2025 Student Membership Asian Percent","publisher_type":"Number","source_column":46,"source_line":2424,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTASIC","ordinal":89,"publisher_description":"District 2024-25 Asian Students Count","publisher_type":"Number","source_column":46,"source_line":2425,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTASIP","ordinal":90,"publisher_description":"District 2024-25 Asian Students Percent","publisher_type":"Number","source_column":46,"source_line":2426,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETPCIC","ordinal":91,"publisher_description":"District 2025 Student Membership Pacific Islander Count","publisher_type":"Number","source_column":46,"source_line":2430,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETPCIP","ordinal":92,"publisher_description":"District 2025 Student Membership Pacific Islander Percent","publisher_type":"Number","source_column":46,"source_line":2431,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTPCIC","ordinal":93,"publisher_description":"District 2025 Student Enrollment Pacific Islander Count","publisher_type":"Number","source_column":46,"source_line":2432,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTPCIP","ordinal":94,"publisher_description":"District 2025 Student Enrollment Pacific Islander Percent","publisher_type":"Number","source_column":46,"source_line":2433,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETTWOC","ordinal":95,"publisher_description":"District 2025 Student Membership Two or More Races Count","publisher_type":"Number","source_column":46,"source_line":2437,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETTWOP","ordinal":96,"publisher_description":"District 2025 Student Membership Two or More Races Percent","publisher_type":"Number","source_column":46,"source_line":2438,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTTWOC","ordinal":97,"publisher_description":"District 2025 Student Enrollment Two or More Races Count","publisher_type":"Number","source_column":46,"source_line":2439,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTTWOP","ordinal":98,"publisher_description":"District 2025 Student Enrollment Two or More Races Percent","publisher_type":"Number","source_column":46,"source_line":2440,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETFEMC","ordinal":99,"publisher_description":"District 2025 Student Membership Female Count","publisher_type":"Number","source_column":46,"source_line":2447,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETFEMP","ordinal":100,"publisher_description":"District 2025 Student Membership Female Percent","publisher_type":"Number","source_column":46,"source_line":2448,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTFEMC","ordinal":101,"publisher_description":"District 2025 Student Enrollment Female: Count","publisher_type":"Number","source_column":46,"source_line":2449,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTFEMP","ordinal":102,"publisher_description":"District 2025 Student Enrollment Female: Percent","publisher_type":"Number","source_column":46,"source_line":2450,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETMALC","ordinal":103,"publisher_description":"District 2025 Student Membership Male Count","publisher_type":"Number","source_column":46,"source_line":2454,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETMALP","ordinal":104,"publisher_description":"District 2025 Student Membership Male Percent","publisher_type":"Number","source_column":46,"source_line":2455,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTMALC","ordinal":105,"publisher_description":"District 2025 Student Enrollment Male Count","publisher_type":"Number","source_column":46,"source_line":2456,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTMALP","ordinal":106,"publisher_description":"District 2025 Student Enrollment Male Percent","publisher_type":"Number","source_column":46,"source_line":2457,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETECOC","ordinal":107,"publisher_description":"District 2025 Student Membership Econ Disadv Count","publisher_type":"Number","source_column":46,"source_line":2464,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETECOP","ordinal":108,"publisher_description":"District 2025 Student Membership Econ Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2465,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTECOC","ordinal":109,"publisher_description":"District 2025 Student Enrollment Economically Disadvantaged Count","publisher_type":"Number","source_column":46,"source_line":2466,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTECOP","ordinal":110,"publisher_description":"District 2025 Student Enrollment Economically Disadvantaged Percent","publisher_type":"Number","source_column":46,"source_line":2467,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETNEDC","ordinal":111,"publisher_description":"District 2025 Student Membership Non-Educationally Disadv Count","publisher_type":"Number","source_column":46,"source_line":2471,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETNEDP","ordinal":112,"publisher_description":"District 2025 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2472,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTNEDC","ordinal":113,"publisher_description":"District 2025 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number","source_column":46,"source_line":2473,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTNEDP","ordinal":114,"publisher_description":"District 2025 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2474,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPET504C","ordinal":115,"publisher_description":"District 2025 Student Membership Section 504 Count","publisher_type":"Number","source_column":46,"source_line":2478,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPET504P","ordinal":116,"publisher_description":"District 2025 Student Membership Section 504 Percent","publisher_type":"Number","source_column":46,"source_line":2479,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNT504C","ordinal":117,"publisher_description":"District 2025 Student Enrollment Section 504 Count","publisher_type":"Number","source_column":46,"source_line":2480,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNT504P","ordinal":118,"publisher_description":"District 2025 Student Enrollment Section 504 Percent","publisher_type":"Number","source_column":46,"source_line":2481,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETLEPC","ordinal":119,"publisher_description":"District 2025 Student Membership EB/EL Count","publisher_type":"Number","source_column":46,"source_line":2485,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETLEPP","ordinal":120,"publisher_description":"District 2025 Student Membership EB/EL Percent","publisher_type":"Number","source_column":46,"source_line":2486,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTLEPC","ordinal":121,"publisher_description":"District 2025 Student Enrollment English Learner Count","publisher_type":"Number","source_column":46,"source_line":2487,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTLEPP","ordinal":122,"publisher_description":"District 2025 Student Enrollment English Learner Percent","publisher_type":"Number","source_column":46,"source_line":2488,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETDISC","ordinal":123,"publisher_description":"District 2024 DAEP Count","publisher_type":"Number","source_column":46,"source_line":2492,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETDISP","ordinal":124,"publisher_description":"District 2024 DAEP Percent","publisher_type":"Number","source_column":46,"source_line":2493,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETDSLC","ordinal":125,"publisher_description":"District 2025 Student Membership Dyslexia Count","publisher_type":"Number","source_column":46,"source_line":2499,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETDSLP","ordinal":126,"publisher_description":"District 2025 Student Membership Dyslexia Percent","publisher_type":"Number","source_column":46,"source_line":2500,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTDSLC","ordinal":127,"publisher_description":"District 2025 Student Enrollment Dyslexia Count","publisher_type":"Number","source_column":46,"source_line":2501,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTDSLP","ordinal":128,"publisher_description":"District 2025 Student Enrollment Dyslexia Percent","publisher_type":"Number","source_column":46,"source_line":2502,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETFOSC","ordinal":129,"publisher_description":"District 2025 Student Membership Foster Care Count","publisher_type":"Number","source_column":46,"source_line":2506,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETFOSP","ordinal":130,"publisher_description":"District 2025 Student Membership Foster Care Percent","publisher_type":"Number","source_column":46,"source_line":2507,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTFOSC","ordinal":131,"publisher_description":"District 2025 Student Enrollment Foster Care Count","publisher_type":"Number","source_column":46,"source_line":2508,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTFOSP","ordinal":132,"publisher_description":"District 2025 Student Enrollment Foster Care Percent","publisher_type":"Number","source_column":46,"source_line":2509,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETHOMC","ordinal":133,"publisher_description":"District 2025 Student Membership Homeless Count","publisher_type":"Number","source_column":46,"source_line":2513,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETHOMP","ordinal":134,"publisher_description":"District 2025 Student Membership Homeless Percent","publisher_type":"Number","source_column":46,"source_line":2514,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTHOMC","ordinal":135,"publisher_description":"District 2025 Student Enrollment Homeless Count","publisher_type":"Number","source_column":46,"source_line":2515,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTHOMP","ordinal":136,"publisher_description":"District 2025 Student Enrollment Homeless Percent","publisher_type":"Number","source_column":46,"source_line":2516,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETIMMC","ordinal":137,"publisher_description":"District 2025 Student Membership Immigrant Count","publisher_type":"Number","source_column":46,"source_line":2520,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETIMMP","ordinal":138,"publisher_description":"District 2025 Student Membership Immigrant Percent","publisher_type":"Number","source_column":46,"source_line":2521,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTIMMC","ordinal":139,"publisher_description":"District 2025 Student Enrollment Immigrant Count","publisher_type":"Number","source_column":46,"source_line":2522,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTIMMP","ordinal":140,"publisher_description":"District 2025 Student Enrollment Immigrant Percent","publisher_type":"Number","source_column":46,"source_line":2523,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETMIGC","ordinal":141,"publisher_description":"District 2025 Student Membership Migrant Count","publisher_type":"Number","source_column":46,"source_line":2527,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETMIGP","ordinal":142,"publisher_description":"District 2025 Student Membership Migrant Percent","publisher_type":"Number","source_column":46,"source_line":2528,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTMIGC","ordinal":143,"publisher_description":"District 2025 Student Enrollment Migrant Count","publisher_type":"Number","source_column":46,"source_line":2529,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTMIGP","ordinal":144,"publisher_description":"District 2025 Student Enrollment Migrant Percent","publisher_type":"Number","source_column":46,"source_line":2530,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETTT1C","ordinal":145,"publisher_description":"District 2025 Student Membership Title I Count","publisher_type":"Number","source_column":46,"source_line":2534,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETTT1P","ordinal":146,"publisher_description":"District 2025 Student Membership Title I Percent","publisher_type":"Number","source_column":46,"source_line":2535,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTTT1C","ordinal":147,"publisher_description":"District 2025 Student Enrollment Title I Count","publisher_type":"Number","source_column":46,"source_line":2536,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTTT1P","ordinal":148,"publisher_description":"District 2025 Student Enrollment Title I Percent","publisher_type":"Number","source_column":46,"source_line":2537,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETMLCC","ordinal":149,"publisher_description":"District 2025 Student Membership Military-Connected Count","publisher_type":"Number","source_column":46,"source_line":2541,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETMLCP","ordinal":150,"publisher_description":"District 2025 Student Membership Military-Connected Percent","publisher_type":"Number","source_column":46,"source_line":2542,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTMLCC","ordinal":151,"publisher_description":"District 2025 Student Enrollment Military-Connected Count","publisher_type":"Number","source_column":46,"source_line":2543,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTMLCP","ordinal":152,"publisher_description":"District 2025 Student Enrollment Military-Connected Percent","publisher_type":"Number","source_column":46,"source_line":2544,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETRSKC","ordinal":153,"publisher_description":"District 2025 Student Membership At Risk Count","publisher_type":"Number","source_column":46,"source_line":2548,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETRSKP","ordinal":154,"publisher_description":"District 2025 Student Membership At Risk Percent","publisher_type":"Number","source_column":46,"source_line":2549,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTRSKC","ordinal":155,"publisher_description":"District 2025 Student Enrollment At Risk Count","publisher_type":"Number","source_column":46,"source_line":2550,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTRSKP","ordinal":156,"publisher_description":"District 2025 Student Enrollment At Risk Percent","publisher_type":"Number","source_column":46,"source_line":2551,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETBILC","ordinal":157,"publisher_description":"District 2025 Student Membership Bilingual/ESL Count","publisher_type":"Number","source_column":46,"source_line":2558,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETBILP","ordinal":158,"publisher_description":"District 2025 Student Membership Bilingual/ESL Percent","publisher_type":"Number","source_column":46,"source_line":2559,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTBILC","ordinal":159,"publisher_description":"District 2025 Student Enrollment Bilingual/ESL Count","publisher_type":"Number","source_column":46,"source_line":2560,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTBILP","ordinal":160,"publisher_description":"District 2025 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number","source_column":46,"source_line":2561,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETVOCC","ordinal":161,"publisher_description":"District 2025 Student Membership Career & Technical Education Count","publisher_type":"Number","source_column":46,"source_line":2565,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETVOCP","ordinal":162,"publisher_description":"District 2025 Student Membership Career & Technical Education Percent","publisher_type":"Number","source_column":46,"source_line":2566,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETVHSC","ordinal":163,"publisher_description":"District 2025 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number","source_column":46,"source_line":2572,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETVHSP","ordinal":164,"publisher_description":"District 2025 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number","source_column":46,"source_line":2573,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGIFC","ordinal":165,"publisher_description":"District 2025 Student Membership Gifted & Talented Count","publisher_type":"Number","source_column":46,"source_line":2579,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETGIFP","ordinal":166,"publisher_description":"District 2025 Student Membership Gifted & Talented Percent","publisher_type":"Number","source_column":46,"source_line":2580,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGIFC","ordinal":167,"publisher_description":"District 2025 Student Enrollment Gifted and Talented Count","publisher_type":"Number","source_column":46,"source_line":2581,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTGIFP","ordinal":168,"publisher_description":"District 2025 Student Enrollment Gifted and Talented Percent","publisher_type":"Number","source_column":46,"source_line":2582,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSPEC","ordinal":169,"publisher_description":"District 2025 Student Membership Special Ed Count","publisher_type":"Number","source_column":46,"source_line":2586,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSPEP","ordinal":170,"publisher_description":"District 2025 Student Membership Special Ed Percent","publisher_type":"Number","source_column":46,"source_line":2587,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTSPEC","ordinal":171,"publisher_description":"District 2025 Student Enrollment Special Ed Count","publisher_type":"Number","source_column":46,"source_line":2588,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPNTSPEP","ordinal":172,"publisher_description":"District 2025 Student Enrollment Special Ed Percent","publisher_type":"Number","source_column":46,"source_line":2589,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSIMC","ordinal":173,"publisher_description":"District 2025 Student Membership Total Students with Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2596,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSINC","ordinal":174,"publisher_description":"District 2025 Student Membership Intellectual Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2603,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSINP","ordinal":175,"publisher_description":"District 2025 Student Membership Intellectual Disabilities Percent","publisher_type":"Number","source_column":46,"source_line":2604,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSPHC","ordinal":176,"publisher_description":"District 2025 Student Membership Physical Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2610,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSPHP","ordinal":177,"publisher_description":"District 2025 Student Membership Physical Disabilities Percent","publisher_type":"Number","source_column":46,"source_line":2611,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSAUC","ordinal":178,"publisher_description":"District 2025 Student Membership Autism Count","publisher_type":"Number","source_column":46,"source_line":2617,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSAUP","ordinal":179,"publisher_description":"District 2025 Student Membership Autism Percent","publisher_type":"Number","source_column":46,"source_line":2618,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSBHC","ordinal":180,"publisher_description":"District 2025 Student Membership Behavioral Disabilities Count","publisher_type":"Number","source_column":46,"source_line":2624,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSBHP","ordinal":181,"publisher_description":"District 2025 Student Membership Behavioral Disabilities Percent","publisher_type":"Number","source_column":46,"source_line":2625,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSNOC","ordinal":182,"publisher_description":"District 2025 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number","source_column":46,"source_line":2631,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETSNOP","ordinal":183,"publisher_description":"District 2025 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number","source_column":46,"source_line":2632,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMBLAC","ordinal":184,"publisher_description":"District 2025 Student Membership 2024 Mobility African American Count","publisher_type":"Number","source_column":46,"source_line":2641,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMBLAP","ordinal":185,"publisher_description":"District 2025 Student Membership 2024 Mobility African American Percent","publisher_type":"Number","source_column":46,"source_line":2642,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMHISC","ordinal":186,"publisher_description":"District 2025 Student Membership 2024 Mobility Hispanic Count","publisher_type":"Number","source_column":46,"source_line":2648,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMHISP","ordinal":187,"publisher_description":"District 2025 Student Membership 2024 Mobility Hispanic Percent","publisher_type":"Number","source_column":46,"source_line":2649,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMWHIC","ordinal":188,"publisher_description":"District 2025 Student Membership 2024 Mobility White Count","publisher_type":"Number","source_column":46,"source_line":2655,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMWHIP","ordinal":189,"publisher_description":"District 2025 Student Membership 2024 Mobility White Percent","publisher_type":"Number","source_column":46,"source_line":2656,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMINDC","ordinal":190,"publisher_description":"District 2025 Student Membership 2024 Mobility American Indian Count","publisher_type":"Number","source_column":46,"source_line":2662,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMINDP","ordinal":191,"publisher_description":"District 2025 Student Membership 2024 Mobility American Indian Percent","publisher_type":"Number","source_column":46,"source_line":2663,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMASIC","ordinal":192,"publisher_description":"District 2025 Student Membership 2024 Mobility Asian Count","publisher_type":"Number","source_column":46,"source_line":2669,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMASIP","ordinal":193,"publisher_description":"District 2025 Student Membership 2024 Mobility Asian Percent","publisher_type":"Number","source_column":46,"source_line":2670,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMPCIC","ordinal":194,"publisher_description":"District 2025 Student Membership 2024 Mobility Pacific Islander Count","publisher_type":"Number","source_column":46,"source_line":2676,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMPCIP","ordinal":195,"publisher_description":"District 2025 Student Membership 2024 Mobility Pacific Islander Percent","publisher_type":"Number","source_column":46,"source_line":2677,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMTWOC","ordinal":196,"publisher_description":"District 2025 Student Membership 2024 Mobility Two or More Races Count","publisher_type":"Number","source_column":46,"source_line":2683,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMTWOP","ordinal":197,"publisher_description":"District 2025 Student Membership 2024 Mobility Two or More Races Percent","publisher_type":"Number","source_column":46,"source_line":2684,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMALLC","ordinal":198,"publisher_description":"District 2025 Student Membership 2024 Mobility All Students Count","publisher_type":"Number","source_column":46,"source_line":2690,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMALLP","ordinal":199,"publisher_description":"District 2025 Student Membership 2024 Mobility All Students Percent","publisher_type":"Number","source_column":46,"source_line":2691,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMSPEC","ordinal":200,"publisher_description":"District 2025 Student Membership 2024 Mobility Special Ed Count","publisher_type":"Number","source_column":46,"source_line":2697,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMSPEP","ordinal":201,"publisher_description":"District 2025 Student Membership 2024 Mobility Special Ed Percent","publisher_type":"Number","source_column":46,"source_line":2698,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMLEPC","ordinal":202,"publisher_description":"District 2025 Student Membership 2024 Mobility EB/EL Count","publisher_type":"Number","source_column":46,"source_line":2704,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMLEPP","ordinal":203,"publisher_description":"District 2025 Student Membership 2024 Mobility EB/EL Percent","publisher_type":"Number","source_column":46,"source_line":2705,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMECOC","ordinal":204,"publisher_description":"District 2025 Student Membership 2024 Mobility Econ Disadv Count","publisher_type":"Number","source_column":46,"source_line":2711,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPEMECOP","ordinal":205,"publisher_description":"District 2025 Student Membership 2024 Mobility Econ Disadv Percent","publisher_type":"Number","source_column":46,"source_line":2712,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETATTC","ordinal":206,"publisher_description":"District 2025 Student Membership 2023-24 Attrition All Students Count","publisher_type":"Number","source_column":46,"source_line":2721,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPETATTP","ordinal":207,"publisher_description":"District 2025 Student Membership 2023-24 Attrition All Students Percent","publisher_type":"Number","source_column":46,"source_line":2722,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRAKR","ordinal":208,"publisher_description":"District 2024 Retention Regular Ed KG Rate","publisher_type":"Number","source_column":46,"source_line":2760,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSAKR","ordinal":209,"publisher_description":"District 2024 Retention Special Ed KG Rate","publisher_type":"Number","source_column":46,"source_line":2761,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA1R","ordinal":210,"publisher_description":"District 2024 Retention Regular Ed 01 Rate","publisher_type":"Number","source_column":46,"source_line":2765,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA1R","ordinal":211,"publisher_description":"District 2024 Retention Special Ed 01 Rate","publisher_type":"Number","source_column":46,"source_line":2766,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA2R","ordinal":212,"publisher_description":"District 2024 Retention Regular Ed 02 Rate","publisher_type":"Number","source_column":46,"source_line":2770,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA2R","ordinal":213,"publisher_description":"District 2024 Retention Special Ed 02 Rate","publisher_type":"Number","source_column":46,"source_line":2771,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA3R","ordinal":214,"publisher_description":"District 2024 Retention Regular Ed 03 Rate","publisher_type":"Number","source_column":46,"source_line":2775,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA3R","ordinal":215,"publisher_description":"District 2024 Retention Special Ed 03 Rate","publisher_type":"Number","source_column":46,"source_line":2776,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA4R","ordinal":216,"publisher_description":"District 2024 Retention Regular Ed 04 Rate","publisher_type":"Number","source_column":46,"source_line":2780,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA4R","ordinal":217,"publisher_description":"District 2024 Retention Special Ed 04 Rate","publisher_type":"Number","source_column":46,"source_line":2781,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA5R","ordinal":218,"publisher_description":"District 2024 Retention Regular Ed 05 Rate","publisher_type":"Number","source_column":46,"source_line":2785,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA5R","ordinal":219,"publisher_description":"District 2024 Retention Special Ed 05 Rate","publisher_type":"Number","source_column":46,"source_line":2786,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA6R","ordinal":220,"publisher_description":"District 2024 Retention Regular Ed 06 Rate","publisher_type":"Number","source_column":46,"source_line":2790,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA6R","ordinal":221,"publisher_description":"District 2024 Retention Special Ed 06 Rate","publisher_type":"Number","source_column":46,"source_line":2791,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA7R","ordinal":222,"publisher_description":"District 2024 Retention Regular Ed 07 Rate","publisher_type":"Number","source_column":46,"source_line":2795,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA7R","ordinal":223,"publisher_description":"District 2024 Retention Special Ed 07 Rate","publisher_type":"Number","source_column":46,"source_line":2796,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA8R","ordinal":224,"publisher_description":"District 2024 Retention Regular Ed 08 Rate","publisher_type":"Number","source_column":46,"source_line":2800,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA8R","ordinal":225,"publisher_description":"District 2024 Retention Special Ed 08 Rate","publisher_type":"Number","source_column":46,"source_line":2801,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERRA9R","ordinal":226,"publisher_description":"District 2024 Retention Regular Ed 09 Rate","publisher_type":"Number","source_column":46,"source_line":2805,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPERSA9R","ordinal":227,"publisher_description":"District 2024 Retention Special Ed 09 Rate","publisher_type":"Number","source_column":46,"source_line":2806,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DAUND24C","ordinal":228,"publisher_description":"District 2024 Underreported Students Count","publisher_type":"Number","source_column":46,"source_line":2841,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DAUND24C","ordinal":229,"publisher_description":"District 2024 Underreported Students Count","publisher_type":"Number","source_column":46,"source_line":2842,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTGKGA","ordinal":230,"publisher_description":"District 2025 Class Size Kindergarten- Avg Size","publisher_type":"Number","source_column":46,"source_line":2871,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTG01A","ordinal":231,"publisher_description":"District 2025 Class Size Grade 1 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2875,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTG02A","ordinal":232,"publisher_description":"District 2025 Class Size Grade 2 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2879,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTG03A","ordinal":233,"publisher_description":"District 2025 Class Size Grade 3 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2883,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTG04A","ordinal":234,"publisher_description":"District 2025 Class Size Grade 4 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2887,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTG05A","ordinal":235,"publisher_description":"District 2025 Class Size Grade 5 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2891,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTG06A","ordinal":236,"publisher_description":"District 2025 Class Size Grade 6 - Avg Size","publisher_type":"Number","source_column":46,"source_line":2895,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTENGA","ordinal":237,"publisher_description":"District 2025 Class Size Sec English - Avg Size","publisher_type":"Number","source_column":46,"source_line":2902,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTFLAA","ordinal":238,"publisher_description":"District 2025 Class Size Sec For Lng - Avg Size","publisher_type":"Number","source_column":46,"source_line":2906,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTMATA","ordinal":239,"publisher_description":"District 2025 Class Size Sec Math - Avg Size","publisher_type":"Number","source_column":46,"source_line":2910,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTSCIA","ordinal":240,"publisher_description":"District 2025 Class Size Sec Sci - Avg Size","publisher_type":"Number","source_column":46,"source_line":2914,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"},{"code":"DPCTSOCA","ordinal":241,"publisher_description":"District 2025 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number","source_column":46,"source_line":2918,"source_sha256":"693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d"}],"fields":[{"code":"DISTRICT","dictionary_status":"not_applicable","disposition":"identity","field":"district_number","label":"6 Digit County District Number","position":1,"publisher_description":null,"publisher_type":null},{"code":"DISTNAME","dictionary_status":"not_applicable","disposition":"identity","field":"district_name","label":"District Name","position":2,"publisher_description":null,"publisher_type":null},{"code":"DPCTSOCA","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_sec_soc_stud_avg_size","label":"District 2025 Class Size: Sec Soc Stud- Avg Size","position":3,"publisher_description":"District 2025 Class Size Sec Soc Stud- Avg Size","publisher_type":"Number"},{"code":"DPCTSCIA","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_sec_sci_avg_size","label":"District 2025 Class Size: Sec Sci - Avg Size","position":4,"publisher_description":"District 2025 Class Size Sec Sci - Avg Size","publisher_type":"Number"},{"code":"DPCTMATA","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_sec_math_avg_size","label":"District 2025 Class Size: Sec Math - Avg Size","position":5,"publisher_description":"District 2025 Class Size Sec Math - Avg Size","publisher_type":"Number"},{"code":"DPCTGKGA","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_kindergarten_avg_size","label":"District 2025 Class Size: Kindergarten- Avg Size","position":6,"publisher_description":"District 2025 Class Size Kindergarten- Avg Size","publisher_type":"Number"},{"code":"DPCTG06A","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_grade_6_avg_size","label":"District 2025 Class Size: Grade 6 - Avg Size","position":7,"publisher_description":"District 2025 Class Size Grade 6 - Avg Size","publisher_type":"Number"},{"code":"DPCTG05A","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_grade_5_avg_size","label":"District 2025 Class Size: Grade 5 - Avg Size","position":8,"publisher_description":"District 2025 Class Size Grade 5 - Avg Size","publisher_type":"Number"},{"code":"DPCTG04A","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_grade_4_avg_size","label":"District 2025 Class Size: Grade 4 - Avg Size","position":9,"publisher_description":"District 2025 Class Size Grade 4 - Avg Size","publisher_type":"Number"},{"code":"DPCTG03A","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_grade_3_avg_size","label":"District 2025 Class Size: Grade 3 - Avg Size","position":10,"publisher_description":"District 2025 Class Size Grade 3 - Avg Size","publisher_type":"Number"},{"code":"DPCTG02A","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_grade_2_avg_size","label":"District 2025 Class Size: Grade 2 - Avg Size","position":11,"publisher_description":"District 2025 Class Size Grade 2 - Avg Size","publisher_type":"Number"},{"code":"DPCTG01A","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_grade_1_avg_size","label":"District 2025 Class Size: Grade 1 - Avg Size","position":12,"publisher_description":"District 2025 Class Size Grade 1 - Avg Size","publisher_type":"Number"},{"code":"DPCTFLAA","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_sec_for_lng_avg_size","label":"District 2025 Class Size: Sec For Lng - Avg Size","position":13,"publisher_description":"District 2025 Class Size Sec For Lng - Avg Size","publisher_type":"Number"},{"code":"DPCTENGA","dictionary_status":"documented","disposition":"fact","field":"district_2025_class_size_sec_english_avg_size","label":"District 2025 Class Size: Sec English - Avg Size","position":14,"publisher_description":"District 2025 Class Size Sec English - Avg Size","publisher_type":"Number"},{"code":"DPETGEEC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_ee_count","label":"District 2025 Student Membership: EE Count","position":15,"publisher_description":"District 2025 Student Membership EE Count","publisher_type":"Number"},{"code":"DPETGPKC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pk_count","label":"District 2025 Student Membership: PK Count","position":16,"publisher_description":"District 2025 Student Membership PK Count","publisher_type":"Number"},{"code":"DPETGKNC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_kg_count","label":"District 2025 Student Membership: KG Count","position":17,"publisher_description":"District 2025 Student Membership KG Count","publisher_type":"Number"},{"code":"DPETG01C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_01_count","label":"District 2025 Student Membership: 01 Count","position":18,"publisher_description":"District 2025 Student Membership 01 Count","publisher_type":"Number"},{"code":"DPETG02C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_02_count","label":"District 2025 Student Membership: 02 Count","position":19,"publisher_description":"District 2025 Student Membership 02 Count","publisher_type":"Number"},{"code":"DPETG03C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_03_count","label":"District 2025 Student Membership: 03 Count","position":20,"publisher_description":"District 2025 Student Membership 03 Count","publisher_type":"Number"},{"code":"DPETG04C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_04_count","label":"District 2025 Student Membership: 04 Count","position":21,"publisher_description":"District 2025 Student Membership 04 Count","publisher_type":"Number"},{"code":"DPETG05C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_05_count","label":"District 2025 Student Membership: 05 Count","position":22,"publisher_description":"District 2025 Student Membership 05 Count","publisher_type":"Number"},{"code":"DPETG06C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_06_count","label":"District 2025 Student Membership: 06 Count","position":23,"publisher_description":"District 2025 Student Membership 06 Count","publisher_type":"Number"},{"code":"DPETG07C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_07_count","label":"District 2025 Student Membership: 07 Count","position":24,"publisher_description":"District 2025 Student Membership 07 Count","publisher_type":"Number"},{"code":"DPETG08C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_08_count","label":"District 2025 Student Membership: 08 Count","position":25,"publisher_description":"District 2025 Student Membership 08 Count","publisher_type":"Number"},{"code":"DPETG09C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_09_count","label":"District 2025 Student Membership: 09 Count","position":26,"publisher_description":"District 2025 Student Membership 09 Count","publisher_type":"Number"},{"code":"DPETG10C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_10_count","label":"District 2025 Student Membership: 10 Count","position":27,"publisher_description":"District 2025 Student Membership 10 Count","publisher_type":"Number"},{"code":"DPETG11C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_11_count","label":"District 2025 Student Membership: 11 Count","position":28,"publisher_description":"District 2025 Student Membership 11 Count","publisher_type":"Number"},{"code":"DPETG12C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_12_count","label":"District 2025 Student Membership: 12 Count","position":29,"publisher_description":"District 2025 Student Membership 12 Count","publisher_type":"Number"},{"code":"DPETALLC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_all_students_count","label":"District 2025 Student Membership: All Students Count","position":30,"publisher_description":"District 2025 Student Membership All Students Count","publisher_type":"Number"},{"code":"DPETSPEC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_special_ed_count","label":"District 2025 Student Membership: Special Ed Count","position":31,"publisher_description":"District 2025 Student Membership Special Ed Count","publisher_type":"Number"},{"code":"DPETBILC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_bilingual_esl_count","label":"District 2025 Student Membership: Bilingual/ESL Count","position":32,"publisher_description":"District 2025 Student Membership Bilingual/ESL Count","publisher_type":"Number"},{"code":"DPETGIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_gifted_and_talented_count","label":"District 2025 Student Membership: Gifted & Talented Count","position":33,"publisher_description":"District 2025 Student Membership Gifted & Talented Count","publisher_type":"Number"},{"code":"DPETLEPC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_eb_el_count","label":"District 2025 Student Membership: EB/EL Count","position":34,"publisher_description":"District 2025 Student Membership EB/EL Count","publisher_type":"Number"},{"code":"DPETECOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_econ_disadv_count","label":"District 2025 Student Membership: Econ Disadv Count","position":35,"publisher_description":"District 2025 Student Membership Econ Disadv Count","publisher_type":"Number"},{"code":"DPETNEDC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_non_educationally_disadv_count","label":"District 2025 Student Membership: Non-Educationally Disadv Count","position":36,"publisher_description":"District 2025 Student Membership Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"DPETRSKC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_at_risk_count","label":"District 2025 Student Membership: At Risk Count","position":37,"publisher_description":"District 2025 Student Membership At Risk Count","publisher_type":"Number"},{"code":"DPETINDC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_american_indian_count","label":"District 2025 Student Membership: American Indian Count","position":38,"publisher_description":"District 2025 Student Membership American Indian Count","publisher_type":"Number"},{"code":"DPETASIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_asian_count","label":"District 2025 Student Membership: Asian Count","position":39,"publisher_description":"District 2025 Student Membership Asian Count","publisher_type":"Number"},{"code":"DPETPCIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pacific_islander_count","label":"District 2025 Student Membership: Pacific Islander Count","position":40,"publisher_description":"District 2025 Student Membership Pacific Islander Count","publisher_type":"Number"},{"code":"DPETTWOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_two_or_more_races_count","label":"District 2025 Student Membership: Two or More Races Count","position":41,"publisher_description":"District 2025 Student Membership Two or More Races Count","publisher_type":"Number"},{"code":"DPETBLAC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_african_american_count","label":"District 2025 Student Membership: African American Count","position":42,"publisher_description":"District 2025 Student Membership African American Count","publisher_type":"Number"},{"code":"DPETHISC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_hispanic_count","label":"District 2025 Student Membership: Hispanic Count","position":43,"publisher_description":"District 2025 Student Membership Hispanic Count","publisher_type":"Number"},{"code":"DPETWHIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_white_count","label":"District 2025 Student Membership: White Count","position":44,"publisher_description":"District 2025 Student Membership White Count","publisher_type":"Number"},{"code":"DPETMALC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_male_count","label":"District 2025 Student Membership: Male Count","position":45,"publisher_description":"District 2025 Student Membership Male Count","publisher_type":"Number"},{"code":"DPETFEMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_female_count","label":"District 2025 Student Membership: Female Count","position":46,"publisher_description":"District 2025 Student Membership Female Count","publisher_type":"Number"},{"code":"DPETDSLC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_dyslexia_count","label":"District 2025 Student Membership: Dyslexia Count","position":47,"publisher_description":"District 2025 Student Membership Dyslexia Count","publisher_type":"Number"},{"code":"DPET504C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_section_504_count","label":"District 2025 Student Membership: Section 504 Count","position":48,"publisher_description":"District 2025 Student Membership Section 504 Count","publisher_type":"Number"},{"code":"DPETTT1C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_title_i_count","label":"District 2025 Student Membership: Title I Count","position":49,"publisher_description":"District 2025 Student Membership Title I Count","publisher_type":"Number"},{"code":"DPETHOMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_homeless_count","label":"District 2025 Student Membership: Homeless Count","position":50,"publisher_description":"District 2025 Student Membership Homeless Count","publisher_type":"Number"},{"code":"DPETIMMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_immigrant_count","label":"District 2025 Student Membership: Immigrant Count","position":51,"publisher_description":"District 2025 Student Membership Immigrant Count","publisher_type":"Number"},{"code":"DPETMIGC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_migrant_count","label":"District 2025 Student Membership: Migrant Count","position":52,"publisher_description":"District 2025 Student Membership Migrant Count","publisher_type":"Number"},{"code":"DPETMLCC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_military_connected_count","label":"District 2025 Student Membership: Military-Connected Count","position":53,"publisher_description":"District 2025 Student Membership Military-Connected Count","publisher_type":"Number"},{"code":"DPETFOSC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_foster_care_count","label":"District 2025 Student Membership: Foster Care Count","position":54,"publisher_description":"District 2025 Student Membership Foster Care Count","publisher_type":"Number"},{"code":"DPETGP3C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pk_count_ages_3_and_under_count","label":"District 2025 Student Membership: PK Count Ages 3 and Under Count","position":55,"publisher_description":"District 2025 Student Membership PK Count Ages 3 and Under Count","publisher_type":"Number"},{"code":"DPETGP4C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pk_count_ages_4_and_over_count","label":"District 2025 Student Membership: PK Count Ages 4 and Over Count","position":56,"publisher_description":"District 2025 Student Membership PK Count Ages 4 and Over Count","publisher_type":"Number"},{"code":"DPETDISC","dictionary_status":"documented","disposition":"fact","field":"district_2024_daep_count","label":"District 2024 DAEP: Count","position":57,"publisher_description":"District 2024 DAEP Count","publisher_type":"Number"},{"code":"DPETDISP","dictionary_status":"documented","disposition":"fact","field":"district_2024_daep_percent","label":"District 2024 DAEP: Percent","position":58,"publisher_description":"District 2024 DAEP Percent","publisher_type":"Number"},{"code":"DPETATTC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2023_24_attrition_all_students_count","label":"District 2025 Student Membership: 2023-24 Attrition All Students Count","position":59,"publisher_description":"District 2025 Student Membership 2023-24 Attrition All Students Count","publisher_type":"Number"},{"code":"DPETATTP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2023_24_attrition_all_students_percent","label":"District 2025 Student Membership: 2023-24 Attrition All Students Percent","position":60,"publisher_description":"District 2025 Student Membership 2023-24 Attrition All Students Percent","publisher_type":"Number"},{"code":"DPETSIMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_total_students_with_disabilities_count","label":"District 2025 Student Membership: Total Students with Disabilities Count","position":61,"publisher_description":"District 2025 Student Membership Total Students with Disabilities Count","publisher_type":"Number"},{"code":"DPETSINC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_intellectual_disabilities_count","label":"District 2025 Student Membership: Intellectual Disabilities Count","position":62,"publisher_description":"District 2025 Student Membership Intellectual Disabilities Count","publisher_type":"Number"},{"code":"DPETSPHC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_physical_disabilities_count","label":"District 2025 Student Membership: Physical Disabilities Count","position":63,"publisher_description":"District 2025 Student Membership Physical Disabilities Count","publisher_type":"Number"},{"code":"DPETSBHC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_behavioral_disabilities_count","label":"District 2025 Student Membership: Behavioral Disabilities Count","position":64,"publisher_description":"District 2025 Student Membership Behavioral Disabilities Count","publisher_type":"Number"},{"code":"DPETSAUC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_autism_count","label":"District 2025 Student Membership: Autism Count","position":65,"publisher_description":"District 2025 Student Membership Autism Count","publisher_type":"Number"},{"code":"DPETSNOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_non_categorical_early_childhood_count","label":"District 2025 Student Membership: Non-Categorical Early Childhood Count","position":66,"publisher_description":"District 2025 Student Membership Non-Categorical Early Childhood Count","publisher_type":"Number"},{"code":"DPETSINP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_intellectual_disabilities_percent","label":"District 2025 Student Membership: Intellectual Disabilities Percent","position":67,"publisher_description":"District 2025 Student Membership Intellectual Disabilities Percent","publisher_type":"Number"},{"code":"DPETSPHP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_physical_disabilities_percent","label":"District 2025 Student Membership: Physical Disabilities Percent","position":68,"publisher_description":"District 2025 Student Membership Physical Disabilities Percent","publisher_type":"Number"},{"code":"DPETSBHP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_behavioral_disabilities_percent","label":"District 2025 Student Membership: Behavioral Disabilities Percent","position":69,"publisher_description":"District 2025 Student Membership Behavioral Disabilities Percent","publisher_type":"Number"},{"code":"DPETSAUP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_autism_percent","label":"District 2025 Student Membership: Autism Percent","position":70,"publisher_description":"District 2025 Student Membership Autism Percent","publisher_type":"Number"},{"code":"DPETSNOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_non_categorical_early_childhood_percent","label":"District 2025 Student Membership: Non-Categorical Early Childhood Percent","position":71,"publisher_description":"District 2025 Student Membership Non-Categorical Early Childhood Percent","publisher_type":"Number"},{"code":"DPERRAKR","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_kg_rate","label":"District 2024 Retention: Regular Ed KG Rate","position":72,"publisher_description":"District 2024 Retention Regular Ed KG Rate","publisher_type":"Number"},{"code":"DPERRA1R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_01_rate","label":"District 2024 Retention: Regular Ed 01 Rate","position":73,"publisher_description":"District 2024 Retention Regular Ed 01 Rate","publisher_type":"Number"},{"code":"DPERRA2R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_02_rate","label":"District 2024 Retention: Regular Ed 02 Rate","position":74,"publisher_description":"District 2024 Retention Regular Ed 02 Rate","publisher_type":"Number"},{"code":"DPERRA3R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_03_rate","label":"District 2024 Retention: Regular Ed 03 Rate","position":75,"publisher_description":"District 2024 Retention Regular Ed 03 Rate","publisher_type":"Number"},{"code":"DPERRA4R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_04_rate","label":"District 2024 Retention: Regular Ed 04 Rate","position":76,"publisher_description":"District 2024 Retention Regular Ed 04 Rate","publisher_type":"Number"},{"code":"DPERRA5R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_05_rate","label":"District 2024 Retention: Regular Ed 05 Rate","position":77,"publisher_description":"District 2024 Retention Regular Ed 05 Rate","publisher_type":"Number"},{"code":"DPERRA6R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_06_rate","label":"District 2024 Retention: Regular Ed 06 Rate","position":78,"publisher_description":"District 2024 Retention Regular Ed 06 Rate","publisher_type":"Number"},{"code":"DPERRA7R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_07_rate","label":"District 2024 Retention: Regular Ed 07 Rate","position":79,"publisher_description":"District 2024 Retention Regular Ed 07 Rate","publisher_type":"Number"},{"code":"DPERRA8R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_08_rate","label":"District 2024 Retention: Regular Ed 08 Rate","position":80,"publisher_description":"District 2024 Retention Regular Ed 08 Rate","publisher_type":"Number"},{"code":"DPERRA9R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_regular_ed_09_rate","label":"District 2024 Retention: Regular Ed 09 Rate","position":81,"publisher_description":"District 2024 Retention Regular Ed 09 Rate","publisher_type":"Number"},{"code":"DPERSAKR","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_kg_rate","label":"District 2024 Retention: Special Ed KG Rate","position":82,"publisher_description":"District 2024 Retention Special Ed KG Rate","publisher_type":"Number"},{"code":"DPERSA1R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_01_rate","label":"District 2024 Retention: Special Ed 01 Rate","position":83,"publisher_description":"District 2024 Retention Special Ed 01 Rate","publisher_type":"Number"},{"code":"DPERSA2R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_02_rate","label":"District 2024 Retention: Special Ed 02 Rate","position":84,"publisher_description":"District 2024 Retention Special Ed 02 Rate","publisher_type":"Number"},{"code":"DPERSA3R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_03_rate","label":"District 2024 Retention: Special Ed 03 Rate","position":85,"publisher_description":"District 2024 Retention Special Ed 03 Rate","publisher_type":"Number"},{"code":"DPERSA4R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_04_rate","label":"District 2024 Retention: Special Ed 04 Rate","position":86,"publisher_description":"District 2024 Retention Special Ed 04 Rate","publisher_type":"Number"},{"code":"DPERSA5R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_05_rate","label":"District 2024 Retention: Special Ed 05 Rate","position":87,"publisher_description":"District 2024 Retention Special Ed 05 Rate","publisher_type":"Number"},{"code":"DPERSA6R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_06_rate","label":"District 2024 Retention: Special Ed 06 Rate","position":88,"publisher_description":"District 2024 Retention Special Ed 06 Rate","publisher_type":"Number"},{"code":"DPERSA7R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_07_rate","label":"District 2024 Retention: Special Ed 07 Rate","position":89,"publisher_description":"District 2024 Retention Special Ed 07 Rate","publisher_type":"Number"},{"code":"DPERSA8R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_08_rate","label":"District 2024 Retention: Special Ed 08 Rate","position":90,"publisher_description":"District 2024 Retention Special Ed 08 Rate","publisher_type":"Number"},{"code":"DPERSA9R","dictionary_status":"documented","disposition":"fact","field":"district_2024_retention_special_ed_09_rate","label":"District 2024 Retention: Special Ed 09 Rate","position":91,"publisher_description":"District 2024 Retention Special Ed 09 Rate","publisher_type":"Number"},{"code":"DAUND24C","dictionary_status":"documented","disposition":"fact","field":"district_2024_underreported_students_count","label":"District 2024 Underreported Students: Count","position":92,"publisher_description":"District 2024 Underreported Students Count","publisher_type":"Number"},{"code":"DPETWHIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_white_percent","label":"District 2025 Student Membership: White Percent","position":93,"publisher_description":"District 2025 Student Membership White Percent","publisher_type":"Number"},{"code":"DPETBLAP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_african_american_percent","label":"District 2025 Student Membership: African American Percent","position":94,"publisher_description":"District 2025 Student Membership African American Percent","publisher_type":"Number"},{"code":"DPETHISP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_hispanic_percent","label":"District 2025 Student Membership: Hispanic Percent","position":95,"publisher_description":"District 2025 Student Membership Hispanic Percent","publisher_type":"Number"},{"code":"DPETINDP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_american_indian_percent","label":"District 2025 Student Membership: American Indian Percent","position":96,"publisher_description":"District 2025 Student Membership American Indian Percent","publisher_type":"Number"},{"code":"DPETASIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_asian_percent","label":"District 2025 Student Membership: Asian Percent","position":97,"publisher_description":"District 2025 Student Membership Asian Percent","publisher_type":"Number"},{"code":"DPETPCIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pacific_islander_percent","label":"District 2025 Student Membership: Pacific Islander Percent","position":98,"publisher_description":"District 2025 Student Membership Pacific Islander Percent","publisher_type":"Number"},{"code":"DPETTWOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_two_or_more_races_percent","label":"District 2025 Student Membership: Two or More Races Percent","position":99,"publisher_description":"District 2025 Student Membership Two or More Races Percent","publisher_type":"Number"},{"code":"DPETECOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_econ_disadv_percent","label":"District 2025 Student Membership: Econ Disadv Percent","position":100,"publisher_description":"District 2025 Student Membership Econ Disadv Percent","publisher_type":"Number"},{"code":"DPETNEDP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_non_educationally_disadv_percent","label":"District 2025 Student Membership: Non-Educationally Disadv Percent","position":101,"publisher_description":"District 2025 Student Membership Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"DPETRSKP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_at_risk_percent","label":"District 2025 Student Membership: At Risk Percent","position":102,"publisher_description":"District 2025 Student Membership At Risk Percent","publisher_type":"Number"},{"code":"DPETLEPP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_eb_el_percent","label":"District 2025 Student Membership: EB/EL Percent","position":103,"publisher_description":"District 2025 Student Membership EB/EL Percent","publisher_type":"Number"},{"code":"DPETSPEP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_special_ed_percent","label":"District 2025 Student Membership: Special Ed Percent","position":104,"publisher_description":"District 2025 Student Membership Special Ed Percent","publisher_type":"Number"},{"code":"DPETBILP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_bilingual_esl_percent","label":"District 2025 Student Membership: Bilingual/ESL Percent","position":105,"publisher_description":"District 2025 Student Membership Bilingual/ESL Percent","publisher_type":"Number"},{"code":"DPETGIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_gifted_and_talented_percent","label":"District 2025 Student Membership: Gifted & Talented Percent","position":106,"publisher_description":"District 2025 Student Membership Gifted & Talented Percent","publisher_type":"Number"},{"code":"DPET504P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_section_504_percent","label":"District 2025 Student Membership: Section 504 Percent","position":107,"publisher_description":"District 2025 Student Membership Section 504 Percent","publisher_type":"Number"},{"code":"DPETDSLP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_dyslexia_percent","label":"District 2025 Student Membership: Dyslexia Percent","position":108,"publisher_description":"District 2025 Student Membership Dyslexia Percent","publisher_type":"Number"},{"code":"DPETTT1P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_title_i_percent","label":"District 2025 Student Membership: Title I Percent","position":109,"publisher_description":"District 2025 Student Membership Title I Percent","publisher_type":"Number"},{"code":"DPETHOMP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_homeless_percent","label":"District 2025 Student Membership: Homeless Percent","position":110,"publisher_description":"District 2025 Student Membership Homeless Percent","publisher_type":"Number"},{"code":"DPETIMMP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_immigrant_percent","label":"District 2025 Student Membership: Immigrant Percent","position":111,"publisher_description":"District 2025 Student Membership Immigrant Percent","publisher_type":"Number"},{"code":"DPETMIGP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_migrant_percent","label":"District 2025 Student Membership: Migrant Percent","position":112,"publisher_description":"District 2025 Student Membership Migrant Percent","publisher_type":"Number"},{"code":"DPETMLCP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_military_connected_percent","label":"District 2025 Student Membership: Military-Connected Percent","position":113,"publisher_description":"District 2025 Student Membership Military-Connected Percent","publisher_type":"Number"},{"code":"DPETFOSP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_foster_care_percent","label":"District 2025 Student Membership: Foster Care Percent","position":114,"publisher_description":"District 2025 Student Membership Foster Care Percent","publisher_type":"Number"},{"code":"DPETGEEP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_ee_percent","label":"District 2025 Student Membership: EE Percent","position":115,"publisher_description":"District 2025 Student Membership EE Percent","publisher_type":"Number"},{"code":"DPETGPKP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pk_percent","label":"District 2025 Student Membership: PK Percent","position":116,"publisher_description":"District 2025 Student Membership PK Percent","publisher_type":"Number"},{"code":"DPETGP3P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pk_count_ages_3_and_under_percent","label":"District 2025 Student Membership: PK Count Ages 3 and Under Percent","position":117,"publisher_description":"District 2025 Student Membership PK Count Ages 3 and Under Percent","publisher_type":"Number"},{"code":"DPETGP4P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_pk_count_ages_4_and_over_percent","label":"District 2025 Student Membership: PK Count Ages 4 and Over Percent","position":118,"publisher_description":"District 2025 Student Membership PK Count Ages 4 and Over Percent","publisher_type":"Number"},{"code":"DPETGKNP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_kg_percent","label":"District 2025 Student Membership: KG Percent","position":119,"publisher_description":"District 2025 Student Membership KG Percent","publisher_type":"Number"},{"code":"DPETG01P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_01_percent","label":"District 2025 Student Membership: 01 Percent","position":120,"publisher_description":"District 2025 Student Membership 01 Percent","publisher_type":"Number"},{"code":"DPETG02P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_02_percent","label":"District 2025 Student Membership: 02 Percent","position":121,"publisher_description":"District 2025 Student Membership 02 Percent","publisher_type":"Number"},{"code":"DPETG03P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_03_percent","label":"District 2025 Student Membership: 03 Percent","position":122,"publisher_description":"District 2025 Student Membership 03 Percent","publisher_type":"Number"},{"code":"DPETG04P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_04_percent","label":"District 2025 Student Membership: 04 Percent","position":123,"publisher_description":"District 2025 Student Membership 04 Percent","publisher_type":"Number"},{"code":"DPETG05P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_05_percent","label":"District 2025 Student Membership: 05 Percent","position":124,"publisher_description":"District 2025 Student Membership 05 Percent","publisher_type":"Number"},{"code":"DPETG06P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_06_percent","label":"District 2025 Student Membership: 06 Percent","position":125,"publisher_description":"District 2025 Student Membership 06 Percent","publisher_type":"Number"},{"code":"DPETG07P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_07_percent","label":"District 2025 Student Membership: 07 Percent","position":126,"publisher_description":"District 2025 Student Membership 07 Percent","publisher_type":"Number"},{"code":"DPETG08P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_08_percent","label":"District 2025 Student Membership: 08 Percent","position":127,"publisher_description":"District 2025 Student Membership 08 Percent","publisher_type":"Number"},{"code":"DPETG09P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_09_percent","label":"District 2025 Student Membership: 09 Percent","position":128,"publisher_description":"District 2025 Student Membership 09 Percent","publisher_type":"Number"},{"code":"DPETG10P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_10_percent","label":"District 2025 Student Membership: 10 Percent","position":129,"publisher_description":"District 2025 Student Membership 10 Percent","publisher_type":"Number"},{"code":"DPETG11P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_11_percent","label":"District 2025 Student Membership: 11 Percent","position":130,"publisher_description":"District 2025 Student Membership 11 Percent","publisher_type":"Number"},{"code":"DPETG12P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_12_percent","label":"District 2025 Student Membership: 12 Percent","position":131,"publisher_description":"District 2025 Student Membership 12 Percent","publisher_type":"Number"},{"code":"DPETMALP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_male_percent","label":"District 2025 Student Membership: Male Percent","position":132,"publisher_description":"District 2025 Student Membership Male Percent","publisher_type":"Number"},{"code":"DPETFEMP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_female_percent","label":"District 2025 Student Membership: Female Percent","position":133,"publisher_description":"District 2025 Student Membership Female Percent","publisher_type":"Number"},{"code":"DPETVOCC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_career_and_technical_education_count","label":"District 2025 Student Membership: Career & Technical Education Count","position":134,"publisher_description":"District 2025 Student Membership Career & Technical Education Count","publisher_type":"Number"},{"code":"DPETVHSC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_career_and_technical_9_12_education_count","label":"District 2025 Student Membership: Career & Technical (9-12) Education Count","position":135,"publisher_description":"District 2025 Student Membership Career & Technical (9-12) Education Count","publisher_type":"Number"},{"code":"DPETVOCP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_career_and_technical_education_percent","label":"District 2025 Student Membership: Career & Technical Education Percent","position":136,"publisher_description":"District 2025 Student Membership Career & Technical Education Percent","publisher_type":"Number"},{"code":"DPETVHSP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_career_and_technical_9_12_education_percent","label":"District 2025 Student Membership: Career & Technical (9-12) Education Percent","position":137,"publisher_description":"District 2025 Student Membership Career & Technical (9-12) Education Percent","publisher_type":"Number"},{"code":"DPNTALLC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_all_students_count","label":"District 2025 Student Enrollment: All Students Count","position":138,"publisher_description":"District 2025 Student Enrollment All Students Count","publisher_type":"Number"},{"code":"DPNTGEEC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_early_childhood_education_count","label":"District 2025 Student Enrollment: Early Childhood Education Count","position":139,"publisher_description":"District 2025 Student Enrollment Early Childhood Education Count","publisher_type":"Number"},{"code":"DPNTGEEP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_early_childhood_education_percent","label":"District 2025 Student Enrollment: Early Childhood Education Percent","position":140,"publisher_description":"District 2025 Student Enrollment Early Childhood Education Percent","publisher_type":"Number"},{"code":"DPNTGPKC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pre_kindergarten_count","label":"District 2025 Student Enrollment: Pre-Kindergarten Count","position":141,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten Count","publisher_type":"Number"},{"code":"DPNTGPKP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pre_kindergarten_percent","label":"District 2025 Student Enrollment: Pre-Kindergarten Percent","position":142,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten Percent","publisher_type":"Number"},{"code":"DPNTGP3C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pre_kindergarten_3_year_old_count","label":"District 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Count","position":143,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 3-Year Old Count","publisher_type":"Number"},{"code":"DPNTGP3P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pre_kindergarten_3_year_old_percent","label":"District 2025 Student Enrollment: Pre-Kindergarten 3-Year Old Percent","position":144,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 3-Year Old Percent","publisher_type":"Number"},{"code":"DPNTGP4C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pre_kindergarten_4_year_old_count","label":"District 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Count","position":145,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 4-Year Old Count","publisher_type":"Number"},{"code":"DPNTGP4P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pre_kindergarten_4_year_old_percent","label":"District 2025 Student Enrollment: Pre-Kindergarten 4-Year Old Percent","position":146,"publisher_description":"District 2025 Student Enrollment Pre-Kindergarten 4-Year Old Percent","publisher_type":"Number"},{"code":"DPNTGKNC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_kindergarten_count","label":"District 2025 Student Enrollment: Kindergarten Count","position":147,"publisher_description":"District 2025 Student Enrollment Kindergarten Count","publisher_type":"Number"},{"code":"DPNTGKNP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_kindergarten_percent","label":"District 2025 Student Enrollment: Kindergarten Percent","position":148,"publisher_description":"District 2025 Student Enrollment Kindergarten Percent","publisher_type":"Number"},{"code":"DPNTG01C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_1_count","label":"District 2025 Student Enrollment: Grade 1 Count","position":149,"publisher_description":"District 2025 Student Enrollment Grade 1 Count","publisher_type":"Number"},{"code":"DPNTG01P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_1_percent","label":"District 2025 Student Enrollment: Grade 1 Percent","position":150,"publisher_description":"District 2025 Student Enrollment Grade 1 Percent","publisher_type":"Number"},{"code":"DPNTG02C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_2_count","label":"District 2025 Student Enrollment: Grade 2 Count","position":151,"publisher_description":"District 2025 Student Enrollment Grade 2 Count","publisher_type":"Number"},{"code":"DPNTG02P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_2_percent","label":"District 2025 Student Enrollment: Grade 2 Percent","position":152,"publisher_description":"District 2025 Student Enrollment Grade 2 Percent","publisher_type":"Number"},{"code":"DPNTG03C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_3_count","label":"District 2025 Student Enrollment: Grade 3 Count","position":153,"publisher_description":"District 2025 Student Enrollment Grade 3 Count","publisher_type":"Number"},{"code":"DPNTG03P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_3_percent","label":"District 2025 Student Enrollment: Grade 3 Percent","position":154,"publisher_description":"District 2025 Student Enrollment Grade 3 Percent","publisher_type":"Number"},{"code":"DPNTG04C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_4_count","label":"District 2025 Student Enrollment: Grade 4 Count","position":155,"publisher_description":"District 2025 Student Enrollment Grade 4 Count","publisher_type":"Number"},{"code":"DPNTG04P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_4_percent","label":"District 2025 Student Enrollment: Grade 4 Percent","position":156,"publisher_description":"District 2025 Student Enrollment Grade 4 Percent","publisher_type":"Number"},{"code":"DPNTG05C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_5_count","label":"District 2025 Student Enrollment: Grade 5 Count","position":157,"publisher_description":"District 2025 Student Enrollment Grade 5 Count","publisher_type":"Number"},{"code":"DPNTG05P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_5_percent","label":"District 2025 Student Enrollment: Grade 5 Percent","position":158,"publisher_description":"District 2025 Student Enrollment Grade 5 Percent","publisher_type":"Number"},{"code":"DPNTG06C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_6_count","label":"District 2025 Student Enrollment: Grade 6 Count","position":159,"publisher_description":"District 2025 Student Enrollment Grade 6 Count","publisher_type":"Number"},{"code":"DPNTG06P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_6_percent","label":"District 2025 Student Enrollment: Grade 6 Percent","position":160,"publisher_description":"District 2025 Student Enrollment Grade 6 Percent","publisher_type":"Number"},{"code":"DPNTG07C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_7_count","label":"District 2025 Student Enrollment: Grade 7 Count","position":161,"publisher_description":"District 2025 Student Enrollment Grade 7 Count","publisher_type":"Number"},{"code":"DPNTG07P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_7_percent","label":"District 2025 Student Enrollment: Grade 7 Percent","position":162,"publisher_description":"District 2025 Student Enrollment Grade 7 Percent","publisher_type":"Number"},{"code":"DPNTG08C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_8_count","label":"District 2025 Student Enrollment: Grade 8 Count","position":163,"publisher_description":"District 2025 Student Enrollment Grade 8 Count","publisher_type":"Number"},{"code":"DPNTG08P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_8_percent","label":"District 2025 Student Enrollment: Grade 8 Percent","position":164,"publisher_description":"District 2025 Student Enrollment Grade 8 Percent","publisher_type":"Number"},{"code":"DPNTG09C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_9_count","label":"District 2025 Student Enrollment: Grade 9 Count","position":165,"publisher_description":"District 2025 Student Enrollment Grade 9 Count","publisher_type":"Number"},{"code":"DPNTG09P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_9_percent","label":"District 2025 Student Enrollment: Grade 9 Percent","position":166,"publisher_description":"District 2025 Student Enrollment Grade 9 Percent","publisher_type":"Number"},{"code":"DPNTG10C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_10_count","label":"District 2025 Student Enrollment: Grade 10 Count","position":167,"publisher_description":"District 2025 Student Enrollment Grade 10 Count","publisher_type":"Number"},{"code":"DPNTG10P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_10_percent","label":"District 2025 Student Enrollment: Grade 10 Percent","position":168,"publisher_description":"District 2025 Student Enrollment Grade 10 Percent","publisher_type":"Number"},{"code":"DPNTG11C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_11_count","label":"District 2025 Student Enrollment: Grade 11 Count","position":169,"publisher_description":"District 2025 Student Enrollment Grade 11 Count","publisher_type":"Number"},{"code":"DPNTG11P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_11_percent","label":"District 2025 Student Enrollment: Grade 11 Percent","position":170,"publisher_description":"District 2025 Student Enrollment Grade 11 Percent","publisher_type":"Number"},{"code":"DPNTG12C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_12_count","label":"District 2025 Student Enrollment: Grade 12 Count","position":171,"publisher_description":"District 2025 Student Enrollment Grade 12 Count","publisher_type":"Number"},{"code":"DPNTG12P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_grade_12_percent","label":"District 2025 Student Enrollment: Grade 12 Percent","position":172,"publisher_description":"District 2025 Student Enrollment Grade 12 Percent","publisher_type":"Number"},{"code":"DPNTBLAC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_african_american_count","label":"District 2025 Student Enrollment: African American Count","position":173,"publisher_description":"District 2025 Student Enrollment African American Count","publisher_type":"Number"},{"code":"DPNTBLAP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_african_american_percent","label":"District 2025 Student Enrollment: African American Percent","position":174,"publisher_description":"District 2025 Student Enrollment African American Percent","publisher_type":"Number"},{"code":"DPNTHISC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_hispanic_count","label":"District 2025 Student Enrollment: Hispanic Count","position":175,"publisher_description":"District 2025 Student Enrollment Hispanic Count","publisher_type":"Number"},{"code":"DPNTHISP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_hispanic_percent","label":"District 2025 Student Enrollment: Hispanic Percent","position":176,"publisher_description":"District 2025 Student Enrollment Hispanic Percent","publisher_type":"Number"},{"code":"DPNTWHIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_white_count","label":"District 2025 Student Enrollment: White Count","position":177,"publisher_description":"District 2025 Student Enrollment White Count","publisher_type":"Number"},{"code":"DPNTWHIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_white_percent","label":"District 2025 Student Enrollment: White Percent","position":178,"publisher_description":"District 2025 Student Enrollment White Percent","publisher_type":"Number"},{"code":"DPNTINDC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_asian_count","label":"District 2025 Student Enrollment: Asian Count","position":179,"publisher_description":"District 2025 Student Enrollment Asian Count","publisher_type":"Number"},{"code":"DPNTINDP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_asian_percent","label":"District 2025 Student Enrollment: Asian Percent","position":180,"publisher_description":"District 2025 Student Enrollment Asian Percent","publisher_type":"Number"},{"code":"DPNTASIC","dictionary_status":"documented","disposition":"fact","field":"district_2024_25_asian_students_count","label":"District 2024-25 Asian Students Count","position":181,"publisher_description":"District 2024-25 Asian Students Count","publisher_type":"Number"},{"code":"DPNTASIP","dictionary_status":"documented","disposition":"fact","field":"district_2024_25_asian_students_percent","label":"District 2024-25 Asian Students Percent","position":182,"publisher_description":"District 2024-25 Asian Students Percent","publisher_type":"Number"},{"code":"DPNTPCIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pacific_islander_count","label":"District 2025 Student Enrollment: Pacific Islander Count","position":183,"publisher_description":"District 2025 Student Enrollment Pacific Islander Count","publisher_type":"Number"},{"code":"DPNTPCIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_pacific_islander_percent","label":"District 2025 Student Enrollment: Pacific Islander Percent","position":184,"publisher_description":"District 2025 Student Enrollment Pacific Islander Percent","publisher_type":"Number"},{"code":"DPNTTWOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_two_or_more_races_count","label":"District 2025 Student Enrollment: Two or More Races Count","position":185,"publisher_description":"District 2025 Student Enrollment Two or More Races Count","publisher_type":"Number"},{"code":"DPNTTWOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_two_or_more_races_percent","label":"District 2025 Student Enrollment: Two or More Races Percent","position":186,"publisher_description":"District 2025 Student Enrollment Two or More Races Percent","publisher_type":"Number"},{"code":"DPNTFEMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_female_count","label":"District 2025 Student Enrollment: Female~ Count","position":187,"publisher_description":"District 2025 Student Enrollment Female: Count","publisher_type":"Number"},{"code":"DPNTFEMP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_female_percent","label":"District 2025 Student Enrollment: Female~ Percent","position":188,"publisher_description":"District 2025 Student Enrollment Female: Percent","publisher_type":"Number"},{"code":"DPNTMALC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_male_count","label":"District 2025 Student Enrollment: Male Count","position":189,"publisher_description":"District 2025 Student Enrollment Male Count","publisher_type":"Number"},{"code":"DPNTMALP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_male_percent","label":"District 2025 Student Enrollment: Male Percent","position":190,"publisher_description":"District 2025 Student Enrollment Male Percent","publisher_type":"Number"},{"code":"DPNTECOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_economically_disadvantaged_count","label":"District 2025 Student Enrollment: Economically Disadvantaged Count","position":191,"publisher_description":"District 2025 Student Enrollment Economically Disadvantaged Count","publisher_type":"Number"},{"code":"DPNTECOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_economically_disadvantaged_percent","label":"District 2025 Student Enrollment: Economically Disadvantaged Percent","position":192,"publisher_description":"District 2025 Student Enrollment Economically Disadvantaged Percent","publisher_type":"Number"},{"code":"DPNTNEDC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_non_educationally_disadv_count","label":"District 2025 Student Enrollment: Non-Educationally Disadv Count","position":193,"publisher_description":"District 2025 Student Enrollment Non-Educationally Disadv Count","publisher_type":"Number"},{"code":"DPNTNEDP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_non_educationally_disadv_percent","label":"District 2025 Student Enrollment: Non-Educationally Disadv Percent","position":194,"publisher_description":"District 2025 Student Enrollment Non-Educationally Disadv Percent","publisher_type":"Number"},{"code":"DPNT504C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_section_504_count","label":"District 2025 Student Enrollment: Section 504 Count","position":195,"publisher_description":"District 2025 Student Enrollment Section 504 Count","publisher_type":"Number"},{"code":"DPNT504P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_section_504_percent","label":"District 2025 Student Enrollment: Section 504 Percent","position":196,"publisher_description":"District 2025 Student Enrollment Section 504 Percent","publisher_type":"Number"},{"code":"DPNTLEPC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_english_learner_count","label":"District 2025 Student Enrollment: English Learner Count","position":197,"publisher_description":"District 2025 Student Enrollment English Learner Count","publisher_type":"Number"},{"code":"DPNTLEPP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_english_learner_percent","label":"District 2025 Student Enrollment: English Learner Percent","position":198,"publisher_description":"District 2025 Student Enrollment English Learner Percent","publisher_type":"Number"},{"code":"DPNTDSLC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_dyslexia_count","label":"District 2025 Student Enrollment: Dyslexia Count","position":199,"publisher_description":"District 2025 Student Enrollment Dyslexia Count","publisher_type":"Number"},{"code":"DPNTDSLP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_dyslexia_percent","label":"District 2025 Student Enrollment: Dyslexia Percent","position":200,"publisher_description":"District 2025 Student Enrollment Dyslexia Percent","publisher_type":"Number"},{"code":"DPNTFOSC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_foster_care_count","label":"District 2025 Student Enrollment: Foster Care Count","position":201,"publisher_description":"District 2025 Student Enrollment Foster Care Count","publisher_type":"Number"},{"code":"DPNTFOSP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_foster_care_percent","label":"District 2025 Student Enrollment: Foster Care Percent","position":202,"publisher_description":"District 2025 Student Enrollment Foster Care Percent","publisher_type":"Number"},{"code":"DPNTHOMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_homeless_count","label":"District 2025 Student Enrollment: Homeless Count","position":203,"publisher_description":"District 2025 Student Enrollment Homeless Count","publisher_type":"Number"},{"code":"DPNTHOMP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_homeless_percent","label":"District 2025 Student Enrollment: Homeless Percent","position":204,"publisher_description":"District 2025 Student Enrollment Homeless Percent","publisher_type":"Number"},{"code":"DPNTIMMC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_immigrant_count","label":"District 2025 Student Enrollment: Immigrant Count","position":205,"publisher_description":"District 2025 Student Enrollment Immigrant Count","publisher_type":"Number"},{"code":"DPNTIMMP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_immigrant_percent","label":"District 2025 Student Enrollment: Immigrant Percent","position":206,"publisher_description":"District 2025 Student Enrollment Immigrant Percent","publisher_type":"Number"},{"code":"DPNTMIGC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_migrant_count","label":"District 2025 Student Enrollment: Migrant Count","position":207,"publisher_description":"District 2025 Student Enrollment Migrant Count","publisher_type":"Number"},{"code":"DPNTMIGP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_migrant_percent","label":"District 2025 Student Enrollment: Migrant Percent","position":208,"publisher_description":"District 2025 Student Enrollment Migrant Percent","publisher_type":"Number"},{"code":"DPNTTT1C","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_title_i_count","label":"District 2025 Student Enrollment: Title I Count","position":209,"publisher_description":"District 2025 Student Enrollment Title I Count","publisher_type":"Number"},{"code":"DPNTTT1P","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_title_i_percent","label":"District 2025 Student Enrollment: Title I Percent","position":210,"publisher_description":"District 2025 Student Enrollment Title I Percent","publisher_type":"Number"},{"code":"DPNTMLCC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_military_connected_count","label":"District 2025 Student Enrollment: Military-Connected Count","position":211,"publisher_description":"District 2025 Student Enrollment Military-Connected Count","publisher_type":"Number"},{"code":"DPNTMLCP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_military_connected_percent","label":"District 2025 Student Enrollment: Military-Connected Percent","position":212,"publisher_description":"District 2025 Student Enrollment Military-Connected Percent","publisher_type":"Number"},{"code":"DPNTRSKC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_at_risk_count","label":"District 2025 Student Enrollment: At Risk Count","position":213,"publisher_description":"District 2025 Student Enrollment At Risk Count","publisher_type":"Number"},{"code":"DPNTRSKP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_at_risk_percent","label":"District 2025 Student Enrollment: At Risk Percent","position":214,"publisher_description":"District 2025 Student Enrollment At Risk Percent","publisher_type":"Number"},{"code":"DPNTBILC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_bilingual_esl_count","label":"District 2025 Student Enrollment: Bilingual/ESL Count","position":215,"publisher_description":"District 2025 Student Enrollment Bilingual/ESL Count","publisher_type":"Number"},{"code":"DPNTBILP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_bilingual_esl_percent","label":"District 2025 Student Enrollment: Bilingual/ESL Percent","position":216,"publisher_description":"District 2025 Student Enrollment Bilingual/ESL Percent","publisher_type":"Number"},{"code":"DPNTGIFC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_gifted_and_talented_count","label":"District 2025 Student Enrollment: Gifted and Talented Count","position":217,"publisher_description":"District 2025 Student Enrollment Gifted and Talented Count","publisher_type":"Number"},{"code":"DPNTGIFP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_gifted_and_talented_percent","label":"District 2025 Student Enrollment: Gifted and Talented Percent","position":218,"publisher_description":"District 2025 Student Enrollment Gifted and Talented Percent","publisher_type":"Number"},{"code":"DPNTSPEC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_special_ed_count","label":"District 2025 Student Enrollment: Special Ed Count","position":219,"publisher_description":"District 2025 Student Enrollment Special Ed Count","publisher_type":"Number"},{"code":"DPNTSPEP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_enrollment_special_ed_percent","label":"District 2025 Student Enrollment: Special Ed Percent","position":220,"publisher_description":"District 2025 Student Enrollment Special Ed Percent","publisher_type":"Number"},{"code":"DPEMALLC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_all_students_count","label":"District 2025 Student Membership: 2024 Mobility All Students Count","position":221,"publisher_description":"District 2025 Student Membership 2024 Mobility All Students Count","publisher_type":"Number"},{"code":"DPEMINDC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_american_indian_count","label":"District 2025 Student Membership: 2024 Mobility American Indian Count","position":222,"publisher_description":"District 2025 Student Membership 2024 Mobility American Indian Count","publisher_type":"Number"},{"code":"DPEMPCIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_pacific_islander_count","label":"District 2025 Student Membership: 2024 Mobility Pacific Islander Count","position":223,"publisher_description":"District 2025 Student Membership 2024 Mobility Pacific Islander Count","publisher_type":"Number"},{"code":"DPEMASIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_asian_count","label":"District 2025 Student Membership: 2024 Mobility Asian Count","position":224,"publisher_description":"District 2025 Student Membership 2024 Mobility Asian Count","publisher_type":"Number"},{"code":"DPEMBLAC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_african_american_count","label":"District 2025 Student Membership: 2024 Mobility African American Count","position":225,"publisher_description":"District 2025 Student Membership 2024 Mobility African American Count","publisher_type":"Number"},{"code":"DPEMHISC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_hispanic_count","label":"District 2025 Student Membership: 2024 Mobility Hispanic Count","position":226,"publisher_description":"District 2025 Student Membership 2024 Mobility Hispanic Count","publisher_type":"Number"},{"code":"DPEMWHIC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_white_count","label":"District 2025 Student Membership: 2024 Mobility White Count","position":227,"publisher_description":"District 2025 Student Membership 2024 Mobility White Count","publisher_type":"Number"},{"code":"DPEMTWOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_two_or_more_races_count","label":"District 2025 Student Membership: 2024 Mobility Two or More Races Count","position":228,"publisher_description":"District 2025 Student Membership 2024 Mobility Two or More Races Count","publisher_type":"Number"},{"code":"DPEMECOC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_econ_disadv_count","label":"District 2025 Student Membership: 2024 Mobility Econ Disadv Count","position":229,"publisher_description":"District 2025 Student Membership 2024 Mobility Econ Disadv Count","publisher_type":"Number"},{"code":"DPEMLEPC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_eb_el_count","label":"District 2025 Student Membership: 2024 Mobility EB/EL Count","position":230,"publisher_description":"District 2025 Student Membership 2024 Mobility EB/EL Count","publisher_type":"Number"},{"code":"DPEMSPEC","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_special_ed_count","label":"District 2025 Student Membership: 2024 Mobility Special Ed Count","position":231,"publisher_description":"District 2025 Student Membership 2024 Mobility Special Ed Count","publisher_type":"Number"},{"code":"DPEMALLP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_all_students_percent","label":"District 2025 Student Membership: 2024 Mobility All Students Percent","position":232,"publisher_description":"District 2025 Student Membership 2024 Mobility All Students Percent","publisher_type":"Number"},{"code":"DPEMINDP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_american_indian_percent","label":"District 2025 Student Membership: 2024 Mobility American Indian Percent","position":233,"publisher_description":"District 2025 Student Membership 2024 Mobility American Indian Percent","publisher_type":"Number"},{"code":"DPEMASIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_asian_percent","label":"District 2025 Student Membership: 2024 Mobility Asian Percent","position":234,"publisher_description":"District 2025 Student Membership 2024 Mobility Asian Percent","publisher_type":"Number"},{"code":"DPEMPCIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_pacific_islander_percent","label":"District 2025 Student Membership: 2024 Mobility Pacific Islander Percent","position":235,"publisher_description":"District 2025 Student Membership 2024 Mobility Pacific Islander Percent","publisher_type":"Number"},{"code":"DPEMTWOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_two_or_more_races_percent","label":"District 2025 Student Membership: 2024 Mobility Two or More Races Percent","position":236,"publisher_description":"District 2025 Student Membership 2024 Mobility Two or More Races Percent","publisher_type":"Number"},{"code":"DPEMBLAP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_african_american_percent","label":"District 2025 Student Membership: 2024 Mobility African American Percent","position":237,"publisher_description":"District 2025 Student Membership 2024 Mobility African American Percent","publisher_type":"Number"},{"code":"DPEMHISP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_hispanic_percent","label":"District 2025 Student Membership: 2024 Mobility Hispanic Percent","position":238,"publisher_description":"District 2025 Student Membership 2024 Mobility Hispanic Percent","publisher_type":"Number"},{"code":"DPEMWHIP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_white_percent","label":"District 2025 Student Membership: 2024 Mobility White Percent","position":239,"publisher_description":"District 2025 Student Membership 2024 Mobility White Percent","publisher_type":"Number"},{"code":"DPEMECOP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_econ_disadv_percent","label":"District 2025 Student Membership: 2024 Mobility Econ Disadv Percent","position":240,"publisher_description":"District 2025 Student Membership 2024 Mobility Econ Disadv Percent","publisher_type":"Number"},{"code":"DPEMLEPP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_eb_el_percent","label":"District 2025 Student Membership: 2024 Mobility EB/EL Percent","position":241,"publisher_description":"District 2025 Student Membership 2024 Mobility EB/EL Percent","publisher_type":"Number"},{"code":"DPEMSPEP","dictionary_status":"documented","disposition":"fact","field":"district_2025_student_membership_2024_mobility_special_ed_percent","label":"District 2025 Student Membership: 2024 Mobility Special Ed Percent","position":242,"publisher_description":"District 2025 Student Membership 2024 Mobility Special Ed Percent","publisher_type":"Number"}],"input_sha256":"8ccd14fb2eaff8c73d94960950cc359d44bf4b81edb721975edf6795b8995811","layout":{"annotations":[],"code_record":2,"first_data_record":3,"label_record":1,"last_data_record":1210},"metric_period":{"kind":"unknown"},"source_schema_sha256":"a5b1c27f6499d17f59d00c1fb38ce013631db138bc09ad372b6d895df57a674e","table":"student_profile"}]}],"mapping_version":1,"schema_version":2} diff --git a/teadata/scripts/build_tapr_profiles.py b/teadata/scripts/build_tapr_profiles.py index c294909..ecad5db 100644 --- a/teadata/scripts/build_tapr_profiles.py +++ b/teadata/scripts/build_tapr_profiles.py @@ -7,6 +7,7 @@ from __future__ import annotations import argparse +from collections.abc import Mapping, Sequence from dataclasses import replace from hashlib import sha256 from importlib.metadata import version @@ -28,23 +29,44 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | None, output_dir: Path, reference_store: ProvenanceStore | None = None, - family: str = "student_staff_profile") -> dict: + family: str = "student_staff_profile", + processing_inputs: Mapping[str, Sequence[str]] | None = None) -> dict: """Validate all selected inputs, then publish one complete new generation.""" import pyarrow.parquet as pq - if (edition not in {"2024", "2025"} or not scopes or len(scopes) != len(set(scopes)) + try: + year = int(edition) + except (TypeError, ValueError) as error: + raise ValueError("Select a canonical annual integer edition") from error + if not isinstance(edition, str) or edition != str(year) or year < 1: + raise ValueError("Select a canonical annual integer edition") + if (not scopes or len(scopes) != len(set(scopes)) or set(scopes) - {"campus", "district"} or family not in TAPR_PROFILE_FAMILIES): - raise ValueError("Select a declared 2024/2025 edition and distinct campus/district scopes") + raise ValueError("Select a declared family and distinct campus/district scopes") output_dir = Path(output_dir) if output_dir.exists() or output_dir.is_symlink(): raise FileExistsError(f"Preparation output already exists: {output_dir}") + selected_datasets = {scope + "_tapr_" + family for scope in scopes} + dependencies = dict(processing_inputs or {}) + if set(dependencies) - selected_datasets: + raise ValueError("Processing inputs must name an exact selected dataset/scope") + for dataset, identifiers in dependencies.items(): + if isinstance(identifiers, (str, bytes)) or not isinstance(identifiers, Sequence): + raise ValueError("Processing inputs require an ordered sequence of receipt IDs") + dependencies[dataset] = list(dict.fromkeys(identifiers)) + for identifier in dependencies[dataset]: + if reference_store is None: + raise ValueError("Processing inputs require an explicit reference_store") + if reference_store.read_record(identifier)["kind"] != "processing": + raise ValueError("Selected processing input is not a processing receipt") + reference_store.verify_record_closure([identifier]) prepared = [] for scope in scopes: dataset = scope + "_tapr_" + family - sources = cfg.read_tapr_sources(dataset, int(edition), input_dir=input_dir) + sources = cfg.read_tapr_sources(dataset, year, input_dir=input_dir) table = merge_tapr_tables(sources, key_field=scope + "_number") - if table.column_names != cfg.column_schema(dataset, int(edition), reader_profile="source"): + if table.column_names != cfg.column_schema(dataset, year, reader_profile="source"): raise ValueError("Full TAPR preparation does not account for its complete field contract") prepared.append((scope, dataset, sources, table)) # No writer or provenance archive runs until every selected input validates. @@ -61,8 +83,8 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | "preparation_code_sha256": sha256(Path(__file__).read_bytes()).hexdigest(), "scopes": {}} for scope, dataset, sources, table in prepared: - source = cfg.resolve_dataset(dataset, int(edition)) - contract = cfg.column_contract(dataset, int(edition), reader_profile="source") + source = cfg.resolve_dataset(dataset, year) + contract = cfg.column_contract(dataset, year, reader_profile="source") assert contract is not None crosswalk_path = stage / (scope + "-crosswalk.json") crosswalk_path.write_text(contract["text"]) @@ -70,6 +92,11 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | replace(source, path=str(crosswalk_path), dataset=dataset + ":schema", section="reference", metadata=DatasetMetadata(title="TEA Data full TAPR source/header contract"))) inputs = [contract_observation] + selected_processing = dependencies.get(dataset, []) + for identifier in selected_processing: + assert reference_store is not None + store.copy_record_from(reference_store, identifier) + inputs.append(identifier) selected = crosswalk_dataset(parse_column_schema(contract["text"].encode()), dataset, edition) if selected.get("source_only"): # Original HTTP observations may predate a source-family split. @@ -95,7 +122,7 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | if acquired != expected: raise ValueError("Original acquisition receipts do not account for every source-only raw input") references = [] - for reference in cfg.reader_references(dataset, int(edition), reader_profile="source"): + for reference in cfg.reader_references(dataset, year, reader_profile="source"): for identifier in reference.provenance_ids: if reference_store is None: raise ValueError("Claimed source references require an explicit reference_store / --reference-store") @@ -144,10 +171,12 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | parameters={"edition": edition, "column_schema_sha256": contract["sha256"], "preparation_code_sha256": receipt["preparation_code_sha256"], "toolchain": receipt["toolchain"], "family": family, + "selected_processing_inputs": selected_processing, "whitespace": "preserve", "geospatial_filter": False}, validation=validation) store.verify_record_closure([processing]) receipt["scopes"][scope] = {**validation, "dataset": dataset, "processing_record_id": processing, + "selected_processing_inputs": selected_processing, "column_schema_sha256": contract["sha256"], "local_reference_closure_verified": True, "reference_states": [{"reference_id": ref.reference_id, "availability": ref.status, @@ -175,20 +204,25 @@ def prepare_profiles(cfg, *, edition: str, scopes: list[str], input_dir: Path | def main(argv: list[str] | None = None) -> None: parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--edition", required=True, choices=("2024", "2025")) + parser.add_argument("--edition", required=True, help="Canonical annual integer edition, exactly declared by Config") parser.add_argument("--family", choices=TAPR_PROFILE_FAMILIES, default="student_staff_profile") parser.add_argument("--scope", action="append", choices=("campus", "district")) parser.add_argument("--config", type=Path) parser.add_argument("--reference-store", type=Path, help="Canonical store containing the exact claimed reference receipts and bytes") + parser.add_argument("--processing-input", action="append", nargs=2, default=[], metavar=("DATASET", "RECORD_ID"), + help="Explicit processing dependency for one exact selected dataset/scope; applicability is caller-reviewed") parser.add_argument("--input-dir", type=Path, default=data_path("tapr", "raw")) parser.add_argument("--output-dir", required=True, type=Path) args = parser.parse_args(argv) + processing_inputs: dict[str, list[str]] = {} + for dataset, identifier in args.processing_input: + processing_inputs.setdefault(dataset, []).append(identifier) result = prepare_profiles(load_config(args.config), edition=args.edition, scopes=args.scope or ["campus", "district"], input_dir=args.input_dir, output_dir=args.output_dir, reference_store=ProvenanceStore(args.reference_store) if args.reference_store is not None else None, - family=args.family) + family=args.family, processing_inputs=processing_inputs) print(json.dumps({"edition": args.edition, "output_dir": str(args.output_dir), "scopes": {key: {"rows": value["rows"], "fields": value["fields"]} for key, value in result["scopes"].items()}})) diff --git a/teadata/teadata_sources.yaml b/teadata/teadata_sources.yaml index 0ae23ab..29f7223 100644 --- a/teadata/teadata_sources.yaml +++ b/teadata/teadata_sources.yaml @@ -615,6 +615,75 @@ data_sources: status: available provenance_ids: [] reviewed_sha256: abb6196de760d6156af23d31f32b91ce3599350d8b53259feb60cb96b37792cd + 2025: + path: data/tapr/raw/2025-campus-STUD-all-checked.csv + metadata: + title: 2025 TAPR Campus Student Information; selected observed revision + publisher: Texas Education Agency + version: '2025' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: Independent source-only observation of publisher edition 2025. Table and field periods, units and scientific token policy remain unknown unless separately reviewed; no 2024 policy or historical composite metadata is inherited. Every source column, identity/history attribute and ordered dictionary occurrence is retained. Original HTTP dates and controls remain in their genuine receipts; old local-download dates remain unknown. The historical 2025 composite is a separate prior revision, not a fallback or current alias. No released default, semantic binding, entity enrichment or app data is activated. Original STUD acquisition logical-label typos are preserved; the explicit correction remains an independent processing receipt, not an acquisition ID or automatic alias. Config does not express a typed processing-input edge for that correction. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Genuine 2025 campus student_profile CSV; original observation and ordered controls preserved + status: available + provenance_ids: + - 3dec9c6e933d9f88c6efacc6f00f8669f8dda0e9d3c51ee9c176f910011e7b35 + reviewed_sha256: 7e0e762a8f2ba50687fd8c6a59e8052d5740ba57abbedecddfca064bbd77548e + - provenance_ids: + - 5b4dae43db23a6a52ae258d48f85224709560d56ea77e17c1772d5d08f168175 + reference_id: exact_selection_form + reviewed_sha256: cca0aa1cf5e13eabaf6ca19acebe68ced611d19256fa40f9a165cc92cf0b08e5 + role: source_notes + status: available + title: Retained actual form, ordered repeated controls and literal action + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker + - provenance_ids: + - 114edf213e7dd527c3167b5e6400feeeeae37ab272bcd9541e771d21c8171bd4 + reference_id: actual2025_dictionary + reviewed_sha256: 01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209 + role: data_dictionary + status: available + title: Actual 2025 STUD dictionary metadata; code-only unknowns remain explicit in audit + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + - reference_id: glossary + role: glossary + url: https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf + title: 2024-25 Comprehensive TAPR Glossary + status: available + provenance_ids: + - e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db + reviewed_sha256: 846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html + title: 2024-2025 TAPR Masking Rules + status: available + provenance_ids: + - 6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554 + reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 + reader: + profiles: + source: + column_schema: schemas/tapr--2025--student-profile-crosswalk.json + tapr_source: + scope: campus + tables: + student_profile: data/tapr/raw/2025-campus-STUD-all-checked.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2025--student-profile-crosswalk.json + title: Reviewed complete 2025 student_profile source-only contract + status: available + provenance_ids: [] + reviewed_sha256: 842ba240f4afffe88adc4f4a6070b8cf257c7ab3895eca23684484afd49b2975 campus_tapr_staff_profile: 2024: path: data/tapr/raw/2024 Campus Staff Information.csv @@ -695,6 +764,75 @@ data_sources: status: available provenance_ids: [] reviewed_sha256: 73b50ad614f998f5f19b725143f80f2b1faf045b2836a3f1bf9e8d261a8fd928 + 2025: + path: data/tapr/raw/2025-campus-STAF-all-checked.csv + metadata: + title: 2025 TAPR Campus Staff Information; selected observed revision + publisher: Texas Education Agency + version: '2025' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: Independent source-only observation of publisher edition 2025. Table and field periods, units and scientific token policy remain unknown unless separately reviewed; no 2024 policy or historical composite metadata is inherited. Every source column, identity/history attribute and ordered dictionary occurrence is retained. Original HTTP dates and controls remain in their genuine receipts; old local-download dates remain unknown. The historical 2025 composite is a separate prior revision, not a fallback or current alias. No released default, semantic binding, entity enrichment or app data is activated. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Genuine 2025 campus staff_profile CSV; original observation and ordered controls preserved + status: available + provenance_ids: + - 7ffcfafba5a510e01d1d613bc01598c6567ed11f1eee342136ca3aa129b49752 + reviewed_sha256: ed29852dd7d7925963413b41c81a36508ccad83a4109a0aeebfa720bf90ff6ea + - provenance_ids: + - c47b8db7fa27c20dbefee429128fe682f2e07ee614b900ae1200d9df3217d032 + reference_id: exact_selection_form + reviewed_sha256: b33d68be76e6dfcad50eb6660361fcab98c0f0474634026682efe04a3ed47bc9 + role: source_notes + status: available + title: Retained actual form, ordered repeated controls and literal action + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker + - provenance_ids: + - 818df760578532e76adb4c6ef32d29bf823adf293bab5bc295144cfaa95ba7f5 + reference_id: actual2025_dictionary + reviewed_sha256: d5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e + role: data_dictionary + status: available + title: Actual 2025 STAF dictionary metadata; code-only unknowns remain explicit in audit + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=C&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + - reference_id: glossary + role: glossary + url: https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf + title: 2024-25 Comprehensive TAPR Glossary + status: available + provenance_ids: + - e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db + reviewed_sha256: 846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html + title: 2024-2025 TAPR Masking Rules + status: available + provenance_ids: + - 6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554 + reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 + reader: + profiles: + source: + column_schema: schemas/tapr--2025--staff-profile-crosswalk.json + tapr_source: + scope: campus + tables: + staff_profile: data/tapr/raw/2025-campus-STAF-all-checked.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2025--staff-profile-crosswalk.json + title: Reviewed complete 2025 staff_profile source-only contract + status: available + provenance_ids: [] + reviewed_sha256: 579619e1d337a6c34078ad45f8138ac9277c4d3e6751995a56ad084c9599300e district_tapr_student_profile: 2024: path: data/tapr/raw/2024 District Student Information.csv @@ -789,6 +927,75 @@ data_sources: status: available provenance_ids: [] reviewed_sha256: abb6196de760d6156af23d31f32b91ce3599350d8b53259feb60cb96b37792cd + 2025: + path: data/tapr/raw/2025-district-STUD-all-checked.csv + metadata: + title: 2025 TAPR District Student Information; selected observed revision + publisher: Texas Education Agency + version: '2025' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: Independent source-only observation of publisher edition 2025. Table and field periods, units and scientific token policy remain unknown unless separately reviewed; no 2024 policy or historical composite metadata is inherited. Every source column, identity/history attribute and ordered dictionary occurrence is retained. Original HTTP dates and controls remain in their genuine receipts; old local-download dates remain unknown. The historical 2025 composite is a separate prior revision, not a fallback or current alias. No released default, semantic binding, entity enrichment or app data is activated. Original STUD acquisition logical-label typos are preserved; the explicit correction remains an independent processing receipt, not an acquisition ID or automatic alias. Config does not express a typed processing-input edge for that correction. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Genuine 2025 district student_profile CSV; original observation and ordered controls preserved + status: available + provenance_ids: + - cdef4db2551805ed9aa901243df73d91843d158d14426592607e842ce7036231 + reviewed_sha256: 8ccd14fb2eaff8c73d94960950cc359d44bf4b81edb721975edf6795b8995811 + - provenance_ids: + - a3c2c2022cb5342750c9b0dd80364b2beb3f88c2f842e854d2dbcf3d7f11d708 + reference_id: exact_selection_form + reviewed_sha256: ea6c5182add93aff2cc6905abf26fcc24afe9d8e34d7852a1abf0b4002e781dd + role: source_notes + status: available + title: Retained actual form, ordered repeated controls and literal action + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker + - provenance_ids: + - 237fa1b42ce2d30f53bb56c7079a147c41b11e94aefb68927fca27e783cd9208 + reference_id: actual2025_dictionary + reviewed_sha256: 693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d + role: data_dictionary + status: available + title: Actual 2025 STUD dictionary metadata; code-only unknowns remain explicit in audit + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=STUD&dd=student&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + - reference_id: glossary + role: glossary + url: https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf + title: 2024-25 Comprehensive TAPR Glossary + status: available + provenance_ids: + - e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db + reviewed_sha256: 846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html + title: 2024-2025 TAPR Masking Rules + status: available + provenance_ids: + - 6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554 + reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 + reader: + profiles: + source: + column_schema: schemas/tapr--2025--student-profile-crosswalk.json + tapr_source: + scope: district + tables: + student_profile: data/tapr/raw/2025-district-STUD-all-checked.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2025--student-profile-crosswalk.json + title: Reviewed complete 2025 student_profile source-only contract + status: available + provenance_ids: [] + reviewed_sha256: 842ba240f4afffe88adc4f4a6070b8cf257c7ab3895eca23684484afd49b2975 district_tapr_staff_profile: 2024: path: data/tapr/raw/2024 District Staff Information.csv @@ -869,6 +1076,75 @@ data_sources: status: available provenance_ids: [] reviewed_sha256: 73b50ad614f998f5f19b725143f80f2b1faf045b2836a3f1bf9e8d261a8fd928 + 2025: + path: data/tapr/raw/2025-district-STAF-all-checked.csv + metadata: + title: 2025 TAPR District Staff Information; selected observed revision + publisher: Texas Education Agency + version: '2025' + period: + kind: unknown + source_url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/index.html + download_url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + provenance_ids: [] + notes: Independent source-only observation of publisher edition 2025. Table and field periods, units and scientific token policy remain unknown unless separately reviewed; no 2024 policy or historical composite metadata is inherited. Every source column, identity/history attribute and ordered dictionary occurrence is retained. Original HTTP dates and controls remain in their genuine receipts; old local-download dates remain unknown. The historical 2025 composite is a separate prior revision, not a fallback or current alias. No released default, semantic binding, entity enrichment or app data is activated. + references: + - reference_id: csv_headers + role: source_notes + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker/ + title: Genuine 2025 district staff_profile CSV; original observation and ordered controls preserved + status: available + provenance_ids: + - 4a72e91345b11dca068b1ae0744bef9b8ca4c269463e83dbaffe148d0e13ceff + reviewed_sha256: 29921c748875f91cc123c22dc5a295f1e61d1754842209bd86e56ad9f7c7abb1 + - provenance_ids: + - 3e501706cba3379f94db5f71f6f6aaad84df253dfbb8f91313e70fbf33a124ed + reference_id: exact_selection_form + reviewed_sha256: 756c03abeab4089ef6b1047b2d26338d8b5453a7f222bd4a0086fa5bba7c64a5 + role: source_notes + status: available + title: Retained actual form, ordered repeated controls and literal action + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker + - provenance_ids: + - 3f655f2f3a8cd4dd8706dbc61abb1a324bd43434afde8ed68b2e334be20ea822 + reference_id: actual2025_dictionary + reviewed_sha256: fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6 + role: data_dictionary + status: available + title: Actual 2025 STAF dictionary metadata; code-only unknowns remain explicit in audit + url: https://rptsvr1.tea.texas.gov/cgi/sas/broker?_service=marykay&_program=perfrept.perfmast.sas&_debug=0&ccyy=2025&sumlev=D&dsname=STAF&dd=staff&asvab=&prgopt=reports/tapr/dd/dd_tapr_dictionary.sas + - reference_id: glossary + role: glossary + url: https://tea.texas.gov/school-and-district-leaders/accountability/academic-accountability/performance-reporting/2024-25-comprehensive-tapr-glossary-0.pdf + title: 2024-25 Comprehensive TAPR Glossary + status: available + provenance_ids: + - e9cb78a172cd247ca3101727a81e31d6b59e9c7372e8c54863f4f0574e1412db + reviewed_sha256: 846810954d479a13467d9e4add3b0ed626247bd48ca9b677ff8a5ec11aedd416 + - reference_id: masking + role: masking_methodology + url: https://rptsvr1.tea.texas.gov/perfreport/tapr/2025/masking.html + title: 2024-2025 TAPR Masking Rules + status: available + provenance_ids: + - 6e4908dc2727a5de0610f9a00a3ec8983810f3aa7577d604c80ba53d93992554 + reviewed_sha256: 7b6e5840645656bf3c0d977431e7f9fcd6ea984bb1734b6387471f8ad4851de8 + reader: + profiles: + source: + column_schema: schemas/tapr--2025--staff-profile-crosswalk.json + tapr_source: + scope: district + tables: + staff_profile: data/tapr/raw/2025-district-STAF-all-checked.csv + references: + - reference_id: columns_source + role: schema + path: schemas/tapr--2025--staff-profile-crosswalk.json + title: Reviewed complete 2025 staff_profile source-only contract + status: available + provenance_ids: [] + reviewed_sha256: 579619e1d337a6c34078ad45f8138ac9277c4d3e6751995a56ad084c9599300e campus_tapr_graduation_profile: 2024: path: data/tapr/raw/2024 Campus Graduation Profile.csv diff --git a/tests/test_tapr_2025_staff.py b/tests/test_tapr_2025_staff.py index 80fb89b..2f60947 100644 --- a/tests/test_tapr_2025_staff.py +++ b/tests/test_tapr_2025_staff.py @@ -1,26 +1,35 @@ +from copy import deepcopy +from datetime import datetime, timezone from hashlib import sha256 +import csv from pathlib import Path import pytest -from teadata.column_schema import header_records, header_rename_map, parse_column_schema -from teadata.manifest import ContractError -from teadata.teadata_config import load_config +from teadata.column_schema import header_records, header_rename_map, parse_column_schema, source_schema_fingerprint +from teadata.dataset_metadata import DatasetMetadata, ResolvedDataset +from teadata.manifest import ContractError, canonical_json +from teadata.provenance import ProvenanceStore +from teadata.scripts.build_tapr_profiles import main as prepare_main, prepare_profiles +from teadata.teadata_config import Config, load_config ROOT = Path(__file__).resolve().parents[1] -RESOURCE = ROOT / 'docs/source-contracts/tapr--2025--staff-profile-crosswalk.json' +RESOURCE = ROOT / 'teadata/schemas/tapr--2025--staff-profile-crosswalk.json' -@pytest.mark.parametrize('scope,columns,rows,raw_sha,dictionary_sha,new_count', [ +@pytest.mark.parametrize('scope,columns,rows,raw_sha,dictionary_sha,new_count,raw_id', [ ('campus', 106, 9084, 'ed29852dd7d7925963413b41c81a36508ccad83a4109a0aeebfa720bf90ff6ea', - 'd5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e', 15), + 'd5a1f29d97d34946eae7705d5f8a1ef7f376f7dd143cf0ce7b2fe0f1ba1f719e', 15, + '7ffcfafba5a510e01d1d613bc01598c6567ed11f1eee342136ca3aa129b49752'), ('district', 118, 1208, '29921c748875f91cc123c22dc5a295f1e61d1754842209bd86e56ad9f7c7abb1', - 'fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6', 17), + 'fead1a0ad8f3a35949dfefc8161781be4161ff7fd028e926f99c3b9c41d5a8d6', 17, + '4a72e91345b11dca068b1ae0744bef9b8ca4c269463e83dbaffe148d0e13ceff'), ]) -def test_new_crosswalk_retains_every_actual_column_without_activating_config(scope, columns, rows, raw_sha, dictionary_sha, new_count): +def test_staff_crosswalk_retains_every_actual_column_without_default_activation(scope, columns, rows, raw_sha, dictionary_sha, new_count, raw_id): document = parse_column_schema(RESOURCE.read_bytes()) - assert not (ROOT / 'teadata/schemas' / RESOURCE.name).exists() + assert not (ROOT / 'docs/source-contracts' / RESOURCE.name).exists() + assert sha256(RESOURCE.read_bytes()).hexdigest() == '579619e1d337a6c34078ad45f8138ac9277c4d3e6751995a56ad084c9599300e' dataset = next(d for d in document['datasets'] if d['dataset'] == scope + '_tapr_staff_profile') assert dataset['edition'] == '2025' and dataset['source_only'] is True table, = dataset['tables'] @@ -46,9 +55,18 @@ def test_new_crosswalk_retains_every_actual_column_without_activating_config(sco assert old_codes < {r['code'] for r in records} assert len({r['code'] for r in records} - old_codes) == new_count cfg = load_config() - assert cfg.availability_report()['data_sources'][dataset['dataset']]['years'] == [2024] - with pytest.raises(ContractError, match='edition unavailable'): - cfg.header_records(dataset['dataset'], edition='2025', reader_profile='source') + assert cfg.availability_report()['data_sources'][dataset['dataset']]['years'] == [2024, 2025] + assert cfg.header_records(dataset['dataset'], edition='2025', reader_profile='source') == records + assert cfg.is_source_only(dataset['dataset'], 2025) + assert cfg.column_schema(dataset['dataset'], 2025) is None + source = cfg.resolve_dataset(dataset['dataset'], 2025) + assert source.metadata.period.kind == 'unknown' and source.metadata.value_policy is None + assert not source.metadata.metrics and not source.metadata.provenance_ids and source.metadata.field_year is None + raw_reference = next(r for r in source.metadata.references if r.reference_id == 'csv_headers') + assert raw_reference.provenance_ids == (raw_id,) and raw_reference.reviewed_sha256 == raw_sha + assert source.reader['profiles']['source']['tapr_source']['tables']['staff_profile'] == f'data/tapr/raw/2025-{scope}-STAF-all-checked.csv' + with pytest.raises(ContractError, match='Reader profile is required'): + cfg.load_df(dataset['dataset'], 2025) def test_code_only_and_dictionary_only_codes_do_not_become_input_fields_or_aliases(): @@ -69,3 +87,208 @@ def test_code_only_and_dictionary_only_codes_do_not_become_input_fields_or_alias occurrences = [r for r in records if r['code'] == code] assert len(occurrences) == 2 and occurrences[0]['ordinal'] != occurrences[1]['ordinal'] assert len({(r['publisher_type'], r['publisher_description']) for r in occurrences}) == 1 + + +@pytest.mark.parametrize('scope,width,rows,raw_sha,dictionary_sha,raw_id', [ + ('campus', 243, 9084, '7e0e762a8f2ba50687fd8c6a59e8052d5740ba57abbedecddfca064bbd77548e', + '01b60e8eec23e5c158206d796c0ce82c713417e5f822f1ab81354199814ef209', + '3dec9c6e933d9f88c6efacc6f00f8669f8dda0e9d3c51ee9c176f910011e7b35'), + ('district', 242, 1208, '8ccd14fb2eaff8c73d94960950cc359d44bf4b81edb721975edf6795b8995811', + '693d84e0fa2285918c0f0d437a8fbfdefa72b66c1a7acd8ddac94165b536568d', + 'cdef4db2551805ed9aa901243df73d91843d158d14426592607e842ce7036231'), +]) +def test_student_source_contract_preserves_observed_headers_and_historical_names_without_period_inference( + scope, width, rows, raw_sha, dictionary_sha, raw_id): + resource = ROOT / 'teadata/schemas/tapr--2025--student-profile-crosswalk.json' + document = parse_column_schema(resource.read_bytes()) + selected = next(d for d in document['datasets'] if d['dataset'] == scope + '_tapr_student_profile') + table, = selected['tables'] + assert selected['source_only'] and 'prepared_input_sha256' not in selected + assert table['input_sha256'] == raw_sha and table['layout'] == { + 'label_record': 1, 'code_record': 2, 'first_data_record': 3, 'last_data_record': rows + 2, 'annotations': []} + historical = parse_column_schema((ROOT / 'teadata/schemas/tapr--2025--header-crosswalk.json').read_bytes()) + previous = next(d for d in historical['datasets'] if d['dataset'] == scope + '_tapr_student_staff_profile') + original = next(t for t in previous['tables'] if t['table'] == 'student') + assert [{key: f[key] for key in ['position', 'code', 'label', 'field']} for f in table['fields']] == original['fields'] + assert table['source_schema_sha256'] == original['source_schema_sha256'] + assert {r['source_sha256'] for r in table['dictionary_records']} == {dictionary_sha} + cfg = load_config() + source = cfg.resolve_dataset(selected['dataset'], 2025) + records = cfg.header_records(selected['dataset'], edition='2025', reader_profile='source') + assert len(records) == width and all(r['period'] == {'kind': 'unknown'} for r in records) + assert not source.metadata.metrics and source.metadata.value_policy is None and source.metadata.field_year is None + assert not source.metadata.provenance_ids + raw_reference = next(r for r in source.metadata.references if r.reference_id == 'csv_headers') + assert raw_reference.provenance_ids == (raw_id,) and raw_reference.reviewed_sha256 == raw_sha + assert source.metadata.notes and 'independent processing receipt' in source.metadata.notes + assert source.path.endswith(f'/data/tapr/raw/2025-{scope}-STUD-all-checked.csv') + for role in ['data_dictionary', 'glossary', 'masking_methodology']: + ref, = [r for r in source.metadata.references if r.role == role] + assert ref.status == 'available' and ref.provenance_ids and ref.reviewed_sha256 + if scope == 'district': + duplicate = [r for r in table['dictionary_records'] if r['code'] == 'DAUND24C'] + assert len(duplicate) == 2 and duplicate[0]['ordinal'] != duplicate[1]['ordinal'] + + +@pytest.mark.parametrize('scope,family,width', [ + ('campus', 'student_profile', 243), ('district', 'student_profile', 242), + ('campus', 'staff_profile', 106), ('district', 'staff_profile', 118), +]) +def test_2025_natural_source_consumer_keeps_all_synthetic_columns_and_original_typed_history( + tmp_path, scope, family, width): + import pyarrow.parquet as pq + + cfg = load_config() + dataset = scope + '_tapr_' + family + contract = cfg.column_contract(dataset, 2025, reader_profile='source') + assert contract is not None + document = parse_column_schema(contract['text'].encode()) + selected = deepcopy(next(d for d in document['datasets'] if d['dataset'] == dataset)) + document['datasets'] = [selected] + table, = selected['tables'] + path = tmp_path / 'original.csv' + identities = {'CAMPUS': '001902001', 'CAMPNAME': 'Historical campus', + 'DISTRICT': '001902', 'DISTNAME': 'Historical district'} + tokens = iter(['.', '', '0', '-1', 'n/a']) + values = [identities[field['code']] if field['code'] in identities else next(tokens, 'unchanged source text') + for field in table['fields']] + with path.open('w', newline='') as stream: + csv.writer(stream).writerows([[f['label'] for f in table['fields']], [f['code'] for f in table['fields']], values]) + table['input_sha256'] = sha256(path.read_bytes()).hexdigest() + table['layout']['last_data_record'] = 3 + schema = tmp_path / 'schema.json' + schema.write_text(canonical_json(document) + '\n') + original_store = ProvenanceStore(tmp_path / 'original-store') + original_label = scope + '_tapr_student_studf_profile' if family == 'student_profile' else scope + '_tapr_student_staff_profile' + raw_id = original_store.record_acquisition(path, ResolvedDataset(original_label, 'data_sources', 2025, 2025, '', + DatasetMetadata(version='2025')), requested_url='https://example.test/original.csv', + downloaded_at=datetime(2026, 1, 1, tzinfo=timezone.utc)) + original_record = original_store.read_record(raw_id) + annotation = tmp_path / 'annotation.json' + annotation.write_text('{"operation":"explicit label annotation; no alias"}') + correction = original_store.record_processing(dataset='explicit_annotation', inputs=[raw_id], + outputs={'annotation': annotation}, processor='synthetic fixture', code_version='fixture') + configured = Config.from_dict({'data_sources': {dataset: {2025: {'path': str(path), + 'metadata': {'version': '2025', 'period': {'kind': 'unknown'}, 'references': [{ + 'reference_id': 'csv_headers', 'role': 'source_notes', 'url': 'https://example.test/original.csv', + 'provenance_ids': [raw_id], 'reviewed_sha256': table['input_sha256']}]}, + 'reader': {'profiles': {'source': {'column_schema': schema.name, + 'tapr_source': {'scope': scope, 'tables': {family: str(path)}}, 'references': [{ + 'reference_id': 'columns_source', 'role': 'schema', 'path': schema.name, + 'reviewed_sha256': sha256(schema.read_bytes()).hexdigest()}]}}}}}}}) + configured.base_dir = tmp_path + result = prepare_profiles(configured, edition='2025', family=family, scopes=[scope], input_dir=None, + output_dir=tmp_path / 'prepared', reference_store=original_store, processing_inputs={dataset: [correction]}) + assert result['scopes'][scope]['fields'] == width and result['scopes'][scope]['rows'] == 1 + prepared = pq.read_table(tmp_path / 'prepared' / (scope + '.parquet')) + assert [column[0].as_py() for column in prepared.columns] == values + archive = ProvenanceStore(tmp_path / 'prepared/provenance') + closure = archive.verify_record_closure([result['scopes'][scope]['processing_record_id']]) + assert raw_id in closure and closure[raw_id] == original_record + assert original_store.read_record(raw_id) == original_record + assert closure[correction] == original_store.read_record(correction) + assert closure[correction]['kind'] == 'processing' and closure[correction]['inputs'] == [raw_id] + assert correction in closure[result['scopes'][scope]['processing_record_id']]['inputs'] + assert result['scopes'][scope]['selected_processing_inputs'] == [correction] + assert configured.resolve_dataset(dataset, 2025).metadata.provenance_ids == () + + +@pytest.mark.parametrize('problem', ['foreign_dataset', 'acquisition_root', 'missing_closure', 'missing_store']) +def test_processing_dependency_failures_precede_source_reads_and_publication(tmp_path, monkeypatch, problem): + store = ProvenanceStore(tmp_path / 'history') + source = tmp_path / 'original.csv' + source.write_bytes(b'original') + raw = store.record_acquisition(source, ResolvedDataset('original', 'data_sources', None, None, '')) + annotation = tmp_path / 'annotation.json' + annotation.write_bytes(b'{"annotation":true}') + processing = store.record_processing(dataset='annotation', inputs=[raw], outputs={'annotation': annotation}, + processor='fixture', code_version='fixture') + dataset = 'campus_tapr_student_profile' + selected = {dataset: [processing]} + if problem == 'foreign_dataset': + selected = {'district_tapr_student_profile': [processing]} + elif problem == 'acquisition_root': + selected = {dataset: [raw]} + elif problem == 'missing_closure': + (store.root / 'objects' / sha256(b'original').hexdigest()).unlink() + cfg = Config() + monkeypatch.setattr(cfg, 'read_tapr_sources', lambda *a, **k: pytest.fail('Invalid dependency reached raw source read')) + with pytest.raises((ValueError, FileNotFoundError)): + prepare_profiles(cfg, edition='2025', scopes=['campus'], input_dir=None, family='student_profile', + output_dir=tmp_path / 'output', reference_store=None if problem == 'missing_store' else store, + processing_inputs=selected) + assert not (tmp_path / 'output').exists() + assert not list(tmp_path.glob('.tapr-preparation-*')) + + +def tiny_annual_source(tmp_path, year): + """A two-column local observation; no real future-year data is asserted.""" + path = tmp_path / 'source.csv' + labels, codes = ['Campus', 'Opaque source observation'], ['CAMPUS', 'VALUE'] + path.write_text(','.join(labels) + '\n' + ','.join(codes) + '\n001902001,.\n') + fields = [{'position': 1, 'code': codes[0], 'label': labels[0], 'field': 'campus_number', + 'disposition': 'identity', 'dictionary_status': 'not_applicable', 'publisher_type': None, 'publisher_description': None}, + {'position': 2, 'code': codes[1], 'label': labels[1], 'field': 'source_observation', + 'disposition': 'fact', 'dictionary_status': 'not_documented', 'publisher_type': None, 'publisher_description': None}] + table = {'table': 'student_profile', 'metric_period': {'kind': 'unknown'}, + 'input_sha256': sha256(path.read_bytes()).hexdigest(), + 'source_schema_sha256': source_schema_fingerprint(labels, codes), + 'fields': fields, 'layout': {'label_record': 1, 'code_record': 2, 'first_data_record': 3, + 'last_data_record': 3, 'annotations': []}} + schema = tmp_path / 'schema.json' + schema.write_text(canonical_json({'schema_version': 2, 'mapping_version': 1, 'datasets': [{ + 'dataset': 'campus_tapr_student_profile', 'edition': str(year), 'source_only': True, 'tables': [table]}]}) + '\n') + store = ProvenanceStore(tmp_path / 'history') + raw = store.record_acquisition(path, ResolvedDataset('original local observation', 'data_sources', year, year, '', + DatasetMetadata(version=str(year)))) + config = tmp_path / 'config.json' + config.write_text(canonical_json({'data_sources': {'campus_tapr_student_profile': {year: { + 'path': path.name, 'metadata': {'version': str(year), 'period': {'kind': 'unknown'}, 'references': [{ + 'reference_id': 'csv_headers', 'role': 'source_notes', 'path': path.name, + 'provenance_ids': [raw], 'reviewed_sha256': table['input_sha256']}]}, + 'reader': {'profiles': {'source': {'column_schema': schema.name, + 'tapr_source': {'scope': 'campus', 'tables': {'student_profile': path.name}}, 'references': [{ + 'reference_id': 'columns_source', 'role': 'schema', 'path': schema.name, + 'reviewed_sha256': sha256(schema.read_bytes()).hexdigest()}]}}}}}}})) + return config, store + + +def test_registered_2026_annual_cli_uses_existing_exact_config_contract(tmp_path, capsys): + config, store = tiny_annual_source(tmp_path, 2026) + annotation = tmp_path / 'review.json' + annotation.write_text('{"review":"synthetic source context"}') + processing = store.record_processing(dataset='synthetic_review', + inputs=[store.history('original local observation')[0]['record_id']], outputs={'review': annotation}, + processor='fixture', code_version='fixture') + prepare_main(['--edition', '2026', '--family', 'student_profile', '--scope', 'campus', + '--config', str(config), '--reference-store', str(store.root), '--input-dir', str(tmp_path), + '--processing-input', 'campus_tapr_student_profile', processing, + '--processing-input', 'campus_tapr_student_profile', processing, + '--output-dir', str(tmp_path / 'prepared')]) + assert '"edition": "2026"' in capsys.readouterr().out + import pyarrow.parquet as pq + table = pq.read_table(tmp_path / 'prepared/campus.parquet') + assert table.to_pydict() == {'campus_number': ['001902001'], 'source_observation': ['.']} + import json + receipt = json.loads((tmp_path / 'prepared/preparation.json').read_text()) + assert receipt['scopes']['campus']['selected_processing_inputs'] == [processing] + assert ProvenanceStore(tmp_path / 'prepared/provenance').read_record(processing) == store.read_record(processing) + + +@pytest.mark.parametrize('configured_year', [2025, 2027]) +def test_absent_or_prior_fallback_2026_fails_before_source_open(tmp_path, monkeypatch, configured_year): + config, store = tiny_annual_source(tmp_path, configured_year) + monkeypatch.setattr('teadata.tapr.read_tapr_table', lambda *a, **k: pytest.fail('Unregistered annual source opened')) + with pytest.raises((ContractError, KeyError)): + prepare_profiles(load_config(config), edition='2026', family='student_profile', scopes=['campus'], + input_dir=tmp_path, output_dir=tmp_path / 'prepared', reference_store=store) + assert not (tmp_path / 'prepared').exists() + + +@pytest.mark.parametrize('edition', ['02026', '2026 ', '2026.0', 'not-an-edition']) +def test_noncanonical_annual_editions_fail_before_source_read(tmp_path, monkeypatch, edition): + cfg = Config() + monkeypatch.setattr(cfg, 'read_tapr_sources', lambda *a, **k: pytest.fail('Noncanonical edition reached source read')) + with pytest.raises(ValueError, match='canonical annual integer'): + prepare_profiles(cfg, edition=edition, family='student_profile', scopes=['campus'], + input_dir=None, output_dir=tmp_path / 'output') diff --git a/tests/test_tapr_student_staff_sources.py b/tests/test_tapr_student_staff_sources.py index 055dff4..245572a 100644 --- a/tests/test_tapr_student_staff_sources.py +++ b/tests/test_tapr_student_staff_sources.py @@ -40,7 +40,7 @@ def test_four_natural_source_leaves_are_complete_independent_and_have_no_default source = cfg.resolve_dataset(dataset, 2024) records = cfg.header_records(dataset, edition='2024', reader_profile='source') assert len(records) == width and cfg.column_schema(dataset, 2024) is None - assert cfg.availability_report()['data_sources'][dataset]['years'] == [2024] + assert cfg.availability_report()['data_sources'][dataset]['years'] == [2024, 2025] assert cfg.is_source_only(dataset, 2024) assert source.metadata.version == '2024' and source.metadata.period.to_dict() == UNKNOWN assert source.metadata.value_policy is None and not source.metadata.provenance_ids @@ -61,9 +61,9 @@ def test_four_natural_source_leaves_are_complete_independent_and_have_no_default with pytest.raises(ContractError, match='Reader profile is required'): cfg.load_df(dataset, 2024) with pytest.raises(ContractError, match='edition unavailable'): - cfg.header_records(dataset, edition='2025', reader_profile='source') + cfg.header_records(dataset, edition='2026', reader_profile='source') with pytest.raises(ContractError, match='exact declared edition'): - cfg.read_tapr_sources(dataset, 2025) + cfg.read_tapr_sources(dataset, 2026) def test_dictionary_gaps_unused_codes_and_identical_occurrences_are_preserved(): @@ -392,7 +392,8 @@ def test_all_prior_dataset_contracts_bindings_options_and_defaults_stay_pinned() assert sha256(canonical_json(previous).encode()).hexdigest() == 'b81466d6c461979f483b406b3685d04d6e3146704e10896f0645c6ae12baff65' -def test_current_family_discovery_is_metadata_only_in_a_fresh_process(): +@pytest.mark.parametrize('edition', [2024, 2025]) +def test_current_family_discovery_is_metadata_only_in_a_fresh_process(edition): code = ''' import importlib.abc,pathlib,socket,sys,urllib.request heavy=('teadata.engine','teadata.entities','teadata.geometry','pyarrow','duckdb','pandas','numpy','sqlalchemy','geopandas','shapely') @@ -402,8 +403,9 @@ def find_spec(self,fullname,path=None,target=None): sys.meta_path.insert(0,Trap()) from teadata.teadata_config import load_config import teadata.teadata_config as module +edition=int(sys.argv[1]) root=pathlib.Path(module.__file__).parent -allowed={(root/'teadata_sources.yaml').resolve(),(root/'schemas/tapr--2024--student-profile-crosswalk.json').resolve(),(root/'schemas/tapr--2024--staff-profile-crosswalk.json').resolve()} +allowed={(root/'teadata_sources.yaml').resolve()}|{(root/f'schemas/tapr--{edition}--{family}-profile-crosswalk.json').resolve() for family in ['student','staff']} original=pathlib.Path.open def guarded(self,*a,**k): if self.resolve() not in allowed: raise AssertionError('Non-metadata open: '+str(self)) @@ -416,9 +418,9 @@ def forbidden(*a,**k): raise AssertionError('Data/network I/O') for scope in ['campus','district']: for family in ['student_profile','staff_profile']: dataset=scope+'_tapr_'+family - assert cfg.header_records(dataset,edition='2024',reader_profile='source') - assert cfg.is_source_only(dataset,2024) + assert cfg.header_records(dataset,edition=str(edition),reader_profile='source') + assert cfg.is_source_only(dataset,edition) assert not any(n==p or n.startswith(p+'.') for n in sys.modules for p in heavy) ''' - result = subprocess.run([sys.executable, '-B', '-c', code], cwd=ROOT, capture_output=True, text=True) + result = subprocess.run([sys.executable, '-B', '-c', code, str(edition)], cwd=ROOT, capture_output=True, text=True) assert result.returncode == 0, result.stdout + result.stderr