Rename rtv to tuir

This commit is contained in:
John Helmert
2019-06-09 19:31:35 -05:00
parent 481780fffa
commit 7e9455b4ca
76 changed files with 352 additions and 359 deletions

View File

@@ -1,5 +1,5 @@
[run]
source = rtv
source = tuir
omit =
*/__main__.py
*/packages/praw/*

2
.gitignore vendored
View File

@@ -10,6 +10,6 @@
*.log
build
dist
rtv.egg-info
tuir.egg-info
tests/refresh-token
venv/

View File

@@ -12,5 +12,5 @@ A clear description of what the bug is and how to reproduce it.
**Describe your environment**
- If a stack trace was displayed on the command line, paste the entire output here.
- Otherwise, run ``$rtv --debug-info`` and paste the entire output here.
- Include any other information that might be relevant to the issue (For example, your operating system, your terminal emulator, how you installed rtv, etc.)
- Otherwise, run ``$tuir --debug-info`` and paste the entire output here.
- Include any other information that might be relevant to the issue (For example, your operating system, your terminal emulator, how you installed tuir, etc.)

View File

@@ -24,7 +24,7 @@ install:
- pip install .[test]
- pip install .
script:
- pylint --rcfile .pylintrc -E rtv/
- pylint --rcfile .pylintrc -E tuir/
- coverage run -m py.test -v
after_success:
- coveralls

View File

@@ -1,5 +1,5 @@
================
RTV Contributors
RTV/TUIR Contributors
================
Thanks to the following people for their contributions to this project.

View File

@@ -5,7 +5,7 @@ Contributor Guidelines
Before you start
================
- Post an issue on the `tracker <https://gitlab.com/ajak/rtv/issues>`_ describing the bug or feature you would like to add
- Post an issue on the `tracker <https://gitlab.com/ajak/tuir/issues>`_ describing the bug or feature you would like to add
- If an issue already exists, leave a comment to let others know that you intend to work on it
Considerations
@@ -70,36 +70,36 @@ This both speeds up the tests and helps to maintain consistency across runs.
.. code-block:: bash
$ pip install rtv[test]
$ pip install tuir[test]
2. Set your ``$PYTHONPATH`` to point to the directory of your RTV repository.
2. Set your ``$PYTHONPATH`` to point to the directory of your TUIR repository.
.. code-block:: bash
$ export PYTHONPATH=~/code/rtv/
$ export PYTHONPATH=~/code/tuir/
3. Run the tests using the existing cassettes
.. code-block:: bash
$ python -m pytest ~/code/rtv/tests/
$ python -m pytest ~/code/tuir/tests/
================================ test session starts ================================
platform linux -- Python 3.4.0, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: ~/code/rtv/, inifile:
rootdir: ~/code/tuir/, inifile:
plugins: xdist-1.14, cov-2.2.0
collected 113 items
4. By default, the cassettes will act as read-only.
If you have written a new test and would like to record a cassette, you must provide your own refresh token.
The easiest thing to do is to use the token generated by RTV when you log in.
This is usually stored as *~/.local/share/rtv/refresh-token*.
The easiest thing to do is to use the token generated by TUIR when you log in.
This is usually stored as *~/.local/share/tuir/refresh-token*.
.. code-block:: bash
$ python -m pytest ~/code/rtv/tests/ --record-mode once --refresh-token ~/.local/share/rtv/refresh-token
$ python -m pytest ~/code/tuir/tests/ --record-mode once --refresh-token ~/.local/share/tuir/refresh-token
================================ test session starts ================================
platform linux -- Python 3.4.0, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: ~/code/rtv/, inifile:
rootdir: ~/code/tuir/, inifile:
plugins: xdist-1.14, cov-2.2.0
collected 113 items

View File

@@ -1,6 +1,7 @@
The MIT License (MIT)
Copyright (c) 2015 michael-lazar
Portions Copyright (c) 2015 michael-lazar
Portions Copyright (c) 2019 John Helmert
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -3,6 +3,6 @@ include CHANGELOG.rst
include AUTHORS.rst
include README.md
include LICENSE
include rtv.1
include rtv/templates/*
include rtv/themes/*
include tuir.1
include tuir/templates/*
include tuir/themes/*

View File

@@ -1,34 +1,34 @@
<h1 align="center">Reddit Terminal Viewer (RTV)</h1>
<h1 align="center">Terminal UI for Reddit (TUIR)</h1>
<p align="center">
A text-based interface (TUI) to view and interact with Reddit from your terminal.<br>
</p>
<p align="center">
<strong>This fork of rtv is currently maintained by John Helmert III (ajak) and was maintained by Michael Lazar in <a href="https://github.com/michael-lazar/rtv">this respository</a> until commit 7923890 on Jun 3, 2019.</strong><br>
<strong>TUIR is a fork of rtv, which was maintained by Michael Lazar in <a href="https://github.com/michael-lazar/rtv">this respository</a> until Jun 3, 2019.</strong><br>
</p>
<p align="center">
<img alt="title image" src="resources/title_image.png"/>
</p>
<p align="center">
<!-- <p align="center">
<a href="https://pypi.python.org/pypi/rtv/">
<img alt="pypi" src="https://img.shields.io/pypi/v/rtv.svg?label=version"/>
</a>
<!-- <a href="https://travis-ci.org/michael-lazar/rtv">
<a href="https://travis-ci.org/michael-lazar/rtv">
<img alt="travis-ci" src="https://travis-ci.org/michael-lazar/rtv.svg?branch=master"/>
</a> -->
</a>
<a href="https://repology.org/project/rtv/versions">
<img src="https://repology.org/badge/tiny-repos/rtv.svg" alt="Packaging status">
</a>
<!-- <a href="https://coveralls.io/github/michael-lazar/rtv?branch=master">
<a href="https://coveralls.io/github/michael-lazar/rtv?branch=master">
<img alt="coveralls" src="https://coveralls.io/repos/michael-lazar/rtv/badge.svg?branch=master&service=github"/>
</a>
<a href="https://saythanks.io/to/michael-lazar">
<img alt="say-thanks" src="https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg"/>
</a> -->
</p>
</a>
</p> -->
## Table of Contents
@@ -88,21 +88,21 @@ $ pkg install rtv
### From source
```bash
$ git clone https://gitlab.com/ajak/rtv.git
$ cd rtv
$ git clone https://gitlab.com/ajak/tuir.git
$ cd tuir
$ python setup.py install
```
### Windows
RTV is not supported on Windows, due to a lack of resources and interest. Sorry!
TUIR is not supported on Windows, due to a lack of resources and interest. Sorry!
## Usage
To run the program, type:
```bash
$ rtv --help
$ tuir --help
```
### Controls
@@ -130,17 +130,17 @@ See [CONTROLS](CONTROLS.md) for the full list of commands.
### Configuration File
Configuration files are stored in the ``{HOME}/.config/rtv/`` directory.
Configuration files are stored in the ``{HOME}/.config/tuir/`` directory.
Check out [rtv.cfg](rtv/templates/rtv.cfg) for the full list of configurable options. You can clone this file into your home directory by running:
Check out [tuir.cfg](tuir/templates/tuir.cfg) for the full list of configurable options. You can clone this file into your home directory by running:
```bash
$ rtv --copy-config
$ tuir --copy-config
```
### Viewing Media Links
You can use [mailcap](https://en.wikipedia.org/wiki/Media_type#Mailcap) to configure how RTV will open different types of links.
You can use [mailcap](https://en.wikipedia.org/wiki/Media_type#Mailcap) to configure how TUIR will open different types of links.
<p align="center">
<img alt="title image" src="resources/mailcap.gif"/>
@@ -149,30 +149,30 @@ You can use [mailcap](https://en.wikipedia.org/wiki/Media_type#Mailcap) to confi
A mailcap file allows you to associate different MIME media types, like ``image/jpeg`` or ``video/mp4``, with shell commands. This feature is disabled by default because it takes a few extra steps to configure. To get started, copy the default mailcap template to your home directory.
```bash
$ rtv --copy-mailcap
$ tuir --copy-mailcap
```
This template contains examples for common MIME types that work with popular reddit websites like *imgur*, *youtube*, and *gfycat*. Open the mailcap template and follow the [instructions](rtv/templates/mailcap) listed inside.
This template contains examples for common MIME types that work with popular reddit websites like *imgur*, *youtube*, and *gfycat*. Open the mailcap template and follow the [instructions](tuir/templates/mailcap) listed inside.
Once you've setup your mailcap file, enable it by launching rtv with the ``rtv --enable-media`` flag (or set it in your **rtv.cfg**)
Once you've setup your mailcap file, enable it by launching tuir with the ``tuir --enable-media`` flag (or set it in your **tuir.cfg**)
### Environment Variables
The default programs that RTV interacts with can be configured through environment variables:
The default programs that TUIR interacts with can be configured through environment variables:
<table>
<tr>
<td><strong>$RTV_EDITOR</strong></td>
<td><strong>$TUIR_EDITOR</strong></td>
<td>A program used to compose text submissions and comments, e.g. <strong>vim</strong>, <strong>emacs</strong>, <strong>gedit</strong>
<br/> <em>If not specified, will fallback to $VISUAL and $EDITOR in that order.</em></td>
</tr>
<tr>
<td><strong>$RTV_BROWSER</strong></td>
<td><strong>$TUIR_BROWSER</strong></td>
<td>A program used to open links to external websites, e.g. <strong>firefox</strong>, <strong>google-chrome</strong>, <strong>w3m</strong>, <strong>lynx</strong>
<br/> <em>If not specified, will fallback to $BROWSER, or your system's default browser.</em></td>
</tr>
<tr>
<td><strong>$RTV_URLVIEWER</strong></td>
<td><strong>$TUIR_URLVIEWER</strong></td>
<td>A tool used to extract hyperlinks from blocks of text, e.g. <a href=https://github.com/sigpipe/urlview>urlview</a>, <a href=https://github.com/firecat53/urlscan>urlscan</a>
<br/> <em>If not specified, will fallback to urlview if it is installed.</em></td>
</tr>
@@ -180,12 +180,12 @@ The default programs that RTV interacts with can be configured through environme
### Clipboard
RTV supports copying submission links to the OS clipboard. On macOS this is supported out of the box.
TUIR supports copying submission links to the OS clipboard. On macOS this is supported out of the box.
On Linux systems you will need to install either [xsel](http://www.vergenet.net/~conrad/software/xsel/) or [xclip](https://sourceforge.net/projects/xclip/).
## Themes
Themes can be used to customize the look and feel of RTV
Themes can be used to customize the look and feel of TUIR
<table>
<tr>
@@ -210,24 +210,24 @@ Themes can be used to customize the look and feel of RTV
</tr>
</table>
You can list all installed themes with the ``--list-themes`` command, and select one with ``--theme``. You can save your choice permanently in your [rtv.cfg](rtv/templates/rtv.cfg) file. You can also use the <kbd>F2</kbd> & <kbd>F3</kbd> keys inside of RTV to cycle through all available themes.
You can list all installed themes with the ``--list-themes`` command, and select one with ``--theme``. You can save your choice permanently in your [tuir.cfg](tuir/templates/tuir.cfg) file. You can also use the <kbd>F2</kbd> & <kbd>F3</kbd> keys inside of TUIR to cycle through all available themes.
For instructions on writing and installing your own themes, see [THEMES.md](THEMES.md).
## FAQ
<details>
<summary>Why am I getting an error during installation/when launching rtv?</summary>
<summary>Why am I getting an error during installation/when launching tuir?</summary>
> If your distro ships with an older version of python 2.7 or python-requests,
> you may experience SSL errors or other package incompatibilities. The
> easiest way to fix this is to install rtv using python 3. If you
> easiest way to fix this is to install tuir using python 3. If you
> don't already have pip3, see http://stackoverflow.com/a/6587528 for setup
> instructions. Then do
>
> ```bash
> $ sudo pip uninstall rtv
> $ sudo pip3 install -U rtv
> $ sudo pip uninstall tuir
> $ sudo pip3 install -U tuir
> ```
</details>
@@ -237,7 +237,7 @@ For instructions on writing and installing your own themes, see [THEMES.md](THEM
> This type of text usually shows up when python is unable to render
> unicode properly.
>
> 1. Try starting RTV in ascii-only mode with ``rtv --ascii``
> 1. Try starting TUIR in ascii-only mode with ``tuir --ascii``
> 2. Make sure that the terminal/font that you're using supports unicode
> 3. Try [setting the LOCALE to utf-8](https://perlgeek.de/en/article/set-up-a-clean-utf8-environment)
> 4. Your python may have been built against the wrong curses library,
@@ -250,11 +250,11 @@ For instructions on writing and installing your own themes, see [THEMES.md](THEM
> This project is structured to be run as a python *module*. This means that
> you need to launch it using python's ``-m`` flag. See the example below, which
> assumes that you have cloned the repository into the directory **~/rtv_project**.
> assumes that you have cloned the repository into the directory **~/tuir_project**.
>
> ```bash
> $ cd ~/rtv_project
> $ python3 -m rtv
> $ cd ~/tuir_project
> $ python3 -m tuir
> ```
</details>
@@ -266,4 +266,3 @@ Before writing any code, please read the [Contributor Guidelines](CONTRIBUTING.r
## License
This project is distributed under the [MIT](LICENSE) license.

View File

@@ -2,12 +2,12 @@
## Installing Themes
You can install custom themes by copying them into your **~/.config/rtv/themes/**
You can install custom themes by copying them into your **~/.config/tuir/themes/**
directory. The name of the theme will match the name of the file.
```
$ cp my-custom-theme.cfg ~/.config/rtv/themes/
$ rtv --theme my-custom-theme
$ cp my-custom-theme.cfg ~/.config/tuir/themes/
$ tuir --theme my-custom-theme
```
If you've created a cool theme and would like to share it with the community,
@@ -31,7 +31,7 @@ Color support on modern terminals can be split into 4 categories:
The 16 system colors, along with the default foreground and background,
can usually be customized through your terminal's profile settings. The
6x6x6 color palette and grayscale colors are constant RGB values across
all terminals. RTV's default theme only uses the 8 primary system colors,
all terminals. TUIR's default theme only uses the 8 primary system colors,
which is why it matches the "look and feel" of the terminal that you're
running it in.
@@ -62,9 +62,9 @@ it will be set automatically by you terminal. Often, problems with
terminal colors can be traced back to somebody hardcoding
``TERM=xterm-256color`` in their .bashrc file.
## Understanding RTV Themes
## Understanding TUIR Themes
Here's an example of what an RTV theme file looks like:
Here's an example of what an TUIR theme file looks like:
```
[theme]
@@ -162,7 +162,7 @@ Attributes can be mixed together using the + symbol. For example,
### Modifiers
RTV themes use special "modifer" elements to define the default
TUIR themes use special "modifer" elements to define the default
application style. This allows you to do things like set the default
background color without needing to set ``<background>`` on every
single element. The three modifier elements are:

View File

@@ -1,34 +0,0 @@
# -*- coding: utf-8 -*-
r"""
________ __________________________
___ __ \__________ /_____ /__(_)_ /_
__ /_/ / _ \ __ /_ __ /__ /_ __/
_ _, _// __/ /_/ / / /_/ / _ / / /_
/_/ |_| \___/\__,_/ \__,_/ /_/ \__/
________ _____ ______
___ __/__________________ ______(_)____________ ___ /
__ / _ _ \_ ___/_ __ `__ \_ /__ __ \ __ `/_ /
_ / / __/ / _ / / / / / / _ / / / /_/ /_ /
/_/ \___//_/ /_/ /_/ /_//_/ /_/ /_/\__,_/ /_/
___ ______
__ | / /__(_)_______ ______________
__ | / /__ /_ _ \_ | /| / / _ \_ ___/
__ |/ / _ / / __/_ |/ |/ // __/ /
_____/ /_/ \___/____/|__/ \___//_/
(RTV)
"""
from __future__ import unicode_literals
from .__version__ import __version__
__title__ = 'Reddit Terminal Viewer'
__author__ = 'Michael Lazar'
__license__ = 'The MIT License (MIT)'
__copyright__ = '(c) 2016 Michael Lazar'

View File

@@ -2,7 +2,7 @@ Release Checklist
-----------------
1. Switch to the master branch and stash any uncommited changes.
2. Bump the version number in [rtv/\_\_version\_\_.py](rtv/__version__.py).
2. Bump the version number in [tuir/\_\_version\_\_.py](tuir/__version__.py).
3. Update the release notes in the [CHANGELOG.rst](CHANGELOG.rst).
4. Update the contributor list by running [``scripts/build_authors.py``](scripts/build_authors.py).
5. Re-generate the manpage by running [``scripts/build_manpage.py``](scripts/build_manpage.py).
@@ -11,7 +11,7 @@ Release Checklist
8. Clean out any old build/release files by running [``scripts/pip_clean.py``](scripts/pip_clean.py).
9. Build the source tarball and binary wheel: ``$ python3 setup.py sdist bdist_wheel``
10. Upload the packages to PyPI: ``$ twine upload dist/*``
11. Verify that the upload was successful: ``$ pip install rtv --upgrade --force-reinstall``
11. Verify that the upload was successful: ``$ pip install tuir --upgrade --force-reinstall``
12. Smoke test the new release on Python 2 and Python 3.
12. Create a new release on Github and copy the release notes from the changelog.
13. Use Github to delete any old branches that have been merged.

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
Internal tool used to automatically generate an up-to-date version of the rtv
Internal tool used to automatically generate an up-to-date version of the tuir
man page. Currently this script should be manually ran after each version bump.
In the future, it would be nice to have this functionality built into setup.py.
@@ -17,8 +17,8 @@ _filepath = os.path.dirname(os.path.relpath(__file__))
ROOT = os.path.abspath(os.path.join(_filepath, '..'))
sys.path.insert(0, ROOT)
import rtv
from rtv import config
import tuir
from tuir import config
def main():
@@ -30,7 +30,7 @@ def main():
data = {}
print('Fetching version')
data['version'] = rtv.__version__
data['version'] = tuir.__version__
print('Fetching release date')
data['release_date'] = datetime.utcnow().strftime('%B %d, %Y')
print('Fetching synopsis')
@@ -65,18 +65,18 @@ def main():
options += '\n'.join(('.TP', flag, description, '\n'))
data['options'] = options
print('Fetching license')
data['license'] = rtv.__license__
data['license'] = tuir.__license__
print('Fetching copyright')
data['copyright'] = rtv.__copyright__
data['copyright'] = tuir.__copyright__
# Escape dashes is all of the sections
data = {k: v.replace('-', r'\-') for k, v in data.items()}
print('Reading from %s/scripts/rtv.1.template' % ROOT)
with open(os.path.join(ROOT, 'scripts/rtv.1.template')) as fp:
print('Reading from %s/scripts/tuir.1.template' % ROOT)
with open(os.path.join(ROOT, 'scripts/tuir.1.template')) as fp:
template = fp.read()
print('Populating template')
out = template.format(**data)
print('Writing to %s/rtv.1' % ROOT)
with open(os.path.join(ROOT, 'rtv.1'), 'w') as fp:
print('Writing to %s/tuir.1' % ROOT)
with open(os.path.join(ROOT, 'tuir.1'), 'w') as fp:
fp.write(out)

View File

@@ -8,8 +8,8 @@ echo "$(wc -l tests/*.py)"
echo -e "\nScripts: "
echo "$(wc -l scripts/*)"
echo -e "\nTemplates: "
echo "$(wc -l rtv/templates/*)"
echo "$(wc -l tuir/templates/*)"
echo -e "\nCode: "
echo "$(wc -l rtv/*.py)"
echo "$(wc -l tuir/*.py)"
echo -e "\nCombined: "
echo "$(cat tests/*.py scripts/* rtv/templates/* rtv/*.py | wc -l) total lines"
echo "$(cat tests/*.py scripts/* tuir/templates/* tuir/*.py | wc -l) total lines"

View File

@@ -15,15 +15,15 @@ from collections import Counter
from vcr import VCR
from six.moves.urllib.parse import urlparse, parse_qs
from rtv.theme import Theme, ThemeList
from rtv.config import Config
from rtv.packages import praw
from rtv.oauth import OAuthHelper
from rtv.terminal import Terminal
from rtv.objects import curses_session
from rtv.subreddit_page import SubredditPage
from rtv.submission_page import SubmissionPage
from rtv.subscription_page import SubscriptionPage
from tuir.theme import Theme, ThemeList
from tuir.config import Config
from tuir.packages import praw
from tuir.oauth import OAuthHelper
from tuir.terminal import Terminal
from tuir.objects import curses_session
from tuir.subreddit_page import SubredditPage
from tuir.submission_page import SubmissionPage
from tuir.subscription_page import SubscriptionPage
try:
from unittest import mock

View File

@@ -3,10 +3,10 @@ Initialize an authenticated instance of PRAW to interact with.
$ python -i initialize_session.py
"""
from rtv.docs import AGENT
from rtv.packages import praw
from rtv.content import RequestHeaderRateLimiter
from rtv.config import Config
from tuir.docs import AGENT
from tuir.packages import praw
from tuir.content import RequestHeaderRateLimiter
from tuir.config import Config
config = Config()
config.load_refresh_token()

View File

@@ -11,11 +11,11 @@ os.environ['BROWSER'] = 'firefox'
# If we want to override the $BROWSER variable that the python webbrowser
# references, it needs to be done before the webbrowser module is imported
# for the first time.
RTV_BROWSER, BROWSER = os.environ.get('RTV_BROWSER'), os.environ.get('BROWSER')
if RTV_BROWSER:
os.environ['BROWSER'] = RTV_BROWSER
TUIR_BROWSER, BROWSER = os.environ.get('TUIR_BROWSER'), os.environ.get('BROWSER')
if TUIR_BROWSER:
os.environ['BROWSER'] = TUIR_BROWSER
print('RTV_BROWSER=%s' % RTV_BROWSER)
print('TUIR_BROWSER=%s' % TUIR_BROWSER)
print('BROWSER=%s' % BROWSER)
import webbrowser

View File

@@ -1,6 +1,6 @@
.TH "RTV" "1" "{release_date}" "Version {version}" "Usage and Commands"
.TH "TUIR" "1" "{release_date}" "Version {version}" "Usage and Commands"
.SH NAME
RTV - Reddit Terminal Viewer
TUIR - Terminal UI for Reddit
.SH SYNOPSIS
{synopsis}
.SH DESCRIPTION
@@ -17,32 +17,32 @@ Press \fBright\fR to view the selected submission and \fBleft\fR to return.
Press \fB?\fR to open the help screen.
.SH FILES
.TP
.BR $XDG_CONFIG_HOME/rtv/rtv.cfg
.BR $XDG_CONFIG_HOME/tuir/tuir.cfg
The configuration file can be used to customize default program settings.
.TP
.BR $XDG_DATA_HOME/rtv/refresh-token
.BR $XDG_DATA_HOME/tuir/refresh-token
After you login to reddit, your most recent OAuth refresh token will be stored
for future sessions.
.TP
.BR $XDG_DATA_HOME/rtv/history.log
.BR $XDG_DATA_HOME/tuir/history.log
This file stores URLs that have been recently opened in order to
visually highlight them as "seen".
.SH ENVIRONMENT
.TP
.BR RTV_EDITOR
.BR TUIR_EDITOR
Text editor to use when editing comments and submissions. Will fallback to
\fI$EDITOR\fR.
.TP
.BR RTV_URLVIEWER
.BR TUIR_URLVIEWER
Url viewer to use to extract links from comments. Requires a compatible
program to be installed.
.TP
.BR RTV_BROWSER
.BR TUIR_BROWSER
Web browser to use when opening links. Will fallback to \fI$BROWSER\fR.
.SH AUTHOR
Michael Lazar <lazar.michael22@gmail.com> (2017).
John Helmert <jchelmertt3@gmail.com> (2019).
John Helmert III <jchelmertt3@gmail.com> (2019).
.SH BUGS
Report bugs to \fIhttps://gitlab.com/ajak/rtv/issues\fR
Report bugs to \fIhttps://gitlab.com/ajak/tuir/issues\fR
.SH LICENSE
{license}

View File

@@ -29,13 +29,13 @@ def main():
commit = p.stdout.read().strip()
print('Found commit %s' % commit)
regex = 's/^__praw_hash__ =.*$/__praw_hash__ = \'%s\'/g' % commit
packages_root = os.path.join(ROOT, 'rtv', 'packages', '__init__.py')
packages_root = os.path.join(ROOT, 'tuir', 'packages', '__init__.py')
print('Updating commit hash in %s' % packages_root)
subprocess.check_call(['sed', '-i', '', regex, packages_root])
# Overwrite the project files
src = os.path.join(tmpdir, 'praw')
dest = os.path.join(ROOT, 'rtv', 'packages', 'praw')
dest = os.path.join(ROOT, 'tuir', 'packages', 'praw')
print('Copying package files to %s' % dest)
shutil.rmtree(dest, ignore_errors=True)
shutil.copytree(src, dest)

View File

@@ -44,30 +44,30 @@ def long_description():
setuptools.setup(
name='rtv',
name='tuir',
version=version,
description='A simple terminal viewer for Reddit (Reddit Terminal Viewer)',
description='A simple terminal viewer for Reddit (Terminal UI for Reddit)',
long_description=long_description(),
long_description_content_type='text/markdown',
url='https://gitlab.com/ajak/rtv',
url='https://gitlab.com/ajak/tuir',
author='John Helmert III',
author_email='jchelmertt3@gmail.com',
license='MIT',
keywords='reddit terminal praw curses',
packages=[
'rtv',
'rtv.packages',
'rtv.packages.praw'
'tuir',
'tuir.packages',
'tuir.packages.praw'
],
package_data={
'rtv': ['templates/*', 'themes/*'],
'rtv.packages.praw': ['praw.ini']
'tuir': ['templates/*', 'themes/*'],
'tuir.packages.praw': ['praw.ini']
},
data_files=[("share/man/man1", ["rtv.1"])],
data_files=[("share/man/man1", ["tuir.1"])],
install_requires=install_requires,
tests_require=tests_require,
extras_require=extras_require,
entry_points={'console_scripts': ['rtv=rtv.__main__:main']},
entry_points={'console_scripts': ['tuir=tuir.__main__:main']},
classifiers=[
'Intended Audience :: End Users/Desktop',
'Environment :: Console :: Curses',

View File

@@ -11,15 +11,15 @@ import pytest
from vcr import VCR
from six.moves.urllib.parse import urlparse, parse_qs
from rtv.oauth import OAuthHelper, OAuthHandler, OAuthHTTPServer
from rtv.content import RequestHeaderRateLimiter
from rtv.config import Config
from rtv.packages import praw
from rtv.terminal import Terminal
from rtv.subreddit_page import SubredditPage
from rtv.submission_page import SubmissionPage
from rtv.subscription_page import SubscriptionPage
from rtv.inbox_page import InboxPage
from tuir.oauth import OAuthHelper, OAuthHandler, OAuthHTTPServer
from tuir.content import RequestHeaderRateLimiter
from tuir.config import Config
from tuir.packages import praw
from tuir.terminal import Terminal
from tuir.subreddit_page import SubredditPage
from tuir.submission_page import SubmissionPage
from tuir.subscription_page import SubscriptionPage
from tuir.inbox_page import InboxPage
try:
from unittest import mock
@@ -40,7 +40,7 @@ for name in ['vcr.matchers', 'vcr.stubs']:
def pytest_addoption(parser):
parser.addoption('--record-mode', dest='record_mode', default='none')
parser.addoption('--refresh-token', dest='refresh_token',
default='~/.local/share/rtv/refresh-token')
default='~/.local/share/tuir/refresh-token')
class MockStdscr(mock.MagicMock):
@@ -184,9 +184,9 @@ def reddit(vcr, request):
os.remove(filename)
with vcr.use_cassette(cassette_name):
with patch('rtv.packages.praw.Reddit.get_access_information'):
with patch('tuir.packages.praw.Reddit.get_access_information'):
handler = RequestHeaderRateLimiter()
reddit = praw.Reddit(user_agent='rtv test suite',
reddit = praw.Reddit(user_agent='tuir test suite',
decode_html_entities=False,
disable_update_check=True,
handler=handler)

View File

@@ -3,8 +3,8 @@ from __future__ import unicode_literals
import pytest
from rtv.clipboard import copy
from rtv.exceptions import ProgramError
from tuir.clipboard import copy
from tuir.exceptions import ProgramError
try:

View File

@@ -5,7 +5,7 @@ import os
import codecs
from tempfile import NamedTemporaryFile
from rtv.config import Config, copy_default_config, copy_default_mailcap
from tuir.config import Config, copy_default_config, copy_default_mailcap
try:
from unittest import mock
@@ -17,7 +17,7 @@ def test_copy_default_config():
"""Make sure the default config file was included in the package"""
with NamedTemporaryFile(suffix='.cfg') as fp:
with mock.patch('rtv.config.six.moves.input', return_value='y'):
with mock.patch('tuir.config.six.moves.input', return_value='y'):
copy_default_config(fp.name)
assert fp.read()
# Check that the permissions were changed
@@ -29,7 +29,7 @@ def test_copy_default_config_cancel():
"""Pressing ``n`` should cancel the copy"""
with NamedTemporaryFile(suffix='.cfg') as fp:
with mock.patch('rtv.config.six.moves.input', return_value='n'):
with mock.patch('tuir.config.six.moves.input', return_value='n'):
copy_default_config(fp.name)
assert not fp.read()
@@ -38,7 +38,7 @@ def test_copy_config_interrupt():
"""Pressing ``Ctrl-C`` should cancel the copy"""
with NamedTemporaryFile(suffix='.cfg') as fp:
with mock.patch('rtv.config.six.moves.input') as func:
with mock.patch('tuir.config.six.moves.input') as func:
func.side_effect = KeyboardInterrupt
copy_default_config(fp.name)
assert not fp.read()
@@ -48,7 +48,7 @@ def test_copy_default_mailcap():
"""Make sure the example mailcap file was included in the package"""
with NamedTemporaryFile() as fp:
with mock.patch('rtv.config.six.moves.input', return_value='y'):
with mock.patch('tuir.config.six.moves.input', return_value='y'):
copy_default_mailcap(fp.name)
assert fp.read()
# Check that the permissions were changed
@@ -79,7 +79,7 @@ def test_config_interface():
def test_config_get_args():
"""Ensure that command line arguments are parsed properly"""
args = ['rtv',
args = ['tuir',
'https://reddit.com/permalink •',
'-s', 'cfb',
'--log', 'logfile.log',
@@ -95,7 +95,7 @@ def test_config_get_args():
'--no-flash',
'--no-autologin']
with mock.patch('sys.argv', ['rtv']):
with mock.patch('sys.argv', ['tuir']):
config_dict = Config.get_args()
config = Config(**config_dict)
assert config.config == {}
@@ -124,14 +124,14 @@ def test_config_get_args():
def test_config_link_deprecated():
# Should still be able to specify the link using the old "-l"
args = ['rtv', '-l', 'https://reddit.com/option']
args = ['tuir', '-l', 'https://reddit.com/option']
with mock.patch('sys.argv', args):
config_dict = Config.get_args()
config = Config(**config_dict)
assert config['link'] == 'https://reddit.com/option'
# But the positional argument should take preference
args = ['rtv', 'https://reddit.com/arg', '-l', 'https://reddit.com/option']
args = ['tuir', 'https://reddit.com/arg', '-l', 'https://reddit.com/option']
with mock.patch('sys.argv', args):
config_dict = Config.get_args()
config = Config(**config_dict)
@@ -172,9 +172,9 @@ def test_config_from_file():
assert config.config == {}
assert config.keymap._keymap == default_keymap
# [rtv]
# [tuir]
rows = ['{0}={1}'.format(key, val) for key, val in args.items()]
data = '\n'.join(['[rtv]'] + rows)
data = '\n'.join(['[tuir]'] + rows)
fp.write(codecs.encode(data, 'utf-8'))
# [bindings]

View File

@@ -8,9 +8,9 @@ from collections import OrderedDict
import six
import pytest
from rtv import exceptions
from rtv.packages import praw
from rtv.content import (
from tuir import exceptions
from tuir.packages import praw
from tuir.content import (
Content, SubmissionContent, SubredditContent, SubscriptionContent,
RequestHeaderRateLimiter)

View File

@@ -2,12 +2,12 @@
from __future__ import unicode_literals
import pytest
from rtv.packages.praw.errors import InvalidUser
from tuir.packages.praw.errors import InvalidUser
from rtv import exceptions
from rtv.docs import FOOTER_INBOX
from rtv.inbox_page import InboxPage
from rtv.submission_page import SubmissionPage
from tuir import exceptions
from tuir.docs import FOOTER_INBOX
from tuir.inbox_page import InboxPage
from tuir.submission_page import SubmissionPage
try:
from unittest import mock

View File

@@ -6,7 +6,7 @@ from collections import OrderedDict
import pytest
from rtv.mime_parsers import parsers, ImgurApiMIMEParser
from tuir.mime_parsers import parsers, ImgurApiMIMEParser
RegexpType = type(re.compile(''))

View File

@@ -3,9 +3,9 @@ from __future__ import unicode_literals
import requests
from rtv.oauth import OAuthHelper, OAuthHandler
from rtv.exceptions import InvalidRefreshToken
from rtv.packages.praw.errors import OAuthException
from tuir.oauth import OAuthHelper, OAuthHandler
from tuir.exceptions import InvalidRefreshToken
from tuir.packages.praw.errors import OAuthException
try:
@@ -128,8 +128,8 @@ def test_oauth_authorize(oauth, reddit, stdscr, refresh_token):
# Because we use `from .helpers import open_browser` we have to patch the
# function in the destination oauth module and not the helpers module
with mock.patch('uuid.UUID.hex', new_callable=mock.PropertyMock) as uuid, \
mock.patch('rtv.terminal.Terminal.open_browser') as open_browser, \
mock.patch('rtv.oauth.OAuthHTTPServer') as http_server, \
mock.patch('tuir.terminal.Terminal.open_browser') as open_browser, \
mock.patch('tuir.oauth.OAuthHTTPServer') as http_server, \
mock.patch.object(oauth.reddit, 'user'), \
mock.patch('time.sleep'):

View File

@@ -11,8 +11,8 @@ import pytest
import requests
from six.moves import reload_module
from rtv import exceptions
from rtv.objects import Controller, Navigator, Command, KeyMap, \
from tuir import exceptions
from tuir.objects import Controller, Navigator, Command, KeyMap, \
curses_session, patch_webbrowser
try:

View File

@@ -1,4 +1,4 @@
from rtv import packages
from tuir import packages
def test_praw3_package():

View File

@@ -5,7 +5,7 @@ import curses
import pytest
from rtv.page import Page, PageController, logged_in
from tuir.page import Page, PageController, logged_in
try:
from unittest import mock

View File

@@ -6,8 +6,8 @@ from collections import OrderedDict
import pytest
from rtv.submission_page import SubmissionPage
from rtv.docs import FOOTER_SUBMISSION
from tuir.submission_page import SubmissionPage
from tuir.docs import FOOTER_SUBMISSION
try:
from unittest import mock
@@ -262,9 +262,9 @@ def test_submission_vote(submission_page, refresh_token):
submission_page.oauth.authorize()
# Test voting on the submission
with mock.patch('rtv.packages.praw.objects.Submission.upvote') as upvote, \
mock.patch('rtv.packages.praw.objects.Submission.downvote') as downvote, \
mock.patch('rtv.packages.praw.objects.Submission.clear_vote') as clear_vote:
with mock.patch('tuir.packages.praw.objects.Submission.upvote') as upvote, \
mock.patch('tuir.packages.praw.objects.Submission.downvote') as downvote, \
mock.patch('tuir.packages.praw.objects.Submission.clear_vote') as clear_vote:
data = submission_page.get_selected_item()
data['object'].archived = False
@@ -338,8 +338,8 @@ def test_submission_save(submission_page, refresh_token):
submission_page.oauth.authorize()
# Test save on the submission
with mock.patch('rtv.packages.praw.objects.Submission.save') as save, \
mock.patch('rtv.packages.praw.objects.Submission.unsave') as unsave:
with mock.patch('tuir.packages.praw.objects.Submission.save') as save, \
mock.patch('tuir.packages.praw.objects.Submission.unsave') as unsave:
data = submission_page.content.get(submission_page.nav.absolute_index)
@@ -370,8 +370,8 @@ def test_submission_comment_save(submission_page, terminal, refresh_token):
submission_page.controller.trigger('j')
# Test save on the comment submission
with mock.patch('rtv.packages.praw.objects.Comment.save') as save, \
mock.patch('rtv.packages.praw.objects.Comment.unsave') as unsave:
with mock.patch('tuir.packages.praw.objects.Comment.save') as save, \
mock.patch('tuir.packages.praw.objects.Comment.unsave') as unsave:
data = submission_page.content.get(submission_page.nav.absolute_index)
@@ -398,7 +398,7 @@ def test_submission_comment(submission_page, terminal, refresh_token):
submission_page.oauth.authorize()
# Leave a comment
with mock.patch('rtv.packages.praw.objects.Submission.add_comment') as add_comment, \
with mock.patch('tuir.packages.praw.objects.Submission.add_comment') as add_comment, \
mock.patch.object(terminal, 'open_editor') as open_editor, \
mock.patch('time.sleep'):
open_editor.return_value.__enter__.return_value = 'comment text'
@@ -430,7 +430,7 @@ def test_submission_delete(submission_page, terminal, refresh_token):
# Spoof the author and try to delete again
data = submission_page.content.get(submission_page.nav.absolute_index)
data['author'] = submission_page.reddit.user.name
with mock.patch('rtv.packages.praw.objects.Comment.delete') as delete, \
with mock.patch('tuir.packages.praw.objects.Comment.delete') as delete, \
mock.patch.object(terminal.stdscr, 'getch') as getch, \
mock.patch('time.sleep'):
getch.return_value = ord('y')
@@ -454,7 +454,7 @@ def test_submission_edit(submission_page, terminal, refresh_token):
# Spoof the submission and try to edit again
data = submission_page.content.get(submission_page.nav.absolute_index)
data['author'] = submission_page.reddit.user.name
with mock.patch('rtv.packages.praw.objects.Submission.edit') as edit, \
with mock.patch('tuir.packages.praw.objects.Submission.edit') as edit, \
mock.patch.object(terminal, 'open_editor') as open_editor, \
mock.patch('time.sleep'):
open_editor.return_value.__enter__.return_value = 'submission text'
@@ -470,7 +470,7 @@ def test_submission_edit(submission_page, terminal, refresh_token):
# Spoof the author and edit the comment
data = submission_page.content.get(submission_page.nav.absolute_index)
data['author'] = submission_page.reddit.user.name
with mock.patch('rtv.packages.praw.objects.Comment.edit') as edit, \
with mock.patch('tuir.packages.praw.objects.Comment.edit') as edit, \
mock.patch.object(terminal, 'open_editor') as open_editor, \
mock.patch('time.sleep'):
open_editor.return_value.__enter__.return_value = 'comment text'

View File

@@ -7,9 +7,9 @@ from collections import OrderedDict
import six
import pytest
from rtv import __version__
from rtv.subreddit_page import SubredditPage
from rtv.packages.praw.errors import NotFound, HTTPException
from tuir import __version__
from tuir.subreddit_page import SubredditPage
from tuir.packages.praw.errors import NotFound, HTTPException
from requests.exceptions import ReadTimeout
try:
@@ -103,13 +103,13 @@ def test_subreddit_title(subreddit_page, terminal, capsys):
subreddit_page.draw()
out, _ = capsys.readouterr()
assert isinstance(out, six.text_type)
assert out == '\x1b]2;hello ? - rtv {}\x07'.format(__version__)
assert out == '\x1b]2;hello ? - tuir {}\x07'.format(__version__)
terminal.config['ascii'] = False
subreddit_page.draw()
out, _ = capsys.readouterr()
assert isinstance(out, six.text_type)
assert out == '\x1b]2;hello ❤ - rtv {}\x07'.format(__version__)
assert out == '\x1b]2;hello ❤ - tuir {}\x07'.format(__version__)
with mock.patch.dict('os.environ', {'DISPLAY': ''}):
subreddit_page.draw()
@@ -313,7 +313,7 @@ def test_subreddit_open(subreddit_page, terminal, config):
assert terminal.open_link.called
config.history.add.assert_called_with(data['url_full'])
# Open the selected link within rtv
# Open the selected link within tuir
data = subreddit_page.content.get(subreddit_page.nav.absolute_index)
with mock.patch.object(subreddit_page, 'open_submission'), \
mock.patch.object(config.history, 'add'):
@@ -404,7 +404,7 @@ def test_subreddit_open_subscriptions(subreddit_page, refresh_token):
assert subreddit_page.selected_page
assert subreddit_page.active
with mock.patch('rtv.page.Page.loop') as loop:
with mock.patch('tuir.page.Page.loop') as loop:
subreddit_page.handle_selected_page()
assert loop.called
@@ -435,7 +435,7 @@ def test_subreddit_open_multireddits(subreddit_page, refresh_token):
assert subreddit_page.selected_page
assert subreddit_page.active
with mock.patch('rtv.page.Page.loop') as loop:
with mock.patch('tuir.page.Page.loop') as loop:
subreddit_page.handle_selected_page()
assert loop.called

View File

@@ -5,7 +5,7 @@ import curses
import pytest
from rtv.subscription_page import SubscriptionPage
from tuir.subscription_page import SubscriptionPage
try:
from unittest import mock
@@ -56,7 +56,7 @@ def test_subscription_page_construct(reddit, terminal, config, oauth,
def test_subscription_refresh(subscription_page):
with mock.patch('rtv.terminal.Terminal.flash') as flash:
with mock.patch('tuir.terminal.Terminal.flash') as flash:
# Refresh content - invalid order
subscription_page.refresh_content(order='top')
assert flash.called

View File

@@ -10,10 +10,10 @@ from textwrap import dedent
import six
import pytest
from rtv.theme import Theme
from rtv.docs import (HELP, REPLY_FILE, COMMENT_EDIT_FILE, TOKEN,
from tuir.theme import Theme
from tuir.docs import (HELP, REPLY_FILE, COMMENT_EDIT_FILE, TOKEN,
SUBMISSION_FILE, SUBMISSION_EDIT_FILE, MESSAGE_FILE)
from rtv.exceptions import TemporaryFileError, BrowserError
from tuir.exceptions import TemporaryFileError, BrowserError
try:
from unittest import mock
@@ -29,13 +29,13 @@ def test_terminal_properties(terminal, config):
assert isinstance(terminal.gilded, six.text_type)
terminal._display = None
with mock.patch('rtv.terminal.sys') as sys, \
with mock.patch('tuir.terminal.sys') as sys, \
mock.patch.dict('os.environ', {'DISPLAY': ''}):
sys.platform = 'linux'
assert terminal.display is False
terminal._display = None
with mock.patch('rtv.terminal.sys') as sys, \
with mock.patch('tuir.terminal.sys') as sys, \
mock.patch('os.environ', {'DISPLAY': ''}), \
mock.patch('webbrowser._tryorder', new=[]):
sys.platform = 'darwin'
@@ -367,7 +367,7 @@ def test_terminal_open_link_mailcap(terminal):
mock_mime_parser = MockMimeParser()
with mock.patch.object(terminal, 'open_browser'), \
mock.patch('rtv.terminal.mime_parsers') as mime_parsers:
mock.patch('tuir.terminal.mime_parsers') as mime_parsers:
mime_parsers.parsers = [mock_mime_parser]
# Pass through to open_browser if media is disabled
@@ -490,7 +490,7 @@ def test_terminal_open_browser_display(terminal):
def test_terminal_open_browser_display_no_response(terminal):
terminal._display = True
with mock.patch('rtv.terminal.Process', autospec=True) as Process:
with mock.patch('tuir.terminal.Process', autospec=True) as Process:
Process.return_value.is_alive.return_value = 1
terminal.open_browser('http://www.test.com')
assert isinstance(terminal.loader.exception, BrowserError)
@@ -738,7 +738,7 @@ def test_terminal_get_link_page_text(terminal):
{'href': 'https://www.reddit.com', 'text': 'Reddit Homepage'},
{'href': 'https://www.duckduckgo.com', 'text': 'Search Engine'},
{
'href': 'https://gitlab.com/ajak/rtv',
'href': 'https://gitlab.com/ajak/tuir',
'text': 'This project\'s homepage'
}
]
@@ -747,7 +747,7 @@ def test_terminal_get_link_page_text(terminal):
assert text == dedent("""\
[0] [Reddit Homepage](https://www.reddit.com)
[1] [Search Engine](https://www.duckduckgo.com)
[2] [This project's home…](https://gitlab.com/ajak/rtv)
[2] [This project's home…](https://gitlab.com/ajak/tuir)
""")

View File

@@ -7,9 +7,9 @@ from tempfile import mkdtemp, NamedTemporaryFile
import pytest
from rtv.theme import Theme
from rtv.config import DEFAULT_THEMES
from rtv.exceptions import ConfigError
from tuir.theme import Theme
from tuir.config import DEFAULT_THEMES
from tuir.exceptions import ConfigError
try:
from unittest import mock

View File

@@ -1,10 +1,10 @@
.TH "RTV" "1" "June 08, 2019" "Version 1.27.0" "Usage and Commands"
.TH "TUIR" "1" "June 10, 2019" "Version 1.27.0" "Usage and Commands"
.SH NAME
RTV - Reddit Terminal Viewer
TUIR - Terminal UI for Reddit
.SH SYNOPSIS
rtv [URL] [\-s SUBREDDIT]
tuir [URL] [\-s SUBREDDIT]
.SH DESCRIPTION
RTV (Reddit Terminal Viewer) is a terminal interface to view and interact with reddit.
TUIR (Terminal UI for Reddit) is a terminal interface to view and interact with reddit.
.SH OPTIONS
.TP
\fBURL\fR
@@ -56,7 +56,7 @@ Remove any saved user data before launching
.TP
\fB\-\-copy\-config\fR
Copy the default configuration to {HOME}/.config/rtv/rtv.cfg
Copy the default configuration to {HOME}/.config/tuir/tuir.cfg
.TP
\fB\-\-copy\-mailcap\fR
@@ -89,32 +89,32 @@ Press \fBright\fR to view the selected submission and \fBleft\fR to return.
Press \fB?\fR to open the help screen.
.SH FILES
.TP
.BR $XDG_CONFIG_HOME/rtv/rtv.cfg
.BR $XDG_CONFIG_HOME/tuir/tuir.cfg
The configuration file can be used to customize default program settings.
.TP
.BR $XDG_DATA_HOME/rtv/refresh-token
.BR $XDG_DATA_HOME/tuir/refresh-token
After you login to reddit, your most recent OAuth refresh token will be stored
for future sessions.
.TP
.BR $XDG_DATA_HOME/rtv/history.log
.BR $XDG_DATA_HOME/tuir/history.log
This file stores URLs that have been recently opened in order to
visually highlight them as "seen".
.SH ENVIRONMENT
.TP
.BR RTV_EDITOR
.BR TUIR_EDITOR
Text editor to use when editing comments and submissions. Will fallback to
\fI$EDITOR\fR.
.TP
.BR RTV_URLVIEWER
.BR TUIR_URLVIEWER
Url viewer to use to extract links from comments. Requires a compatible
program to be installed.
.TP
.BR RTV_BROWSER
.BR TUIR_BROWSER
Web browser to use when opening links. Will fallback to \fI$BROWSER\fR.
.SH AUTHOR
Michael Lazar <lazar.michael22@gmail.com> (2017).
John Helmert <jchelmertt3@gmail.com> (2019).
John Helmert III <jchelmertt3@gmail.com> (2019).
.SH BUGS
Report bugs to \fIhttps://gitlab.com/ajak/rtv/issues\fR
Report bugs to \fIhttps://gitlab.com/ajak/tuir/issues\fR
.SH LICENSE
The MIT License (MIT)

27
tuir/__init__.py Normal file
View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
r"""
______ _ __ __ ______ ____
/_ __/__ _________ ___ (_)___ ____ _/ / / / / / _/ / __/___ _____
/ / / _ \/ ___/ __ `__ \/ / __ \/ __ `/ / / / / // / / /_/ __ \/ ___/
/ / / __/ / / / / / / / / / / / /_/ / / / /_/ // / / __/ /_/ / /
/_/ \___/_/ /_/ /_/ /_/_/_/ /_/\__,_/_/ \____/___/ /_/ \____/_/
____ __ ___ __
/ __ \___ ____/ /___/ (_) /_
/ /_/ / _ \/ __ / __ / / __/
/ _, _/ __/ /_/ / /_/ / / /_
/_/ |_|\___/\__,_/\__,_/_/\__/
(TUIR)
"""
from __future__ import unicode_literals
from .__version__ import __version__
__title__ = 'Terminal UI for Reddit'
__author__ = 'Michael Lazar'
__license__ = 'The MIT License (MIT)'
__copyright__ = '(c) 2016 Michael Lazar, portions (c) 2019 John Helmert III'

View File

@@ -13,7 +13,7 @@ import warnings
import six
import requests
# Need to check for curses compatibility before performing the rtv imports
# Need to check for curses compatibility before performing the tuir imports
try:
import curses
except ImportError:
@@ -28,9 +28,9 @@ except ImportError:
# references, it needs to be done before the webbrowser module is imported
# for the first time.
webbrowser_import_warning = ('webbrowser' in sys.modules)
RTV_BROWSER, BROWSER = os.environ.get('RTV_BROWSER'), os.environ.get('BROWSER')
if RTV_BROWSER:
os.environ['BROWSER'] = RTV_BROWSER
TUIR_BROWSER, BROWSER = os.environ.get('TUIR_BROWSER'), os.environ.get('BROWSER')
if TUIR_BROWSER:
os.environ['BROWSER'] = TUIR_BROWSER
from . import docs
from . import packages
@@ -50,8 +50,8 @@ _logger = logging.getLogger(__name__)
# Pycharm debugging note:
# You can use pycharm to debug a curses application by launching rtv in a
# console window (python -m rtv) and using pycharm to attach to the remote
# You can use pycharm to debug a curses application by launching tuir in a
# console window (python -m tuir) and using pycharm to attach to the remote
# process. On Ubuntu, you may need to allow ptrace permissions by setting
# ptrace_scope to 0 in /etc/sysctl.d/10-ptrace.conf.
# http://blog.mellenthin.de/archives/2010/10/18/gdb-attach-fails
@@ -68,7 +68,7 @@ def main():
# Set the terminal title
if os.getenv('DISPLAY'):
title = 'rtv {0}'.format(__version__)
title = 'tuir {0}'.format(__version__)
sys.stdout.write('\x1b]2;{0}\x07'.format(title))
sys.stdout.flush()
@@ -150,8 +150,8 @@ def main():
user_agent = docs.AGENT.format(version=__version__)
debug_info = [
'rtv version: rtv {}'.format(__version__),
'rtv module path: {}'.format(os.path.abspath(__file__)),
'tuir version: tuir {}'.format(__version__),
'tuir module path: {}'.format(os.path.abspath(__file__)),
'python version: {}'.format(sys.version.replace('\n', ' ')),
'python executable: {}'.format(sys.executable),
'praw version: {}'.format(praw_info),
@@ -163,10 +163,10 @@ def main():
('EDITOR', os.getenv('EDITOR')),
('LANG', os.getenv('LANG')),
('PAGER', os.getenv('PAGER')),
('RTV_BROWSER', RTV_BROWSER),
('RTV_EDITOR', os.getenv('RTV_EDITOR')),
('RTV_PAGER', os.getenv('RTV_PAGER')),
('RTV_URLVIEWER', os.getenv('RTV_URLVIEWER')),
('TUIR_BROWSER', TUIR_BROWSER),
('TUIR_EDITOR', os.getenv('TUIR_EDITOR')),
('TUIR_PAGER', os.getenv('TUIR_PAGER')),
('TUIR_URLVIEWER', os.getenv('TUIR_URLVIEWER')),
('TERM', os.getenv('TERM')),
('VISUAL', os.getenv('VISUAL')),
('XDG_CONFIG_HOME', os.getenv('XDG_CONFIG_HOME')),
@@ -263,8 +263,8 @@ def main():
exit_message = '\n'.join([
debug_text,
traceback.format_exc(),
'rtv has crashed. Please report this traceback at:',
'https://gitlab.com/ajak/rtv/issues\n'])
'tuir has crashed. Please report this traceback at:',
'https://gitlab.com/ajak/tuir/issues\n'])
sys.stderr.write(exit_message)
return 1 # General error exception code
except KeyboardInterrupt:

View File

@@ -16,21 +16,21 @@ from .objects import KeyMap
PACKAGE = os.path.dirname(__file__)
HOME = os.path.expanduser('~')
TEMPLATES = os.path.join(PACKAGE, 'templates')
DEFAULT_CONFIG = os.path.join(TEMPLATES, 'rtv.cfg')
DEFAULT_CONFIG = os.path.join(TEMPLATES, 'tuir.cfg')
DEFAULT_MAILCAP = os.path.join(TEMPLATES, 'mailcap')
DEFAULT_THEMES = os.path.join(PACKAGE, 'themes')
XDG_CONFIG_HOME = os.getenv('XDG_CONFIG_HOME', os.path.join(HOME, '.config'))
XDG_DATA_HOME = os.getenv('XDG_DATA_HOME', os.path.join(HOME, '.local', 'share'))
CONFIG = os.path.join(XDG_CONFIG_HOME, 'rtv', 'rtv.cfg')
CONFIG = os.path.join(XDG_CONFIG_HOME, 'tuir', 'tuir.cfg')
MAILCAP = os.path.join(HOME, '.mailcap')
TOKEN = os.path.join(XDG_DATA_HOME, 'rtv', 'refresh-token')
HISTORY = os.path.join(XDG_DATA_HOME, 'rtv', 'history.log')
THEMES = os.path.join(XDG_CONFIG_HOME, 'rtv', 'themes')
TOKEN = os.path.join(XDG_DATA_HOME, 'tuir', 'refresh-token')
HISTORY = os.path.join(XDG_DATA_HOME, 'tuir', 'history.log')
THEMES = os.path.join(XDG_CONFIG_HOME, 'tuir', 'themes')
def build_parser():
parser = argparse.ArgumentParser(
prog='rtv', description=docs.SUMMARY,
prog='tuir', description=docs.SUMMARY,
epilog=docs.CONTROLS,
usage=docs.USAGE,
formatter_class=argparse.RawDescriptionHelpFormatter)
@@ -72,7 +72,7 @@ def build_parser():
help='Remove any saved user data before launching')
parser.add_argument(
'--copy-config', dest='copy_config', action='store_const', const=True,
help='Copy the default configuration to {HOME}/.config/rtv/rtv.cfg')
help='Copy the default configuration to {HOME}/.config/tuir/tuir.cfg')
parser.add_argument(
'--copy-mailcap', dest='copy_mailcap', action='store_const', const=True,
help='Copy an example mailcap configuration to {HOME}/.mailcap')
@@ -80,7 +80,7 @@ def build_parser():
'--enable-media', dest='enable_media', action='store_const', const=True,
help='Open external links using programs defined in the mailcap config')
parser.add_argument(
'-V', '--version', action='version', version='rtv ' + __version__)
'-V', '--version', action='version', version='tuir ' + __version__)
parser.add_argument(
'--no-flash', dest='flash', action='store_const', const=False,
help='Disable screen flashing')
@@ -99,7 +99,7 @@ def copy_default_mailcap(filename=MAILCAP):
def copy_default_config(filename=CONFIG):
"""
Copy the default rtv user configuration to the specified file.
Copy the default tuir user configuration to the specified file.
"""
return _copy_settings_file(DEFAULT_CONFIG, filename, 'config')
@@ -241,7 +241,7 @@ class Config(object):
@classmethod
def get_file(cls, filename=None):
"""
Load settings from an rtv configuration file.
Load settings from an tuir configuration file.
"""
if filename is None:
@@ -252,36 +252,36 @@ class Config(object):
with codecs.open(filename, encoding='utf-8') as fp:
config.read_file(fp)
return cls._parse_rtv_file(config)
return cls._parse_tuir_file(config)
@staticmethod
def _parse_rtv_file(config):
def _parse_tuir_file(config):
rtv = {}
if config.has_section('rtv'):
rtv = dict(config.items('rtv'))
tuir = {}
if config.has_section('tuir'):
tuir = dict(config.items('tuir'))
# convert non-string params to their typed representation
params = {
'ascii': partial(config.getboolean, 'rtv'),
'monochrome': partial(config.getboolean, 'rtv'),
'persistent': partial(config.getboolean, 'rtv'),
'autologin': partial(config.getboolean, 'rtv'),
'clear_auth': partial(config.getboolean, 'rtv'),
'enable_media': partial(config.getboolean, 'rtv'),
'history_size': partial(config.getint, 'rtv'),
'oauth_redirect_port': partial(config.getint, 'rtv'),
'oauth_scope': lambda x: rtv[x].split(','),
'max_comment_cols': partial(config.getint, 'rtv'),
'max_pager_cols': partial(config.getint, 'rtv'),
'hide_username': partial(config.getboolean, 'rtv'),
'flash': partial(config.getboolean, 'rtv'),
'force_new_browser_window': partial(config.getboolean, 'rtv')
'ascii': partial(config.getboolean, 'tuir'),
'monochrome': partial(config.getboolean, 'tuir'),
'persistent': partial(config.getboolean, 'tuir'),
'autologin': partial(config.getboolean, 'tuir'),
'clear_auth': partial(config.getboolean, 'tuir'),
'enable_media': partial(config.getboolean, 'tuir'),
'history_size': partial(config.getint, 'tuir'),
'oauth_redirect_port': partial(config.getint, 'tuir'),
'oauth_scope': lambda x: tuir[x].split(','),
'max_comment_cols': partial(config.getint, 'tuir'),
'max_pager_cols': partial(config.getint, 'tuir'),
'hide_username': partial(config.getboolean, 'tuir'),
'flash': partial(config.getboolean, 'tuir'),
'force_new_browser_window': partial(config.getboolean, 'tuir')
}
for key, func in params.items():
if key in rtv:
rtv[key] = func(key)
if key in tuir:
tuir[key] = func(key)
bindings = {}
if config.has_section('bindings'):
@@ -290,7 +290,7 @@ class Config(object):
for name, keys in bindings.items():
bindings[name] = [key.strip() for key in keys.split(',')]
return rtv, bindings
return tuir, bindings
@staticmethod
def _ensure_filepath(filename):

View File

@@ -1041,7 +1041,7 @@ class RequestHeaderRateLimiter(DefaultHandler):
# In PRAW's convention, these variables were bound to the
# class so the cache could be shared among all of the ``reddit``
# instances. In RTV's use-case there is only ever a single reddit
# instances. In TUIR's use-case there is only ever a single reddit
# instance so it made sense to clean up the globals and transfer them
# to method variables
self.cache = {}
@@ -1150,8 +1150,8 @@ class RequestHeaderRateLimiter(DefaultHandler):
_cache_key = (url, (items[0], items[1], items[3], items[4]))
if kwargs['request'].method != 'GET':
# I added this check for RTV, I have no idea why PRAW would ever
# want to cache POST/PUT/DELETE requests
# I [michael-lazar] added this check for RTV, I have no idea
# why PRAW would ever want to cache POST/PUT/DELETE requests
_cache_ignore = True
if _cache_ignore:

View File

@@ -2,19 +2,19 @@
from __future__ import unicode_literals
AGENT = """\
desktop:https://github.com/ajak/rtv:{version}\
(by /u/civilization_phaze_3)\
desktop:https://gitlab.com/ajak/tuir:{version}\
(by /u/ajak__)\
"""
SUMMARY = """
RTV (Reddit Terminal Viewer) is a terminal interface to view and interact with reddit.
TUIR (Terminal UI for Reddit) is a terminal interface to view and interact with reddit.
"""
USAGE = """\
rtv [URL] [-s SUBREDDIT]
tuir [URL] [-s SUBREDDIT]
$ rtv https://www.reddit.com/r/programming/comments/7h9l31
$ rtv -s linux
$ tuir https://www.reddit.com/r/programming/comments/7h9l31
$ tuir -s linux
"""
CONTROLS = """
@@ -24,9 +24,9 @@ Press `?` to open the help screen.
HELP = """\
====================================
Reddit Terminal Viewer
Terminal UI for Reddit
https://github.com/ajak/rtv
https://github.com/ajak/tuir
====================================
[Basic Commands]
@@ -196,7 +196,7 @@ Enter your message below this instruction block:
OAUTH_ACCESS_DENIED = """\
<h1 style="color: red">Access Denied</h1><hr>
<p><span style="font-weight: bold">Reddit Terminal Viewer</span> was
<p><span style="font-weight: bold">Terminal UI for Reddit</span> was
denied access and will continue to operate in unauthenticated mode,
you can close this window.</p>
"""
@@ -214,7 +214,7 @@ OAUTH_INVALID = """\
OAUTH_SUCCESS = """\
<h1 style="color: green">Access Granted</h1><hr>
<p><span style="font-weight: bold">Reddit Terminal Viewer</span>
<p><span style="font-weight: bold">Terminal UI for Reddit</span>
will now log in, you can close this window.</p>
"""

View File

@@ -10,23 +10,23 @@ class ConfigError(Exception):
"There was a problem with the configuration"
class RTVError(Exception):
"Base RTV error class"
class TUIRError(Exception):
"Base TUIR error class"
class AccountError(RTVError):
class AccountError(TUIRError):
"Could not access user account"
class SubmissionError(RTVError):
class SubmissionError(TUIRError):
"Submission could not be loaded"
class SubredditError(RTVError):
class SubredditError(TUIRError):
"Subreddit could not be loaded"
class NoSubmissionsError(RTVError):
class NoSubmissionsError(TUIRError):
"No submissions for the given page"
def __init__(self, name):
@@ -35,29 +35,29 @@ class NoSubmissionsError(RTVError):
super(NoSubmissionsError, self).__init__(message)
class SubscriptionError(RTVError):
class SubscriptionError(TUIRError):
"Content could not be fetched"
class InboxError(RTVError):
class InboxError(TUIRError):
"Content could not be fetched"
class ProgramError(RTVError):
class ProgramError(TUIRError):
"Problem executing an external program"
class BrowserError(RTVError):
class BrowserError(TUIRError):
"Could not open a web browser tab"
class TemporaryFileError(RTVError):
class TemporaryFileError(TUIRError):
"Indicates that an error has occurred and the file should not be deleted"
class MailcapEntryNotFound(RTVError):
class MailcapEntryNotFound(TUIRError):
"A valid mailcap entry could not be coerced from the given url"
class InvalidRefreshToken(RTVError):
class InvalidRefreshToken(TUIRError):
"The refresh token is corrupt and cannot be used to login"

View File

@@ -202,9 +202,9 @@ class ImgurApiMIMEParser(BaseMIMEParser):
page has an associated hash and can either contain an album, a gallery,
or single image.
The default client token for RTV is shared among users and allows a maximum
The default client token for TUIR is shared among users and allows a maximum
global number of requests per day of 12,500. If we find that this limit is
not sufficient for all of rtv's traffic, this method will be revisited.
not sufficient for all of tuir's traffic, this method will be revisited.
Reference:
https://apidocs.imgur.com

View File

@@ -167,7 +167,7 @@ class OAuthHelper(object):
else:
if not autologin:
# Only show the welcome message if explicitly logging
# in, not when RTV first launches.
# in, not when TUIR first launches.
message = 'Welcome {}!'.format(self.reddit.user.name)
self.term.show_notification(message)

View File

@@ -165,7 +165,7 @@ class LoadScreen(object):
"""
EXCEPTION_MESSAGES = [
(exceptions.RTVError, '{0}'),
(exceptions.TUIRError, '{0}'),
(praw.errors.OAuthException, 'OAuth Error'),
(praw.errors.OAuthScopeRequired, 'Not logged in'),
(praw.errors.LoginRequired, 'Not logged in'),

View File

@@ -21,6 +21,6 @@ except ImportError:
if not praw.__version__.startswith('3.'):
raise RuntimeError('Invalid PRAW version ({0}) detected, '
'rtv requires PRAW version 3'.format(praw.__version__))
'tuir requires PRAW version 3'.format(praw.__version__))
sys.modules['%s.praw' % __name__] = praw
__praw_bundled__ = False

View File

@@ -237,7 +237,7 @@ class Page(object):
Move the cursor to the last item on the page.
"""
# If the page is empty, don't try to go to the bottom, rtv will
# If the page is empty, don't try to go to the bottom, tuir will
# crash when rendering
if self.content.range[1] < 0:
return
@@ -725,7 +725,7 @@ class Page(object):
# Setting the terminal title will break emacs or systems without
# X window.
if os.getenv('DISPLAY') and not os.getenv('INSIDE_EMACS'):
title += ' - rtv {0}'.format(__version__)
title += ' - tuir {0}'.format(__version__)
title = self.term.clean(title)
if six.PY3:
# In py3 you can't write bytes to stdout

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>RTV OAuth2 Helper</title>
<title>TUIR OAuth2 Helper</title>
<!-- style borrowed from http://bettermotherfuckingwebsite.com/ -->
<style type="text/css">
body {
@@ -26,6 +26,6 @@
</head>
<body>
${message}
<div id="footer">View the <a href="http://www.gitlab.com/ajak/rtv">Documentation</a></div>
<div id="footer">View the <a href="http://www.gitlab.com/ajak/tuir">Documentation</a></div>
</body>
</html>

View File

@@ -1,8 +1,8 @@
# Example mailcap file for Reddit Terminal Viewer
# https://gitlab.com/ajak/rtv/
# Example mailcap file for Terminal UI for Reddit
# https://gitlab.com/ajak/tuir/
#
# Copy the contents of this file to {HOME}/.mailcap, or point to it using $MAILCAPS
# Then launch RTV using the --enable-media flag. All shell commands defined in
# Then launch TUIR using the --enable-media flag. All shell commands defined in
# this file depend on external programs that must be installed on your system.
#
# HELP REQUESTED! If you come up with your own commands (especially for OS X)
@@ -19,11 +19,11 @@
###############################################################################
# Commands below this point will open media in a separate window without
# pausing execution of RTV.
# pausing execution of TUIR.
###############################################################################
# Feh is a simple and effective image viewer
# Note that rtv returns a list of urls for imgur albums, so we don't put quotes
# Note that tuir returns a list of urls for imgur albums, so we don't put quotes
# around the `%s`
image/x-imgur-album; feh -g 640x480 -. %s; test=test -n "$DISPLAY"
image/gif; mpv '%s' --autofit 640x480 --loop=inf; test=test -n "$DISPLAY"
@@ -56,10 +56,10 @@ image/x-imgur-album; echo
# 256 color images using half-width unicode characters
# Much higher quality that img2txt, but must be built from source
# https://github.com/rossy/img2xterm
image/*; curl -s '%s' | convert -resize 80x80 - jpg:/tmp/rtv.jpg && img2xterm /tmp/rtv.jpg; needsterminal; copiousoutput
image/*; curl -s '%s' | convert -resize 80x80 - jpg:/tmp/tuir.jpg && img2xterm /tmp/tuir.jpg; needsterminal; copiousoutput
# Display images in classic ascii using img2txt and lib-caca
image/*; curl -s '%s' | convert - jpg:/tmp/rtv.jpg && img2txt -f utf8 /tmp/rtv.jpg; needsterminal; copiousoutput
image/*; curl -s '%s' | convert - jpg:/tmp/tuir.jpg && img2txt -f utf8 /tmp/tuir.jpg; needsterminal; copiousoutput
# Full motion videos - requires a framebuffer to view
video/x-youtube; mpv -vo drm -quiet '%s'; needsterminal

View File

@@ -1,10 +1,10 @@
; Reddit Terminal Viewer Configuration File
; https://gitlab.com/ajak/rtv
; Terminal UI for Reddit Configuration File
; https://gitlab.com/ajak/tuir
;
; This file should be placed in $XDG_CONFIG/rtv/rtv.cfg
; If $XDG_CONFIG is not set, use ~/.config/rtv/rtv.cfg
; This file should be placed in $XDG_CONFIG/tuir/tuir.cfg
; If $XDG_CONFIG is not set, use ~/.config/tuir/tuir.cfg
[rtv]
[tuir]
##################
# General Settings
##################
@@ -26,7 +26,7 @@ monochrome = False
flash = True
; Enable debugging by logging all HTTP requests and errors to the given file.
;log = /tmp/rtv.log
;log = /tmp/tuir.log
; Default subreddit that will be opened when the program launches.
subreddit = front
@@ -34,7 +34,7 @@ subreddit = front
;subreddit = python+linux+programming
;subreddit = all
; Allow rtv to store reddit authentication credentials between sessions.
; Allow tuir to store reddit authentication credentials between sessions.
persistent = True
; Automatically log in on startup, if credentials are available.
@@ -58,7 +58,7 @@ max_comment_cols = 120
; Hide username if logged in, display "Logged in" instead
hide_username = False
; Color theme, use "rtv --list-themes" to view a list of valid options.
; Color theme, use "tuir --list-themes" to view a list of valid options.
; This can be an absolute filepath, or the name of a theme file that has
; been installed into either the custom of default theme paths.
;theme = molokai
@@ -70,16 +70,16 @@ force_new_browser_window = False
# OAuth Settings
################
; This sections defines the paramaters that will be used during the OAuth
; authentication process. rtv is registered as an "installed app",
; authentication process. tuir is registered as an "installed app",
; see https://github.com/reddit/reddit/wiki/OAuth2 for more information.
; These settings are defined at https://www.reddit.com/prefs/apps and should
; not be altered unless you are defining your own developer application.
oauth_client_id = E2oEtRQfdfAfNQ
oauth_client_id = zjyhNI7tK8ivzQ
oauth_client_secret = praw_gapfill
oauth_redirect_uri = http://127.0.0.1:65000/
; Port that the rtv webserver will listen on. This should match the redirect
; Port that the tuir webserver will listen on. This should match the redirect
; uri defined above.
oauth_redirect_port = 65000

View File

@@ -428,10 +428,10 @@ class Terminal(object):
Most urls are parsed using their file extension, but special cases
exist for websites that are prevalent on reddit such as Imgur and
Gfycat. If there are no valid mailcap definitions, RTV will fall back
Gfycat. If there are no valid mailcap definitions, TUIR will fall back
to using the default webbrowser.
RTV checks for certain mailcap fields to determine how to open a link:
TUIR checks for certain mailcap fields to determine how to open a link:
- If ``copiousoutput`` is specified, the curses application will
be paused and stdout will be piped to the system pager.
- If `needsterminal`` is specified, the curses application will
@@ -465,7 +465,7 @@ class Terminal(object):
copious_output = 'copiousoutput' in entry
if needs_terminal or copious_output:
# Blocking, pause rtv until the process returns
# Blocking, pause tuir until the process returns
with self.suspend():
os.system('clear')
p = subprocess.Popen(
@@ -567,7 +567,7 @@ class Terminal(object):
http://bugs.python.org/issue22277 for a better description of the
problem.
For console browsers (e.g. w3m), RTV will suspend and display the
For console browsers (e.g. w3m), TUIR will suspend and display the
browser window within the same terminal. This mode is triggered either
when
@@ -587,7 +587,7 @@ class Terminal(object):
# This used to be done using subprocess.Popen().
# It was switched to multiprocessing.Process so that we
# can re-use the webbrowser instance that has been patched
# by RTV. It's also safer because it doesn't inject
# by TUIR. It's also safer because it doesn't inject
# python code through the command line.
# Suppress stdout/stderr from the browser, see
@@ -640,14 +640,14 @@ class Terminal(object):
def open_pager(self, data, wrap=None):
"""
View a long block of text using an external pager / viewer. The setting
of the RTV_PAGER variable will be used if set, otherwise the system's
default pager is chosen, finally defaulting to 'less' if both RTV_PAGER
of the TUIR_PAGER variable will be used if set, otherwise the system's
default pager is chosen, finally defaulting to 'less' if both TUIR_PAGER
and PAGER is unset in the calling environment.
The data string will be piped directly to the pager.
"""
pager = os.getenv('RTV_PAGER')
pager = os.getenv('TUIR_PAGER')
if pager is None:
pager = os.getenv('PAGER') or 'less'
command = shlex.split(pager)
@@ -687,7 +687,7 @@ class Terminal(object):
text (str): The text that the user entered into the editor.
"""
with NamedTemporaryFile(prefix='rtv_', suffix='.txt', delete=False) as fp:
with NamedTemporaryFile(prefix='tuir_', suffix='.txt', delete=False) as fp:
# Create a tempory file and grab the name, but close immediately so
# we can re-open using the right encoding
filepath = fp.name
@@ -696,7 +696,7 @@ class Terminal(object):
fp.write(data)
_logger.info('File created: %s', filepath)
editor = (os.getenv('RTV_EDITOR') or
editor = (os.getenv('TUIR_EDITOR') or
os.getenv('VISUAL') or
os.getenv('EDITOR') or
'nano')
@@ -740,7 +740,7 @@ class Terminal(object):
web browser.
"""
urlview = os.getenv('RTV_URLVIEWER') or 'urlview'
urlview = os.getenv('TUIR_URLVIEWER') or 'urlview'
command = shlex.split(urlview)
try:
with self.suspend():
@@ -912,7 +912,7 @@ class Terminal(object):
@staticmethod
def strip_instructions(text):
"""
Remove instructional HTML comment tags inserted by RTV.
Remove instructional HTML comment tags inserted by TUIR.
We used to use # to annotate comments, but it conflicted with the
header tag for markdown, which some people use to format their posts.

View File

@@ -134,10 +134,10 @@ class Theme(object):
name (str): A unique string that describes the theme
source (str): A string that describes the source of the theme:
built-in - Should only be used when Theme() is called directly
preset - Themes packaged with rtv
installed - Themes in ~/.config/rtv/themes/
preset - Themes packaged with tuir
installed - Themes in ~/.config/tuir/themes/
custom - When a filepath is explicitly provided, e.g.
``rtv --theme=/path/to/theme_file.cfg``
``tuir --theme=/path/to/theme_file.cfg``
elements (dict): The theme's element map, should be in the same
format as Theme.DEFAULT_THEME.
"""

View File

@@ -1 +1 @@
rtv/__version__.py
tuir/__version__.py