Beispiel #1
0
def dist_daily_taw_run():
    cfg2 = Config()
    cfg2.load()
    etrm2 = Processes(cfg2)
    etrm2.set_save_dates(cfg2.save_dates)
    etrm2.modify_taw(cfg2.taw_modification)
    etrm2.run()
Beispiel #2
0
class TestConfig (unittest.TestCase):
    """ Test Config class. """

    def setUp(self):
        """ Set up Config instance. """
        config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                  'config')
        self.config = Config(config_dir)

    def test_singleton_shared_state(self):
        """ Check that two instances share state. """
        second = Config()
        second.foo = 'bar'
        self.assertEqual('bar', self.config.foo)
        self.config.bar = 'bash'
        self.assertEqual('bash', second.bar)

    def test_separate_tests(self):
        """ Test that tests do not affect each other's copy of config. """
        # Note, this relies on an implementation detail
        self.assertNotIn('foo', self.config.__dict__)

    def test_load(self):
        """ Test loading a yaml config file. """
        self.config.load('database')
        self.assertIsNotNone(self.config.database)

    def test_auto_load(self):
        """ Test autoloading a yaml config file. """
        self.assertIsNotNone(self.config.database)
Beispiel #3
0
class TestConfig(unittest.TestCase):
    """ Test Config class. """
    def setUp(self):
        """ Set up Config instance. """
        config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                  'config')
        self.config = Config(config_dir)

    def test_singleton_shared_state(self):
        """ Check that two instances share state. """
        second = Config()
        second.foo = 'bar'
        self.assertEqual('bar', self.config.foo)
        self.config.bar = 'bash'
        self.assertEqual('bash', second.bar)

    def test_separate_tests(self):
        """ Test that tests do not affect each other's copy of config. """
        # Note, this relies on an implementation detail
        self.assertNotIn('foo', self.config.__dict__)

    def test_load(self):
        """ Test loading a yaml config file. """
        self.config.load('database')
        self.assertIsNotNone(self.config.database)

    def test_auto_load(self):
        """ Test autoloading a yaml config file. """
        self.assertIsNotNone(self.config.database)
Beispiel #4
0
def dist_daily_taw_run():
    cfg2 = Config()
    cfg2.load()
    etrm2 = Processes(cfg2)
    etrm2.set_save_dates(cfg2.save_dates)
    etrm2.modify_taw(cfg2.taw_modification)
    etrm2.run()
Beispiel #5
0
def create_app():
    app = Flask(__name__)
    Config.load()

    for repo_name in Config.repos:
        repo = Repo(repo_name)
        app.register_blueprint(repo.blueprint)
        repos.append(repo)

    if not os.path.exists(Config.path_repos):
        os.makedirs(Config.path_repos, exist_ok=True)

    return app
Beispiel #6
0
class Application:
    def __init__(self, args):
        Log.append('app_init', 'Info', 'version: %s' % Const.version)
        set_default(default_zone=Zone(home_dir=pyinstaller.get_runtime_dir()))

        self.qt = QApplication(args)
        self.qt.setApplicationName(Const.app_name)
        self.qt.setWindowIcon(
            QIcon('%s/app/res/icon.png' % pyinstaller.get_runtime_dir()))

        self.hook_exception()

        self.config = Config()
        self.config.load()

        self.lang = None  # type: English
        self.load_language(Config.language)

        self.events = {
            'process_events': self.qt.processEvents,
            'export_log': self.export_log,
            'check_update': self.check_update,
            'load_language': self.load_language,
            'get_language': lambda: self.lang,
            'set_language': self.set_language,
            'get_config': lambda: self.config,
        }

    def load_language(self, language):
        self.lang = load_language(language)

    def set_language(self, language):
        self.lang = load_language(language)
        self.config.language = language
        self.config.save()

    def run(self):
        init_app(events=self.events)
        return self.qt.exec()

    def callback_exception(self, exc=None):
        if exc is None:
            exc = common.get_exception()
        Log.append(self.callback_exception, 'Error', exc)

        if QMessageBox.warning(None, self.lang.title_crash,
                               self.lang.description_crash):
            self.export_log()

    def export_log(self):
        folder = QFileDialog.getExistingDirectory(
            None, caption=self.lang.menu_export_log)
        if folder is not None:
            log = Log.extract_log()
            err = Log.extract_err()

            for f in Config._protect_fields:
                v = getattr(Config, f, '')
                if v != '':
                    log = log.replace(v, Const.protector)
                    err = err.replace(v, Const.protector)

            if log != '':
                with open('%s/%s' % (folder, '%s.log' % Const.app_name),
                          'w') as io:
                    io.write(log)

            if err != '':
                with open('%s/%s' % (folder, '%s.err' % Const.app_name),
                          'w') as io:
                    io.write(err)

    def check_update(self, test=False):
        try:
            release = github.get_latest_release(Const.author,
                                                Const.app_name,
                                                timeout=5)
            Log.append(self.check_update, 'Info', release)

            if test or common.compare_version(Const.version,
                                              release['tag_name']):
                if len(release['assets']) > 0:
                    QMessageBox.information(
                        self.lang.title_check_update, '%s\n%s\n\n%s' %
                        (self.lang.description_new_version, release['body'],
                         release['assets'][0]['browser_download_url']))
                else:
                    QMessageBox.information(
                        self.lang.title_check_update, '%s\n%s\n\n%s' %
                        (self.lang.description_new_version, release['body'],
                         release['assets'][0]['browser_download_url']))
        except:
            Log.append(self.check_update, 'Warning', common.get_exception())

    def hook_exception(self):
        def boom(type, value, tb):
            from io import StringIO
            from app.util import io_helper
            import traceback
            with StringIO() as io:
                traceback.print_exception(type, value, tb, file=io)
                exc = io_helper.read_all(io)
            self.callback_exception(exc)

        sys.excepthook = boom
Beispiel #7
0
class MainWindow(BaseMainWindow, MainWindowView):
    signal_set_preview = pyqtSignal(bytes)
    signal_refresh_scene = pyqtSignal(list)

    def __init__(self, app: BaseApplication):
        self._config = Config()
        self._config._config_path = os.path.expanduser('~/.coc_automator.json')
        self._device = None  # type: Device

        self._event = dict(
            config=lambda: self._config,
            set_preview=lambda: self.signal_set_preview,
            refresh_scenes=lambda: self.signal_refresh_scene,
        )

        super().__init__(app)

        app_shell = get_app_shell()
        self._adb = PyADB('%s/app/res/libs/adb' % app_shell.get_runtime_dir())
        self._automator = COCAutomator(self._event)
        self._automator.load('app/res/data.dat')

        self.signal_set_preview.connect(self.set_preview)
        self.signal_refresh_scene.connect(self.refresh_scenes)

        if self._config.load():
            devices = self._adb.devices
            if len(devices) == 0:
                self._adb.kill_server()
                self._adb.start_server()
                devices = self._adb.devices
            self._device = devices.get(self._config.device)
            self._automator.set_device(self._device)

    def sync_scenes(self):
        if self._device is not None:
            scenes = self._project.scenes
            data = []
            for k, v in scenes.items():
                v: SceneModel
                data.append([k, len(v.accuracy)])
            TableHelper.sync_data(self.tableWidgetScenes, data)
            TableHelper.auto_inject_columns_width(self.tableWidgetScenes)

    def _callback_select_device_triggered(self, b: bool):
        devices = self._adb.devices
        if len(devices) == 0:
            self._adb.kill_server()
            self._adb.start_server()
        devices = self._adb.devices

        item = SelectDialog.select(
            self,
            title=self.tr('Select Device'),
            cols_title=[self.tr('Device'), self.tr('State')],
            rows=[(sn, device.state) for sn, device in devices.items()],
            item_keys=['sn', 'state'])

        if item is not None:
            self._device = devices[item['sn']]
            self._automator.set_device(self._device)
            self._config.device = item['sn']
            self._config.save()

    def _callback_settings_triggered(self, b: bool):
        data = FormDialog.input([
            StringField('device', self._config.device, self.tr('Device')),
            SelectField('app_package', Const.dta_app_packages,
                        self._config.app_package, self.tr('App Package')),
        ])
        if data is not None:
            object_convert.dict_to_object(data, self._config, False)
            self._config.save()

    @try_exec(show=True, info_only=True)
    def _callback_run_triggered(self, b: bool):
        package = self._config.app_package
        if package != '':
            self._device.app.start_by_package(package)
        else:
            raise Exception(self.tr('App Package is empty!'))

    def _callback_kill_triggered(self, b: bool):
        package = self._config.app_package
        if package != '':
            self._device.app.force_stop(package)

    def _callback_restart_triggered(self, b: bool):
        self._callback_kill_triggered(b)
        self._callback_run_triggered(b)

    def _callback_play_triggered(self, b: bool):
        self._automator.play()

    def _callback_pause_triggered(self, b: bool):
        self._automator.pause()

    def _callback_stop_triggered(self, b: bool):
        self._automator.stop()

    def _callback_scale_changed(self, v: int):
        self.refresh_preview_size()

    def refresh_preview_size(self):
        pixmap = self.labelPreview.pixmap()
        if pixmap is not None:
            size = pixmap.size()
            scale = self.verticalSliderScale.value(
            ) / self.verticalSliderScale.maximum()
            size.setWidth(int(size.width() * scale))
            size.setHeight(int(size.height() * scale))
            self.labelPreview.setMinimumSize(size)
            self.labelPreview.setMaximumSize(size)

    def set_preview(self, img_data: bytes):
        pixmap = QPixmap()
        pixmap.loadFromData(img_data)
        self.labelPreview.setPixmap(pixmap)
        self.refresh_preview_size()

    def refresh_scenes(self, data):
        mi = -1
        mv = 0
        for i, (k, v) in enumerate(data):
            if v > mv:
                mi, mv = i, v
            data[i] = [k, '%.6f' % v]

        TableHelper.sync_data(self.tableWidgetScenes, data)
        TableHelper.auto_inject_columns_width(self.tableWidgetScenes)
        self.tableWidgetScenes.selectRow(mi)
        self.app.processEvents()

    def closeEvent(self, *args):
        self._automator.stop()
        self._automator.destroy()
        return super().closeEvent(*args)