#查询引擎 #JSON #查询 #JSON路径 #simd #JSON文件 #解析器

rsonpath-test-codegen

由SIMD驱动的闪电般的JSONPath查询引擎。为rsonpath-lib提供的基于TOML的测试代码生成。

1个不稳定版本

0.5.1 2023年7月2日

#1404文本处理

MIT许可证

36KB
759

rsonpath提供声明式TOML驱动的测试用例生成。

该框架的全部卖点在于我们可以通过编写简单的TOML配置文件来声明完整的查询引擎测试文档和查询。

[input]
description = "short json with objects and lists, given as an example on jsonpath com"
is_compressed = false

[input.source]
json_string = '''
{
    "firstName": "John",
    "lastName": "doe",
    "age": 26,
    "address": {
        "streetAddress": "naist street",
        "city": "Nara",
        "postalCode": "630-0192"
    },
    "phoneNumbers": [
        {
            "type": "iPhone",
            "number": "0123-4567-8888"
        },
        {
            "type": "home",
            "number": "0123-4567-8910"
        }
    ]
}
'''

[[queries]]
description = "select exact path with name and index selectors"
query = "$.phoneNumbers[0].type"

[queries.results]
count = 1
bytes = [239]
nodes = ['"iPhone"']

[[queries]]
description = "descendant search for 'number'"
query = "$..number"

[queries.results]
count = 2
bytes = [271, 359]
nodes = ['"0123-4567-8888"', '"0123-4567-8910"']

[[queries]]
description = "select first number directly"
query = "$.phoneNumbers[0]"

[queries.results]
count = 1
bytes = [217]
nodes = ['''{
            "type": "iPhone",
            "number": "0123-4567-8888"
        }''']

工作原理

此库提供了一个公共入口点,即generate_tests,它接受一个包含源TOML配置的目录路径以及一个辅助JSON输出目录路径。

  1. 它读取所有TOML文件并将它们解析为在model中声明的结构。
  2. 它使用compression模块创建所有声称为非压缩的文档的压缩版本(input.is_compressed为false)。这将创建一个具有相同名称的新TOML文件,位于compressed子目录中,其输入源被处理为精简后的JSON。
  3. 具有内联input.source的每个TOML文档都会创建一个包含给定输入的JSON文件。这样做有两个原因:一是测试MmapInput需要一个实际的文件;二是将这些字符串内联放入生成的测试.rs文件会使它变得过大。
  4. 为每个声明的查询为每个文档生成测试用例,使用两个引擎、所有声明的结果类型以及所有支持的输入模式。这由gen驱动。

大输入

input.source属性可以包含作为json_string属性的JSON字符串,也可以包含实际JSON文件在large_file属性中的相对路径。这用于twitter和wikidata文件,因为它们需要多个兆字节,并使TOML文件难以编辑。

依赖项

~1.2–9MB
~75K SLoC