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
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}
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)