Merge pull request #123 from lnalex/master
authorOrakaro <DTVD@users.noreply.github.com>
Tue, 16 Aug 2016 14:37:19 +0000 (23:37 +0900)
committerGitHub <noreply@github.com>
Tue, 16 Aug 2016 14:37:19 +0000 (23:37 +0900)
Add Pocket support

MANIFEST.in
README.rst
docs/conf.py
docs/index.rst
rainbowstream/c_image.py
rainbowstream/colorset/base16.json [new file with mode: 0644]
rainbowstream/colorset/config
rainbowstream/draw.py
rainbowstream/rainbow.py
rainbowstream/util.py
setup.py

index 5c3747f..71ef396 100644 (file)
@@ -1,3 +1,3 @@
-include README.rst
+include README.rst LICENSE.txt
 include rainbowstream/image.c
 recursive-include rainbowstream/colorset *
index 34a81fd..ddcdf30 100644 (file)
@@ -7,7 +7,7 @@ Rainbow Stream
 .. image:: http://img.shields.io/pypi/v/rainbowstream.svg?style=flat-square\r
    :target: https://pypi.python.org/pypi/rainbowstream\r
 \r
-Terminal-based Twitter Client. Realtime tweetstream, compose, search ,\r
+Terminal-based Twitter Client. Realtime tweetstream, compose, search,\r
 favorite … and much more fun directly from terminal.\r
 \r
 This package is built on the top of `Python Twitter Tool`_ and `Twitter API`_,\r
@@ -45,7 +45,7 @@ Use `virtualenv`_
 .. code:: bash\r
 \r
     virtualenv venv\r
-    # Python 3 users : use -p to specify your Python 3 localtion as below\r
+    # Python 3 users : use -p to specify your Python 3 location as below\r
     # virtualenv -p /usr/bin/python3 venv\r
     source venv/bin/activate\r
     pip install rainbowstream\r
@@ -60,6 +60,12 @@ For debian-based distros, these can be installed with
 \r
     sudo apt-get install python-dev libjpeg-dev libfreetype6 libfreetype6-dev zlib1g-dev\r
 \r
+For CentOS:\r
+\r
+.. code:: bash\r
+\r
+    sudo yum install python-devel libjpeg-devel\r
+\r
 Besides, Mac OSX Maverick with Xcode 5.1 has a well-known `clang unknown argument`_ problem with\r
 the ``Pillow`` package installation - a dependency of this app.\r
 If you are in this case, I recommend taking a look at `Issue #10`_ and let me know if this workaround doesn't work for you.\r
index 3c2d6aa..105bb94 100644 (file)
@@ -48,9 +48,9 @@ copyright = u'2014, Vu Nhat Minh'
 # built documents.
 #
 # The short X.Y version.
-version = '1.3.0'
+version = '1.3.4'
 # The full version, including alpha/beta/rc tags.
-release = '1.3.0'
+release = '1.3.4'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
index 6e85da0..ef2c8e2 100644 (file)
@@ -132,6 +132,8 @@ Here is full list of supported command:
 \r
 -  ``home`` will show your timeline. ``home 10`` will print exactly 10 tweets.\r
 \r
+-  ``me`` will show your latest tweets. ``me 2`` will show your last 2 tweets.\r
+\r
 -  ``notification`` will show your notification from the time you started RainbowStream.\r
 \r
 -  ``mentions`` will show mentions timeline. ``mentions 7`` will show 7 mention tweets.\r
@@ -321,6 +323,8 @@ You also can view or set a new value of every config key by ``config`` command (
 \r
 -  ``IMAGE_ON_TERM``: display tweet's image directly on terminal.\r
 \r
+-  ``IMAGE_RESIZE_TO_FIT``: display tweet's image fit inside terminal view (width and height).\r
+\r
 -  ``THEME``: current theme.\r
 \r
 -  ``ASCII_ART``: diplay your twitter name by ascii art at stream begin or not.\r
index a044e07..b26142d 100644 (file)
@@ -71,6 +71,17 @@ def image_to_display(path, start=None, length=None):
     i.load()
     width = min(w, length)
     height = int(float(h) * (float(width) / float(w)))
+
+    if c['IMAGE_RESIZE_TO_FIT'] is True:
+        # If it image won't fit in the terminal without scrolling shrink it
+        # Subtract 3 from rows so the tweet message fits in too.
+        h = 2 * (int(rows) - 3)
+        if height >= h:
+            width = int(float(width) * (float(h) / float(height)))
+            height = h
+    if (height <= 0) or (width <= 0):
+        raise ValueError("image has negative dimensions")
+
     i = i.resize((width, height), Image.ANTIALIAS)
     height = min(height, c['IMAGE_MAX_HEIGHT'])
 
diff --git a/rainbowstream/colorset/base16.json b/rainbowstream/colorset/base16.json
new file mode 100644 (file)
index 0000000..57b793a
--- /dev/null
@@ -0,0 +1,61 @@
+{
+    "DECORATED_NAME": 7,
+    "CYCLE_COLOR": [1,2,3,4,5,6,16,17,20,21],
+    "TWEET": {
+        "mynick": 3,
+        "nick": 4,
+        "clock": 8,
+        "id": 4,
+        "client": 7,
+        "favorited": 1,
+        "retweet_count": 2,
+        "favorite_count": 1,
+        "rt": 2,
+        "link": 4,
+        "hashtag": 3,
+        "mytweet": 20,
+        "keyword": "on_light_green"
+    },
+    "NOTIFICATION": {
+        "source_nick": 3,
+        "notify": 1,
+        "clock": 8
+    },
+    "MESSAGE": {
+        "partner": 2,
+        "me": 7,
+        "partner_frame": 2,
+        "me_frame": 7,
+        "sender": 2,
+        "recipient": 6,
+        "to": 3,
+        "clock": 8,
+        "id": 4
+    },
+    "PROFILE": {
+        "statuses_count": 6,
+        "friends_count": 7,
+        "followers_count": 7,
+        "nick": 2,
+        "profile_image_url": 4,
+        "description": 7,
+        "location": 7,
+        "url": 4,
+        "clock": 8
+    },
+    "TREND": {
+        "url": 6
+    },
+    "CAL": {
+        "days": 1,
+        "today": "on_light_blue"
+    },
+    "GROUP": {
+        "name": 6,
+        "member": 1,
+        "subscriber": 3,
+        "mode": 6,
+        "description": 2,
+        "clock": 8
+    }
+}
index 491ae61..a9ee3fd 100644 (file)
@@ -3,6 +3,8 @@
     "HEARTBEAT_TIMEOUT" : 120,
     // Image on term
     "IMAGE_ON_TERM" : false,
+    // Resize image to fit on terminal view
+    "IMAGE_RESIZE_TO_FIT" : false,
     // Themes
     "THEME" : "monokai",
     // Ascii Art
@@ -55,7 +57,7 @@
     "FORMAT": {
         "TWEET": {
             "CLOCK_FORMAT" : "%Y/%m/%d %H:%M:%S",
-            "DISPLAY" : "\n  #name #nick #clock \n  \u20AA:#rt_count \u2665:#fa_count id:#id via #client #fav\n  #tweet"
+            "DISPLAY" : "\n  #name #nick #clock \n  \u267A:#rt_count \u2665:#fa_count id:#id via #client #fav\n  #tweet"
         },
         "MESSAGE": {
             "CLOCK_FORMAT" : "%Y/%m/%d %H:%M:%S",
index 756604e..b9373d3 100644 (file)
@@ -273,7 +273,8 @@ def draw(t, keyword=None, humanize=True, noti=False, fil=[], ig=[]):
     if favorited:
         fav = color_func(c['TWEET']['favorited'])(u'\u2605')
 
-    tweet = text.split()
+    tweet = text.split(' ')
+    tweet = [x for x in tweet if x != '']
     # Replace url
     if expanded_url:
         for index in xrange(len(expanded_url)):
@@ -289,17 +290,18 @@ def draw(t, keyword=None, humanize=True, noti=False, fil=[], ig=[]):
         else x,
         tweet)
     # Highlight screen_name
-    tweet = lmap(lambda x: cycle_color(x) if x[0] == '@' else x, tweet)
+    tweet = lmap(
+        lambda x: cycle_color(x) if x.lstrip().startswith('@') else x, tweet)
     # Highlight link
     tweet = lmap(
         lambda x: color_func(c['TWEET']['link'])(x)
-        if x.startswith('http')
+        if x.lstrip().startswith('http')
         else x,
         tweet)
     # Highlight hashtag
     tweet = lmap(
         lambda x: color_func(c['TWEET']['hashtag'])(x)
-        if x.startswith('#')
+        if x.lstrip().startswith('#')
         else x,
         tweet)
     # Highlight my tweet
@@ -308,11 +310,12 @@ def draw(t, keyword=None, humanize=True, noti=False, fil=[], ig=[]):
                  for x in tweet
                  if not any([
                      x == 'RT',
-                     x.startswith('http'),
-                     x.startswith('#')])
+                     x.lstrip().startswith('http'),
+                     x.lstrip().startswith('#')])
                  ]
     # Highlight keyword
     tweet = ' '.join(tweet)
+    tweet = '\n  '.join(tweet.split('\n'))
     if keyword:
         roj = re.search(keyword, tweet, re.IGNORECASE)
         if roj:
index 8e9e22b..93f711a 100644 (file)
@@ -221,12 +221,12 @@ def upgrade_center():
             notice += light_yellow(current) + '\n'
             notice += light_magenta('You should upgrade with ')
             notice += light_green('pip install -U rainbowstream')
-            printNicely(notice)
         else:
             notice = light_yellow('You are running latest version (')
             notice += light_green(current)
             notice += light_yellow(')')
             notice += '\n'
+        printNicely(notice)
     except:
         pass
 
@@ -271,7 +271,6 @@ def init(args):
     c['message_dict'] = []
     # Image on term
     c['IMAGE_ON_TERM'] = args.image_on_term
-    set_config('IMAGE_ON_TERM', str(c['IMAGE_ON_TERM']))
     # Use 24 bit color
     c['24BIT'] = args.color_24bit
     # Check type of ONLY_LIST and IGNORE_LIST
@@ -407,6 +406,21 @@ def view():
         printNicely(red('A name should begin with a \'@\''))
 
 
+def view_my_tweets():
+    """
+    Display user's recent tweets.
+    """
+    t = Twitter(auth=authen())
+    try:
+        num = int(g['stuff'])
+    except:
+        num = c['HOME_TWEET_NUM']
+    for tweet in reversed(
+            t.statuses.user_timeline(count=num, screen_name=g['original_name'])):
+        draw(t=tweet)
+    printNicely('')
+
+
 def search():
     """
     Search
@@ -950,7 +964,7 @@ def mute():
             rel = t.mutes.users.create(screen_name=screen_name[1:])
             if isinstance(rel, dict):
                 printNicely(green(screen_name + ' is muted.'))
-                c['IGNORE_LIST'] += [unc(screen_name)]
+                c['IGNORE_LIST'] += [screen_name]
                 c['IGNORE_LIST'] = list(set(c['IGNORE_LIST']))
             else:
                 printNicely(red(rel))
@@ -1520,6 +1534,8 @@ def help_discover():
         light_green('trend JP Tokyo') + '.\n'
     usage += s * 2 + light_green('home') + ' will show your timeline. ' + \
         light_green('home 7') + ' will show 7 tweets.\n'
+    usage += s * 2 + light_green('me') + ' will show your latest tweets. ' + \
+        light_green('me 2') + ' will show your last 2 tweets.\n'
     usage += s * 2 + \
         light_green('notification') + ' will show your recent notification.\n'
     usage += s * 2 + light_green('mentions') + ' will show mentions timeline. ' + \
@@ -1846,6 +1862,7 @@ cmdset = [
     't',
     'rt',
     'quote',
+    'me',
     'allrt',
     'conversation',
     'fav',
@@ -1895,6 +1912,7 @@ funcset = [
     tweet,
     retweet,
     quote,
+    view_my_tweets,
     allretweet,
     conversation,
     favorite,
@@ -1957,6 +1975,7 @@ def listen():
             [],  # tweet
             [],  # retweet
             [],  # quote
+            [],  # view_my_tweets
             [],  # allretweet
             [],  # conversation
             [],  # favorite
@@ -2044,8 +2063,6 @@ def listen():
                 g['prefix'] = False
             else:
                 g['prefix'] = True
-            # Release the semaphore lock
-            c['lock'] = False
         except EOFError:
             printNicely('')
         except TwitterHTTPError as e:
@@ -2053,6 +2070,9 @@ def listen():
         except Exception:
             debug_option()
             printNicely(red('OMG something is wrong with Twitter API right now.'))
+        finally:
+            # Release the semaphore lock
+            c['lock'] = False
 
 
 def reconn_notice():
index 292a7e5..d69cf88 100644 (file)
@@ -9,16 +9,12 @@ def detail_twitter_error(twitterException):
     """
     Display Twitter Errors nicely
     """
+    data = twitterException.response_data
     try:
-        # twitterException.response_data can be byte string on Python 3
-        # or nornal dict on Python 2
-        loadedJson = json.loads(twitterException.response_data.decode('utf8'))
-        for m in loadedJson.get('errors', dict()):
-            info = "Error " + str(m.get('code')) + ": " + m.get('message')
-            printNicely(yellow(info))
-    except:
-        info = "Error: " + twitterException.response_data.decode('utf8')
-        printNicely(yellow(info))
+        for m in data.get('errors', dict()):
+            printNicely(yellow(m.get('message')))
+    except: 
+        printNicely(yellow(data))
 
 
 def format_prefix(listname='', keyword=''):
index 1d4e49e..a206274 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1,9 +1,15 @@
 from setuptools import setup, find_packages
 import os
 import os.path
+import sys
+
+if sys.version[0] == "2":
+    from pipes import quote
+else:
+    from shlex import quote
 
 # Bumped version
-version = '1.3.0'
+version = '1.3.4'
 
 # Require
 install_requires = [
@@ -17,11 +23,16 @@ install_requires = [
     "pocket"
 ]
 
+# Default user (considers non virtualenv method)
+user = os.environ.get('SUDO_USER', os.environ['USER'])
+
 # Copy default config if not exists
 default = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
 if not os.path.isfile(default):
     cmd = 'cp rainbowstream/colorset/config ' + default
     os.system(cmd)
+    cmd = 'chown ' + quote(user) + ' ' + default
+    os.system(cmd)
     cmd = 'chmod 777 ' + default
     os.system(cmd)
 
@@ -40,6 +51,7 @@ setup(name='rainbowstream',
           "Programming Language :: Python :: 3.2",
           "Programming Language :: Python :: 3.3",
           "Programming Language :: Python :: 3.4",
+          "Programming Language :: Python :: 3.5",
           "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",
           "Topic :: Utilities",
           "License :: OSI Approved :: MIT License",