def test_find_config_item_by_filepath(basic_site_config):
    """SiteConfig.find_item_by_filepath should return a config item if one is found with the given filepath"""
    site_config = SiteConfig(basic_site_config)
    all_config_items = list(site_config.iter_items())
    assert (site_config.find_item_by_filepath("data/metadata.json") ==
            all_config_items[3])
    assert site_config.find_item_by_filepath("bad/path") is None
Example #2
0
def _untransform_hugo_menu_data(data: dict, filepath: str,
                                site_config: SiteConfig) -> dict:
    """
    Removes 'url' property from internal links in serialized menu data.

    Returns the dict of all values that will be deserialized to website content, including the transformed
    "menu" fields.
    """
    config_item = site_config.find_item_by_filepath(filepath)
    menu_fields = {
        field["name"]
        for field in config_item.fields
        if field.get("widget") == CONTENT_MENU_FIELD
    }
    transformed_menu_fields = {}
    for field_name, field_data in data.items():
        if field_name not in menu_fields:
            continue
        result_menu_items = []
        for menu_item in field_data:
            updated_menu_item = menu_item.copy()
            if (is_valid_uuid(updated_menu_item["identifier"])
                    and "url" in updated_menu_item):
                del updated_menu_item["url"]
            result_menu_items.append(updated_menu_item)
        transformed_menu_fields[field_name] = result_menu_items
    return {**data, **transformed_menu_fields}
Example #3
0
 def for_file(site_config: SiteConfig,
              filepath: str) -> BaseContentFileSerializer:
     """
     Given the path of a file in a storage backend, returns a serializer object of the correct type for
     deserializing the file as a WebsiteContent object.
     """
     file_ext = get_file_extension(filepath)
     if file_ext == "md":
         cls = HugoMarkdownFileSerializer
     elif file_ext == "json":
         cls = JsonFileSerializer
     elif file_ext in {"yml", "yaml"}:
         # HACK: Hugo-specific logic for properly transforming data if the "menu" widget is used
         config_item = site_config.find_item_by_filepath(filepath)
         if config_item is not None and _has_menu_fields(config_item):
             cls = HugoMenuYamlFileSerializer
         else:
             cls = YamlFileSerializer
     else:
         raise ValueError(
             f"Unrecognized file type. Cannot deserialize ({filepath}).")
     return cls(site_config=site_config)