def test_tabulate_ansi_escape_in_default_value(): """Test that ANSI escape codes work with tabulate.""" data = [['1', None], ['2', 'Sam'], ['3', 'Joe']] headers = ['id', 'name'] styled = format_output(data, headers, format_name='psql', missing_value='\x1b[38;5;10mNULL\x1b[39m') unstyled = format_output(data, headers, format_name='psql', missing_value='NULL') assert strip_ansi(styled) == unstyled
def test_provide_column_types(): """Test that provided column types are passed to preprocessors.""" expected_column_types = (bool, float) data = ((1, 1.0), (0, 2)) headers = ('a', 'b') def preprocessor(data, headers, column_types=(), **_): assert expected_column_types == column_types return data, headers format_output(data, headers, 'csv', column_types=expected_column_types, preprocessors=(preprocessor, ))
def test_tabulate_ansi_escape_in_default_value(): """Test that ANSI escape codes work with tabulate.""" data = [["1", None], ["2", "Sam"], ["3", "Joe"]] headers = ["id", "name"] styled = format_output( iter(data), headers, format_name="psql", missing_value="\x1b[38;5;10mNULL\x1b[39m", ) unstyled = format_output( iter(data), headers, format_name="psql", missing_value="NULL" ) stripped_styled = [strip_ansi(s) for s in styled] assert list(unstyled) == stripped_styled
def print_result(db, result) -> None: headers = ["table", "count", "max id", "sequence"] left_tables = result.get("left") right_tables = result.get("right") data = [] keys = ['count', "max", "seq"] for table in result.get("tables"): left = left_tables.get(table) right = right_tables.get(table) row = [table] for key in keys: row.append(render(left[key], right[key])) data.append(row) print(f"Database: {db}") rows = tabular_output.format_output(data, headers, format_name="fancy_grid") for row in rows: print(row)
def test_tabular_format_output_wrapper(): """Test the format_output wrapper.""" data = [['1', None], ['2', 'Sam'], ['3', 'Joe']] headers = ['id', 'name'] expected = dedent('''\ +----+------+ | id | name | +----+------+ | 1 | N/A | | 2 | Sam | | 3 | Joe | +----+------+''') assert expected == format_output(data, headers, format_name='ascii', missing_value='N/A')
def test_tabular_format_output_wrapper(): """Test the format_output wrapper.""" data = [["1", None], ["2", "Sam"], ["3", "Joe"]] headers = ["id", "name"] expected = dedent("""\ +----+------+ | id | name | +----+------+ | 1 | N/A | | 2 | Sam | | 3 | Joe | +----+------+""") assert expected == "\n".join( format_output(iter(data), headers, format_name="ascii", missing_value="N/A"))
def _remind(ctx, *args, **kwargs): initialize_conrad() _id = kwargs["id"] if _id is None: session = Session() reminders = list( session.query(Event, Reminder) .filter(Event.id == Reminder.id) .order_by(Event.start_date) .all() ) if len(reminders) > 0: header = ["id", "Name", "Start Date", "Days Left"] reminders_output = [] for reminder, __ in reminders: start = dt.datetime.now() cfp_days_left = (reminder.cfp_end_date - start).days event_days_left = (reminder.start_date - start).days if reminder.cfp_open and cfp_days_left >= 0: days_left = cfp_days_left days_left_output = f"{days_left} days left to cfp deadline!" elif event_days_left >= 0: days_left = event_days_left days_left_output = f"{days_left} days left!" else: days_left = -1 days_left_output = "Event ended." if days_left >= 30: style = f"{Fore.GREEN}{Style.BRIGHT}" elif 30 > days_left >= 10: style = f"{Fore.YELLOW}{Style.BRIGHT}" elif 10 > days_left >= 0: style = f"{Fore.RED}{Style.BRIGHT}" else: style = "" days_left_output = ( f"{style}{days_left_output}{Style.RESET_ALL}" ) reminders_output.append( [ reminder.id, reminder.name, reminder.start_date.strftime("%Y-%m-%d"), days_left_output, ] ) session.close() formatted = tabular_output.format_output( reminders_output, header, format_name="ascii" ) click.echo("\n".join(formatted)) else: click.echo("No reminders found!") else: try: session = Session() if session.query(Event).filter(Event.id == _id).first() is None: click.echo("Event not found!") else: reminder = Reminder(id=_id) session.add(reminder) session.commit() session.close() click.echo("Reminder set!") except sqlalchemy.exc.IntegrityError: session.rollback() if click.confirm("Do you want to remove this reminder?"): session = Session() session.query(Reminder).filter(Reminder.id == _id).delete() session.commit() session.close() click.echo("Reminder removed!")
def _show(ctx, *args, **kwargs): # TODO: conrad show --new initialize_conrad() _id = kwargs["id"] cfp = kwargs["cfp"] tag = kwargs["tag"] name = kwargs["name"] date = list(kwargs["date"]) location = kwargs["location"] filters = [] if _id: filters.append(Event.id == _id) if cfp: filters.append(Event.cfp_open.is_(cfp)) if tag: filters.append(Event.tags.contains(tag)) if name: filters.append(Event.name.ilike(f"%{name}%")) if date: date_filters = [] for d in date: cmp, date = d.split(" ") if not (">" in cmp or "<" in cmp): raise click.UsageError("Wrong comparison operator!") try: __ = dt.datetime.strptime(date, "%Y-%m-%d") except ValueError: raise click.UsageError("Wrong date format!") if ">" in cmp: date_filters.append(Event.start_date >= date) elif "<" in cmp: date_filters.append(Event.start_date <= date) filters.append(sqlalchemy.and_(*date_filters)) if location: filters.append( sqlalchemy.or_( Event.city.ilike(f"%{location}%"), Event.state.ilike(f"%{location}%"), Event.country.ilike(f"%{location}%"), ) ) session = Session() events = list( session.query(Event).filter(*filters).order_by(Event.start_date).all() ) if len(events) > 0: header = [ "id", "Name", "Website", "City", "State", "Country", "Start Date", "End Date", ] events_output = [] rids = [r.id for r in session.query(Reminder).all()] for event in events: event_output = [ event.id, event.name, event.url, event.city, event.state, event.country, event.start_date.strftime("%Y-%m-%d"), event.end_date.strftime("%Y-%m-%d"), ] # highlight event which has a reminder set if event.id in rids: event_output = list(map(lambda x: f"{Fore.WHITE}{Style.BRIGHT}{x}{Style.RESET_ALL}", event_output)) events_output.append(event_output) session.close() formatted = tabular_output.format_output( events_output, header, format_name="ascii" ) click.echo_via_pager("\n".join(formatted)) else: click.echo("No events found!")
def _remind(ctx, *args, **kwargs): _id = kwargs["id"] if _id is None: session = Session() reminders = list( session.query(Event, Reminder).filter(Event.id == Reminder.id).order_by( Event.start_date).all()) if len(reminders): header = ["id", "name", "start_date", "days_left"] reminders_output = [] for reminder, __ in reminders: start = dt.datetime.now() if reminder.cfp_open: delta_days = (reminder.cfp_end_date - start).days days_left = "{} days left to cfp deadline!".format( delta_days) else: delta_days = (reminder.start_date - start).days days_left = "{} days left!".format(delta_days) if delta_days > 30: days_left = Fore.GREEN + Style.BRIGHT + days_left + Style.RESET_ALL elif delta_days < 30 and delta_days > 10: days_left = Fore.YELLOW + Style.BRIGHT + days_left + Style.RESET_ALL elif delta_days < 10: days_left = Fore.RED + Style.BRIGHT + days_left + Style.RESET_ALL reminders_output.append([ reminder.id, reminder.name, reminder.start_date.strftime("%Y-%m-%d"), days_left, ]) session.close() formatted = tabular_output.format_output(reminders_output, header, format_name="ascii") click.echo("\n".join(formatted)) else: click.echo("No reminders found!") else: try: session = Session() reminder = Reminder(id=_id) session.add(reminder) session.commit() session.close() click.echo("Reminder set!") except sqlalchemy.exc.IntegrityError: session.rollback() if click.confirm("Do you want to remove this reminder?"): session = Session() session.query(Reminder).filter(Reminder.id == _id).delete() session.commit() session.close() click.echo("Reminder removed!")
def _show(ctx, *args, **kwargs): # TODO: conrad show --new if not os.path.exists(CONRAD_HOME): os.makedirs(CONRAD_HOME) if not os.path.exists(os.path.join(CONRAD_HOME, "conrad.db")): click.echo("Event database not found, fetching it!") get_events() initialize_database() with open(os.path.join(CONRAD_HOME, "events.json"), "r") as f: events = json.load(f) refresh_database(events) cfp = kwargs["cfp"] tag = kwargs["tag"] name = kwargs["name"] date = list(kwargs["date"]) location = kwargs["location"] filters = [] if cfp: filters.append(Event.cfp_open.is_(cfp)) if tag: filters.append(Event.tags.contains(tag)) if name: filters.append(Event.name.ilike("%{}%".format(name))) if date: date_filters = [] for d in date: cmp, date = d.split(" ") if not (">" in cmp or "<" in cmp): raise click.UsageError("Wrong comparison operator!") try: __ = dt.datetime.strptime(date, "%Y-%m-%d") except ValueError: raise click.UsageError("Wrong date format!") if ">" in cmp: date_filters.append(Event.start_date >= date) elif "<" in cmp: date_filters.append(Event.start_date <= date) filters.append(sqlalchemy.and_(*date_filters)) if location: filters.append( sqlalchemy.or_( Event.city.ilike("%{}%".format(location)), Event.state.ilike("%{}%".format(location)), Event.country.ilike("%{}%".format(location)), )) session = Session() events = list( session.query(Event).filter(*filters).order_by(Event.start_date).all()) if len(events): header = [ "id", "name", "url", "city", "state", "country", "start_date", "end_date", ] events_output = [] for event in events: events_output.append([ event.id, event.name, event.url, event.city, event.state, event.country, event.start_date.strftime("%Y-%m-%d"), event.end_date.strftime("%Y-%m-%d"), ]) session.close() formatted = tabular_output.format_output(events_output, header, format_name="ascii") click.echo_via_pager("\n".join(formatted)) else: click.echo("No events found!")
def _show(ctx, *args, **kwargs): # TODO: conrad show --new initialize_conrad() cfp = kwargs["cfp"] tag = kwargs["tag"] name = kwargs["name"] date = list(kwargs["date"]) location = kwargs["location"] filters = [] if cfp: filters.append(Event.cfp_open.is_(cfp)) if tag: filters.append(Event.tags.contains(tag)) if name: filters.append(Event.name.ilike("%{}%".format(name))) if date: date_filters = [] for d in date: cmp, date = d.split(" ") if not (">" in cmp or "<" in cmp): raise click.UsageError("Wrong comparison operator!") try: __ = dt.datetime.strptime(date, "%Y-%m-%d") except ValueError: raise click.UsageError("Wrong date format!") if ">" in cmp: date_filters.append(Event.start_date >= date) elif "<" in cmp: date_filters.append(Event.start_date <= date) filters.append(sqlalchemy.and_(*date_filters)) if location: filters.append( sqlalchemy.or_( Event.city.ilike("%{}%".format(location)), Event.state.ilike("%{}%".format(location)), Event.country.ilike("%{}%".format(location)), ) ) session = Session() events = list( session.query(Event).filter(*filters).order_by(Event.start_date).all() ) if len(events): header = [ "id", "Name", "Website", "City", "State", "Country", "Start Date", "End Date", ] events_output = [] for event in events: events_output.append( [ event.id, event.name, event.url, event.city, event.state, event.country, event.start_date.strftime("%Y-%m-%d"), event.end_date.strftime("%Y-%m-%d"), ] ) session.close() formatted = tabular_output.format_output( events_output, header, format_name="ascii" ) click.echo_via_pager("\n".join(formatted)) else: click.echo("No events found!")