def __init__(self, *pattern_objects, flag_groupable = None, value_immediate = None, value_delimiter = None): # Create graphs (forward and reversed) fgraph = Graph() rgraph = Graph() # Create a flat map of all patterns, and # a flag map (associate all flags with all patterns), and # a graph all patterns, to build context hierarchy self._flags = flags = {} self._patterns = patterns = {} for pattern in pattern_objects: if pattern.name in patterns: raise Scheme.LongFlagIsNotUnique( 'Long flag is used more than once: ' '{!r}'.format(pattern.name)) patterns[pattern.name] = pattern # Set global options if flag_groupable is not None: pattern.flag_groupable = flag_groupable if value_immediate is not None: pattern.value_immediate = value_immediate if value_delimiter is not None: pattern.value_delimiter = value_delimiter # Add pattern to graph fgraph.add_vertex(pattern.name) rgraph.add_vertex(pattern.name) for flag in pattern.flags: if flag in flags: raise Scheme.ShortFlagIsNotUnique( 'Short flag is used more than once: ' '{!r}'.format(flag)) flags[flag] = pattern # Build graph edges for name, pattern in patterns.items(): # If pattern is a context, create edges to its members for member in pattern._members: # If member is an Pattern instance if isinstance(member, Pattern): fgraph.add_edge(name, member.name) rgraph.add_edge(member.name, name) # If member is a string-name reference elif isinstance(member, str): # If member is not a real reference if member not in patterns: raise Scheme.InvalidMemberReference(member) fgraph.add_edge(name, member) rgraph.add_edge(member, name) # If member is not a Pattern nor a string else: raise Scheme.InvalidPatternMember( "Type of members of Pattern {!r} " "should be 'str' or 'Pattern' not " "{.__class__.__qualname__!r}".format(name, member)) # Build context hierarchy self._hierarchy = hierarchy = {} try: for vertex in topo_sort(fgraph, tracking=True): # If vertex doesn't have parent(s) if not rgraph.vertex(vertex.id).vertices(): # Build its branch hierarchy[vertex.id] = Scheme._branch(vertex) # If there are circular references in the graph except DAGCycleError as message: raise Scheme.CircularReferences(message.args) from None
def __init__(self, *pattern_objects, flag_groupable=None, value_immediate=None, value_delimiter=None): # Create graphs (forward and reversed) fgraph = Graph() rgraph = Graph() # Create a flat map of all patterns, and # a flag map (associate all flags with all patterns), and # a graph all patterns, to build context hierarchy self._flags = flags = {} self._patterns = patterns = {} for pattern in pattern_objects: if pattern.name in patterns: raise Scheme.LongFlagIsNotUnique( 'Long flag is used more than once: ' '{!r}'.format(pattern.name)) patterns[pattern.name] = pattern # Set global options if flag_groupable is not None: pattern.flag_groupable = flag_groupable if value_immediate is not None: pattern.value_immediate = value_immediate if value_delimiter is not None: pattern.value_delimiter = value_delimiter # Add pattern to graph fgraph.add_vertex(pattern.name) rgraph.add_vertex(pattern.name) for flag in pattern.flags: if flag in flags: raise Scheme.ShortFlagIsNotUnique( 'Short flag is used more than once: ' '{!r}'.format(flag)) flags[flag] = pattern # Build graph edges for name, pattern in patterns.items(): # If pattern is a context, create edges to its members for member in pattern._members: # If member is an Pattern instance if isinstance(member, Pattern): fgraph.add_edge(name, member.name) rgraph.add_edge(member.name, name) # If member is a string-name reference elif isinstance(member, str): # If member is not a real reference if member not in patterns: raise Scheme.InvalidMemberReference(member) fgraph.add_edge(name, member) rgraph.add_edge(member, name) # If member is not a Pattern nor a string else: raise Scheme.InvalidPatternMember( "Type of members of Pattern {!r} " "should be 'str' or 'Pattern' not " "{.__class__.__qualname__!r}".format(name, member)) # Build context hierarchy self._hierarchy = hierarchy = {} try: for vertex in topo_sort(fgraph, tracking=True): # If vertex doesn't have parent(s) if not rgraph.vertex(vertex.id).vertices(): # Build its branch hierarchy[vertex.id] = Scheme._branch(vertex) # If there are circular references in the graph except DAGCycleError as message: raise Scheme.CircularReferences(message.args) from None