def test_split(self):
     timer = Timer()
     time.sleep(0.01)
     fist_lap =  timer.split()
     assert timer.elapsed == fist_lap
     time.sleep(0.1)
     second_lap = timer.split()
     assert second_lap > fist_lap
     assert timer.elapsed == second_lap
 def test_split(self):
     timer = Timer()
     time.sleep(0.01)
     fist_lap = timer.split()
     assert timer.elapsed == fist_lap
     time.sleep(0.1)
     second_lap = timer.split()
     assert second_lap > fist_lap
     assert timer.elapsed == second_lap
Exemple #3
0
def main():
    t = Timer()
    parser = ArgumentParser()
    parser.add_argument("-d",
                        "--directory",
                        default="./",
                        help="Path to directory containing the fonts")
    parser.add_argument("-o",
                        "--output",
                        default="merged.ttf",
                        help="Path to output file.")
    parser.add_argument(
        "-v",
        "--verbose",
        action="store_true",
        help="Verbose mode, printing out more info",
    )
    args = parser.parse_args()

    logging.basicConfig(
        level=logging.INFO if args.verbose else logging.WARNING)

    valid_files = build_valid_filenames(directory=args.directory)
    if len(valid_files) <= 1:
        log.warning(
            "expecting at least two fonts to merge, but only got %d " +
            "font(s).",
            len(valid_files),
        )
        sys.exit(-1)

    for idx, file in enumerate(valid_files):
        if not has_gsub_table(file):
            log.info("adding default GSUB table to %s." % file)
            valid_files[idx] = add_gsub_to_font(file)

    merger = merge.Merger()
    print("Merging %d Fonts..." % len(valid_files))
    font = merger.merge(valid_files)
    # Use the line metric in the first font to replace the one in final result.
    metrics = read_line_metrics(ttLib.TTFont(valid_files[0]))
    set_line_metrics(font, metrics)
    font.save(args.output)
    font.close()

    print("%d fonts are merged. %d fonts are skipped. Cost %0.3f s." %
          (len(valid_files), len(files) - len(valid_files), t.time()))
    print("Please check the result at %s." %
          os.path.abspath(os.path.realpath(args.output)))
    def test_using_logger(self, logger):
        with Timer(logger, 'do something'):
            time.sleep(0.01)

        assert re.match(
            "Took [0-9]\.[0-9]{3}s to do something",
            logger.handlers[0].stream.getvalue())
Exemple #5
0
    def __call__(self, font, glyphSet=None):
        """ Run this filter on all the included glyphs.
        Return the set of glyph names that were modified, if any.

        If `glyphSet` (dict) argument is provided, run the filter on
        the glyphs contained therein (which may be copies).
        Otherwise, run the filter in-place on the font's default
        glyph set.
        """
        if glyphSet is None:
            glyphSet = font

        context = self.set_context(font, glyphSet)

        filter_ = self.filter
        include = self.include
        modified = context.modified

        with Timer() as t:
            # we sort the glyph names to make loop deterministic
            for glyphName in sorted(glyphSet.keys()):
                if glyphName in modified:
                    continue
                glyph = glyphSet[glyphName]
                if include(glyph) and filter_(glyph):
                    modified.add(glyphName)

        num = len(modified)
        if num > 0:
            logger.debug("Took %.3fs to run %s on %d glyph%s", t, self.name,
                         len(modified), "" if num == 1 else "s")
        return modified
Exemple #6
0
def main():
    t = Timer()
    parser = ArgumentParser()
    parser.add_argument('-f', '--files',
        help='Path to YAML file containing paths to the fonts')
    parser.add_argument('-o', '--output', default='merged.ttf',
        help='Path to output file.')
    parser.add_argument('-v', '--verbose', action='store_true',
        help='Verbose mode, printing out more info')
    args = parser.parse_args()

    logging.basicConfig(level=logging.INFO if args.verbose else logging.WARNING)

    if not args.files: 
        print('add -h for usage')
        sys.exit(2)

    with open(args.files, 'r') as stream:
        try:
            valid_files = yaml.safe_load(stream)
        except yaml.YAMLError as exc:
            print(exc)

    if len(valid_files) <= 1:
        log.warn('expecting at least two fonts to merge, but only got %d '
            + 'font(s).', len(valid_files))
        sys.exit(-1)

    for idx, file in enumerate(valid_files):
        if not has_gsub_table(file):
            log.info('adding default GSUB table to %s.' % file)
            valid_files[idx] = add_gsub_to_font(file)

    merger = merge.Merger()
    print('Merging %d Fonts...' % len(valid_files))
    font = merger.merge(valid_files)
    # Use the line metric in the first font to replace the one in final result.
    metrics = read_line_metrics(ttLib.TTFont(valid_files[0]))
    set_line_metrics(font, metrics)
    font.save(args.output)
    font.close()

    print('%d fonts are merged. Cost %0.3f s.' % (len(valid_files), t.time()))
    print('Please check the result at %s.' % os.path.abspath(
        os.path.realpath(args.output)))
Exemple #7
0
def main(newName, files):
    t = Timer()
    parser = ArgumentParser()
    parser.add_argument('-d',
                        '--directory',
                        default='./',
                        help='Path to directory containing the fonts')
    # parser.add_argument('-o', '--output', default='merged.ttf',
    # help='Path to output file.')
    parser.add_argument('-v',
                        '--verbose',
                        action='store_true',
                        help='Verbose mode, printing out more info')
    args = parser.parse_args()

    logging.basicConfig(
        level=logging.INFO if args.verbose else logging.WARNING)

    valid_files = build_valid_filenames(files=files, directory=args.directory)
    if len(valid_files) <= 1:
        log.warning(
            'expecting at least two fonts to merge, but only got %d ' +
            'font(s).', len(valid_files))
        # sys.exit(-1)
        return

    for idx, file in enumerate(valid_files):
        if not has_gsub_table(file):
            log.info('adding default GSUB table to %s.' % file)
            valid_files[idx] = add_gsub_to_font(file)

    merger = merge.Merger()
    print('Merging %d Fonts...' % len(valid_files))
    font = merger.merge(valid_files)
    # Use the line metric in the first font to replace the one in final result.
    metrics = read_line_metrics(ttLib.TTFont(valid_files[0]))
    set_line_metrics(font, metrics)
    # print(os.path.basename(valid_files[0]))
    font.save(newName)
    font.close()

    print('%d fonts are merged. %d fonts are skipped. Cost %0.3f s.' %
          (len(valid_files), len(files) - len(valid_files), t.time()))
    print('Please check the result at %s.' %
          os.path.abspath(os.path.realpath(newName)))
    def test_using_logger_calling_instance(self, logger):
        timer = Timer(logger)
        with timer():
            time.sleep(0.01)

        assert re.match(r"elapsed time: [0-9]\.[0-9]{3}s",
                        logger.handlers[0].stream.getvalue())

        # do it again but with custom level
        with timer('redo it', level=logging.WARNING):
            time.sleep(0.02)

        assert re.search(r"WARNING: Took [0-9]\.[0-9]{3}s to redo it",
                         logger.handlers[0].stream.getvalue())
    def test_function_decorator(self, logger):
        timer = Timer(logger)

        @timer()
        def test1():
            time.sleep(0.01)

        @timer('run test 2', level=logging.INFO)
        def test2():
            time.sleep(0.02)

        test1()

        assert re.match(r"Took [0-9]\.[0-9]{3}s to run 'test1'",
                        logger.handlers[0].stream.getvalue())

        test2()

        assert re.search(r"Took [0-9]\.[0-9]{3}s to run test 2",
                         logger.handlers[0].stream.getvalue())
Exemple #10
0
def main():
    t = Timer()
    parser = ArgumentParser()
    parser.add_argument('-d', '--directory', default='./',
        help='Path to directory containing the fonts')
    parser.add_argument('-o', '--output', default='merged.ttf',
        help='Path to output file.')
    parser.add_argument('-v', '--verbose', action='store_true',
        help='Verbose mode, printing out more info')
    args = parser.parse_args()

    logging.basicConfig(level=logging.INFO if args.verbose else logging.WARNING)

    valid_files = build_valid_filenames(directory=args.directory)
    if len(valid_files) <= 1:
        log.warn('expecting at least two fonts to merge, but only got %d '
            + 'font(s).', len(valid_files))
        sys.exit(-1)

    for idx, file in enumerate(valid_files):
        if not has_gsub_table(file):
            log.info('adding default GSUB table to %s.' % file)
            valid_files[idx] = add_gsub_to_font(file)

    merger = merge.Merger()
    print('Merging %d Fonts...' % len(valid_files))
    font = merger.merge(valid_files)
    # Use the line metric in the first font to replace the one in final result.
    metrics = read_line_metrics(ttLib.TTFont(valid_files[0]))
    set_line_metrics(font, metrics)
    font.save(args.output)
    font.close()

    print('%d fonts are merged. %d fonts are skipped. Cost %0.3f s.' % (len(valid_files), len(files) - len(valid_files), t.time()))
    print('Please check the result at %s.' % os.path.abspath(
        os.path.realpath(args.output)))
 def test_time(self):
     timer = Timer()
     time.sleep(0.01)
     overall_time = timer.time()
     assert overall_time > 0
Exemple #12
0
                             Use value 1 to perform operation serially.

Usage (command line):
From the command line, you can either run the package as a module,

$ python -m compreffor --help

Or call the `compreffor` console script installed with the package.
Use -h/--help to list all the available options.
"""

import logging
from fontTools.misc.loggingTools import Timer

log = logging.getLogger(__name__)
timer = Timer(logger=logging.getLogger(log.name + ".timer"))

from compreffor import cxxCompressor, pyCompressor

__version__ = "0.4.6"


def compress(ttFont, method_python=False, **options):
    """ Subroutinize TTFont instance in-place using the C++ Compreffor.
    If 'method_python' is True, use the slower, pure-Python Compreffor.
    If the font already contains subroutines, it is first decompressed.
    """
    if has_subrs(ttFont):
        log.warning("There are subroutines in font; must decompress it first")
        decompress(ttFont)
    if method_python:
Exemple #13
0
from fontTools.misc.py23 import *
from fontTools.misc.timeTools import timestampNow
from fontTools import ttLib, cffLib
from fontTools.ttLib.tables import otTables, _h_e_a_d
from fontTools.ttLib.tables.DefaultTable import DefaultTable
from fontTools.misc.loggingTools import Timer
from fontTools.pens.recordingPen import DecomposingRecordingPen
from functools import reduce
import sys
import time
import operator
import logging


log = logging.getLogger("fontTools.merge")
timer = Timer(logger=logging.getLogger(__name__+".timer"), level=logging.INFO)


def _add_method(*clazzes, **kwargs):
	"""Returns a decorator function that adds a new method to one or
	more classes."""
	allowDefault = kwargs.get('allowDefaultTable', False)
	def wrapper(method):
		done = []
		for clazz in clazzes:
			if clazz in done: continue # Support multiple names of a clazz
			done.append(clazz)
			assert allowDefault or clazz != DefaultTable, 'Oops, table class not found.'
			assert method.__name__ not in clazz.__dict__, \
				"Oops, class '%s' has method '%s'." % (clazz.__name__, method.__name__)
			setattr(clazz, method.__name__, method)
Exemple #14
0
from fontTools import designspaceLib
from fontTools.misc.loggingTools import Timer, configLogger
from fontTools.misc.plistlib import load as readPlist
from fontTools.ttLib import TTFont
from fontTools.varLib.interpolate_layout import interpolate_layout
from ufo2ft import CFFOptimization
from ufo2ft.featureCompiler import parseLayoutFeatures
from ufo2ft.featureWriters import FEATURE_WRITERS_KEY, loadFeatureWriters
from ufo2ft.util import makeOfficialGlyphOrder

from fontmake import instantiator
from fontmake.errors import FontmakeError, TTFAError
from fontmake.ttfautohint import ttfautohint

logger = logging.getLogger(__name__)
timer = Timer(logging.getLogger("fontmake.timer"), level=logging.DEBUG)

PUBLIC_PREFIX = "public."
GLYPHS_PREFIX = "com.schriftgestaltung."
# for glyphsLib < 2.3.0
KEEP_GLYPHS_OLD_KEY = GLYPHS_PREFIX + "Keep Glyphs"
# for glyphsLib >= 2.3.0
KEEP_GLYPHS_NEW_KEY = (
    GLYPHS_PREFIX +
    "customParameter.InstanceDescriptorAsGSInstance.Keep Glyphs")
GLYPH_EXPORT_KEY = GLYPHS_PREFIX + "Glyphs.Export"

INTERPOLATABLE_OUTPUTS = frozenset(
    ["ttf-interpolatable", "otf-interpolatable", "variable", "variable-cff2"])

from fontTools.misc.py23 import tobytes, basestring
from fontTools.misc.loggingTools import configLogger, Timer
from fontTools.misc.transform import Transform
from fontTools.pens.transformPen import TransformPen
from fontTools.ttLib import TTFont
from fontTools import varLib
from fontTools.varLib.interpolate_layout import interpolate_layout
from ufo2ft import compileOTF, compileTTF
from ufo2ft.featureCompiler import FeatureCompiler
from ufo2ft.kernFeatureWriter import KernFeatureWriter
from ufo2ft.markFeatureWriter import MarkFeatureWriter

from fontmake.ttfautohint import ttfautohint

logger = logging.getLogger(__name__)
timer = Timer(logging.getLogger('fontmake.timer'), level=logging.DEBUG)

PUBLIC_PREFIX = 'public.'
GLYPHS_PREFIX = 'com.schriftgestaltung.'


class FontProject(object):
    """Provides methods for building fonts."""
    def __init__(self, timing=False, verbose='INFO'):
        logging.basicConfig(level=getattr(logging, verbose.upper()))
        logging.getLogger('fontTools.subset').setLevel(logging.WARNING)
        if timing:
            configLogger(logger=timer.logger, level=logging.DEBUG)

    @timer()
    def build_master_ufos(self,
 def test_context_manager(self):
     with Timer() as t:
         time.sleep(0.01)
     assert t.elapsed > 0
 def test_time(self):
     timer = Timer()
     time.sleep(0.01)
     overall_time = timer.time()
     assert overall_time > 0