flowcraft/generator/pipeline_parser.py
def inner_fork_insanity_checks(pipeline_string):
    """
    This function performs two sanity checks in the pipeline string. The first
    check, assures that each fork contains a lane token '|', while the second
    check looks for duplicated processes within the same fork.

    Parameters
    ----------
    pipeline_string: str
         String with the definition of the pipeline, e.g.::
             'processA processB processC(ProcessD | ProcessE)'

    """

    # first lets get all forks to a list.
    list_of_forks = []  # stores forks
    left_indexes = []  # stores indexes of left brackets

    # iterate through the string looking for '(' and ')'.
    for pos, char in enumerate(pipeline_string):
        if char == FORK_TOKEN:
            # saves pos to left_indexes list
            left_indexes.append(pos)
        elif char == CLOSE_TOKEN and len(left_indexes) > 0:
            # saves fork to list_of_forks
            list_of_forks.append(pipeline_string[left_indexes[-1] + 1: pos])
            # removes last bracket from left_indexes list
            left_indexes = left_indexes[:-1]

    # sort list in descending order of number of forks
    list_of_forks.sort(key=lambda x: x.count(FORK_TOKEN), reverse=True)

    # Now, we can iterate through list_of_forks and check for errors in each
    # fork
    for fork in list_of_forks:
        # remove inner forks for these checks since each fork has its own entry
        # in list_of_forks. Note that each fork is now sorted in descending
        # order which enables to remove sequentially the string for the fork
        # potentially with more inner forks
        for subfork in list_of_forks:
            # checks if subfork is contained in fork and if they are different,
            # avoiding to remove itself
            if subfork in list_of_forks and subfork != fork:
                # removes inner forks. Note that string has no spaces
                fork_simplified = fork.replace("({})".format(subfork), "")
            else:
                fork_simplified = fork

        # Checks if there is no fork separator character '|' within each fork
        if not len(fork_simplified.split(LANE_TOKEN)) > 1:
            raise SanityError("One of the forks doesn't have '|' "
                              "separator between the processes to fork. This is"
                              " the prime suspect: '({})'".format(fork))
def inner_fork_insanity_checks(pipeline_string):
    # first lets get all forks to a list.
    list_of_forks = []  # stores forks
    left_indexes = []  # stores indexes of left brackets

    # iterate through the string looking for '(' and ')'.
    for pos, char in enumerate(pipeline_string):
        if char == FORK_TOKEN:
            # saves pos to left_indexes list
            left_indexes.append(pos)
        elif char == CLOSE_TOKEN and len(left_indexes) > 0:
            # saves fork to list_of_forks
            list_of_forks.append(pipeline_string[left_indexes[-1] + 1: pos])
            # removes last bracket from left_indexes list
            left_indexes = left_indexes[:-1]

    # sort list in descending order of number of forks
    list_of_forks.sort(key=lambda x: x.count(FORK_TOKEN), reverse=True)

    # Now, we can iterate through list_of_forks and check for errors in each
    # fork
    for fork in list_of_forks:
        # remove inner forks for these checks since each fork has its own entry
        # in list_of_forks. Note that each fork is now sorted in descending
        # order which enables to remove sequentially the string for the fork
        # potentially with more inner forks
        for subfork in list_of_forks:
            # checks if subfork is contained in fork and if they are different,
            # avoiding to remove itself
            if subfork in list_of_forks and subfork != fork:
                # removes inner forks. Note that string has no spaces
                fork_simplified = fork.replace("({})".format(subfork), "")
            else:
                fork_simplified = fork

        # Checks if there is no fork separator character '|' within each fork
        if not len(fork_simplified.split(LANE_TOKEN)) > 1:
            raise SanityError("One of the forks doesn't have '|' "
                              "separator between the processes to fork. This is"
                              " the prime suspect: '({})'".format(fork))
def inner_fork_insanity_checks ( pipeline_string ) : # first lets get all forks to a list. list_of_forks = [ ] # stores forks left_indexes = [ ] # stores indexes of left brackets # iterate through the string looking for '(' and ')'. for pos , char in enumerate ( pipeline_string ) : if char == FORK_TOKEN : # saves pos to left_indexes list left_indexes . append ( pos ) elif char == CLOSE_TOKEN and len ( left_indexes ) > 0 : # saves fork to list_of_forks list_of_forks . append ( pipeline_string [ left_indexes [ - 1 ] + 1 : pos ] ) # removes last bracket from left_indexes list left_indexes = left_indexes [ : - 1 ] # sort list in descending order of number of forks list_of_forks . sort ( key = lambda x : x . count ( FORK_TOKEN ) , reverse = True ) # Now, we can iterate through list_of_forks and check for errors in each # fork for fork in list_of_forks : # remove inner forks for these checks since each fork has its own entry # in list_of_forks. Note that each fork is now sorted in descending # order which enables to remove sequentially the string for the fork # potentially with more inner forks for subfork in list_of_forks : # checks if subfork is contained in fork and if they are different, # avoiding to remove itself if subfork in list_of_forks and subfork != fork : # removes inner forks. Note that string has no spaces fork_simplified = fork . replace ( "({})" . format ( subfork ) , "" ) else : fork_simplified = fork # Checks if there is no fork separator character '|' within each fork if not len ( fork_simplified . split ( LANE_TOKEN ) ) > 1 : raise SanityError ( "One of the forks doesn't have '|' " "separator between the processes to fork. This is" " the prime suspect: '({})'" . format ( fork ) )
This function performs two sanity checks in the pipeline string. The first
    check, assures that each fork contains a lane token '|', while the second
    check looks for duplicated processes within the same fork.

    Parameters
    ----------
    pipeline_string: str
         String with the definition of the pipeline, e.g.::
             'processA processB processC(ProcessD | ProcessE)'
This function performs two sanity checks in the pipeline string . The first check assures that each fork contains a lane token | while the second check looks for duplicated processes within the same fork .