Merge pull request #19 from alexbutum/master
Be more Pythonic and Python 3.x compatible
This commit is contained in:
commit
e48521b1ed
|
@ -1,10 +1,10 @@
|
|||
#!/usr/bin/python
|
||||
#!/usr/bin/env python
|
||||
|
||||
import pygtk
|
||||
|
||||
pygtk.require('2.0')
|
||||
import gtk
|
||||
|
||||
import requests
|
||||
import webbrowser
|
||||
import json
|
||||
import argparse
|
||||
|
@ -21,14 +21,17 @@ from appindicator_replacement import get_icon_filename
|
|||
##This is to get --version to work
|
||||
try:
|
||||
import pkg_resources
|
||||
|
||||
__version = pkg_resources.require("hackertray")[0].version
|
||||
except ImportError, e:
|
||||
except ImportError:
|
||||
__version = "Can't read version number."
|
||||
|
||||
from hackernews import HackerNews
|
||||
|
||||
|
||||
class HackerNewsApp:
|
||||
HN_URL_PREFIX = "https://news.ycombinator.com/item?id="
|
||||
|
||||
def __init__(self):
|
||||
#Load the database
|
||||
home = expanduser("~")
|
||||
|
@ -37,7 +40,7 @@ class HackerNewsApp:
|
|||
content = content_file.read()
|
||||
try:
|
||||
self.db = set(json.loads(content))
|
||||
except:
|
||||
except ValueError:
|
||||
self.db = set()
|
||||
|
||||
# create an indicator applet
|
||||
|
@ -68,7 +71,8 @@ class HackerNewsApp:
|
|||
|
||||
btnRefresh = gtk.MenuItem("Refresh")
|
||||
btnRefresh.show()
|
||||
btnRefresh.connect("activate", self.refresh, True) #the last parameter is for not running the timer
|
||||
#the last parameter is for not running the timer
|
||||
btnRefresh.connect("activate", self.refresh, True)
|
||||
self.menu.append(btnRefresh)
|
||||
|
||||
btnQuit = gtk.MenuItem("Quit")
|
||||
|
@ -81,22 +85,24 @@ class HackerNewsApp:
|
|||
self.ind.set_menu(self.menu)
|
||||
self.refresh()
|
||||
|
||||
'''Whether comments page is opened or not'''
|
||||
def toggleComments(self, widget):
|
||||
"""Whether comments page is opened or not"""
|
||||
self.commentState = not self.commentState
|
||||
|
||||
'''Handle the about btn'''
|
||||
def showAbout(self, widget):
|
||||
"""Handle the about btn"""
|
||||
webbrowser.open("https://github.com/captn3m0/hackertray/")
|
||||
|
||||
''' Handler for the quit button'''
|
||||
#ToDo: Handle keyboard interrupt properly
|
||||
def quit(self, widget, data=None):
|
||||
""" Handler for the quit button"""
|
||||
l = list(self.db)
|
||||
home = expanduser("~")
|
||||
|
||||
#truncate the file
|
||||
with open(home + '/.hackertray.json', 'w+') as file:
|
||||
file.write(json.dumps(l))
|
||||
|
||||
gtk.main_quit()
|
||||
|
||||
def run(self):
|
||||
|
@ -104,24 +110,30 @@ class HackerNewsApp:
|
|||
gtk.main()
|
||||
return 0
|
||||
|
||||
'''Opens the link in the web browser'''
|
||||
def open(self, widget, event=None, data=None):
|
||||
"""Opens the link in the web browser"""
|
||||
#We disconnect and reconnect the event in case we have
|
||||
#to set it to active and we don't want the signal to be processed
|
||||
if(widget.get_active() == False):
|
||||
if not widget.get_active():
|
||||
widget.disconnect(widget.signal_id)
|
||||
widget.set_active(True)
|
||||
widget.signal_id = widget.connect('activate', self.open)
|
||||
|
||||
self.db.add(widget.item_id)
|
||||
webbrowser.open(widget.url)
|
||||
if(self.commentState):
|
||||
|
||||
if self.commentState:
|
||||
webbrowser.open(self.HN_URL_PREFIX + widget.hn_id)
|
||||
|
||||
'''Adds an item to the menu'''
|
||||
def addItem(self, item):
|
||||
if(item['points'] == 0 or item['points'] == None): #This is in the case of YC Job Postings, which we skip
|
||||
"""Adds an item to the menu"""
|
||||
#This is in the case of YC Job Postings, which we skip
|
||||
if item['points'] == 0 or item['points'] is None:
|
||||
return
|
||||
i = gtk.CheckMenuItem("("+str(item['points']).zfill(3)+"/"+str(item['comments_count']).zfill(3)+") "+item['title'])
|
||||
|
||||
i = gtk.CheckMenuItem(
|
||||
"(" + str(item['points']).zfill(3) + "/" + str(item['comments_count']).zfill(3) + ") " + item['title'])
|
||||
|
||||
i.set_active(item['id'] in self.db)
|
||||
i.url = item['url']
|
||||
i.signal_id = i.connect('activate', self.open)
|
||||
|
@ -130,20 +142,24 @@ class HackerNewsApp:
|
|||
self.menu.prepend(i)
|
||||
i.show()
|
||||
|
||||
'''Refreshes the menu '''
|
||||
def refresh(self, widget=None, no_timer=False):
|
||||
data = reversed(HackerNews.getHomePage()[0:20]);
|
||||
"""Refreshes the menu """
|
||||
data = reversed(HackerNews.getHomePage()[0:20])
|
||||
|
||||
#Remove all the current stories
|
||||
for i in self.menu.get_children():
|
||||
if(hasattr(i,'url')):
|
||||
if hasattr(i, 'url'):
|
||||
self.menu.remove(i)
|
||||
|
||||
#Add back all the refreshed news
|
||||
for i in data:
|
||||
self.addItem(i)
|
||||
|
||||
#Call every 5 minutes
|
||||
if no_timer==False:
|
||||
if not no_timer:
|
||||
gtk.timeout_add(10 * 60 * 1000, self.refresh)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Hacker News in your System Tray')
|
||||
parser.add_argument('--version', action='version', version=__version)
|
||||
|
|
|
@ -14,7 +14,6 @@ import gobject
|
|||
|
||||
# We also need os and sys
|
||||
import os
|
||||
import sys
|
||||
|
||||
from pkg_resources import resource_filename
|
||||
|
||||
|
@ -27,18 +26,16 @@ STATUS_ATTENTION = 1
|
|||
|
||||
# Locations to search for the given icon
|
||||
|
||||
def get_icon_filename(icon_name):
|
||||
|
||||
def get_icon_filename(icon_name):
|
||||
# Determine where the icon is
|
||||
return os.path.abspath(resource_filename('hackertray.data', 'hacker-tray.png'))
|
||||
|
||||
|
||||
# The main class
|
||||
class Indicator:
|
||||
|
||||
# Constructor
|
||||
|
||||
def __init__(self, unknown, icon, category):
|
||||
|
||||
# Store the settings
|
||||
self.inactive_icon = get_icon_filename(icon)
|
||||
self.active_icon = "" # Blank until the user calls set_attention_icon
|
||||
|
@ -53,7 +50,6 @@ class Indicator:
|
|||
self.menu = None # We have no menu yet
|
||||
|
||||
def set_menu(self, menu):
|
||||
|
||||
# Save a copy of the menu
|
||||
self.menu = menu
|
||||
|
||||
|
@ -63,7 +59,6 @@ class Indicator:
|
|||
self.icon.connect("activate", self.show_menu)
|
||||
|
||||
def set_status(self, status):
|
||||
|
||||
# Status defines whether the active or inactive
|
||||
# icon should be displayed.
|
||||
if status == STATUS_ACTIVE:
|
||||
|
@ -76,17 +71,14 @@ class Indicator:
|
|||
return
|
||||
|
||||
def set_icon(self, icon):
|
||||
|
||||
# Set the new icon
|
||||
self.icon.set_from_file(get_icon_filename(icon))
|
||||
|
||||
def set_attention_icon(self, icon):
|
||||
|
||||
# Set the icon filename as the attention icon
|
||||
self.active_icon = get_icon_filename(icon)
|
||||
|
||||
def show_menu(self, widget):
|
||||
|
||||
# Show the menu
|
||||
self.menu.popup(None, None, None, 0, 0)
|
||||
|
||||
|
@ -102,7 +94,6 @@ class Indicator:
|
|||
self.timer = gobject.timeout_add(100, self.check_mouse)
|
||||
|
||||
def check_mouse(self):
|
||||
|
||||
if not self.menu.get_window().is_visible():
|
||||
return
|
||||
|
||||
|
@ -117,5 +108,4 @@ class Indicator:
|
|||
return True
|
||||
|
||||
def hide_menu(self):
|
||||
|
||||
self.menu.popdown()
|
||||
|
|
|
@ -3,7 +3,8 @@ import requests
|
|||
|
||||
urls = [
|
||||
'https://node-hnapi.herokuapp.com/'
|
||||
];
|
||||
]
|
||||
|
||||
|
||||
class HackerNews:
|
||||
@staticmethod
|
||||
|
@ -14,4 +15,4 @@ class HackerNews:
|
|||
try:
|
||||
return r.json()
|
||||
except ValueError:
|
||||
continue;
|
||||
continue
|
|
@ -1,10 +1,12 @@
|
|||
import unittest
|
||||
from hackernews import HackerNews
|
||||
|
||||
|
||||
class HNTest(unittest.TestCase):
|
||||
def runTest(self):
|
||||
data = HackerNews.getHomePage()
|
||||
self.assertTrue(len(data) > 0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
Loading…
Reference in New Issue