sync with 1.10.0
This commit is contained in:
@@ -2,6 +2,9 @@
|
||||
RTV Changelog
|
||||
=============
|
||||
|
||||
.. _1.10.0: http://github.com/michael-lazar/rtv/releases/tag/v1.10.0
|
||||
.. _1.9.1: http://github.com/michael-lazar/rtv/releases/tag/v1.9.1
|
||||
.. _1.9.0: http://github.com/michael-lazar/rtv/releases/tag/v1.9.0
|
||||
.. _1.8.1: http://github.com/michael-lazar/rtv/releases/tag/v1.8.1
|
||||
.. _1.8.0: http://github.com/michael-lazar/rtv/releases/tag/v1.8.0
|
||||
.. _1.7.0: http://github.com/michael-lazar/rtv/releases/tag/v1.7.0
|
||||
@@ -16,6 +19,56 @@ RTV Changelog
|
||||
.. _1.2.1: http://github.com/michael-lazar/rtv/releases/tag/v1.2.1
|
||||
.. _1.2: http://github.com/michael-lazar/rtv/releases/tag/v1.2
|
||||
|
||||
--------------------
|
||||
1.10.0_ (2016-07-11)
|
||||
--------------------
|
||||
Features
|
||||
|
||||
* New command, `b` extracts urls from comments using urlviewer.
|
||||
* Comment files will no longer be destroyed if RTV encounters an error while posting.
|
||||
* The terminal title now displays the subreddit name/url.
|
||||
|
||||
Bugfixes
|
||||
|
||||
* Fixed crash when entering empty or invalid subreddit name.
|
||||
* Fixed crash when opening x-posts linked to subreddits.
|
||||
* Fixed a bug where the terminal title wasn't getting set.
|
||||
* **/r/me** is now displayed as *My Submissions* in the header.
|
||||
|
||||
-------------------
|
||||
1.9.1_ (2016-06-13)
|
||||
-------------------
|
||||
Features
|
||||
|
||||
* Better support for */r/random*.
|
||||
* Added a ``monochrome`` config setting to disable all color.
|
||||
* Improved cursor positioning when expanding/hiding comments.
|
||||
* Show ``(not enough space)`` when comments are too large.
|
||||
|
||||
Bugfixes
|
||||
|
||||
* Fixed permissions when copying the config file.
|
||||
* Fixed bug where submission indicies were duplicated when paging.
|
||||
* Specify praw v3.4.0 to avoid installing praw 4.
|
||||
|
||||
Documentation
|
||||
|
||||
* Added section to the readme on Arch Linux installation.
|
||||
* Updated a few argument descriptions.
|
||||
* Added a proper ascii logo.
|
||||
|
||||
-------------------
|
||||
1.9.0_ (2016-04-05)
|
||||
-------------------
|
||||
Features
|
||||
|
||||
* You can now open long posts/comments with the $PAGER by pressing `l`.
|
||||
* Changed a couple of visual separators.
|
||||
|
||||
Documentation
|
||||
|
||||
* Added testing instructions to the FAQ.
|
||||
|
||||
-------------------
|
||||
1.8.1_ (2016-03-01)
|
||||
-------------------
|
||||
|
||||
108
CONTRIBUTING.rst
Normal file
108
CONTRIBUTING.rst
Normal file
@@ -0,0 +1,108 @@
|
||||
-----------------------
|
||||
Contributor Guidlines
|
||||
-----------------------
|
||||
|
||||
Before you start
|
||||
================
|
||||
|
||||
- Post an issue on the `tracker <https://github.com/michael-lazar/rtv/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
|
||||
==============
|
||||
|
||||
- One of the project's goals is to maintain compatibility with as many terminal emulators as possible.
|
||||
Please be mindful of this when designing a new feature
|
||||
|
||||
- Is it compatible with both Linux and OS X?
|
||||
- Is it compatible with both Python 2 and Python 3
|
||||
- Will it work over ssh (without X11)?
|
||||
- What about terminals that don't support color? Or in those with limited (8/256) colors?
|
||||
- Will it work in tmux/screen?
|
||||
- Will is fail gracefully if unicode is not supported?
|
||||
|
||||
- If you're adding a new feature, try to include a few test cases.
|
||||
See the section below on setting up your test environment
|
||||
- If you tried, but you **ABSOLUTELY CAN'T** get the tests to run, it's ok
|
||||
- If you are unsure about anything, ask!
|
||||
|
||||
Submitting a pull request
|
||||
=========================
|
||||
|
||||
- Reference the issue # that the pull request is related to
|
||||
- Make sure you have merged in the latest changes from the ``master`` branch
|
||||
- After you submit, make sure that the Travis-CI build passes
|
||||
- Be prepared to have your code reviewed.
|
||||
For non-trivial additions, it's normal for this process to take a few iterations
|
||||
|
||||
Style guide
|
||||
===========
|
||||
|
||||
- All code should follow `PEP 8 <https://www.python.org/dev/peps/pep-0008/>`_
|
||||
- Try to keep lines under 80 characters, but don't sacrifice readability to do it!
|
||||
|
||||
**Ugly**
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
text = ''.join(
|
||||
line for line in fp2 if not line.startswith('#'))
|
||||
|
||||
**Better**
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
text = ''.join(line for line in fp2 if not line.startswith('#'))
|
||||
|
||||
- Use the existing codebase as a reference when writing docstrings (adopted from the `Google Style Guide <https://google.github.io/styleguide/pyguide.html#Comments>`_)
|
||||
- Add an encoding header ``# -*- coding: utf-8 -*-`` to all new files
|
||||
- **Please don't submit pull requests for style-only code changes**
|
||||
|
||||
Running the tests
|
||||
=================
|
||||
|
||||
This project uses `pytest <http://pytest.org/>`_ and `VCR.py <https://vcrpy.readthedocs.org/>`_
|
||||
|
||||
VCR is a tool that records HTTP requests made during the test run and stores them in *tests/cassettes* for subsequent runs.
|
||||
This both speeds up the tests and helps to maintain consistency across runs.
|
||||
|
||||
1. Install the test dependencies
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip install pytest vcrpy
|
||||
|
||||
2. Set your ``$PYTHONPATH`` to point to the directory of your RTV repository.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ export PYTHONPATH=~/code/rtv/
|
||||
|
||||
3. Run the tests using the existing cassettes
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python -m pytest ~/code/rtv/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:
|
||||
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 *~/.config/rtv/refresh-token*.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python -m pytest ~/code/rtv/tests/ --record-mode once --refresh-token ~/.config/rtv/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:
|
||||
plugins: xdist-1.14, cov-2.2.0
|
||||
collected 113 items
|
||||
|
||||
Note that all sensitive information will automatically be stripped from the cassette when it's saved.
|
||||
|
||||
5. Once you have generated a new cassette, go ahead and commit it to your branch along with your test case
|
||||
@@ -62,3 +62,4 @@ In submission mode you can view the self text for a submission and browse commen
|
||||
:``l`` or ``►``: Open the selected comment in a new window
|
||||
:``o`` or ``ENTER``: Open the comment permalink with your web browser
|
||||
:``SPACE``: Fold the selected comment, or load additional comments
|
||||
:``b``: Display URLs with urlview
|
||||
|
||||
88
README.rst
88
README.rst
@@ -1,8 +1,8 @@
|
||||
===========================
|
||||
RTV: Reddit Terminal Viewer
|
||||
===========================
|
||||
============================
|
||||
RTV (Reddit Terminal Viewer)
|
||||
============================
|
||||
|
||||
| RTV allows you to view and interact with reddit from your terminal.
|
||||
| RTV provides an interface to view and interact with reddit from your terminal.
|
||||
| It's compatible with *most* terminal emulators on Linux and OSX.
|
||||
|
||||
.. image:: http://i.imgur.com/Ek13lqM.png
|
||||
@@ -21,20 +21,20 @@ RTV is built in **python** using the **curses** library.
|
||||
* `Usage`_
|
||||
* `Settings`_
|
||||
* `FAQ`_
|
||||
* `Changelog`_
|
||||
* `Contributing`_
|
||||
* `License`_
|
||||
|
||||
============
|
||||
Installation
|
||||
============
|
||||
|
||||
Install using pip...
|
||||
Install using pip (**recommended**)
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip install rtv
|
||||
|
||||
or clone the repository.
|
||||
or clone the repository
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@@ -42,6 +42,15 @@ or clone the repository.
|
||||
$ cd rtv
|
||||
$ python3 setup.py install
|
||||
|
||||
on Arch Linux or Arch based distros (Antergos, Manjaro, `etc.`_) you can install directly using an `aur helper`_ such as yaourt. There's also an *rtv-git* package if you wish to keep up to date with the latest development code.
|
||||
|
||||
.. code:: bash
|
||||
|
||||
$ yaourt -S rtv
|
||||
|
||||
.. _etc.: https://wiki.archlinux.org/index.php/Arch_based_distributions_(active)
|
||||
.. _aur helper: https://wiki.archlinux.org/index.php/AUR_helpers#AUR_search.2Fbuild_helpers
|
||||
|
||||
=====
|
||||
Usage
|
||||
=====
|
||||
@@ -62,16 +71,16 @@ Move the cursor using either the arrow keys or *Vim* style movement
|
||||
- Press **right** to view the selected submission and **left** to return.
|
||||
- Press **?** to open the help screen.
|
||||
|
||||
See `CONTROLS.rst <https://github.com/michael-lazar/rtv/blob/master/CONTROLS.rst>`_ for the complete list of available commands.
|
||||
See `CONTROLS <https://github.com/michael-lazar/rtv/blob/master/CONTROLS.rst>`_ for the complete list of available commands.
|
||||
|
||||
--------------
|
||||
Authentication
|
||||
--------------
|
||||
|
||||
RTV enables you to login to your reddit account in order to perform actions like voting and leave comments.
|
||||
RTV enables you to login to your reddit account in order to perform actions like voting and leaving comments.
|
||||
The login process uses OAuth [#]_ and follows these steps:
|
||||
|
||||
1. Initiate a login by pressing the ``u`` key.
|
||||
1. Initiate the login by pressing the ``u`` key.
|
||||
2. Open a new webpage where reddit will ask you to authorize the application.
|
||||
3. Click **Accept**.
|
||||
|
||||
@@ -127,6 +136,33 @@ If you prefer the complete terminal experience, set ``$BROWSER`` to a console-ba
|
||||
|
||||
`w3m <http://w3m.sourceforge.net/>`_, `lynx <http://lynx.isc.org/>`_, and `elinks <http://elinks.or.cz/>`_ are all good choices.
|
||||
|
||||
----------
|
||||
Url Viewer
|
||||
----------
|
||||
|
||||
You can open links displayed inside of comments by taking advantage of a url extraction program.
|
||||
Use ``$RTV_URLVIEWER`` to specify a custom url viewer.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ export RTV_URLVIEWER=urlview
|
||||
|
||||
`urlview <https://github.com/sigpipe/urlview>`_ and `urlscan <https://github.com/firecat53/urlscan>`_ are known to be compatible, but any program that accepts text via a stdin pipe will do.
|
||||
These applications do not come pre-installed on most systems.
|
||||
|
||||
**Ubuntu**
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ sudo apt-get install urlview
|
||||
|
||||
**Mac with Homebrew**
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ brew install urlview
|
||||
|
||||
|
||||
===
|
||||
FAQ
|
||||
===
|
||||
@@ -154,33 +190,13 @@ How do I run the repository code directly?
|
||||
|
||||
$ cd ~/rtv_project
|
||||
$ python3 -m rtv
|
||||
|
||||
How do I run the tests?
|
||||
This project uses `pytest <http://pytest.org/>`_ and `VCR.py <https://vcrpy.readthedocs.org/>`_.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ pip3 install pytest
|
||||
$ # The pip release for VCR.py is out-of-date
|
||||
$ pip3 install git+https://github.com/kevin1024/vcrpy.git
|
||||
$ cd ~/rtv_project
|
||||
$ # Run the full suite
|
||||
$ PYTHONPATH=. py.test
|
||||
$ # or a single test
|
||||
$ PYTHONPATH=. py.test tests/test_config.py::test_copy_default_config
|
||||
|
||||
VCR.py will record HTTP requests made during the test run and store
|
||||
them in *tests/cassettes/*. By default these cassettes are read-only,
|
||||
if you would like to record new cassettes you must provide your own refresh token.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ PYTHONPATH=. py.test --record-mode=once --refresh-token=~/.config/rtv/refresh-token
|
||||
|
||||
=========
|
||||
Changelog
|
||||
=========
|
||||
Please see `CHANGELOG.rst <https://github.com/michael-lazar/rtv/blob/master/CHANGELOG.rst>`_.
|
||||
============
|
||||
Contributing
|
||||
============
|
||||
All feedback and suggestions are welcome, just post an issue!
|
||||
|
||||
Before writing any code, please read the `Contributor Guidelines <https://github.com/michael-lazar/rtv/blob/master/CONTRIBUTING.rst>`_.
|
||||
|
||||
=======
|
||||
License
|
||||
|
||||
31
rtv.1
31
rtv.1
@@ -1,8 +1,8 @@
|
||||
.TH "RTV" "1" "March 02, 2016" "Version 1.8.1" "Usage and Commands"
|
||||
.TH "RTV" "1" "July 12, 2016" "Version 1.10.0" "Usage and Commands"
|
||||
.SH NAME
|
||||
RTV - Reddit Terminal Viewer
|
||||
.SH SYNOPSIS
|
||||
rtv [\-h] [\-V] [\-s SUBREDDIT] [\-l LINK] [\-\-log FILE] [\-\-config FILE] [\-\-ascii] [\-\-non\-persistent] [\-\-clear\-auth] [\-\-copy\-config]
|
||||
rtv [\-h] [\-V] [\-s SUBREDDIT] [\-l LINK] [\-\-log FILE] [\-\-config FILE] [\-\-ascii] [\-\-monochrome] [\-\-non\-persistent] [\-\-clear\-auth] [\-\-copy\-config]
|
||||
.SH DESCRIPTION
|
||||
Reddit Terminal Viewer is a lightweight browser for www.reddit.com built into a
|
||||
terminal window.
|
||||
@@ -17,15 +17,15 @@ show program's version number and exit
|
||||
|
||||
.TP
|
||||
\fB\-s SUBREDDIT\fR
|
||||
name of the subreddit that will be opened on start
|
||||
Name of the subreddit that will be opened on start
|
||||
|
||||
.TP
|
||||
\fB\-l LINK\fR
|
||||
full URL of a submission that will be opened on start
|
||||
Full URL of a submission that will be opened on start
|
||||
|
||||
.TP
|
||||
\fB\-\-log FILE\fR
|
||||
log HTTP requests to the given file
|
||||
Log HTTP requests to the given file
|
||||
|
||||
.TP
|
||||
\fB\-\-config FILE\fR
|
||||
@@ -33,7 +33,11 @@ Load configuration settings from the given file
|
||||
|
||||
.TP
|
||||
\fB\-\-ascii\fR
|
||||
enable ascii\-only mode
|
||||
Enable ascii\-only mode
|
||||
|
||||
.TP
|
||||
\fB\-\-monochrome\fR
|
||||
Disable color
|
||||
|
||||
.TP
|
||||
\fB\-\-non\-persistent\fR
|
||||
@@ -66,13 +70,18 @@ for future sessions. You can disable this behavior by setting the option
|
||||
.SH ENVIRONMENT
|
||||
.TP
|
||||
.BR RTV_EDITOR
|
||||
Specifies which text editor RTV will attempt to use when editing comments and
|
||||
posts. RTV will fallback to \fI$EDITOR\fR if the editor is unspecified.
|
||||
Text editor to use when editing comments and submissions. Will fallback to
|
||||
\fI$EDITOR\fR.
|
||||
.TP
|
||||
.BR RTV_URLVIEWER
|
||||
Url Viewer to use to extract links from comments. Requires a compatible
|
||||
Url Viewer to be installed
|
||||
.TP
|
||||
.BR BROWSER
|
||||
Specifies which webbrowser RTV will attempt to use when opening links.
|
||||
This can be set to a terminal browser (w3m, lynx, elinks, etc.) for a true
|
||||
terminal experience. RTV will fallback to the system's default browser.
|
||||
Web browser to use when opening links.
|
||||
.TP
|
||||
.BR PAGER
|
||||
Pager to use when expanding individual comments and submissions.
|
||||
.SH AUTHOR
|
||||
Michael Lazar <lazar.michael22@gmail.com> (2016).
|
||||
.SH BUGS
|
||||
|
||||
@@ -1,4 +1,30 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r"""
|
||||
________ __________________________
|
||||
___ __ \__________ /_____ /__(_)_ /_
|
||||
__ /_/ / _ \ __ /_ __ /__ /_ __/
|
||||
_ _, _// __/ /_/ / / /_/ / _ / / /_
|
||||
/_/ |_| \___/\__,_/ \__,_/ /_/ \__/
|
||||
|
||||
|
||||
________ _____ ______
|
||||
___ __/__________________ ______(_)____________ ___ /
|
||||
__ / _ _ \_ ___/_ __ `__ \_ /__ __ \ __ `/_ /
|
||||
_ / / __/ / _ / / / / / / _ / / / /_/ /_ /
|
||||
/_/ \___//_/ /_/ /_/ /_//_/ /_/ /_/\__,_/ /_/
|
||||
|
||||
|
||||
___ ______
|
||||
__ | / /__(_)_______ ______________
|
||||
__ | / /__ /_ _ \_ | /| / / _ \_ ___/
|
||||
__ |/ / _ / / __/_ |/ |/ // __/ /
|
||||
_____/ /_/ \___/____/|__/ \___//_/
|
||||
|
||||
|
||||
(RTV)
|
||||
"""
|
||||
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from .__version__ import __version__
|
||||
@@ -6,4 +32,4 @@ from .__version__ import __version__
|
||||
__title__ = 'Reddit Terminal Viewer'
|
||||
__author__ = 'Michael Lazar'
|
||||
__license__ = 'The MIT License (MIT)'
|
||||
__copyright__ = '(c) 2015 Michael Lazar'
|
||||
__copyright__ = '(c) 2016 Michael Lazar'
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os
|
||||
import sys
|
||||
import locale
|
||||
import logging
|
||||
@@ -12,7 +13,7 @@ from . import docs
|
||||
from .config import Config, copy_default_config
|
||||
from .oauth import OAuthHelper
|
||||
from .terminal import Terminal
|
||||
from .objects import curses_session
|
||||
from .objects import curses_session, Color
|
||||
from .subreddit import SubredditPage
|
||||
from .exceptions import ConfigError
|
||||
from .__version__ import __version__
|
||||
@@ -29,15 +30,17 @@ _logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def main():
|
||||
"Main entry point"
|
||||
"""Main entry point"""
|
||||
|
||||
# Squelch SSL warnings
|
||||
logging.captureWarnings(True)
|
||||
locale.setlocale(locale.LC_ALL, '')
|
||||
|
||||
# Set the terminal title
|
||||
title = 'rtv {0}'.format(__version__)
|
||||
sys.stdout.write('\x1b]2;{0}\x07'.format(title))
|
||||
if os.getenv('DISPLAY'):
|
||||
title = 'rtv {0}'.format(__version__)
|
||||
sys.stdout.write('\x1b]2;{0}\x07'.format(title))
|
||||
sys.stdout.flush()
|
||||
|
||||
args = Config.get_args()
|
||||
fargs, bindings = Config.get_file(args.get('config'))
|
||||
@@ -73,7 +76,19 @@ def main():
|
||||
# if args[0] != "header:":
|
||||
# _http_logger.info(' '.join(args))
|
||||
# client.print = print_to_file
|
||||
logging.basicConfig(level=logging.DEBUG, filename=config['log'])
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
filename=config['log'],
|
||||
format='%(asctime)s:%(levelname)s:%(filename)s:%(lineno)d:%(message)s')
|
||||
_logger.info('Starting new session, RTV v%s', __version__)
|
||||
env = [
|
||||
('$DISPLAY', os.getenv('DISPLAY')),
|
||||
('$XDG_CONFIG_HOME', os.getenv('XDG_CONFIG_HOME')),
|
||||
('$BROWSER', os.getenv('BROWSER')),
|
||||
('$PAGER', os.getenv('PAGER')),
|
||||
('$RTV_EDITOR', os.getenv('RTV_EDITOR')),
|
||||
('$RTV_URLVIEWER', os.getenv('RTV_URLVIEWER'))]
|
||||
_logger.info('Environment: %s', env)
|
||||
else:
|
||||
# Add an empty handler so the logger doesn't complain
|
||||
logging.root.addHandler(logging.NullHandler())
|
||||
@@ -83,6 +98,11 @@ def main():
|
||||
|
||||
try:
|
||||
with curses_session() as stdscr:
|
||||
|
||||
# Initialize global color-pairs with curses
|
||||
if not config['monochrome']:
|
||||
Color.init()
|
||||
|
||||
term = Terminal(stdscr, config['ascii'])
|
||||
with term.loader('Initializing', catch_exception=False):
|
||||
reddit = praw.Reddit(user_agent=user_agent,
|
||||
@@ -124,4 +144,4 @@ def main():
|
||||
# Explicitly close file descriptors opened by Tornado's IOLoop
|
||||
tornado.ioloop.IOLoop.current().close(all_fds=True)
|
||||
|
||||
sys.exit(main())
|
||||
sys.exit(main())
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
__version__ = '1.8.1'
|
||||
__version__ = '1.10.0'
|
||||
|
||||
@@ -33,19 +33,22 @@ def build_parser():
|
||||
'-V', '--version', action='version', version='rtv '+__version__)
|
||||
parser.add_argument(
|
||||
'-s', dest='subreddit',
|
||||
help='name of the subreddit that will be opened on start')
|
||||
help='Name of the subreddit that will be opened on start')
|
||||
parser.add_argument(
|
||||
'-l', dest='link',
|
||||
help='full URL of a submission that will be opened on start')
|
||||
help='Full URL of a submission that will be opened on start')
|
||||
parser.add_argument(
|
||||
'--log', metavar='FILE', action='store',
|
||||
help='log HTTP requests to the given file')
|
||||
help='Log HTTP requests to the given file')
|
||||
parser.add_argument(
|
||||
'--config', metavar='FILE', action='store',
|
||||
help='Load configuration settings from the given file')
|
||||
parser.add_argument(
|
||||
'--ascii', action='store_const', const=True,
|
||||
help='enable ascii-only mode')
|
||||
help='Enable ascii-only mode')
|
||||
parser.add_argument(
|
||||
'--monochrome', action='store_const', const=True,
|
||||
help='Disable color')
|
||||
parser.add_argument(
|
||||
'--non-persistent', dest='persistent', action='store_const',
|
||||
const=False,
|
||||
@@ -79,6 +82,7 @@ def copy_default_config(filename=CONFIG):
|
||||
|
||||
print('Copying default settings to %s' % filename)
|
||||
shutil.copy(DEFAULT_CONFIG, filename)
|
||||
os.chmod(filename, 0o664)
|
||||
|
||||
|
||||
class OrderedSet(object):
|
||||
@@ -208,6 +212,7 @@ class Config(object):
|
||||
|
||||
params = {
|
||||
'ascii': partial(config.getboolean, 'rtv'),
|
||||
'monochrome': partial(config.getboolean, 'rtv'),
|
||||
'clear_auth': partial(config.getboolean, 'rtv'),
|
||||
'persistent': partial(config.getboolean, 'rtv'),
|
||||
'history_size': partial(config.getint, 'rtv'),
|
||||
|
||||
@@ -6,6 +6,7 @@ from datetime import datetime
|
||||
|
||||
import six
|
||||
import praw
|
||||
from praw.errors import InvalidSubreddit
|
||||
from kitchen.text.display import wrap
|
||||
|
||||
from . import exceptions
|
||||
@@ -96,6 +97,7 @@ class Content(object):
|
||||
data['type'] = 'MoreComments'
|
||||
data['count'] = comment.count
|
||||
data['body'] = 'More comments'
|
||||
data['hidden'] = True
|
||||
else:
|
||||
author = getattr(comment, 'author', '[deleted]')
|
||||
name = getattr(author, 'name', '[deleted]')
|
||||
@@ -118,6 +120,7 @@ class Content(object):
|
||||
data['gold'] = comment.gilded > 0
|
||||
data['permalink'] = permalink
|
||||
data['stickied'] = stickied
|
||||
data['hidden'] = False
|
||||
data['saved'] = comment.saved
|
||||
|
||||
return data
|
||||
@@ -129,10 +132,11 @@ class Content(object):
|
||||
displayed through the terminal.
|
||||
|
||||
Definitions:
|
||||
permalink - Full URL to the submission comments.
|
||||
url_full - Link that the submission points to.
|
||||
url - URL that is displayed on the subreddit page, may be
|
||||
"selfpost" or "x-post" or a link.
|
||||
permalink - URL to the reddit page with submission comments.
|
||||
url_full - URL that the submission points to.
|
||||
url - URL that will be displayed on the subreddit page, may be
|
||||
"selfpost", "x-post submission", "x-post subreddit", or an
|
||||
external link.
|
||||
"""
|
||||
|
||||
reddit_link = re.compile(
|
||||
@@ -148,8 +152,7 @@ class Content(object):
|
||||
data['text'] = sub.selftext
|
||||
data['created'] = cls.humanize_timestamp(sub.created_utc)
|
||||
data['comments'] = '{0} comments'.format(sub.num_comments)
|
||||
data['score'] = '{0} pts'.format(
|
||||
'-' if sub.hide_score else sub.score)
|
||||
data['score'] = '{0} pts'.format('-' if sub.hide_score else sub.score)
|
||||
data['author'] = name
|
||||
data['permalink'] = sub.permalink
|
||||
data['subreddit'] = six.text_type(sub.subreddit)
|
||||
@@ -159,6 +162,8 @@ class Content(object):
|
||||
data['gold'] = sub.gilded > 0
|
||||
data['nsfw'] = sub.over_18
|
||||
data['stickied'] = sub.stickied
|
||||
data['hidden'] = False
|
||||
data['xpost_subreddit'] = None
|
||||
data['index'] = None # This is filled in later by the method caller
|
||||
data['saved'] = sub.saved
|
||||
|
||||
@@ -168,8 +173,13 @@ class Content(object):
|
||||
elif reddit_link.match(sub.url):
|
||||
# Strip the subreddit name from the permalink to avoid having
|
||||
# submission.subreddit.url make a separate API call
|
||||
data['url'] = 'self.{0}'.format(sub.url.split('/')[4])
|
||||
data['url_type'] = 'x-post'
|
||||
url_parts = sub.url.split('/')
|
||||
data['xpost_subreddit'] = url_parts[4]
|
||||
data['url'] = 'self.{0}'.format(url_parts[4])
|
||||
if 'comments' in url_parts:
|
||||
data['url_type'] = 'x-post submission'
|
||||
else:
|
||||
data['url_type'] = 'x-post subreddit'
|
||||
else:
|
||||
data['url'] = sub.url
|
||||
data['url_type'] = 'external'
|
||||
@@ -324,7 +334,8 @@ class SubmissionContent(Content):
|
||||
'cache': cache,
|
||||
'count': count,
|
||||
'level': data['level'],
|
||||
'body': 'Hidden'}
|
||||
'body': 'Hidden',
|
||||
'hidden': True}
|
||||
|
||||
self._comment_data[index:index + len(cache)] = [comment]
|
||||
|
||||
@@ -409,6 +420,11 @@ class SubredditContent(Content):
|
||||
submissions = reddit.search(query, subreddit=name, sort=order)
|
||||
|
||||
else:
|
||||
if name == '':
|
||||
# Praw does not correctly handle empty strings
|
||||
# https://github.com/praw-dev/praw/issues/615
|
||||
raise InvalidSubreddit()
|
||||
|
||||
if name == 'front':
|
||||
dispatch = {
|
||||
None: reddit.get_front_page,
|
||||
@@ -420,6 +436,9 @@ class SubredditContent(Content):
|
||||
}
|
||||
else:
|
||||
subreddit = reddit.get_subreddit(name)
|
||||
# For special subreddits like /r/random we want to replace the
|
||||
# display name with the one returned by the request.
|
||||
display_name = '/r/{0}'.format(subreddit.display_name)
|
||||
dispatch = {
|
||||
None: subreddit.get_hot,
|
||||
'hot': subreddit.get_hot,
|
||||
@@ -456,9 +475,10 @@ class SubredditContent(Content):
|
||||
data = self.strip_praw_submission(submission)
|
||||
except:
|
||||
continue
|
||||
data['index'] = index
|
||||
|
||||
data['index'] = len(self._submission_data) + 1
|
||||
# Add the post number to the beginning of the title
|
||||
data['title'] = '{0}. {1}'.format(index+1, data.get('title'))
|
||||
data['title'] = '{0}. {1}'.format(data['index'], data['title'])
|
||||
self._submission_data.append(data)
|
||||
|
||||
# Modifies the original dict, faster than copying
|
||||
|
||||
@@ -45,6 +45,7 @@ HELP = """
|
||||
`h` or `LEFT` : Return to subreddit mode
|
||||
`l` or `RIGHT` : Open the selected comment in a new window
|
||||
`SPACE` : Fold the selected comment, or load additional comments
|
||||
`b` : Display URLs with urlview
|
||||
"""
|
||||
|
||||
COMMENT_FILE = """
|
||||
|
||||
@@ -35,4 +35,8 @@ class ProgramError(RTVError):
|
||||
|
||||
|
||||
class BrowserError(RTVError):
|
||||
"Could not open a web browser tab"
|
||||
"Could not open a web browser tab"
|
||||
|
||||
|
||||
class TemporaryFileError(RTVError):
|
||||
"Indicates that an error has occurred and the file should not be deleted"
|
||||
@@ -62,7 +62,8 @@ def curses_session():
|
||||
# Hide the blinking cursor
|
||||
curses.curs_set(0)
|
||||
|
||||
Color.init()
|
||||
# Assign the terminal's default (background) color to code -1
|
||||
curses.use_default_colors()
|
||||
|
||||
yield stdscr
|
||||
|
||||
@@ -254,7 +255,6 @@ class LoadScreen(object):
|
||||
|
||||
|
||||
class Color(object):
|
||||
|
||||
"""
|
||||
Color attributes for curses.
|
||||
"""
|
||||
@@ -286,9 +286,6 @@ class Color(object):
|
||||
curses color pairs can be accessed directly through class attributes.
|
||||
"""
|
||||
|
||||
# Assign the terminal's default (background) color to code -1
|
||||
curses.use_default_colors()
|
||||
|
||||
for index, (attr, code) in enumerate(cls._colors.items(), start=1):
|
||||
curses.init_pair(index, code[0], code[1])
|
||||
setattr(cls, attr, curses.color_pair(index))
|
||||
@@ -318,7 +315,8 @@ class Navigator(object):
|
||||
valid_page_cb,
|
||||
page_index=0,
|
||||
cursor_index=0,
|
||||
inverted=False):
|
||||
inverted=False,
|
||||
top_item_height=None):
|
||||
"""
|
||||
Params:
|
||||
valid_page_callback (func): This function, usually `Content.get`,
|
||||
@@ -334,11 +332,16 @@ class Navigator(object):
|
||||
inverted - The page is drawn from the bottom of the screen,
|
||||
starting with the page index, up to the top of the
|
||||
screen.
|
||||
top_item_height (int): If this is set to a non-null value
|
||||
The number of columns that the top-most item
|
||||
should utilize if non-inverted. This is used for a special mode
|
||||
where all items are drawn non-inverted except for the top one.
|
||||
"""
|
||||
|
||||
self.page_index = page_index
|
||||
self.cursor_index = cursor_index
|
||||
self.inverted = inverted
|
||||
self.top_item_height = top_item_height
|
||||
self._page_cb = valid_page_cb
|
||||
|
||||
@property
|
||||
@@ -399,15 +402,21 @@ class Navigator(object):
|
||||
# Flip the orientation and reset the cursor
|
||||
self.flip(self.cursor_index)
|
||||
self.cursor_index = 0
|
||||
self.top_item_height = None
|
||||
redraw = True
|
||||
else:
|
||||
if self.cursor_index > 0:
|
||||
self.cursor_index -= 1
|
||||
if self.top_item_height and self.cursor_index == 0:
|
||||
# Selecting the partially displayed item
|
||||
self.top_item_height = None
|
||||
redraw = True
|
||||
else:
|
||||
self.page_index -= self.step
|
||||
if self._is_valid(self.absolute_index):
|
||||
# We have reached the beginning of the page - move the
|
||||
# index
|
||||
self.top_item_height = None
|
||||
redraw = True
|
||||
else:
|
||||
self.page_index += self.step
|
||||
@@ -481,6 +490,7 @@ class Navigator(object):
|
||||
self.page_index += (self.step * n_windows)
|
||||
self.cursor_index = n_windows
|
||||
self.inverted = not self.inverted
|
||||
self.top_item_height = None
|
||||
|
||||
def _is_valid(self, page_index):
|
||||
"""
|
||||
|
||||
68
rtv/page.py
68
rtv/page.py
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import curses
|
||||
@@ -10,6 +11,8 @@ from kitchen.text.display import textual_width
|
||||
|
||||
from . import docs
|
||||
from .objects import Controller, Color, Command
|
||||
from .exceptions import TemporaryFileError
|
||||
from .__version__ import __version__
|
||||
|
||||
|
||||
def logged_in(f):
|
||||
@@ -234,16 +237,19 @@ class Page(object):
|
||||
self.term.flash()
|
||||
return
|
||||
|
||||
text = self.term.open_editor(info)
|
||||
if text == content:
|
||||
self.term.show_notification('Canceled')
|
||||
return
|
||||
with self.term.open_editor(info) as text:
|
||||
if text == content:
|
||||
self.term.show_notification('Canceled')
|
||||
return
|
||||
|
||||
with self.term.loader('Editing', delay=0):
|
||||
data['object'].edit(text)
|
||||
time.sleep(2.0)
|
||||
if self.term.loader.exception is None:
|
||||
self.refresh_content()
|
||||
with self.term.loader('Editing', delay=0):
|
||||
data['object'].edit(text)
|
||||
time.sleep(2.0)
|
||||
|
||||
if self.term.loader.exception is None:
|
||||
self.refresh_content()
|
||||
else:
|
||||
raise TemporaryFileError()
|
||||
|
||||
@PageController.register(Command('INBOX'))
|
||||
@logged_in
|
||||
@@ -291,9 +297,22 @@ class Page(object):
|
||||
ch, attr = str(' '), curses.A_REVERSE | curses.A_BOLD | Color.CYAN
|
||||
window.bkgd(ch, attr)
|
||||
|
||||
sub_name = self.content.name.replace('/r/front', 'Front Page')
|
||||
sub_name = self.content.name
|
||||
sub_name = sub_name.replace('/r/front', 'Front Page')
|
||||
sub_name = sub_name.replace('/r/me', 'My Submissions')
|
||||
self.term.add_line(window, sub_name, 0, 0)
|
||||
|
||||
# Set the terminal title
|
||||
if len(sub_name) > 50:
|
||||
title = sub_name.strip('/').rsplit('/', 1)[1].replace('_', ' ')
|
||||
else:
|
||||
title = sub_name
|
||||
|
||||
if os.getenv('DISPLAY'):
|
||||
title += ' - rtv {0}'.format(__version__)
|
||||
sys.stdout.write('\x1b]2;{0}\x07'.format(title))
|
||||
sys.stdout.flush()
|
||||
|
||||
if self.reddit.user is not None:
|
||||
# The starting position of the name depends on if we're converting
|
||||
# to ascii or not
|
||||
@@ -344,29 +363,46 @@ class Page(object):
|
||||
# If not inverted, align the first submission with the top and draw
|
||||
# downwards. If inverted, align the first submission with the bottom
|
||||
# and draw upwards.
|
||||
cancel_inverted = True
|
||||
current_row = (win_n_rows - 1) if inverted else 0
|
||||
available_rows = (win_n_rows - 1) if inverted else win_n_rows
|
||||
top_item_height = None if inverted else self.nav.top_item_height
|
||||
for data in self.content.iterate(page_index, step, win_n_cols - 2):
|
||||
subwin_n_rows = min(available_rows, data['n_rows'])
|
||||
subwin_inverted = inverted
|
||||
if top_item_height is not None:
|
||||
# Special case: draw the page as non-inverted, except for the
|
||||
# top element. This element will be drawn as inverted with a
|
||||
# restricted height
|
||||
subwin_n_rows = min(subwin_n_rows, top_item_height)
|
||||
subwin_inverted = True
|
||||
top_item_height = None
|
||||
subwin_n_cols = win_n_cols - data['offset']
|
||||
start = current_row - subwin_n_rows if inverted else current_row
|
||||
subwindow = window.derwin(
|
||||
subwin_n_rows, subwin_n_cols, start, data['offset'])
|
||||
attr = self._draw_item(subwindow, data, inverted)
|
||||
attr = self._draw_item(subwindow, data, subwin_inverted)
|
||||
self._subwindows.append((subwindow, attr))
|
||||
available_rows -= (subwin_n_rows + 1) # Add one for the blank line
|
||||
current_row += step * (subwin_n_rows + 1)
|
||||
if available_rows <= 0:
|
||||
# Indicate the page is full and we can keep the inverted screen.
|
||||
cancel_inverted = False
|
||||
break
|
||||
else:
|
||||
# If the page is not full we need to make sure that it is NOT
|
||||
|
||||
if len(self._subwindows) == 1:
|
||||
# Never draw inverted if only one subwindow. The top of the
|
||||
# subwindow should always be aligned with the top of the screen.
|
||||
cancel_inverted = True
|
||||
|
||||
if cancel_inverted and self.nav.inverted:
|
||||
# In some cases we need to make sure that the screen is NOT
|
||||
# inverted. Unfortunately, this currently means drawing the whole
|
||||
# page over again. Could not think of a better way to pre-determine
|
||||
# if the content will fill up the page, given that it is dependent
|
||||
# on the size of the terminal.
|
||||
if self.nav.inverted:
|
||||
self.nav.flip((len(self._subwindows) - 1))
|
||||
self._draw_content()
|
||||
self.nav.flip((len(self._subwindows) - 1))
|
||||
self._draw_content()
|
||||
|
||||
self._row = n_rows
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
; This may be necessary for compatibility with some terminal browsers.
|
||||
ascii = False
|
||||
|
||||
; Turn on monochrome mode to disable color.
|
||||
monochrome = False
|
||||
|
||||
; Enable debugging by logging all HTTP requests and errors to the given file.
|
||||
;log = /tmp/rtv.log
|
||||
|
||||
@@ -110,6 +113,7 @@ SUBMISSION_OPEN_IN_BROWSER = o, <LF>, <KEY_ENTER>
|
||||
SUBMISSION_POST = c
|
||||
SUBMISSION_EXIT = h, <KEY_LEFT>
|
||||
SUBMISSION_OPEN_IN_PAGER = l, <KEY_RIGHT>
|
||||
SUBMISSION_OPEN_IN_URLVIEWER = b
|
||||
|
||||
; Subreddit page
|
||||
SUBREDDIT_SEARCH = f
|
||||
|
||||
@@ -8,6 +8,7 @@ from . import docs
|
||||
from .content import SubmissionContent
|
||||
from .page import Page, PageController, logged_in
|
||||
from .objects import Navigator, Color, Command
|
||||
from .exceptions import TemporaryFileError
|
||||
|
||||
|
||||
class SubmissionController(PageController):
|
||||
@@ -33,11 +34,19 @@ class SubmissionPage(Page):
|
||||
|
||||
current_index = self.nav.absolute_index
|
||||
self.content.toggle(current_index)
|
||||
|
||||
# This logic handles a display edge case after a comment toggle. We
|
||||
# want to make sure that when we re-draw the page, the cursor stays at
|
||||
# its current absolute position on the screen. In order to do this,
|
||||
# apply a fixed offset if, while inverted, we either try to hide the
|
||||
# bottom comment or toggle any of the middle comments.
|
||||
if self.nav.inverted:
|
||||
# Reset the navigator so that the cursor is at the bottom of the
|
||||
# page. This is a workaround to handle if folding the comment
|
||||
# causes the cursor index to go out of bounds.
|
||||
self.nav.page_index, self.nav.cursor_index = current_index, 0
|
||||
data = self.content.get(current_index)
|
||||
if data['hidden'] or self.nav.cursor_index != 0:
|
||||
window = self._subwindows[-1][0]
|
||||
n_rows, _ = window.getmaxyx()
|
||||
self.nav.flip(len(self._subwindows) - 1)
|
||||
self.nav.top_item_height = n_rows
|
||||
|
||||
@SubmissionController.register(Command('SUBMISSION_EXIT'))
|
||||
def exit_submission(self):
|
||||
@@ -113,17 +122,20 @@ class SubmissionPage(Page):
|
||||
type=data['type'].lower(),
|
||||
content=content)
|
||||
|
||||
comment = self.term.open_editor(comment_info)
|
||||
if not comment:
|
||||
self.term.show_notification('Canceled')
|
||||
return
|
||||
with self.term.open_editor(comment_info) as comment:
|
||||
if not comment:
|
||||
self.term.show_notification('Canceled')
|
||||
return
|
||||
|
||||
with self.term.loader('Posting', delay=0):
|
||||
reply(comment)
|
||||
# Give reddit time to process the submission
|
||||
time.sleep(2.0)
|
||||
if not self.term.loader.exception:
|
||||
self.refresh_content()
|
||||
with self.term.loader('Posting', delay=0):
|
||||
reply(comment)
|
||||
# Give reddit time to process the submission
|
||||
time.sleep(2.0)
|
||||
|
||||
if self.term.loader.exception is None:
|
||||
self.refresh_content()
|
||||
else:
|
||||
raise TemporaryFileError()
|
||||
|
||||
@SubmissionController.register(Command('DELETE'))
|
||||
@logged_in
|
||||
@@ -135,6 +147,15 @@ class SubmissionPage(Page):
|
||||
else:
|
||||
self.term.flash()
|
||||
|
||||
@SubmissionController.register(Command('SUBMISSION_OPEN_IN_URLVIEWER'))
|
||||
def comment_urlview(self):
|
||||
data = self.content.get(self.nav.absolute_index)
|
||||
comment = data.get('body', '')
|
||||
if comment:
|
||||
self.term.open_urlview(comment)
|
||||
else:
|
||||
self.term.flash()
|
||||
|
||||
def _draw_item(self, win, data, inverted):
|
||||
|
||||
if data['type'] == 'MoreComments':
|
||||
@@ -155,6 +176,16 @@ class SubmissionPage(Page):
|
||||
valid_rows = range(0, n_rows)
|
||||
offset = 0 if not inverted else -(data['n_rows'] - n_rows)
|
||||
|
||||
# If there isn't enough space to fit the comment body on the screen,
|
||||
# replace the last line with a notification.
|
||||
split_body = data['split_body']
|
||||
if data['n_rows'] > n_rows:
|
||||
# Only when there is a single comment on the page and not inverted
|
||||
if not inverted and len(self._subwindows) == 0:
|
||||
cutoff = data['n_rows'] - n_rows + 1
|
||||
split_body = split_body[:-cutoff]
|
||||
split_body.append('(Not enough space to display)')
|
||||
|
||||
row = offset
|
||||
if row in valid_rows:
|
||||
|
||||
@@ -182,7 +213,7 @@ class SubmissionPage(Page):
|
||||
text, attr = self.term.saved
|
||||
self.term.add_line(win, text, attr=attr)
|
||||
|
||||
for row, text in enumerate(data['split_body'], start=offset+1):
|
||||
for row, text in enumerate(split_body, start=offset+1):
|
||||
if row in valid_rows:
|
||||
self.term.add_line(win, text, row, 1)
|
||||
|
||||
@@ -201,7 +232,8 @@ class SubmissionPage(Page):
|
||||
n_cols -= 1
|
||||
|
||||
self.term.add_line(win, '{body}'.format(**data), 0, 1)
|
||||
self.term.add_line(win, ' [{count}]'.format(**data), attr=curses.A_BOLD)
|
||||
self.term.add_line(
|
||||
win, ' [{count}]'.format(**data), attr=curses.A_BOLD)
|
||||
|
||||
attr = Color.get_level(data['level'])
|
||||
self.term.addch(win, 0, 0, self.term.vline, attr)
|
||||
|
||||
@@ -10,6 +10,7 @@ from .page import Page, PageController, logged_in
|
||||
from .objects import Navigator, Color, Command
|
||||
from .submission import SubmissionPage
|
||||
from .subscription import SubscriptionPage
|
||||
from .exceptions import TemporaryFileError
|
||||
|
||||
|
||||
class SubredditController(PageController):
|
||||
@@ -99,7 +100,9 @@ class SubredditPage(Page):
|
||||
data = self.content.get(self.nav.absolute_index)
|
||||
if data['url_type'] == 'selfpost':
|
||||
self.open_submission()
|
||||
elif data['url_type'] == 'x-post':
|
||||
elif data['url_type'] == 'x-post subreddit':
|
||||
self.refresh_content(order='ignore', name=data['xpost_subreddit'])
|
||||
elif data['url_type'] == 'x-post submission':
|
||||
self.open_submission(url=data['url_full'])
|
||||
self.config.history.add(data['url_full'])
|
||||
else:
|
||||
@@ -118,31 +121,35 @@ class SubredditPage(Page):
|
||||
return
|
||||
|
||||
submission_info = docs.SUBMISSION_FILE.format(name=name)
|
||||
text = self.term.open_editor(submission_info)
|
||||
if not text or '\n' not in text:
|
||||
self.term.show_notification('Canceled')
|
||||
return
|
||||
with self.term.open_editor(submission_info) as text:
|
||||
if not text:
|
||||
self.term.show_notification('Canceled')
|
||||
return
|
||||
elif '\n' not in text:
|
||||
self.term.show_notification('Missing body')
|
||||
return
|
||||
|
||||
title, content = text.split('\n', 1)
|
||||
with self.term.loader('Posting', delay=0):
|
||||
submission = self.reddit.submit(name, title, text=content,
|
||||
raise_captcha_exception=True)
|
||||
# Give reddit time to process the submission
|
||||
time.sleep(2.0)
|
||||
if self.term.loader.exception:
|
||||
return
|
||||
title, content = text.split('\n', 1)
|
||||
with self.term.loader('Posting', delay=0):
|
||||
submission = self.reddit.submit(name, title, text=content,
|
||||
raise_captcha_exception=True)
|
||||
# Give reddit time to process the submission
|
||||
time.sleep(2.0)
|
||||
if self.term.loader.exception:
|
||||
raise TemporaryFileError()
|
||||
|
||||
# Open the newly created post
|
||||
with self.term.loader('Loading submission'):
|
||||
page = SubmissionPage(
|
||||
self.reddit, self.term, self.config, self.oauth,
|
||||
submission=submission)
|
||||
if self.term.loader.exception:
|
||||
return
|
||||
if not self.term.loader.exception:
|
||||
# Open the newly created post
|
||||
with self.term.loader('Loading submission'):
|
||||
page = SubmissionPage(
|
||||
self.reddit, self.term, self.config, self.oauth,
|
||||
submission=submission)
|
||||
if self.term.loader.exception:
|
||||
return
|
||||
|
||||
page.loop()
|
||||
page.loop()
|
||||
|
||||
self.refresh_content()
|
||||
self.refresh_content()
|
||||
|
||||
@SubredditController.register(Command('SUBREDDIT_OPEN_SUBSCRIPTIONS'))
|
||||
@logged_in
|
||||
|
||||
105
rtv/terminal.py
105
rtv/terminal.py
@@ -6,12 +6,14 @@ import sys
|
||||
import time
|
||||
import codecs
|
||||
import curses
|
||||
import logging
|
||||
import tempfile
|
||||
import webbrowser
|
||||
import subprocess
|
||||
import curses.ascii
|
||||
from curses import textpad
|
||||
from datetime import datetime
|
||||
from contextlib import contextmanager
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
import six
|
||||
from kitchen.text.display import textual_width_chop
|
||||
@@ -27,6 +29,9 @@ except ImportError:
|
||||
unescape = html_parser.HTMLParser().unescape
|
||||
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Terminal(object):
|
||||
|
||||
MIN_HEIGHT = 10
|
||||
@@ -58,13 +63,13 @@ class Terminal(object):
|
||||
|
||||
@property
|
||||
def neutral_arrow(self):
|
||||
symbol = '>' if self.ascii else '‣'
|
||||
symbol = 'o' if self.ascii else '•'
|
||||
attr = curses.A_BOLD
|
||||
return symbol, attr
|
||||
|
||||
@property
|
||||
def timestamp_sep(self):
|
||||
symbol = 'o' if self.ascii else '•'
|
||||
symbol = '-'
|
||||
attr = curses.A_BOLD
|
||||
return symbol, attr
|
||||
|
||||
@@ -100,7 +105,14 @@ class Terminal(object):
|
||||
if self._display is None:
|
||||
if sys.platform == 'darwin':
|
||||
# OSX doesn't always set DISPLAY so we can't use this to check
|
||||
display = True
|
||||
# Note: Disabling for now, with the hope that if this
|
||||
# is a widespread issue then people will complain and we can
|
||||
# come up with a better solution. Checking for $DISPLAY is
|
||||
# used extensively in mailcap files, so it really *should* be
|
||||
# set properly. I don't have a mac anymore so I can't test.
|
||||
|
||||
# display = True
|
||||
display = bool(os.environ.get("DISPLAY"))
|
||||
else:
|
||||
display = bool(os.environ.get("DISPLAY"))
|
||||
|
||||
@@ -350,7 +362,8 @@ class Terminal(object):
|
||||
'Browser exited with status=%s' % code)
|
||||
time.sleep(0.01)
|
||||
else:
|
||||
raise exceptions.BrowserError('Timeout opening browser')
|
||||
raise exceptions.BrowserError(
|
||||
'Timeout opening browser')
|
||||
finally:
|
||||
# Can't check the loader exception because the oauth module
|
||||
# supersedes this loader and we need to always kill the
|
||||
@@ -383,37 +396,75 @@ class Terminal(object):
|
||||
except OSError:
|
||||
self.show_notification('Could not open pager %s' % pager)
|
||||
|
||||
@contextmanager
|
||||
def open_editor(self, data=''):
|
||||
"""
|
||||
Open a temporary file using the system's default editor.
|
||||
Open a file for editing using the system's default editor.
|
||||
|
||||
The data string will be written to the file before opening. This
|
||||
function will block until the editor has closed. At that point the file
|
||||
will be read and and lines starting with '#' will be stripped.
|
||||
After the file has been altered, the text will be read back and lines
|
||||
starting with '#' will be stripped. If an error occurs inside of the
|
||||
context manager, the file will be preserved. Otherwise, the file will
|
||||
be deleted when the context manager closes.
|
||||
|
||||
Params:
|
||||
data (str): If provided, text will be written to the file before
|
||||
opening it with the editor.
|
||||
|
||||
Returns:
|
||||
text (str): The text that the user entered into the editor.
|
||||
"""
|
||||
|
||||
with NamedTemporaryFile(prefix='rtv-', suffix='.txt', mode='wb') as fp:
|
||||
fp.write(self.clean(data))
|
||||
fp.flush()
|
||||
editor = os.getenv('RTV_EDITOR') or os.getenv('EDITOR') or 'nano'
|
||||
filename = 'rtv_{:%Y%m%d_%H%M%S}.txt'.format(datetime.now())
|
||||
filepath = os.path.join(tempfile.gettempdir(), filename)
|
||||
|
||||
with codecs.open(filepath, 'w', 'utf-8') as fp:
|
||||
fp.write(data)
|
||||
_logger.info('File created: %s', filepath)
|
||||
|
||||
editor = os.getenv('RTV_EDITOR') or os.getenv('EDITOR') or 'nano'
|
||||
try:
|
||||
with self.suspend():
|
||||
p = subprocess.Popen([editor, filepath])
|
||||
try:
|
||||
p.wait()
|
||||
except KeyboardInterrupt:
|
||||
p.terminate()
|
||||
except OSError:
|
||||
self.show_notification('Could not open file with %s' % editor)
|
||||
|
||||
with codecs.open(filepath, 'r', 'utf-8') as fp:
|
||||
text = ''.join(line for line in fp if not line.startswith('#'))
|
||||
text = text.rstrip()
|
||||
|
||||
try:
|
||||
yield text
|
||||
except exceptions.TemporaryFileError:
|
||||
# All exceptions will cause the file to *not* be removed, but these
|
||||
# ones should also be swallowed
|
||||
_logger.info('Caught TemporaryFileError')
|
||||
self.show_notification('Post saved as: %s', filepath)
|
||||
else:
|
||||
# If no errors occurred, try to remove the file
|
||||
try:
|
||||
with self.suspend():
|
||||
p = subprocess.Popen([editor, fp.name])
|
||||
try:
|
||||
p.wait()
|
||||
except KeyboardInterrupt:
|
||||
p.terminate()
|
||||
os.remove(filepath)
|
||||
except OSError:
|
||||
self.show_notification('Could not open file with %s' % editor)
|
||||
_logger.warning('Could not delete: %s', filepath)
|
||||
else:
|
||||
_logger.info('File deleted: %s', filepath)
|
||||
|
||||
# Open a second file object to read. This appears to be necessary
|
||||
# in order to read the changes made by some editors (gedit). w+
|
||||
# mode does not work!
|
||||
with codecs.open(fp.name, 'r', 'utf-8') as fp2:
|
||||
text = ''.join(line for line in fp2 if not line.startswith('#'))
|
||||
text = text.rstrip()
|
||||
return text
|
||||
def open_urlview(self, data):
|
||||
urlview = os.getenv('RTV_URLVIEWER') or 'urlview'
|
||||
try:
|
||||
with self.suspend():
|
||||
p = subprocess.Popen([urlview],
|
||||
stdin=subprocess.PIPE)
|
||||
try:
|
||||
p.communicate(input=six.b(data))
|
||||
except KeyboardInterrupt:
|
||||
p.terminate()
|
||||
except OSError:
|
||||
self.show_notification(
|
||||
'Could not open urls with {}'.format(urlview))
|
||||
|
||||
def text_input(self, window, allow_resize=False):
|
||||
"""
|
||||
|
||||
@@ -28,8 +28,13 @@ for future sessions. You can disable this behavior by setting the option
|
||||
Text editor to use when editing comments and submissions. Will fallback to
|
||||
\fI$EDITOR\fR.
|
||||
.TP
|
||||
.BR RTV_URLVIEWER
|
||||
Url Viewer to use to extract links from comments. Requires a compatible
|
||||
Url Viewer to be installed
|
||||
.TP
|
||||
.BR BROWSER
|
||||
Web browser to use when opening links.
|
||||
.TP
|
||||
.BR PAGER
|
||||
Pager to use when expanding individual comments and submissions.
|
||||
.SH AUTHOR
|
||||
|
||||
2
setup.py
2
setup.py
@@ -3,7 +3,7 @@ import setuptools
|
||||
|
||||
from version import __version__ as version
|
||||
|
||||
requirements = ['tornado', 'praw>=3.3.0', 'six', 'requests', 'kitchen']
|
||||
requirements = ['tornado', 'praw==3.5.0', 'six', 'requests', 'kitchen']
|
||||
|
||||
# Python 2: add required concurrent.futures backport from Python 3.2
|
||||
if sys.version_info.major <= 2:
|
||||
|
||||
1353
tests/cassettes/test_content_subreddit_random.yaml
Normal file
1353
tests/cassettes/test_content_subreddit_random.yaml
Normal file
File diff suppressed because it is too large
Load Diff
173
tests/cassettes/test_submission_comment_not_enough_space.yaml
Normal file
173
tests/cassettes/test_submission_comment_not_enough_space.yaml
Normal file
@@ -0,0 +1,173 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: null
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
Accept-Encoding: ['gzip, deflate, compress']
|
||||
User-Agent: [!!python/unicode rtv test suite PRAW/3.3.0 Python/2.7.6 Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty]
|
||||
method: !!python/unicode GET
|
||||
uri: https://www.reddit.com/r/Python/comments/2xmo63.json
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
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
|
||||
headers:
|
||||
access-control-allow-origin: ['*']
|
||||
access-control-expose-headers: ['X-Reddit-Tracking, X-Moose']
|
||||
cache-control: ['max-age=0, must-revalidate']
|
||||
cf-ray: [296f3f0aeb072858-SJC]
|
||||
connection: [keep-alive]
|
||||
content-encoding: [gzip]
|
||||
content-length: ['7683']
|
||||
content-type: [application/json; charset=UTF-8]
|
||||
date: ['Thu, 21 Apr 2016 07:50:39 GMT']
|
||||
server: [cloudflare-nginx]
|
||||
set-cookie: ['__cfduid=d8e1d83c8cfa76ac404e21fc7d924dc961461225038; expires=Fri,
|
||||
21-Apr-17 07:50:38 GMT; path=/; domain=.reddit.com; HttpOnly', 'loid=hCXBgtTCOflyUpYHv9;
|
||||
Domain=reddit.com; Max-Age=63071999; Path=/; expires=Sat, 21-Apr-2018 07:50:38
|
||||
GMT; secure', 'loidcreated=2016-04-21T07%3A50%3A38.582Z; Domain=reddit.com;
|
||||
Max-Age=63071999; Path=/; expires=Sat, 21-Apr-2018 07:50:38 GMT; secure']
|
||||
strict-transport-security: [max-age=15552000; includeSubDomains; preload]
|
||||
vary: [accept-encoding]
|
||||
x-content-type-options: [nosniff]
|
||||
x-frame-options: [SAMEORIGIN]
|
||||
x-moose: [majestic]
|
||||
x-reddit-tracking: ['https://pixel.redditmedia.com/pixel/of_destiny.png?v=wUoXo%2B%2BbEgovlSTbKrPiRzy5CGl5PaWJAwmKAdLtVFDt9zGb%2FmDNZzDIUNfJZ7SEiQl6UK0WZns%3D']
|
||||
x-ua-compatible: [IE=edge]
|
||||
x-xss-protection: [1; mode=block]
|
||||
status: {code: 200, message: OK}
|
||||
version: 1
|
||||
249
tests/cassettes/test_submission_urlview.yaml
Normal file
249
tests/cassettes/test_submission_urlview.yaml
Normal file
@@ -0,0 +1,249 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: !!binary |
|
||||
cmVkaXJlY3RfdXJpPWh0dHAlM0ElMkYlMkYxMjcuMC4wLjElM0E2NTAwMCUyRiZncmFudF90eXBl
|
||||
PXJlZnJlc2hfdG9rZW4mcmVmcmVzaF90b2tlbj0qKioqKioqKioq
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
Accept-Encoding: ['gzip, deflate']
|
||||
Authorization: ['**********']
|
||||
Connection: [keep-alive]
|
||||
Content-Length: ['122']
|
||||
Content-Type: [application/x-www-form-urlencoded]
|
||||
Cookie: [__cfduid=d963647719488322ce24aaf79235c3d6e1449042300]
|
||||
User-Agent: [rtv test suite PRAW/3.3.0 Python/3.4.0 b'Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty']
|
||||
method: POST
|
||||
uri: https://api.reddit.com/api/v1/access_token/
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
H4sIAAAAAAAAAyWMsQrCQBAFf2W5WiFqDGqb0lYQq3DJPXSReMfuJvEU/12i1YNh5r2d7zqoNhbv
|
||||
eLgDubKsdsVqtV0iDedjf/GvNJzzaR/qqeZ1XW72084tyP2CxnLCXLXwApk5nokF2vD8tqmKYkFO
|
||||
u/jXENjoxmpRMnHAw9gy9VmHVhACm1ISHr2hh6q/QkngAwlSFCP1I0iHtmebRzvhFjRGg/t8AYx9
|
||||
Bq7KAAAA
|
||||
headers:
|
||||
CF-RAY: [24e569649f492816-SJC]
|
||||
Connection: [keep-alive]
|
||||
Content-Encoding: [gzip]
|
||||
Content-Type: [application/json; charset=UTF-8]
|
||||
Date: ['Wed, 02 Dec 2015 07:45:20 GMT']
|
||||
Server: [cloudflare-nginx]
|
||||
Strict-Transport-Security: [max-age=15552000; includeSubDomains; preload]
|
||||
X-Moose: [majestic]
|
||||
cache-control: ['max-age=0, must-revalidate']
|
||||
x-content-type-options: [nosniff]
|
||||
x-frame-options: [SAMEORIGIN]
|
||||
x-xss-protection: [1; mode=block]
|
||||
status: {code: 200, message: OK}
|
||||
- request:
|
||||
body: null
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
Accept-Encoding: ['gzip, deflate']
|
||||
Authorization: ['**********']
|
||||
Connection: [keep-alive]
|
||||
User-Agent: [rtv test suite PRAW/3.3.0 Python/3.4.0 b'Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty']
|
||||
method: GET
|
||||
uri: https://oauth.reddit.com/api/v1/me.json
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
H4sIAAAAAAAAA12QwWrDMBBEf0Xs2YTYuLTxZ5TSq5CtdbNE2k1XUhoI/fei1C5xjxp23ozmBkeX
|
||||
bHQUYDCzCwkbA+wiwmDgFb2n/IYaiV14J/xChcbApOgyehhM2/fd89O+Oxx2+8bAkTzaWSValVFy
|
||||
emBSsqmkM7K/G1d5QdmSpxXXtf2Kq9XE/68XiE/25DS6aqkQiRE5/2nVKxdU275sG3xI8Fslykao
|
||||
D/gMjGP9Zz23eD2TukzCMBguIdQ7HuVqJymcl7ha9YJKM6G3uBTOWnDFTHofMy33v1skEn4IWFao
|
||||
Id8/dZfx5JkBAAA=
|
||||
headers:
|
||||
CF-RAY: [24e56971a0f811a7-SJC]
|
||||
Connection: [keep-alive]
|
||||
Content-Encoding: [gzip]
|
||||
Content-Type: [application/json; charset=UTF-8]
|
||||
Date: ['Wed, 02 Dec 2015 07:45:22 GMT']
|
||||
Server: [cloudflare-nginx]
|
||||
Set-Cookie: ['__cfduid=d667511ab17e019fb769e680b9cab23071449042322; expires=Thu,
|
||||
01-Dec-16 07:45:22 GMT; path=/; domain=.reddit.com; HttpOnly']
|
||||
Strict-Transport-Security: [max-age=15552000; includeSubDomains; preload]
|
||||
X-Moose: [majestic]
|
||||
cache-control: ['private, s-maxage=0, max-age=0, must-revalidate', 'max-age=0,
|
||||
must-revalidate']
|
||||
expires: ['-1']
|
||||
x-content-type-options: [nosniff]
|
||||
x-frame-options: [SAMEORIGIN]
|
||||
x-ratelimit-remaining: ['586.0']
|
||||
x-ratelimit-reset: ['278']
|
||||
x-ratelimit-used: ['14']
|
||||
x-xss-protection: [1; mode=block]
|
||||
status: {code: 200, message: OK}
|
||||
- request:
|
||||
body: null
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
Accept-Encoding: ['gzip, deflate']
|
||||
Authorization: ['**********']
|
||||
Connection: [keep-alive]
|
||||
Cookie: [__cfduid=d667511ab17e019fb769e680b9cab23071449042322]
|
||||
User-Agent: [rtv test suite PRAW/3.3.0 Python/3.4.0 b'Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty']
|
||||
method: GET
|
||||
uri: https://oauth.reddit.com/r/Python/comments/2xmo63/a_python_terminal_viewer_for_browsing_reddit/.json
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
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
|
||||
AA==
|
||||
headers:
|
||||
CF-RAY: [24e56974010611a7-SJC]
|
||||
Connection: [keep-alive]
|
||||
Content-Encoding: [gzip]
|
||||
Content-Length: ['7639']
|
||||
Content-Type: [application/json; charset=UTF-8]
|
||||
Date: ['Wed, 02 Dec 2015 07:45:22 GMT']
|
||||
Server: [cloudflare-nginx]
|
||||
Strict-Transport-Security: [max-age=15552000; includeSubDomains; preload]
|
||||
Vary: [accept-encoding]
|
||||
X-Moose: [majestic]
|
||||
cache-control: ['private, s-maxage=0, max-age=0, must-revalidate', 'max-age=0,
|
||||
must-revalidate']
|
||||
expires: ['-1']
|
||||
x-content-type-options: [nosniff]
|
||||
x-frame-options: [SAMEORIGIN]
|
||||
x-ratelimit-remaining: ['585.0']
|
||||
x-ratelimit-reset: ['278']
|
||||
x-ratelimit-used: ['15']
|
||||
x-reddit-tracking: ['https://pixel.redditmedia.com/pixel/of_destiny.png?v=x7Hgtcci0o4lZvWWI68HSCYaPfSu8AoLGJymDPfSvXaVLHrXHOY314V%2FS7aiBGPeCNk%2FdOqa1ik%3D']
|
||||
x-ua-compatible: [IE=edge]
|
||||
x-xss-protection: [1; mode=block]
|
||||
status: {code: 200, message: OK}
|
||||
version: 1
|
||||
2790
tests/cassettes/test_subreddit_draw_header.yaml
Normal file
2790
tests/cassettes/test_subreddit_draw_header.yaml
Normal file
File diff suppressed because it is too large
Load Diff
771
tests/cassettes/test_subreddit_open_xpost.yaml
Normal file
771
tests/cassettes/test_subreddit_open_xpost.yaml
Normal file
@@ -0,0 +1,771 @@
|
||||
interactions:
|
||||
- request:
|
||||
body: null
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
Accept-Encoding: ['gzip, deflate, compress']
|
||||
User-Agent: [!!python/unicode rtv test suite PRAW/3.4.0 Python/2.7.6 Linux-3.13.0-85-generic-x86_64-with-Ubuntu-14.04-trusty]
|
||||
method: !!python/unicode GET
|
||||
uri: https://api.reddit.com/r/python/.json?limit=1024
|
||||
response:
|
||||
body:
|
||||
string: !!binary |
|
||||
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
|
||||
headers:
|
||||
access-control-allow-origin: ['*']
|
||||
access-control-expose-headers: ['X-Reddit-Tracking, X-Moose']
|
||||
cache-control: ['max-age=0, must-revalidate']
|
||||
cf-ray: [2bf1d78abde30da3-SJC]
|
||||
connection: [keep-alive]
|
||||
content-encoding: [gzip]
|
||||
content-length: ['41778']
|
||||
content-type: [application/json; charset=UTF-8]
|
||||
date: ['Fri, 08 Jul 2016 07:32:23 GMT']
|
||||
server: [cloudflare-nginx]
|
||||
set-cookie: ['__cfduid=da4c26bd1b674e3819415c9b7e4063f911467963142; expires=Sat,
|
||||
08-Jul-17 07:32:22 GMT; path=/; domain=.reddit.com; HttpOnly', 'loid=JxWRoshaZuPtNIAQ1W;
|
||||
Domain=reddit.com; Max-Age=63071999; Path=/; expires=Sun, 08-Jul-2018 07:32:23
|
||||
GMT; secure', 'loidcreated=2016-07-08T07%3A32%3A23.110Z; Domain=reddit.com;
|
||||
Max-Age=63071999; Path=/; expires=Sun, 08-Jul-2018 07:32:23 GMT; secure']
|
||||
strict-transport-security: [max-age=15552000; includeSubDomains; preload]
|
||||
vary: [accept-encoding]
|
||||
x-content-type-options: [nosniff]
|
||||
x-frame-options: [SAMEORIGIN]
|
||||
x-moose: [majestic]
|
||||
x-reddit-tracking: ['https://pixel.redditmedia.com/pixel/of_destiny.png?v=KzN2Y%2F7HejPW9lFlAE5Yo5g7HI5v7MEUvkF2G6QMIq3ap9ofwMhdfAyRDrVKFqqAQFaO9ukLEz0%3D']
|
||||
x-ua-compatible: [IE=edge]
|
||||
x-xss-protection: [1; mode=block]
|
||||
status: {code: 200, message: OK}
|
||||
version: 1
|
||||
@@ -5,6 +5,7 @@ import os
|
||||
import curses
|
||||
import logging
|
||||
from functools import partial
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
import praw
|
||||
import pytest
|
||||
@@ -27,7 +28,9 @@ except ImportError:
|
||||
patch = partial(mock.patch, autospec=True)
|
||||
|
||||
# Turn on logging, but disable vcr from spamming
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
format='%(asctime)s:%(levelname)s:%(filename)s:%(lineno)d:%(message)s')
|
||||
for name in ['vcr.matchers', 'vcr.stubs']:
|
||||
logging.getLogger(name).disabled = True
|
||||
|
||||
@@ -122,9 +125,18 @@ def refresh_token(request):
|
||||
|
||||
@pytest.yield_fixture()
|
||||
def config():
|
||||
with patch('rtv.config.Config.save_refresh_token'), \
|
||||
patch('rtv.config.Config.save_history'):
|
||||
yield Config()
|
||||
conf = Config()
|
||||
with mock.patch.object(conf, 'save_history'), \
|
||||
mock.patch.object(conf, 'delete_history'), \
|
||||
mock.patch.object(conf, 'save_refresh_token'), \
|
||||
mock.patch.object(conf, 'delete_refresh_token'):
|
||||
|
||||
def delete_refresh_token():
|
||||
# Skip the os.remove
|
||||
conf.refresh_token = None
|
||||
conf.delete_refresh_token.side_effect = delete_refresh_token
|
||||
|
||||
yield conf
|
||||
|
||||
|
||||
@pytest.yield_fixture()
|
||||
|
||||
@@ -53,9 +53,10 @@ def test_config_get_args():
|
||||
'--log', 'logfile.log',
|
||||
'--config', 'configfile.cfg',
|
||||
'--ascii',
|
||||
'--monochrome',
|
||||
'--non-persistent',
|
||||
'--clear-auth',
|
||||
'--copy-config']
|
||||
'--copy-config',]
|
||||
|
||||
with mock.patch('sys.argv', ['rtv']):
|
||||
config_dict = Config.get_args()
|
||||
@@ -67,6 +68,7 @@ def test_config_get_args():
|
||||
|
||||
config = Config(**config_dict)
|
||||
assert config['ascii'] is True
|
||||
assert config['monochrome'] is True
|
||||
assert config['subreddit'] == 'cfb'
|
||||
assert config['log'] == 'logfile.log'
|
||||
assert config['ascii'] is True
|
||||
@@ -82,6 +84,7 @@ def test_config_from_file():
|
||||
|
||||
args = {
|
||||
'ascii': True,
|
||||
'monochrome': True,
|
||||
'persistent': False,
|
||||
'clear_auth': True,
|
||||
'log': 'logfile.log',
|
||||
|
||||
@@ -101,7 +101,8 @@ def test_content_submission(reddit, terminal):
|
||||
assert content.get(40)['type'] == 'Comment'
|
||||
|
||||
for data in content.iterate(-1, 1):
|
||||
assert all(k in data for k in ('object', 'n_rows', 'offset', 'type'))
|
||||
assert all(k in data for k in ('object', 'n_rows', 'offset', 'type',
|
||||
'hidden'))
|
||||
# All text should be converted to unicode by this point
|
||||
for val in data.values():
|
||||
assert not isinstance(val, six.binary_type)
|
||||
@@ -121,11 +122,14 @@ def test_content_submission(reddit, terminal):
|
||||
data = content.get(2)
|
||||
assert data['type'] == 'HiddenComment'
|
||||
assert data['count'] == 3
|
||||
assert data['hidden'] is True
|
||||
assert data['level'] >= content.get(3)['level']
|
||||
assert len(content._comment_data) == 43
|
||||
|
||||
# Toggling again expands the children
|
||||
content.toggle(2)
|
||||
data = content.get(2)
|
||||
assert data['hidden'] is False
|
||||
assert len(content._comment_data) == 45
|
||||
|
||||
|
||||
@@ -195,8 +199,9 @@ def test_content_subreddit(reddit, terminal):
|
||||
assert content.get(0)['type'] == 'Submission'
|
||||
|
||||
for data in content.iterate(0, 1):
|
||||
assert all(k in data for k in ('object', 'n_rows', 'offset', 'type',
|
||||
'index', 'title', 'split_title'))
|
||||
assert all(k in data for k in (
|
||||
'object', 'n_rows', 'offset', 'type', 'index', 'title',
|
||||
'split_title', 'hidden'))
|
||||
# All text should be converted to unicode by this point
|
||||
for val in data.values():
|
||||
assert not isinstance(val, six.binary_type)
|
||||
@@ -216,13 +221,17 @@ def test_content_subreddit_load_more(reddit, terminal):
|
||||
assert content.get(50)['type'] == 'Submission'
|
||||
assert len(content._submission_data) == 51
|
||||
|
||||
for data in islice(content.iterate(0, 1), 0, 50):
|
||||
for i, data in enumerate(islice(content.iterate(0, 1), 0, 50)):
|
||||
assert all(k in data for k in ('object', 'n_rows', 'offset', 'type',
|
||||
'index', 'title', 'split_title'))
|
||||
# All text should be converted to unicode by this point
|
||||
for val in data.values():
|
||||
assert not isinstance(val, six.binary_type)
|
||||
|
||||
# Index be appended to each title, starting at "1." and incrementing
|
||||
assert data['index'] == i + 1
|
||||
assert data['title'].startswith(six.text_type(i + 1))
|
||||
|
||||
|
||||
def test_content_subreddit_from_name(reddit, terminal):
|
||||
|
||||
@@ -250,6 +259,14 @@ def test_content_subreddit_from_name(reddit, terminal):
|
||||
SubredditContent.from_name(reddit, name, terminal.loader)
|
||||
assert isinstance(terminal.loader.exception, exceptions.SubredditError)
|
||||
|
||||
# A couple of edge cases
|
||||
names = ['', '/', '//', '/////////////////']
|
||||
for name in names:
|
||||
with terminal.loader():
|
||||
SubredditContent.from_name(reddit, name, terminal.loader)
|
||||
assert isinstance(terminal.loader.exception,
|
||||
praw.errors.InvalidSubreddit)
|
||||
|
||||
# Front page alias
|
||||
name = '/r/front/rising'
|
||||
content = SubredditContent.from_name(reddit, name, terminal.loader)
|
||||
@@ -274,6 +291,14 @@ def test_content_subreddit_multireddit(reddit, terminal):
|
||||
assert isinstance(terminal.loader.exception, praw.errors.NotFound)
|
||||
|
||||
|
||||
def test_content_subreddit_random(reddit, terminal):
|
||||
|
||||
name = '/r/random'
|
||||
content = SubredditContent.from_name(reddit, name, terminal.loader)
|
||||
assert content.name.startswith('/r/')
|
||||
assert content.name != name
|
||||
|
||||
|
||||
def test_content_subreddit_me(reddit, oauth, refresh_token, terminal):
|
||||
|
||||
# Not logged in
|
||||
@@ -327,4 +352,4 @@ def test_content_subscription_empty(terminal):
|
||||
|
||||
with terminal.loader():
|
||||
SubscriptionContent(subscriptions, terminal.loader)
|
||||
assert isinstance(terminal.loader.exception, exceptions.SubscriptionError)
|
||||
assert isinstance(terminal.loader.exception, exceptions.SubscriptionError)
|
||||
|
||||
@@ -168,7 +168,6 @@ def test_objects_color(stdscr):
|
||||
assert getattr(Color, color) == curses.A_NORMAL
|
||||
|
||||
Color.init()
|
||||
assert curses.use_default_colors.called
|
||||
|
||||
# Check that all colors are populated
|
||||
for color in colors:
|
||||
@@ -182,6 +181,7 @@ def test_objects_curses_session(stdscr):
|
||||
pass
|
||||
assert curses.initscr.called
|
||||
assert curses.endwin.called
|
||||
assert curses.use_default_colors.called
|
||||
curses.initscr.reset_mock()
|
||||
curses.endwin.reset_mock()
|
||||
|
||||
@@ -346,11 +346,13 @@ def test_objects_navigator_properties():
|
||||
assert nav.step == 1
|
||||
assert nav.position == (0, 0, False)
|
||||
assert nav.absolute_index == 0
|
||||
assert nav.top_item_height is None
|
||||
|
||||
nav = Navigator(valid_page_cb, 5, 2, True)
|
||||
nav = Navigator(valid_page_cb, 5, 2, True, 10)
|
||||
assert nav.step == -1
|
||||
assert nav.position == (5, 2, True)
|
||||
assert nav.absolute_index == 3
|
||||
assert nav.top_item_height == 10
|
||||
|
||||
|
||||
def test_objects_navigator_move():
|
||||
@@ -360,6 +362,7 @@ def test_objects_navigator_move():
|
||||
raise IndexError()
|
||||
|
||||
nav = Navigator(valid_page_cb)
|
||||
nav.top_item_height = 5
|
||||
|
||||
# Try to scroll up past the first item
|
||||
valid, redraw = nav.move(-1, 2)
|
||||
@@ -375,6 +378,7 @@ def test_objects_navigator_move():
|
||||
|
||||
# Scroll down, reach last item on the page and flip the screen
|
||||
valid, redraw = nav.move(1, 3)
|
||||
assert nav.top_item_height is None
|
||||
assert nav.page_index == 2
|
||||
assert nav.cursor_index == 0
|
||||
assert nav.inverted
|
||||
|
||||
@@ -111,6 +111,24 @@ def test_submission_pager(submission_page, terminal):
|
||||
assert terminal.open_pager.called
|
||||
|
||||
|
||||
def test_submission_comment_not_enough_space(submission_page, terminal):
|
||||
|
||||
# The first comment is 10 lines, shrink the screen so that it won't fit.
|
||||
# Setting the terminal to 10 lines means that there will only be 8 lines
|
||||
# available (after subtracting the header and footer) to draw the comment.
|
||||
terminal.stdscr.nlines = 10
|
||||
|
||||
# Select the first comment
|
||||
with mock.patch.object(submission_page, 'clear_input_queue'):
|
||||
submission_page.move_cursor_down()
|
||||
|
||||
submission_page.draw()
|
||||
|
||||
text = '(Not enough space to display)'.encode('ascii')
|
||||
window = terminal.stdscr.subwin
|
||||
window.subwin.addstr.assert_any_call(7, 1, text)
|
||||
|
||||
|
||||
def test_submission_vote(submission_page, refresh_token):
|
||||
|
||||
# Log in
|
||||
@@ -160,7 +178,7 @@ def test_submission_comment(submission_page, terminal, refresh_token):
|
||||
with mock.patch('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 = 'comment text'
|
||||
open_editor.return_value.__enter__.return_value = 'comment text'
|
||||
|
||||
submission_page.controller.trigger('c')
|
||||
assert open_editor.called
|
||||
@@ -205,6 +223,8 @@ def test_submission_edit(submission_page, terminal, refresh_token):
|
||||
submission_page.oauth.authorize()
|
||||
|
||||
# Try to edit the submission - wrong author
|
||||
data = submission_page.content.get(submission_page.nav.absolute_index)
|
||||
data['author'] = 'some other person'
|
||||
curses.flash.reset_mock()
|
||||
submission_page.controller.trigger('e')
|
||||
assert curses.flash.called
|
||||
@@ -215,7 +235,7 @@ def test_submission_edit(submission_page, terminal, refresh_token):
|
||||
with mock.patch('praw.objects.Submission.edit') as edit, \
|
||||
mock.patch.object(terminal, 'open_editor') as open_editor, \
|
||||
mock.patch('time.sleep'):
|
||||
open_editor.return_value = 'submission text'
|
||||
open_editor.return_value.__enter__.return_value = 'submission text'
|
||||
|
||||
submission_page.controller.trigger('e')
|
||||
assert open_editor.called
|
||||
@@ -231,8 +251,33 @@ def test_submission_edit(submission_page, terminal, refresh_token):
|
||||
with mock.patch('praw.objects.Comment.edit') as edit, \
|
||||
mock.patch.object(terminal, 'open_editor') as open_editor, \
|
||||
mock.patch('time.sleep'):
|
||||
open_editor.return_value = 'comment text'
|
||||
open_editor.return_value.__enter__.return_value = 'comment text'
|
||||
|
||||
submission_page.controller.trigger('e')
|
||||
assert open_editor.called
|
||||
edit.assert_called_with('comment text')
|
||||
edit.assert_called_with('comment text')
|
||||
|
||||
|
||||
def test_submission_urlview(submission_page, terminal, refresh_token):
|
||||
|
||||
# Log in
|
||||
submission_page.config.refresh_token = refresh_token
|
||||
submission_page.oauth.authorize()
|
||||
|
||||
# Positive Case
|
||||
data = submission_page.content.get(submission_page.nav.absolute_index)
|
||||
TEST_BODY = 'test comment body'
|
||||
data['body'] = TEST_BODY
|
||||
with mock.patch.object(terminal, 'open_urlview') as open_urlview, \
|
||||
mock.patch('subprocess.Popen'):
|
||||
submission_page.controller.trigger('b')
|
||||
open_urlview.assert_called_with(TEST_BODY)
|
||||
|
||||
# Negative Case
|
||||
data = submission_page.content.get(submission_page.nav.absolute_index)
|
||||
TEST_NO_BODY = ''
|
||||
data['body'] = TEST_NO_BODY
|
||||
with mock.patch.object(terminal, 'open_urlview') as open_urlview, \
|
||||
mock.patch('subprocess.Popen'):
|
||||
submission_page.controller.trigger('b')
|
||||
assert not open_urlview.called
|
||||
|
||||
@@ -116,6 +116,26 @@ def test_subreddit_open(subreddit_page, terminal, config):
|
||||
assert subreddit_page.open_submission.called
|
||||
|
||||
|
||||
def test_subreddit_open_xpost(subreddit_page, config):
|
||||
|
||||
data = subreddit_page.content.get(subreddit_page.nav.absolute_index)
|
||||
|
||||
# Open an x-post subreddit, see /r/TinySubredditoftheDay for an example
|
||||
with mock.patch.object(subreddit_page, 'refresh_content'):
|
||||
data['url_type'] = 'x-post subreddit'
|
||||
data['xpost_subreddit'] = 'goodbye'
|
||||
subreddit_page.controller.trigger('o')
|
||||
subreddit_page.refresh_content.assert_called_with(
|
||||
name='goodbye', order='ignore')
|
||||
|
||||
# Open an x-post submission, see /r/bestof for an example
|
||||
with mock.patch.object(subreddit_page, 'open_submission'):
|
||||
data['url_type'] = 'x-post submission'
|
||||
data['url_full'] = 'www.test.com'
|
||||
subreddit_page.controller.trigger('o')
|
||||
subreddit_page.open_submission.assert_called_with(url='www.test.com')
|
||||
|
||||
|
||||
def test_subreddit_unauthenticated(subreddit_page, terminal):
|
||||
|
||||
# Unauthenticated commands
|
||||
@@ -148,9 +168,9 @@ def test_subreddit_post(subreddit_page, terminal, reddit, refresh_token):
|
||||
# Post a submission with a title but with no body
|
||||
subreddit_page.refresh_content(name='python')
|
||||
with mock.patch.object(terminal, 'open_editor'):
|
||||
terminal.open_editor.return_value = 'title'
|
||||
terminal.open_editor.return_value.__enter__.return_value = 'title'
|
||||
subreddit_page.controller.trigger('c')
|
||||
text = 'Canceled'.encode('utf-8')
|
||||
text = 'Missing body'.encode('utf-8')
|
||||
terminal.stdscr.subwin.addstr.assert_called_with(1, 1, text)
|
||||
|
||||
# Post a fake submission
|
||||
@@ -160,7 +180,7 @@ def test_subreddit_post(subreddit_page, terminal, reddit, refresh_token):
|
||||
mock.patch.object(reddit, 'submit'), \
|
||||
mock.patch('rtv.page.Page.loop') as loop, \
|
||||
mock.patch('time.sleep'):
|
||||
terminal.open_editor.return_value = 'test\ncontent'
|
||||
terminal.open_editor.return_value.__enter__.return_value = 'test\ncont'
|
||||
reddit.submit.return_value = submission
|
||||
subreddit_page.controller.trigger('c')
|
||||
assert reddit.submit.called
|
||||
@@ -176,4 +196,33 @@ def test_subreddit_open_subscriptions(subreddit_page, refresh_token):
|
||||
# Open a subscription
|
||||
with mock.patch('rtv.page.Page.loop') as loop:
|
||||
subreddit_page.controller.trigger('s')
|
||||
assert loop.called
|
||||
assert loop.called
|
||||
|
||||
|
||||
def test_subreddit_draw_header(subreddit_page, refresh_token, terminal):
|
||||
|
||||
# /r/front alias should be renamed in the header
|
||||
subreddit_page.refresh_content(name='/r/front')
|
||||
subreddit_page.draw()
|
||||
text = 'Front Page'.encode('utf-8')
|
||||
terminal.stdscr.subwin.addstr.assert_any_call(0, 0, text)
|
||||
|
||||
subreddit_page.refresh_content(name='/r/front/new')
|
||||
subreddit_page.draw()
|
||||
text = 'Front Page'.encode('utf-8')
|
||||
terminal.stdscr.subwin.addstr.assert_any_call(0, 0, text)
|
||||
|
||||
# Log in to check the user submissions page
|
||||
subreddit_page.config.refresh_token = refresh_token
|
||||
subreddit_page.oauth.authorize()
|
||||
|
||||
# /r/me alias should be renamed in the header
|
||||
subreddit_page.refresh_content(name='/r/me')
|
||||
subreddit_page.draw()
|
||||
text = 'My Submissions'.encode('utf-8')
|
||||
terminal.stdscr.subwin.addstr.assert_any_call(0, 0, text)
|
||||
|
||||
subreddit_page.refresh_content(name='/r/me/new')
|
||||
subreddit_page.draw()
|
||||
text = 'My Submissions'.encode('utf-8')
|
||||
terminal.stdscr.subwin.addstr.assert_any_call(0, 0, text)
|
||||
@@ -40,7 +40,7 @@ def test_subscription_page_construct(reddit, terminal, config, oauth,
|
||||
|
||||
# Header - Name
|
||||
name = reddit.user.name.encode('utf-8')
|
||||
window.addstr.assert_any_call(0, 59, name)
|
||||
assert name in [args[0][2] for args in window.addstr.call_args_list]
|
||||
|
||||
# Banner shouldn't be drawn
|
||||
menu = ('[1]hot '
|
||||
|
||||
@@ -10,6 +10,7 @@ import pytest
|
||||
|
||||
from rtv.docs import HELP, COMMENT_EDIT_FILE
|
||||
from rtv.objects import Color
|
||||
from rtv.exceptions import TemporaryFileError
|
||||
|
||||
try:
|
||||
from unittest import mock
|
||||
@@ -36,7 +37,7 @@ def test_terminal_properties(terminal, config):
|
||||
with mock.patch('rtv.terminal.sys') as sys, \
|
||||
mock.patch.dict('os.environ', {'DISPLAY': ''}):
|
||||
sys.platform = 'darwin'
|
||||
assert terminal.display is True
|
||||
assert terminal.display is False
|
||||
|
||||
terminal._display = None
|
||||
with mock.patch.dict('os.environ', {'DISPLAY': ':0', 'BROWSER': 'w3m'}):
|
||||
@@ -269,7 +270,10 @@ def test_prompt_y_or_n(terminal, stdscr):
|
||||
assert curses.flash.called
|
||||
|
||||
|
||||
def test_open_editor(terminal):
|
||||
@pytest.mark.parametrize('ascii', [True, False])
|
||||
def test_open_editor(terminal, ascii):
|
||||
|
||||
terminal.ascii = ascii
|
||||
|
||||
comment = COMMENT_EDIT_FILE.format(content='#| This is a comment! ❤')
|
||||
data = {'filename': None}
|
||||
@@ -284,11 +288,57 @@ def test_open_editor(terminal):
|
||||
with mock.patch('subprocess.Popen', autospec=True) as Popen:
|
||||
Popen.side_effect = side_effect
|
||||
|
||||
reply_text = terminal.open_editor(comment)
|
||||
assert reply_text == 'This is an amended comment! ❤'
|
||||
with terminal.open_editor(comment) as reply_text:
|
||||
assert reply_text == 'This is an amended comment! ❤'
|
||||
assert os.path.isfile(data['filename'])
|
||||
assert curses.endwin.called
|
||||
assert curses.doupdate.called
|
||||
assert not os.path.isfile(data['filename'])
|
||||
assert curses.endwin.called
|
||||
assert curses.doupdate.called
|
||||
|
||||
|
||||
def test_open_editor_error(terminal):
|
||||
|
||||
with mock.patch('subprocess.Popen', autospec=True) as Popen, \
|
||||
mock.patch.object(terminal, 'show_notification'):
|
||||
|
||||
# Invalid editor
|
||||
Popen.side_effect = OSError
|
||||
with terminal.open_editor('hello') as text:
|
||||
assert text == 'hello'
|
||||
assert 'Could not open' in terminal.show_notification.call_args[0][0]
|
||||
|
||||
data = {'filename': None}
|
||||
|
||||
def side_effect(args):
|
||||
data['filename'] = args[1]
|
||||
return mock.Mock()
|
||||
|
||||
# Temporary File Errors don't delete the file
|
||||
Popen.side_effect = side_effect
|
||||
with terminal.open_editor('test'):
|
||||
assert os.path.isfile(data['filename'])
|
||||
raise TemporaryFileError()
|
||||
assert os.path.isfile(data['filename'])
|
||||
os.remove(data['filename'])
|
||||
|
||||
# Other Exceptions don't delete the file *and* are propagated
|
||||
Popen.side_effect = side_effect
|
||||
with pytest.raises(ValueError):
|
||||
with terminal.open_editor('test'):
|
||||
assert os.path.isfile(data['filename'])
|
||||
raise ValueError()
|
||||
assert os.path.isfile(data['filename'])
|
||||
os.remove(data['filename'])
|
||||
|
||||
# Gracefully handle the case when we can't remove the file
|
||||
with mock.patch.object(os, 'remove'):
|
||||
os.remove.side_effect = OSError
|
||||
with terminal.open_editor():
|
||||
pass
|
||||
assert os.remove.called
|
||||
|
||||
assert os.path.isfile(data['filename'])
|
||||
os.remove(data['filename'])
|
||||
|
||||
|
||||
def test_open_browser(terminal):
|
||||
|
||||
Reference in New Issue
Block a user