port not_strings to python, add trailing space
This commit is contained in:
parent
6743438607
commit
8b47473df3
3 changed files with 51 additions and 7 deletions
|
@ -214,7 +214,7 @@ std::string not_strings(const std::vector<std::string> & strings) {
|
||||||
};
|
};
|
||||||
visit(trie);
|
visit(trie);
|
||||||
|
|
||||||
out << " ) char* [\"]";
|
out << " ) char* [\"] space";
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,47 @@ NON_LITERAL_SET = set('|.()[]{}*+?')
|
||||||
ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALS = set('[]()|{}*+?')
|
ESCAPED_IN_REGEXPS_BUT_NOT_IN_LITERALS = set('[]()|{}*+?')
|
||||||
|
|
||||||
|
|
||||||
|
def not_strings(strings):
|
||||||
|
class TrieNode:
|
||||||
|
def __init__(self):
|
||||||
|
self.children = {}
|
||||||
|
self.is_end_of_string = False
|
||||||
|
|
||||||
|
def insert(self, string):
|
||||||
|
node = self
|
||||||
|
for c in string:
|
||||||
|
node = node.children.setdefault(c, TrieNode())
|
||||||
|
node.is_end_of_string = True
|
||||||
|
|
||||||
|
trie = TrieNode()
|
||||||
|
for s in strings:
|
||||||
|
trie.insert(s)
|
||||||
|
|
||||||
|
out = ['["] ( ']
|
||||||
|
|
||||||
|
def visit(node):
|
||||||
|
rejects = []
|
||||||
|
first = True
|
||||||
|
for c, child in node.children.items():
|
||||||
|
rejects.append(c)
|
||||||
|
if child.is_end_of_string:
|
||||||
|
continue
|
||||||
|
if first:
|
||||||
|
first = False
|
||||||
|
else:
|
||||||
|
out.append(' | ')
|
||||||
|
out.append(f'[{c}] (')
|
||||||
|
visit(child)
|
||||||
|
out.append(')')
|
||||||
|
if node.children:
|
||||||
|
if not first:
|
||||||
|
out.append(' | ')
|
||||||
|
out.append(f'[^"{"".join(rejects)}]')
|
||||||
|
visit(trie)
|
||||||
|
|
||||||
|
out.append(' ) char* ["] space')
|
||||||
|
return ''.join(out)
|
||||||
|
|
||||||
class SchemaConverter:
|
class SchemaConverter:
|
||||||
def __init__(self, *, prop_order, allow_fetch, dotall, raw_pattern):
|
def __init__(self, *, prop_order, allow_fetch, dotall, raw_pattern):
|
||||||
self._prop_order = prop_order
|
self._prop_order = prop_order
|
||||||
|
@ -471,9 +512,12 @@ class SchemaConverter:
|
||||||
if additional_properties == True or isinstance(additional_properties, dict):
|
if additional_properties == True or isinstance(additional_properties, dict):
|
||||||
sub_name = f'{name}{"-" if name else ""}additional'
|
sub_name = f'{name}{"-" if name else ""}additional'
|
||||||
value_rule = self.visit({} if additional_properties == True else additional_properties, f'{sub_name}-value')
|
value_rule = self.visit({} if additional_properties == True else additional_properties, f'{sub_name}-value')
|
||||||
|
key_rule = self._add_primitive('string', PRIMITIVE_RULES['string']) if not sorted_props \
|
||||||
|
else self._add_rule(f'{sub_name}-k', not_strings(sorted_props))
|
||||||
|
|
||||||
prop_kv_rule_names["*"] = self._add_rule(
|
prop_kv_rule_names["*"] = self._add_rule(
|
||||||
f'{sub_name}-kv',
|
f'{sub_name}-kv',
|
||||||
self._add_primitive('string', PRIMITIVE_RULES['string']) + f' ":" space {value_rule}'
|
f'{key_rule} ":" space {value_rule}'
|
||||||
)
|
)
|
||||||
optional_props.append("*")
|
optional_props.append("*")
|
||||||
|
|
||||||
|
|
|
@ -634,7 +634,7 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
|
||||||
})""",
|
})""",
|
||||||
R"""(
|
R"""(
|
||||||
a-kv ::= "\"a\"" space ":" space number
|
a-kv ::= "\"a\"" space ":" space number
|
||||||
additional-k ::= ["] ( [^"a] ) char* ["]
|
additional-k ::= ["] ( [^"a] ) char* ["] space
|
||||||
additional-kv ::= additional-k ":" space string
|
additional-kv ::= additional-k ":" space string
|
||||||
char ::= [^"\\\x7F\x00-\x1F] | [\\] (["\\bfnrt] | "u" [0-9a-fA-F]{4})
|
char ::= [^"\\\x7F\x00-\x1F] | [\\] (["\\bfnrt] | "u" [0-9a-fA-F]{4})
|
||||||
decimal-part ::= [0-9]{1,16}
|
decimal-part ::= [0-9]{1,16}
|
||||||
|
@ -659,7 +659,7 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
|
||||||
R"""(
|
R"""(
|
||||||
a-kv ::= "\"a\"" space ":" space number
|
a-kv ::= "\"a\"" space ":" space number
|
||||||
a-rest ::= ( "," space additional-kv )*
|
a-rest ::= ( "," space additional-kv )*
|
||||||
additional-k ::= ["] ( [^"a] ) char* ["]
|
additional-k ::= ["] ( [^"a] ) char* ["] space
|
||||||
additional-kv ::= additional-k ":" space number
|
additional-kv ::= additional-k ":" space number
|
||||||
decimal-part ::= [0-9]{1,16}
|
decimal-part ::= [0-9]{1,16}
|
||||||
integral-part ::= [0] | [1-9] [0-9]{0,15}
|
integral-part ::= [0] | [1-9] [0-9]{0,15}
|
||||||
|
@ -682,7 +682,7 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
|
||||||
"additionalProperties": {"type": "number"}
|
"additionalProperties": {"type": "number"}
|
||||||
})""",
|
})""",
|
||||||
R"""(
|
R"""(
|
||||||
additional-k ::= ["] ( [a] ([l] ([s] ([^"o]) | [^"s]) | [n] ([^"d]) | [^"ln]) | [^"a] ) char* ["]
|
additional-k ::= ["] ( [a] ([l] ([s] ([^"o]) | [^"s]) | [n] ([^"d]) | [^"ln]) | [^"a] ) char* ["] space
|
||||||
additional-kv ::= additional-k ":" space number
|
additional-kv ::= additional-k ":" space number
|
||||||
also-kv ::= "\"also\"" space ":" space number
|
also-kv ::= "\"also\"" space ":" space number
|
||||||
also-rest ::= ( "," space additional-kv )*
|
also-rest ::= ( "," space additional-kv )*
|
||||||
|
@ -748,7 +748,7 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
|
||||||
alternative-1 ::= bar
|
alternative-1 ::= bar
|
||||||
array ::= "[" space ( value ("," space value)* )? "]" space
|
array ::= "[" space ( value ("," space value)* )? "]" space
|
||||||
bar ::= "{" space (bar-b-kv bar-b-rest | bar-additional-kv ( "," space bar-additional-kv )* )? "}" space
|
bar ::= "{" space (bar-b-kv bar-b-rest | bar-additional-kv ( "," space bar-additional-kv )* )? "}" space
|
||||||
bar-additional-k ::= ["] ( [^"b] ) char* ["]
|
bar-additional-k ::= ["] ( [^"b] ) char* ["] space
|
||||||
bar-additional-kv ::= bar-additional-k ":" space bar-additional-value
|
bar-additional-kv ::= bar-additional-k ":" space bar-additional-value
|
||||||
bar-additional-value ::= object
|
bar-additional-value ::= object
|
||||||
bar-b-kv ::= "\"b\"" space ":" space number
|
bar-b-kv ::= "\"b\"" space ":" space number
|
||||||
|
@ -759,7 +759,7 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
|
||||||
foo ::= "{" space (foo-a-kv foo-a-rest | foo-additional-kv ( "," space foo-additional-kv )* )? "}" space
|
foo ::= "{" space (foo-a-kv foo-a-rest | foo-additional-kv ( "," space foo-additional-kv )* )? "}" space
|
||||||
foo-a-kv ::= "\"a\"" space ":" space number
|
foo-a-kv ::= "\"a\"" space ":" space number
|
||||||
foo-a-rest ::= ( "," space foo-additional-kv )*
|
foo-a-rest ::= ( "," space foo-additional-kv )*
|
||||||
foo-additional-k ::= ["] ( [^"a] ) char* ["]
|
foo-additional-k ::= ["] ( [^"a] ) char* ["] space
|
||||||
foo-additional-kv ::= foo-additional-k ":" space foo-additional-value
|
foo-additional-kv ::= foo-additional-k ":" space foo-additional-value
|
||||||
foo-additional-value ::= object
|
foo-additional-value ::= object
|
||||||
integral-part ::= [0] | [1-9] [0-9]{0,15}
|
integral-part ::= [0] | [1-9] [0-9]{0,15}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue