Beispiel #1
0
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
Beispiel #2
0
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, ))
Beispiel #3
0
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
Beispiel #4
0
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)
Beispiel #5
0
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"))
Beispiel #7
0
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!")
Beispiel #8
0
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!")
Beispiel #9
0
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!")
Beispiel #10
0
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!")
Beispiel #11
0
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!")