コード例 #1
0
 def append(self, item):
     assert not self.is_finished()
     assert isinstance(item, Block)
     if not isinstance(item, Fold):
         print('inserting unusual element into combined at {0}:{1}: {2}'.format(self.name, len(self._content), item))
     self._content.append(item)
     if self.numerical_identifiers is False:
         # TODO: check each expected item has been added
         self._is_finished = len(self._content) == self.expected_element_count
     else:
         try:
             (group_name, suffix) = BlockDict._parse_name(item.name)
             if isinstance(suffix, int):
                 if suffix == max(self.numerical_identifiers):
                     self._is_finished = True
         except:
             pass
コード例 #2
0
    def _regroup(self, tree):
        """Regroup tree into a dictionary of well defined blocks."""
        blocks = BlockDict()
        parsed_block_names = list(
            blocks._parse_name(block.name) for block in tree
            if not isinstance(block, str))

        print('parsed_block_names', parsed_block_names)

        group_names = Counter(
            group_name for group_name, suffix in parsed_block_names)
        print('group names', group_names)
        repeated_names = [name for name, cnt in group_names.most_common() if cnt > 1]
        print('repeats', repeated_names)
        suffixes = {}
        for group_name in repeated_names:
            suffixes[group_name] = [
                suffix for identifier, suffix in parsed_block_names
                if identifier == group_name]
        print('suffixes', suffixes)

        for item in tree:
            if isinstance(item, AnsiColour):
                continue
            elif not isinstance(item, Block):
                assert isinstance(item, str)
                print('string found: {0}'.format(item))
                continue

            full_name = item.name
            group_name, suffix = blocks._parse_name(full_name)
            print('found {0} . {1}'.format(group_name, suffix))

            if blocks and isinstance(blocks.last, CombinedGroup):
                last_block = blocks.last
                print('finished?', last_block.is_finished())
                if not last_block.is_finished():
                    last_block.append(item)
                    continue

            if group_name in repeated_names:
                if group_name not in blocks:
                    block = CombinedGroup(group_name, suffixes[group_name])
                    blocks.append(block)
                else:
                    block = blocks[group_name]

                print('add {0} to {1}'.format(full_name, group_name))
                block.append(item)
            else:
                print('adding block {0}'.format(full_name))
                blocks.append(item)

        # Find 'script'
        if 'script' not in blocks and '_done' in blocks:
            script_block = ScriptBlock()

            if 'install' in blocks:
                start_after_name = 'install'

            end_before_name = '_done'

            found = False

            for index, item_name in enumerate(blocks.keys()):
                if item_name == start_after_name:
                    found = True
                elif item_name == end_before_name:
                    break
                elif found is True:
                    script_block.append(blocks[item_name])
                    del blocks[item_name]

            blocks.append(script_block)
            blocks.move_to_end(end_before_name)

        # Wrap activation
        for index, (name, block) in enumerate(blocks.items()):
            if name == 'script':
                break

            if isinstance(block, Timer):
                activate_block = Activate()
                if block._content and isinstance(block._content[0], CommandLine):
                    executed = block._content[0].executed
                    if re.match('source.*\/activate', executed):
                        activate_block._contents = block
                        blocks[index] = activate_block
                        break

        return blocks