Пример #1
0
    def test_parts(self):
        # build test sets
        full_count = 47988
        one_part_count = 15996
        test_sets = {}
        dom = DictOfMask("?l?d,1,3")
        for i in range(full_count):
            part_key = i / one_part_count + 1
            if part_key not in test_sets.keys():
                test_sets[part_key] = dom.get()
            else:
                dom.get()

        for i in range(1, 4):
            counter = 0
            dom = DictOfMask("?l?d,1,3", 3, i)
            assert one_part_count == dom.second_border - dom.first_border
            while True:
                phrase = dom.get()
                if phrase is None:
                    break
                counter += 1
            assert one_part_count == counter
Пример #2
0
    def write_mask_variants(self, mask, base_fh):
        """
        Write in file variants names generated by mask
        :param mask:
        :param base_fh:
        :return:
        """
        dom = DictOfMask(mask, 0, 0)
        while True:
            line = dom.get()
            if line is None:
                break

            gens = ContentDiscoveryNameGenerator.gen_exts_variants(
                line, self.exts)
            for gen in gens:
                base_fh.write(gen + "\n")
        del dom
class CombineGenerator(object):
    """ Class for generate and work with masks """
    mask = None
    template = None
    mask_generator = None
    dict_generator = None
    first_border = 0
    second_border = 0
    lines_count = 0
    current_counter = 0
    current_dict_line = None

    def __init__(self, mask, dict_file, parts, part, template):
        if not template.count("%m%"):
            raise WSException(
                "Template '{0}' not contains %m% (mask) marker ".format(
                    template))
        if not template.count("%d%"):
            raise WSException(
                "Template '{0}' not contains %d% (dict) marker ".format(
                    template))

        if not os.path.exists(dict_file):
            raise WSException("Dict '{0}' not exists ".format(dict_file))

        self.template = template

        self.dict_generator = FileGenerator(dict_file)
        self.next_dict_line()

        self.mask = mask
        self.mask_generator = DictOfMask(mask)

        self.lines_count = (self.dict_generator.lines_count * self.template.count("%d%")) * \
            (self.mask_generator.all_objects_count * self.template.count("%m%"))

        if parts and part:
            one_part_count = int(self.lines_count / parts)
            self.first_border = one_part_count * (part - 1)
            self.second_border = one_part_count * part

            while self.current_counter < self.first_border:
                self.get()

    def _get(self):
        """ Get next combine item """
        mask = self.get_next_mask()
        if mask is None:
            self.next_dict_line()
            if self.current_dict_line is None:
                return None

            self.mask_generator = DictOfMask(self.mask)
            mask = self.get_next_mask()

        return self.template.replace("%m%",
                                     mask).replace("%d%",
                                                   self.current_dict_line)

    def get(self):
        """ Get next combine item and up counters """
        if self.second_border and self.current_counter >= self.second_border:
            return None

        to_return = self._get()

        self.current_counter += 1

        return to_return

    def get_next_mask(self):
        """ Get next mask string from mask generator """
        return self.mask_generator.get()

    def next_dict_line(self):
        """ Set next string from dict generator """
        self.current_dict_line = self.dict_generator.get()

    def get_dict_current_line(self):
        """ Get next line from dict and get next if need  """
        if not len(self.current_dict_line):
            self.next_dict_line()
        return self.current_dict_line