Spaces:
Running
Running
import time | |
from jinja2 import meta, TemplateError | |
import pytest | |
import promptsource.templates | |
from promptsource.utils import get_dataset_builder | |
from uuid import UUID | |
# Sets up Jinja environment | |
env = promptsource.templates.env | |
# Loads templates and iterates over each data (sub)set | |
template_collection = promptsource.templates.TemplateCollection() | |
def test_uuids(): | |
""" | |
Checks that all UUIDs across promptsource are unique. (Although collisions | |
are unlikely, copying and pasting YAML files could lead to duplicates. | |
""" | |
all_uuids = {} | |
# Iterates over all datasets | |
for dataset_name, subset_name in template_collection.keys: | |
# Iterates over each template for current data (sub)set | |
dataset_templates = template_collection.get_dataset(dataset_name, subset_name) | |
for template_name in dataset_templates.all_template_names: | |
template = dataset_templates[template_name] | |
uuid = template.get_id() | |
if uuid in all_uuids: | |
raise ValueError(f"Template {template_name} for dataset {dataset_name}/{subset_name} " | |
f"has duplicate uuid {template.get_id()} as " | |
f"{all_uuids[uuid][0]}/{all_uuids[uuid][1]}.") | |
all_uuids[uuid] = (dataset_name, subset_name) | |
def test_dataset(dataset): | |
""" | |
Validates all the templates in the repository with simple syntactic checks: | |
0. Are all templates parsable YAML? | |
1. Do all templates parse in Jinja and are all referenced variables in the dataset schema? | |
2. Does the template contain a prompt/output separator "|||" ? | |
3. Are all names and templates within a data (sub)set unique? | |
4. Is the YAML dictionary properly formatted? | |
5. Is the UUID valid? | |
:param dataset: (dataset_name, subset_name) pair to test | |
""" | |
dataset_name, subset_name = dataset | |
# Loads dataset information | |
tries = 0 | |
max_tries = 3 | |
while True: | |
try: | |
builder_instance = get_dataset_builder(dataset_name, subset_name) | |
break | |
except ConnectionError as e: | |
if tries < max_tries: | |
time.sleep(2) | |
tries += 1 | |
else: | |
raise e | |
has_features = builder_instance.info.features is not None | |
if has_features: | |
features = builder_instance.info.features.keys() | |
features = set([feature.replace("-", "_") for feature in features]) | |
# Initializes sets for checking uniqueness among templates | |
template_name_set = set() | |
template_jinja_set = set() | |
# Iterates over each template for current data (sub)set | |
dataset_templates = template_collection.get_dataset(dataset_name, subset_name) | |
any_original = False | |
for template_name in dataset_templates.all_template_names: | |
template = dataset_templates[template_name] | |
any_original = any_original or template.metadata.original_task | |
# Check 1: Jinja and all features valid? | |
try: | |
parse = env.parse(template.jinja) | |
except TemplateError as e: | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} failed to parse.") from e | |
variables = meta.find_undeclared_variables(parse) | |
for variable in variables: | |
if has_features and variable not in features and variable != "answer_choices": | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} has unrecognized variable {variable}.") | |
# Check 2: Prompt/output separator present? | |
if "|||" not in template.jinja: | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} has no prompt/output separator.") | |
# Check 3: Unique names and templates? | |
if template.get_name() in template_name_set: | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} has duplicate name.") | |
if template.jinja in template_jinja_set: | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} has duplicate definition.") | |
template_name_set.add(template.get_name()) | |
template_jinja_set.add(template.jinja) | |
# Check 4: Is the YAML dictionary properly formatted? | |
try: | |
if dataset_templates.templates[template.get_id()] != template: | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} has wrong YAML key.") | |
except KeyError as e: | |
raise ValueError(f"Template for dataset {dataset_name}/{subset_name} " | |
f"with uuid {template.get_id()} has wrong YAML key.") from e | |
# Check 5: Is the UUID valid? | |
UUID(template.get_id()) | |
# Turned off for now until we fix. | |
#assert any_original, "There must be at least one original task template for each dataset" | |