Пример #1
0
class LivePremailer():
    def __init__(self):
        self.observer_paths = {HERE}
        self.bsync_params = {
            'server': None,
            'directory': None,
            'reloadDelay': 1000,
            'online': 'true',
            'logLevel': 'silent',
            'files': HERE,
        }

    def append_arguments(self, parser):
        parser.add_argument('--devpostfix',
                            nargs='?',
                            default='_dev',
                            help='Postfix which should be used to search\
                                  dev templates')
        parser.add_argument('--livepostfix',
                            nargs='?',
                            default='_live',
                            help='Postfix which should be used to name\
                                  files with live preview')
        parser.add_argument('--loadhistory',
                            action='store_true',
                            help='lpremailer will load all paths located\
                                  in {} file to memory and rerender them\
                                  everytime change in any file occurs'.format(
                                HISTORY_FILENAME))
        parser.add_argument('--savehistory',
                            action='store_true',
                            help='lpremailer will save all dev file paths\
                                  recorded during development in {} file'.
                            format(HISTORY_FILENAME))
        parser.add_argument('--astext',
                            action='store_true',
                            help='lpremailer will save all dev files\
                                  as simple txt messages')

    def parse_args(self):
        parser = argparse.ArgumentParser()
        subparsers = parser.add_subparsers()

        runserver_help = 'Runs server for live premailer'
        sub_parser = subparsers.add_parser(PARSER_RUN, help=runserver_help)
        sub_parser.set_defaults(which=PARSER_RUN)
        sub_parser.add_argument('--staticdir',
                                nargs='?',
                                help='Path to directory where static folder\
                                      is located')
        self.append_arguments(sub_parser)
        init_help = 'Create json files for htmls with provided\
                     postfix in current directory'

        sub_parser = subparsers.add_parser(PARSER_INIT, help=init_help)
        sub_parser.set_defaults(which=PARSER_INIT)
        sub_parser.add_argument('--force',
                                action='store_true',
                                help='Overwrites json files')
        self.append_arguments(sub_parser)

        self.args = parser.parse_args()

    def json_files(self):
        handler = RenderHandler(self.args)
        if self.args.which == PARSER_INIT:
            JsonGenerator(handler, HERE).generate()
            sys.exit(1)

    def start_observer(self):
        self.observer = PollingObserver()
        self.observer.should_keep_running()
        self.observer.handler = RenderHandler(self.args)
        for path in self.observer_paths:
            self.observer.schedule(self.observer.handler, path, recursive=True)
        self.observer.start()

    def update_params(self):
        if not os.path.exists(self.args.staticdir):
            logging.warning('Static files won\'t be maintained/served.')
            return
        files = '!**/*.less,!**/*.sass,!**/*.scss'
        files = (self.bsync_params['files'], self.args.staticdir, files)
        self.bsync_params['files'] = ','.join(files)
        self.bsync_params['ss'] = self.args.staticdir
        self.observer_paths.add(self.args.staticdir)

    def bsync_command(self):
        return 'browser-sync start {}'\
               .format(parse_params(self.bsync_params))

    def run_bsync(self):
        self.bsync = subprocess.Popen(self.bsync_command(), shell=True)

    def run(self):
        self.parse_args()
        self.json_files()
        self.update_params()
        self.start_observer()
        self.run_bsync()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            if self.args.savehistory:
                self.observer.handler.save_history()
            self.observer.stop()
            self.bsync.kill()
        self.observer.join()