Beispiel #1
0
 def test_stop_and_persist_no_dict_or_options(self):
     """Test if options is not dict or required options in stop_and_persist.
     """
     with self.assertRaises(TypeError):
         spinner = Halo()
         spinner.start()
         spinner.stop_and_persist('not dict')
Beispiel #2
0
def get_accounts(hi_api_key, hi_api_url):

    spinner = Halo(text="Fetching account via Hi-iQ api ..",
                   spinner='dots',
                   text_color="grey")
    spinner.start()

    headers = {"Authorization": "ematic-admin-apikey=" + hi_api_key}
    try:
        res = requests.get(hi_api_url + "/account", headers=headers, timeout=5)
    except requests.Timeout:
        print("Timeout occured. You should reset your network")
        return -1, [], []

    if res.status_code != 200:
        print("Request to our Hi-iQ api went to errors!")
        print("Response status code: ", res.status_code)
        return -1, [], []

    account_list = {}
    default_list = {}

    for account in res.json()['account']:
        if account['espId'] == 10 and account['active']:
            # print("account: ", account)
            account_list[account['name']] = account['espAPIKey']
            default_list[account['name']] = account['espList']

    spinner.stop_and_persist(symbol=LogSymbols.SUCCESS.value,
                             text="Done fetching account via Hi-iQ api")

    return 1, account_list, default_list
Beispiel #3
0
def doDaka(username, password, logger):
    print("\n[Time] %s" %
          datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("🚌 打卡任务启动")
    logger.info("🚌 打卡任务启动")

    spinner = Halo(text='Loading', spinner='dots')
    spinner.start('正在新建打卡实例...')
    logger.info('正在新建打卡实例...')

    dk = DaKa(username, password)
    spinner.succeed('已新建打卡实例')
    logger.info('已新建打卡实例')

    spinner.start(text='登录到浙大统一身份认证平台...')
    logger.info('登录到浙大统一身份认证平台...')
    dk.login()
    spinner.succeed('已登录到浙大统一身份认证平台')
    logger.info('已登录到浙大统一身份认证平台')

    spinner.start(text='正在获取个人信息...')
    logger.info('正在获取个人信息...')
    dk.get_info()
    spinner.succeed('%s 同学, 你好~' % (dk.name))
    logger.info('%s 同学, 你好~' % (dk.name))

    spinner.start(text='正在为您打卡打卡打卡')
    logger.info('正在为您打卡打卡打卡')
    res = dk.post()
    if str(res['e']) == '0':
        spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'), text='已为您打卡成功!')
        logger.info('已为您打卡成功!')
    else:
        spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'), text=res['m'])
        logger.info(res['m'])
Beispiel #4
0
    def spinner(spin_txt: str,
                function: callable,
                url: str = None,
                *args,
                name: str = None,
                spinner: str = "dots",
                debug: bool = False,
                **kwargs) -> Any:
        name = name or spin_txt.replace(" ", "_").rstrip(".").lower()
        if not name.startswith("spinner_"):
            name = f"spinner_{name}"

        spin = None
        if sys.stdin.isatty():
            # If a spinner is already running, update that spinner vs creating new
            active_spinners = [
                t for t in threading.enumerate()[::-1]
                if t.name.startswith("spinner")
            ]
            if active_spinners:
                spin = active_spinners[0]._target.__self__
                if debug:
                    spin.stop()
                else:
                    log.warning(
                        f"A Spinner was already running '{spin.text}' updating to '{spin_txt}'"
                    )
                    spin.text == spin_txt
                    spin.spinner == "dots12" if spin.spinner == spinner else spinner
            elif not debug:
                spin = Halo(text=spin_txt, spinner=spinner)
                spin.start()
                threading.enumerate()[-1].name = spin._spinner_id = name

        if url:
            args = (url, *args)

        r = function(*args, **kwargs)

        if spin:
            # determine pass if request successful
            _spin_fail_msg = spin_txt
            ok = None
            if hasattr(r, "ok"):
                ok = r.ok
            if "refreshToken" in str(function):
                ok = r is not None
                if hasattr(r, "json"):
                    _spin_fail_msg = f"spin_text\n   {r.json().get('error_description', spin_txt)}"

            if ok is True:
                spin.succeed()
            elif ok is False:
                spin.fail(_spin_fail_msg)
            else:
                spin.stop_and_persist()

        return r
Beispiel #5
0
def end_notification(spinner: Halo, success=True):
    mark = '✔' if success else '✘'
    if sys.stdout.isatty():  # pragma: no-cover
        if success:
            spinner.succeed()
        else:
            mark = colored_frame(mark, 'red')
            spinner.stop_and_persist(mark)
    else:
        print(mark, end='')
Beispiel #6
0
def download_files(folder_title: str, LINKS: List[str], args: argparse.Namespace):
    """
    Download files when the given URL is parsed
    """

    ROOT_PATH = Path.cwd()
    links_len = len(LINKS)

    if args.name:
        dir_path = ROOT_PATH / args.name
    else:
        dir_path = ROOT_PATH / folder_title

    # Create folder
    spinner = Halo(text="Creating folder", spinner="dots")
    spinner.start()
    try:
        dir_path.mkdir()
    except FileExistsError as _:
        pass
    spinner.stop_and_persist(symbol="✅".encode("utf-8"), text="Folder Created")

    print(f"Total files: {links_len}")
    print(f"Download Path: {dir_path}")

    # Start download
    for index, url in enumerate(LINKS):
        r = requests.get(url, stream=True, headers={"Accept-Encoding": None})
        total_size = int(r.headers.get("Content-Length"))

        spinner.text = f"Downloading {index + 1}/{links_len} file"
        spinner.spinner = "arrow3"
        spinner.start()
        time.sleep(1)
        spinner.stop()

        file = url.split("/")[-1]
        file = (file[:50] + "...") if len(file) > 50 else file
        with open(dir_path / file, "wb") as f:
            with tqdm(
                total=total_size,
                desc=f"{file:<53}",
                unit="B",
                unit_scale=True,
                bar_format="{l_bar}{bar:20}{r_bar}{bar:-10b}",
            ) as pbar:
                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(chunk)
                        pbar.update(len(chunk))

    spinner.spinner = "monkey"
    spinner.start()
    time.sleep(2)
    spinner.stop_and_persist(symbol="🔥".encode("utf-8"), text="All files downloaded.")
Beispiel #7
0
def doDaka(username, password, logger):
    print("\n[Time] %s" %
          datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("🚌 打卡任务启动")
    logger.info("🚌 打卡任务启动")

    spinner = Halo(text='Loading', spinner='dots')
    spinner.start('正在新建打卡实例...')
    logger.info('正在新建打卡实例...')

    dk = DaKa(username, password)
    spinner.succeed('已新建打卡实例')
    logger.info('已新建打卡实例')

    spinner.start(text='登录到浙大统一身份认证平台...')
    logger.info('登录到浙大统一身份认证平台...')
    try:
        dk.login()
        spinner.succeed('已登录到浙大统一身份认证平台')
        logger.info('已登录到浙大统一身份认证平台')
    except Exception as err:
        spinner.fail(str(err))
        logger.info(str(err))
        return

    spinner.start(text='正在获取个人信息...')
    logger.info('正在获取个人信息...')
    try:
        dk.get_info()
        spinner.succeed('%s %s同学, 你好~' % (dk.info['number'], dk.info['name']))
        logger.info('%s %s同学, 你好~' % (dk.info['number'], dk.info['name']))
    except Exception as err:
        spinner.fail('获取信息失败,请手动打卡,更多信息: ' + str(err))
        logger.info('获取信息失败,请手动打卡,更多信息: ' + str(err))
        return

    spinner.start(text='正在为您打卡打卡打卡')
    logger.info('正在为您打卡打卡打卡')
    try:
        res = dk.post()
        if str(res['e']) == '0':
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text='已为您打卡成功!')
            logger.info('已为您打卡成功!')
        else:
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text=res['m'])
            logger.info(res['m'])
    except:
        spinner.fail('数据提交失败')
        logger.info('数据提交失败')
        return
Beispiel #8
0
def main():
    init()  #initialize colorama
    print(Back.BLUE + Fore.RED + " halo spinner example ")
    #create the Halo spinner
    spinner = Halo(text='What is taking so long..',
                   text_color='cyan',
                   color='green')
    #start the spin simulation
    spinner.start()
    #sleep
    time.sleep(5)
    #stop and print the final message
    spinner.stop_and_persist(symbol='✔ '.encode('utf-8'), text='Done!')
def submit_job(code_url, cpus, memory_mb, max_runtime_secs):
    job_spec = {
        "code_url": code_url,

        # TODO: Later, when we add support for resource_requirements, test some real values for this
        "resource_requirements": {
            "cpus": cpus,
            "memory_mb": memory_mb,
            "max_runtime_secs": max_runtime_secs
        }
    }

    print("Submitting job...")
    res = requests.post(submit_job_url, json=job_spec)
    if res.status_code != 200:
        print("Could not submit job!")
        sys.exit(1)

    resp = res.json()
    if not resp.get("success", False):
        print("Could not submit job!")
        sys.exit(1)

    job_id = resp['job_id']

    job_status_code = None

    spinner = Halo(text="Waiting for job updates", spinner='dots')
    spinner.start()

    while True:
        try:
            new_job_status_code = get_job_status(job_id)
            if new_job_status_code != job_status_code:
                if new_job_status_code in ("UNASSIGNED", "ASSIGNED"):
                    spinner.info(STATUS_CODE_MESSAGES[new_job_status_code])
                    spinner.start("Waiting for job updates")
                elif new_job_status_code == "FAILED":
                    spinner.fail(STATUS_CODE_MESSAGES[new_job_status_code])
                    spinner.start("Waiting for job updates")
                else:
                    # the job has succeeded
                    spinner.stop_and_persist(
                        symbol='🦄'.encode('utf-8'),
                        text=STATUS_CODE_MESSAGES[new_job_status_code])
                    break
                job_status_code = new_job_status_code
            time.sleep(JOB_STATUS_POLL_INTERVAL_SECS)
        except (KeyboardInterrupt, SystemExit):
            spinner.stop()
            break
Beispiel #10
0
def main(username, password):
    """Hit card process

    Arguments:
        username: (str) 浙大统一认证平台用户名(一般为学号)
        password: (str) 浙大统一认证平台密码
    """
    global final_return_text
    print("\n[Time] %s" %
          datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("🚌 打卡任务启动")
    spinner = Halo(text='Loading', spinner='dots')
    spinner.start('正在新建打卡实例...')
    dk = DaKa(username, password)
    spinner.succeed('已新建打卡实例')

    spinner.start(text='登录到浙大统一身份认证平台...')
    try:
        dk.login()
        spinner.succeed('已登录到浙大统一身份认证平台')
    except Exception as err:
        spinner.fail(str(err))
        return

    spinner.start(text='正在获取个人信息...')
    try:
        dk.get_info()
        spinner.succeed('%s %s同学, 你好~' % (dk.info['number'], dk.info['name']))
    except Exception as err:
        spinner.fail('获取信息失败,请手动打卡,更多信息: ' + str(err))
        final_return_text = "获取信息失败,请手动打卡。错误信息:" + str(err)
        return

    spinner.start(text='正在为您打卡打卡打卡')
    try:
        res = dk.post()
        if str(res['e']) == '0':
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text='已为您打卡成功!')
            final_return_text = "🦄 已为您打卡成功!"
        else:
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text=res['m'])
            final_return_text = '🦄  ' + res['m']
    except:
        final_return_text = '❌数据提交失败'
        spinner.fail('数据提交失败')
        return
Beispiel #11
0
    def test_closing_stream_before_persistent(self):
        """Test no I/O is performed on streams closed before stop_and_persist is called
        """
        stream = io.StringIO()
        spinner = Halo(text='foo', stream=stream)
        spinner.start()
        time.sleep(0.5)

        # no exception raised after closing the stream means test was successful
        try:
            stream.close()

            time.sleep(0.5)
            spinner.stop_and_persist('done')
        except ValueError as e:
            self.fail('Attempted to write to a closed stream: {}'.format(e))
Beispiel #12
0
def main(username, password):
    """Hit card process

    Arguments:
        username: (str) 浙大统一认证平台用户名(一般为学号)
        password: (str) 浙大统一认证平台密码
    """
    print("\n[Time] %s" %
          datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("🚌 打卡任务启动")
    spinner = Halo(text='Loading', spinner='dots')
    spinner.start('正在新建打卡实例...')
    hit_carder = HitCarder(username, password)
    spinner.succeed('已新建打卡实例')

    spinner.start(text='登录到浙大统一身份认证平台...')
    try:
        hit_carder.login()
        spinner.succeed('已登录到浙大统一身份认证平台')
    except Exception as err:
        spinner.fail(str(err))
        return

    spinner.start(text='正在获取个人信息...')
    try:
        hit_carder.get_info()
        spinner.succeed('%s %s同学, 你好~' %
                        (hit_carder.info['number'], hit_carder.info['name']))
    except Exception as err:
        spinner.fail('获取信息失败,请手动打卡,更多信息: ' + str(err))
        return

    spinner.start(text='正在为您打卡...')
    try:
        res = hit_carder.post()
        if str(res['e']) == '0':
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text='已为您打卡成功!')
        else:
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text=res['m'])
    except Exception as err:
        spinner.fail('数据提交失败 ' + str(err))
        return
Beispiel #13
0
def run():
    # Prompt input
    while True:
        service_name = input("Service name: ").strip().replace(" ", "-")
        if service_name:
            break
        else:
            print("Please enter a service name")
    root_dir = input("Root directory (blank for current directory): ")
    service = Service(service_name, root_dir)

    # Create file structure
    spinner = Halo(text="Creating file structure")
    spinner.start()
    service.create_tree()
    spinner.succeed()

    # Generate venv
    spinner.start("Generating virtual environment")
    service.generate_venv()
    spinner.succeed()

    # Activate venv and install requirements
    spinner.start("Installing requirements")
    service.install_requirements()
    spinner.succeed()

    # Initialize git
    spinner.start("Initializing git repository")
    service.initialize_git()
    spinner.succeed()

    # Personalize
    spinner.start("Personalizing")
    service.personalize()
    spinner.succeed()

    # Done!
    spinner.stop_and_persist("🎂".encode("utf-8"), "All done!")
    print("Your new project is located in:", service.cwd, sep="\t")
Beispiel #14
0
def main(username, password, eai_sess, UUkey):
    print("\n[Time] %s" % datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("🚌 打卡任务启动")
    spinner = Halo(text='Loading', spinner='dots')
    spinner.start('正在新建打卡实例...')
    dk = DaKa(username, password, eai_sess, UUkey)
    spinner.succeed('已新建打卡实例')

    spinner.start(text='登录到中南大学信息门户...')
    dk.login()
    spinner.succeed('已登录到中南大学信息门户')

    spinner.start(text='正在获取个人信息...')
    dk.get_info()
    spinner.succeed('%s %s同学, 你好~' % (dk.info['number'], dk.info['name']))

    spinner.start(text='正在为您打卡打卡打卡')
    res = dk.post()
    if str(res['e']) == '0':
        spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'), text='已为您打卡成功!')
    else:
        spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'), text=res['m'])
Beispiel #15
0
def check_db_status():
    spinner = Halo(text='Populating Database', spinner='dots')
    spinner.start()
    if not os.path.exists(DB_PATH):
        table_sql = """CREATE TABLE IF NOT EXISTS questions (
                                            id text PRIMARY KEY,
                                            q_text text NOT NULL,
                                            answer text,
                                            category text
                                        );"""
        create_DB(DB_PATH)
        create_table(table_sql)
        BASE_QUESTIONS_PATH = root_dir_path + '/data/base_questions.csv'
        if os.path.exists(BASE_QUESTIONS_PATH):
            df = pd.read_csv(BASE_QUESTIONS_PATH, header=0)
            df = df.dropna()
            for index, row in df.iterrows():
                # print ('{} -> {}'.format(type(row['Question']), type(row['Answer'])))
                q = Question(row['Question'])
                q.create_question()
                q.answer_question(row['Answer'])
    spinner.stop_and_persist(symbol='✅ '.encode('utf-8'),
                             text='Populated/Loaded Database')
Beispiel #16
0
class CLIConnectionRecovery(ConnectionRecovery):
    """
    CLI Connection recovery class.
    """

    def __init__(self, access_address, channel_map=None, crc=None, hop_interval=None, devices=None, baudrate=115200, hijack=False, jamming=False, output=None, debug=False, verbose=False):
        super().__init__(
            access_address,
            channel_map=channel_map,
            crc=crc,
            hop_interval=hop_interval,
            devices=devices,
            baudrate=baudrate
        )
        self.output = output
        self.debug = debug
        self.verbose = verbose

        self._jamming = jamming
        self._hijack = hijack
        self._pt = None

        # Display sniffers version
        major,minor = [int(v) for v in VERSION.split('.')]
        versions = self.interface.get_version()
        print('[i] Detected sniffers:')
        for i, version in enumerate(versions):
            print(' > Sniffer #%d: fw version %d.%d' % (i, version[0], version[1]))
            if (major == version[0] and (minor > version[1])) or (major > version[0]):
                print(' -!!!- You must update the firmware of this sniffer -!!!-')
                raise SnifferUpgradeRequired()

        print('')
        print('[i] Synchronizing with connection 0x%08x ...' % access_address)
        #self.spinner = Spinner('Computing CRCInit value')
        if crc is None:
            self.spinner = Halo(text='Computing CRCInit value', spinner='line')
        elif channel_map is not None:
            print('✓ CRCInit: 0x%006x' % crc)
            print('✓ Channel map is provided: 0x%010x' % self.chm)
            self.spinner = Halo(text='Computing hop interval', spinner='line')
        else:
            print('✓ CRCInit: 0x%006x' % crc)
            self.spinner = Halo(text='Determining channel map', spinner='line')
        self.spinner.start()
        self.access_address = access_address

    def on_verbose(self, packet):
        """
        Called when a verbose packet is received from the sniffer.
        """
        if self.verbose:
            print('@> '+ str(packet.message))

    def on_debug(self, packet):
        """
        Called when a debug packet is received from the sniffer.
        """
        print('D:'+str(packet))

    def on_crc(self, crc):
        """
        Connection CRC has been recovered.
        """
        self.crc = crc
        self.spinner.stop_and_persist(
            symbol='✓'.encode('utf-8'),
            text='CRCInit = 0x%06x'%crc
        )
        if self.chm_provided:
            print('✓ Channel map is provided: 0x%010x' % self.chm)
            self.spinner.text = 'Computing hop interval'
            self.spinner.start()
            self.interface.recover_hop(self.access_address, self.crc, self.chm)
        else:
            self.spinner.text = 'Determining channel map'
            self.spinner.start()

    def on_chm(self, chm):
        """
        Channel map has been recovered.
        """
        self.chm = chm
        self.spinner.stop_and_persist(
            symbol='✓'.encode('utf-8'),
            text='Channel Map = 0x%010x'%chm
        )
        if self.hop_provided:
            print('✓ Hop interval is provided: %d' % self.hop_interval)
            self.spinner.text = 'Computing hop increment'
            self.spinner.start()
        else:
            self.spinner.text = 'Computing hop interval'
            self.spinner.start()
            self.interface.recover_hop(self.access_address, self.crc, self.chm)

    def on_hopinterval(self, interval):
        """
        Hop interval has been recovered.
        """
        self.spinner.stop_and_persist(
            symbol='✓'.encode('utf-8'),
            text='Hop interval = %d'%interval
        )
        self.spinner.text = 'Computing hop increment'
        self.spinner.start()

    def on_hopincrement(self, increment):
        """
        Hop increment has been recovered.
        """
        self.spinner.stop_and_persist(
            symbol='✓'.encode('utf-8'),
            text='Hop increment = %d'%increment
        )
        if self._hijack:
            print('[i] Synchronized, hijacking in progress ...')
            self.hijack()
        elif self._jamming:
            print('[i] Synchronized, jamming in progress ...')
            self.jam()
        else:
            print('[i] Synchronized, packet capture in progress ...')


    def on_ll_packet(self, packet):
        """
        A BLE LL packet has been captured.
        """
        if self._pt is not None:
            self._pt.on_ll_packet(packet)
        else:
            timestamp = time()
            ts_sec = int(timestamp)
            ts_usec = int((timestamp - ts_sec)*1000000)
            if self.output is not None:
                self.output.write_packet(ts_sec, ts_usec, self.access_address, packet.data)
            pkt_hex = ' '.join(['%02x' % c for c in packet.data[10:]])
            print('LL Data: ' + pkt_hex)

    def on_hijacking_success(self):
        """
        Hijacking was successful, hijacker now owns this connection.
        """
        print('[i] Connection successfully hijacked, it is all yours \o/')
        self._pt = PromptThread(self)
        self._pt.start()

    def on_hijacking_failed(self):
        """
        Could not hijack this connection.
        """
        print('[!] Hijack failed.')

    def hijack_done(self):
        """
        Hijack terminated callback
        """
        #raise ForcedTermination()

    def on_packet_received(self, packet):
        if self._pt is not None and self._pt.canceled:
            self._pt.join()
            raise ForcedTermination()
        else:
            super().on_packet_received(packet)


    def on_connection_lost(self):
        """
        Connection lost.
        """
        # if we were hijacking, close PromptThread
        if self._pt is not None:
            # Kill prompt thread and wait for its termination.
            self._pt.cancel()
            self._pt.join()

        # Okay, we exit here.
        print('[!] Connection lost.')
        raise ForcedTermination()
Beispiel #17
0
class ScrapeTaskABC(ABC):
    data_set: DataSet
    url_tracker: UrlTracker

    def __init__(self, app, db_job):
        self.app = app
        self.config = app.config
        self.db_session = app.db_session
        self.scraped_data = app.scraped_data
        self.db_job = db_job
        self.start_date = None
        self.end_date = None
        self.season = self.db_job.season
        self.total_days = self.db_job.total_days
        self.scrape_condition = self.app.get_current_setting(
            "SCRAPE_CONDITION", self.data_set)
        self.spinner = Halo(color=JOB_SPINNER_COLORS[self.data_set],
                            spinner="dots3")

    @property
    def date_range(self):
        return get_date_range(self.start_date, self.end_date)

    def execute(self, start_date=None, end_date=None):
        self.start_date = start_date
        self.end_date = end_date
        if not start_date:
            self.start_date = self.db_job.start_date
        if not end_date:
            self.end_date = self.db_job.end_date

        result = (self.initialize().on_success(
            self.identify_needed_urls).on_success(
                self.retrieve_scraped_html).on_success(
                    self.scrape_missing_html).on_success(
                        self.parse_scraped_html))
        self.spinner.stop()
        if result.failure:
            return result
        self.url_tracker.remove_scraped_html()
        return Result.Ok()

    def initialize(self):
        if self.scrape_condition == ScrapeCondition.NEVER:
            return Result.Fail("skip")
        signal(
            SIGINT,
            partial(user_cancelled, self.db_session, self.db_job,
                    self.spinner))
        self.spinner.text = "Building URL List..."
        self.spinner.start()
        self.url_tracker = UrlTracker(self.db_job, self.data_set,
                                      self.scraped_data)
        result = self.url_tracker.create_url_set(self.start_date,
                                                 self.end_date)
        return result if result.failure else Result.Ok(
        ) if self.url_tracker.total_urls else Result.Fail("skip")

    def identify_needed_urls(self):
        self.spinner.text = self.url_tracker.identify_html_report
        for game_date, urls in self.url_tracker.all_urls.items():
            result = self.check_prerequisites(game_date)
            if result.failure:
                return result
            result = self.check_current_status(game_date)
            if result.failure:
                if "skip" not in result.error:
                    return result
                self.url_tracker.skip_urls.extend(urls)
            else:
                self.url_tracker.need_urls.extend(urls)
            self.spinner.text = self.url_tracker.identify_html_report
        return Result.Ok()

    def retrieve_scraped_html(self):
        self.spinner.text = self.url_tracker.retrieve_html_report
        if not self.url_tracker.need_urls:
            return Result.Fail("skip")
        for url in self.url_tracker.need_urls[:]:
            self.scraped_data.get_html(self.data_set, url.url_id)
            if not url.html_was_scraped:
                self.url_tracker.missing_urls.append(url)
            else:
                self.url_tracker.cached_urls.append(url)
            self.url_tracker.need_urls.remove(url)
            self.spinner.text = self.url_tracker.retrieve_html_report
        return Result.Ok()

    def scrape_missing_html(self):
        while not self.url_tracker.html_scraping_complete:
            self.spinner.text = self.url_tracker.scrape_html_report
            self.spinner.stop_and_persist(self.spinner.frame(), "")
            result = self.invoke_nodejs_script()
            self.spinner.text = self.url_tracker.save_html_report
            self.spinner.start()
            for url in self.url_tracker.missing_urls[:]:
                if not url.scraped_html_is_valid:
                    continue
                result = self.scraped_data.save_html(self.data_set, url.url_id,
                                                     url.html)
                if result.failure:
                    return result
                self.url_tracker.completed_urls.append(url)
                self.url_tracker.missing_urls.remove(url)
                self.spinner.text = self.url_tracker.save_html_report
        return Result.Ok()

    def invoke_nodejs_script(self):
        missing_urls_filepath = self.url_tracker.create_missing_urls_json_file(
        )
        script_args = self.config.get_nodejs_script_args(
            self.data_set, missing_urls_filepath)
        result = execute_nodejs_script(NODEJS_SCRIPT, script_args)
        missing_urls_filepath.unlink()
        return result

    def parse_scraped_html(self):
        parsed = 0
        self.spinner.text = self.url_tracker.parse_html_report(parsed)
        for urls_for_date in self.url_tracker.all_urls.values():
            for url_details in urls_for_date:
                if url_details.url_id not in self.url_tracker.parse_url_ids:
                    continue
                result = self.parse_html(url_details)
                if result.failure:
                    if ("Unable to parse any game data" in result.error
                            or "will be completed at a later date"
                            in result.error):
                        continue
                    return result
                parsed_data = result.value
                result = self.scraped_data.save_json(self.data_set,
                                                     parsed_data)
                if result.failure:
                    return result
                result = self.update_status(parsed_data)
                if result.failure:
                    return result
                self.db_session.commit()
                parsed += 1
                self.spinner.text = self.url_tracker.parse_html_report(parsed)
        return Result.Ok()

    @abstractmethod
    def check_prerequisites(self, game_date):
        pass

    @abstractmethod
    def check_current_status(self, game_date):
        pass

    @abstractmethod
    def parse_html(self, url_details):
        pass

    @abstractmethod
    def update_status(self, parsed_data):
        pass
Beispiel #18
0
resolved_circuit = circuit.with_parameters_resolved_by(resolver)
print('Resulting parameterized symbolic circuit:\n{}'.format(resolved_circuit))

spinner = Halo(text='Sweeping across the circuit', spinner='simpleDots')
spinner.start()

sweep_size = 10
sweep = (cirq.Linspace(key='alpha', start=0.0, stop=1.0, length=10) *
         cirq.Linspace(key='beta', start=0.0, stop=1.0, length=10) *
         cirq.Linspace(key='gamma', start=0.0, stop=1.0, length=10))
results = simulator.run_sweep(circuit, params=sweep, repetitions=100)

obj_min = None
min_params = None

spinner.stop_and_persist('✓')
spinner.start('Solving Objective Function')

for result in results:
    value = obj_func(result)
    if obj_min is None or value < obj_min:
        obj_min = value
        min_params = result.params
        pass
    pass
pass

spinner.stop_and_persist('✓')

print('Minimum objective value is {}.'.format(obj_min))
Beispiel #19
0
        # find the editing location of the source file
        tag = main_index.find('div', {'class': 'wrapper'})
        tag.insert(0, body)

        # save the new edited source file
        with open(os.path.join(message.file_dir, '../index.html'),
                  'w') as file:
            file.write(str(main_index))

        spinner = Halo(text='Creating post...',
                       spinner='pong',
                       text_color='magenta')
        spinner.start()
        time.sleep(4)
        spinner.stop_and_persist(
            text="New post successfully created and appended to the index",
            symbol='✔ ')  # ✔

    if answers['item'] == "edit post":
        # filter files
        places = [y[0] for x, y in post_data.items()]

        post = {
            'type': 'list',
            'name': 'item',
            'message': 'Which post?',
            'choices': places,
        }

        # file selected
        answer = prompt(message.post, style=message.style)['item']
Beispiel #20
0
    # print ([round(y, 2) for y in y_hat])
    print(
        'Most Similar Question is: {0} -- [Probability: {1}]'.format(
            data['question1'][idx]), y_hat[idx])
    return y_hat


if __name__ == '__main__' and getpass.getuser() != "jonahadler":
    start = time.time()
    check_db_status()
    spinner = Halo(
        text='Loading Question Matching Engine (could take up to 5 minutes)',
        spinner='dots')
    spinner.start()
    load_models()
    spinner.stop_and_persist(symbol='✅ '.encode('utf-8'),
                             text='Loaded Question Matching Model')
    end = time.time()
    print(
        'Finished initalization steps in {0:.2f} minutes, ready to handle questions'
        .format((end - start) / 60))

    process = psutil.Process(os.getpid())
    print('Current using {0:.2f}% of the process\' memory'.format(
        process.memory_percent()))
    # input_q = input('What is your question?\n')
    # input_q = 'Can you used piped text in a Web Service?'
    # input_q = 'What should I do to be a great geologist?'

    while True:
        input_q = input('What is your question?\n')
        if input_q == 'q' or input_q == 'quit':
Beispiel #21
0
# -*- coding: utf-8 -*-
"""Example for doge spinner ;)
"""
from __future__ import unicode_literals
import os
import sys
import time

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from halo import Halo

spinner = Halo(text='Such Spins', spinner='dots')

try:
    spinner.start()
    time.sleep(2)
    spinner.text = 'Much Colors'
    spinner.color = 'magenta'
    time.sleep(2)
    spinner.text = 'Very emojis'
    spinner.spinner = 'hearts'
    time.sleep(2)
    spinner.stop_and_persist({
        'symbol': '🦄 '.encode('utf-8'),
        'text': 'Wow!'
    })
except (KeyboardInterrupt, SystemExit):
    spinner.stop()
Beispiel #22
0
def main(username, password):
    """Hit card process

    Arguments:
        username: (str) 浙大统一认证平台用户名(一般为学号)
        password: (str) 浙大统一认证平台密码
    """
    try:
        scheduler.remove_job('checkin_ontime')
    except JobLookupError as e:
        pass

    print("\n[Time] %s" %
          datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    print("🚌 打卡任务启动")
    spinner = Halo(text='Loading', spinner='dots')
    spinner.start('正在新建打卡实例...')
    ci = CheckIn(username, password)
    spinner.succeed('已新建打卡实例')

    spinner.start(text='登录到浙大统一身份认证平台...')
    try:
        ci.login()
        spinner.succeed('已登录到浙大统一身份认证平台')
    except Exception as err:
        spinner.fail(str(err))
        return

    spinner.start(text='正在获取个人信息...')
    try:
        ci.get_info()
        spinner.succeed('%s %s同学, 你好~' % (ci.info['number'], ci.info['name']))
    except Exception as err:
        spinner.fail('获取信息失败,请手动打卡,更多信息: ' + str(err))
        return

    spinner.start(text='正在为您打卡打卡打卡')
    try:
        res = ci.post()
        if str(res['e']) == '0':
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text='已为您打卡成功!')
        else:
            spinner.stop_and_persist(symbol='🦄 '.encode('utf-8'),
                                     text=res['m'])

        # Random time
        random_time = random.randint(0, 60) + hour * 60 + minute
        random_hour = random_time // 60
        random_minute = random_time % 60
        weekday = (datetime.datetime.now().weekday() + 1) % 7

        # Schedule task
        scheduler.add_job(main,
                          'cron',
                          id='checkin_ontime',
                          args=[username, password],
                          day_of_week=weekday,
                          hour=random_hour,
                          minute=random_minute)
        print('⏰ 已启动定时程序,明天 %02d:%02d 为您打卡' %
              (int(random_hour), int(random_minute)))
        print('Press Ctrl+{0} to exit'.format('Break' if os.name ==
                                              'nt' else 'C'))
    except:
        spinner.fail('数据提交失败')
        return
Beispiel #23
0
# -*- coding: utf-8 -*-
"""Example for doge spinner ;)
"""
from __future__ import unicode_literals
import os
import sys
import time

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from halo import Halo

spinner = Halo(text='Such Spins', spinner='dots')

try:
    spinner.start()
    time.sleep(2)
    spinner.text = 'Much Colors'
    spinner.color = 'magenta'
    time.sleep(2)
    spinner.text = 'Very emojis'
    spinner.spinner = 'hearts'
    time.sleep(2)
    spinner.stop_and_persist(symbol='🦄'.encode('utf-8'), text='Wow!')
except (KeyboardInterrupt, SystemExit):
    spinner.stop()
    def _aux_min_func(self, arch_param_vec):
        """
            Auxiliary minimisation function for the architecture picker.
            :return:
        """
        # print('\n---------------------:',xVecArch, '\n---------------------:')
        arch_vec = self._conv_net_vec(arch_param_vec)
        nb_nerons, nb_layers, act_fct = arch_vec[0], arch_vec[1], arch_vec[2]
        arch_str = f'N{nb_nerons}_L{nb_layers}_{act_fct}'

        res_loss_sum = 0
        param_loss = np.inf
        # de_loss_list = []

        fill_str = '-' * 50
        print('\n' + fill_str +
              f' {self.name}:: Averaging over training for {arch_str} ' +
              fill_str)
        spinner = Halo(text=f'Starting Test 0 for {arch_str}', spinner='dots')
        spinner.start()
        tf.keras.backend.clear_session()

        spinner.text = 'Finished Clearing TF session. Training model nb 0'
        for try_nb in range(self.avg_nb):
            stat_str = f"Test: {try_nb + 1}/{self.avg_nb} || Trying {arch_str} with" \
                       f" a MSize:{self.mb_size} for {self.epochs} Epochs. "

            # ---------- Initialise and train the new network ----------
            net_inst = DeepNetBonanza(nb_nerons,
                                      nb_layers,
                                      train_dict=self.train_dict,
                                      drop_rate=0.2,
                                      verbose=self.verbose,
                                      name=self.name)
            train_hist = net_inst.train_net(nb_epochs=self.epochs,
                                            mb_size=self.mb_size)
            # ---------- Get and return the DE evolution loss ----------
            res_loss_part, param_loss, loss_dict = self.get_de_loss(
                net_inst.model, train_hist)

            # ---------- Update the statistics string ----------
            stat_str += ' ---> '
            for loss_key in loss_dict:
                stat_str += f'{loss_key} : {loss_dict[loss_key]:.4E}  |  '
            stat_str += f'Comb DE Loss: {res_loss_part * param_loss:.4E}'
            spinner.text = stat_str
            # de_loss_list.append(de_loss_part)
            res_loss_sum += res_loss_part
            # print(stat_str)

        tf.keras.backend.clear_session()
        spinner.text = 'Finished Clearing TF session'
        del net_inst

        de_loss_avg = res_loss_sum / self.avg_nb
        de_loss_avg = de_loss_avg * param_loss
        spinner.stop_and_persist(symbol='та┐', text=stat_str)
        del spinner
        # de_loss_arr = np.array(de_loss_list)
        #
        # de_hist, de_bins = np.histogram(de_loss_arr, density=True, bins='auto')
        # mid_bin = de_bins[:-1] + np.diff(de_bins) / 2
        # hist_mean = np.average(mid_bin, weights=de_hist)

        # print(f'{Fore.RED}HIST_MEAN:{Fore.GREEN}{fill_str} Arch {arch_str}'
        #       f' Comb DE Loss {hist_mean:.4f} {fill_str}{Style.RESET_ALL}')
        log_loss = {
            arch_str: [nb_nerons, nb_layers, act_fct, de_loss_avg, param_loss]
        }
        dat_frame = pd.DataFrame.from_dict(log_loss, orient='index')
        dat_frame.to_csv(self.log_file_path, mode='a', header=False)
        print(dat_frame)

        del dat_frame, log_loss

        print(
            f'{Fore.RED}MEAN:{Fore.GREEN}{fill_str} {self.name}:: Arch {arch_str}'
            f' Comb DE Loss {de_loss_avg:.4E} {fill_str}{Style.RESET_ALL}')

        return de_loss_avg
        sys.exit(1)

    job_id = resp['job_id']

    job_status_code = None

    spinner = Halo(text="Waiting for job updates", spinner='dots')
    spinner.start()

    while True:
        try:
            new_job_status_code = get_job_status(job_id)
            if new_job_status_code != job_status_code:
                if new_job_status_code in ("UNASSIGNED", "ASSIGNED"):
                    spinner.info(STATUS_CODE_MESSAGES[new_job_status_code])
                    spinner.start("Waiting for job updates")
                elif new_job_status_code == "FAILED":
                    spinner.fail(STATUS_CODE_MESSAGES[new_job_status_code])
                    spinner.start("Waiting for job updates")
                else:
                    # the job has succeeded
                    spinner.stop_and_persist(
                        symbol='🦄'.encode('utf-8'),
                        text=STATUS_CODE_MESSAGES[new_job_status_code])
                    break
                job_status_code = new_job_status_code
            time.sleep(JOB_STATUS_POLL_INTERVAL_SECS)
        except (KeyboardInterrupt, SystemExit):
            spinner.stop()
            break
Beispiel #26
0
class BumbleSpeech():
    def __init__(self, speech_mode='voice'):
        self.spinner = Halo(spinner='dots')
        self.speech_modes = ['silent', 'voice']
        self.speech_mode = speech_mode
        self.engine = pyttsx3.init()
        self.engine.setProperty('voice',
                                'com.apple.speech.synthesis.voice.tessa')
        self.engine.setProperty('rate', 210)
        self.input_queue = deque()
        self.YES_TERMS = [
            "yes",
            "sure",
            "yhup",
            "yup",
            "ye",
            "yeah",
        ]
        self.NO_TERMS = [
            "no",
            "nope",
            "nah",
            "nay",
        ]
        self.CANCEL_TERMS = ["stop", "cancel", "abort"]

    def change_voice(self):
        '''Function to change voice of the voice engine'''
        # TODO
        return

    def change_speech_rate(self):
        '''Function to change the speaking rate'''
        # TODO
        return

    def set_input_queue(self, input_list: list):
        '''
        Function to set the input queue to be used to simulate user responses
        to Bumblebee. This is useful for programatically answering prompts when
        a feature is being run in a routine.
        Note: The input queue should have fewer or as many items as hear calls
        that the feature has. This will prevent items set by one feature to be
        encountered by other features which are called afterwards.
        '''
        self.input_queue = deque(input_list)

    def set_speech_mode(self, mode: str):
        '''Function to set speech mode.'''
        if not isinstance(mode, (str)):
            raise Exception(f'{mode} is not a string.')
        mode = mode.lower()
        if mode in self.speech_modes:
            self.speech_mode = mode
        else:
            raise Exception(f'Could not find {mode} mode.')
        return 0

    def infinite_speaking_chances(func):
        '''
        Wrapper for bumblebee hear function.
        This wrapper gives the user a chance to repeat
        when bumblebee doesn't hear properly.
        '''
        def wrapper(*args, **kwargs):
            input_text = ''
            while input_text == '':
                input_text = func(*args, **kwargs)
            return input_text

        return wrapper

    @infinite_speaking_chances
    def hear(self):
        '''
        Function to capture requests/questions.
        '''
        # If there are items in the input queue, use the queue to provide
        # input to the feature which is seeking for input.
        if (len(self.input_queue) > 0):
            return self.input_queue.popleft()

        # For silent mode.
        if self.speech_mode == self.speech_modes[0]:
            input_text = console.input("[white]type your response here: ")
            return input_text

        # For voice mode.
        elif self.speech_mode == self.speech_modes[1]:
            self.spinner.start(text=(Fore.RED +
                                     "Wait for beep to start talking..."))
            recognizer = sr.Recognizer()

            with sr.Microphone() as source:
                spoken_text = ''
                # breifly adjust for ambient noise
                recognizer.adjust_for_ambient_noise(source, duration=1)
                playsound.playsound(bumblebee_root + 'sounds/tone-beep.wav',
                                    True)
                self.spinner.stop()
                self.spinner.start(text='Listening')
                audio = recognizer.listen(source)
                self.spinner.stop()
                try:
                    self.spinner.start('Recognizing')
                    spoken_text = recognizer.recognize_google(audio)
                    self.spinner.stop()

                    console.print('[white]You said, ' + spoken_text)
                except sr.UnknownValueError:
                    self.spinner.stop()
                    self.respond('Sorry I did not hear you, please repeat.')
                except sr.RequestError:
                    # This happens when there is no internet connection.
                    self.spinner.stop()
                    self.respond('No internet connection found.')
                    self.respond('Starting silent mode.')
                    self.set_silent_mode(True)
            return spoken_text

    def respond(self, output):
        ''' Respond to requests/questions.'''
        # If we are in silent mode or the input queue is being used.
        if self.speech_mode == self.speech_modes[0] or \
                len(self.input_queue) > 0:
            console.print("[yellow]" + output)
            return

        # Voice mode
        elif self.speech_mode == self.speech_modes[1]:
            self.spinner.start(text=(Fore.YELLOW + output))
            self.engine.say(output)
            self.engine.runAndWait()
            self.spinner.stop_and_persist()
            return

    def interrupt_check(self, input_text):
        '''Check for cancel command from user.'''
        # TODO: use cancel terms here.
        if "stop" in input_text or "cancel" in input_text:
            self.respond("Okay.")
            return True

    def approve(self, question):
        '''
        Seek approval from user.
        e.g. user says yes/no to confirm question.
        Arguments: question i.e. the question to be approved by the user.
        Returns: True if the user approves
                False if the user disapproves
        '''
        self.respond(question)
        while True:
            answer = self.hear()
            if self.interrupt_check(answer):
                return False
            if answer in self.YES_TERMS:
                return True
            elif answer in self.NO_TERMS:
                return False
            else:
                self.respond("Please say yes or no.")

    def ask_question(self, question):
        '''
        Ask the user a question and get a response from them.
        Returns 0 if the answer to the question expresses desire
        to cease the operation. Otherwise, return the answer to
        the question.
        '''
        self.respond(question)
        answer = self.hear()
        if self.interrupt_check(answer):
            return 0
        return answer

    def choice_prompt(self, prompt: str, choices: list, default: str):
        '''
        Asks the user a prompt and loops until the response is within the list
        of choices.
        '''
        answer = Prompt.ask(prompt, choices=choices, default=default)
        if self.interrupt_check(answer):
            return 0
        return answer
import time
from colorama import init, Fore, Back
from halo import Halo

init()

print(Back.BLUE + Fore.RED + " halo spinner example ")
spinner = Halo(text='What is taking so long..',
               text_color='cyan',
               color='green')
spinner.start()
time.sleep(5)
spinner.stop_and_persist(symbol='✔ '.encode('utf-8'), text='Done!')
Beispiel #28
0
"""Example for persisting spinner
"""
from __future__ import unicode_literals
import os
import sys
import time

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from halo import Halo

success_message = 'Loading success'
failed_message = 'Loading failed'
unicorn_message = 'Loading unicorn'

spinner = Halo(text=success_message, spinner='dots')

try:
    spinner.start()
    time.sleep(1)
    spinner.succeed()
    spinner.start(failed_message)
    time.sleep(1)
    spinner.fail()
    spinner.start(unicorn_message)
    time.sleep(1)
    spinner.stop_and_persist(symbol='🦄'.encode('utf-8'),
                             text=unicorn_message)
except (KeyboardInterrupt, SystemExit):
    spinner.stop()
Beispiel #29
0
from __future__ import unicode_literals
import os
import sys
import time

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from halo import Halo

success_message = 'Loading success'
failed_message = 'Loading failed'
unicorn_message = 'Loading unicorn'

spinner = Halo(text=success_message, spinner='dots')

try:
    spinner.start()
    time.sleep(1)
    spinner.succeed()
    spinner.start(failed_message)
    time.sleep(1)
    spinner.fail()
    spinner.start(unicorn_message)
    time.sleep(1)
    spinner.stop_and_persist({
        'symbol': '🦄 '.encode('utf-8'),
        'text': unicorn_message
    })
except (KeyboardInterrupt, SystemExit):
    spinner.stop()
Beispiel #30
0
class Output:
    DEFAULT_COLOR = 'white'
    INFO_COLOR = 'blue'
    WARNING_COLOR = 'yellow'
    ERROR_COLOR = 'red'
    SUCCESS_COLOR = 'green'

    def __init__(self):
        self.types_colors = {
            'default': self.DEFAULT_COLOR,
            'info': self.INFO_COLOR,
            'warning': self.WARNING_COLOR,
            'error': self.ERROR_COLOR,
            'success': self.SUCCESS_COLOR
        }

        self.sp = Halo()

    def start_spinner(self, message: str, color: str = None):
        self.sp.text_color = color if color else self.DEFAULT_COLOR
        self.sp.start(text=message)

    def spinner_success(self,
                        message: str = None,
                        color: str = None,
                        message_color: str = None):
        self.sp.text_color = color if color else self.SUCCESS_COLOR
        self.sp.succeed()

        if message:
            self.sp.text_color = message_color if message_color else self.INFO_COLOR
            self.sp.stop_and_persist(text=message)

    def spinner_fail(self, message: str = None, color: str = None):
        self.sp.text_color = color if color else self.ERROR_COLOR
        self.sp.fail()

        if message:
            self.sp.stop_and_persist(text=message)

    def title(self, message: str, color: str = None):
        if not color:
            color = self.DEFAULT_COLOR

        message = '\n * {} \n{}'.format(message.upper(), '=' * 60)
        cprint(message, color=color, attrs=['bold'])

    def success(self, message: str):
        self.write(message, 'success', '✔')

    def warning(self, message: str):
        self.write(message, 'warning', '⚠')

    def info(self, message: str):
        self.write(message, 'info', 'ℹ')

    def error(self, message: str):
        self.write(message, 'error', '✗')

    def write(self,
              message: str,
              message_type: str = 'default',
              symbol: str = ''):
        color = self.types_colors[message_type]

        if symbol:
            symbol = '{} '.format(symbol)

        print('')
        cprint('{}{}'.format(symbol, message), color=color, attrs=['bold'])
        print('')