Skip to content

Commit

Permalink
Added necessary file for packaging and script to start ui and daemon
Browse files Browse the repository at this point in the history
  • Loading branch information
Benoit HERVIER (Khertan) committed Apr 4, 2011
1 parent 4830021 commit afd38e5
Show file tree
Hide file tree
Showing 86 changed files with 7,903 additions and 4 deletions.
File renamed without changes.
File renamed without changes.
Expand Up @@ -608,7 +608,7 @@ def retrieve(self, options=None):

if __name__ == "__main__":
install_excepthook(__version__)
daemon = KhweeteurDaemon('/tmp/khweeteur.pid')
daemon = KhweeteurDaemon('/var/run/khweeteurd/khweeteurd.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
Expand Down
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -48,6 +48,7 @@ def __init__(self,parent):
@dbus.service.signal(dbus_interface='net.khertan.Khweeteur')
def require_update(self,optional=None):
self.parent.setAttribute(Qt.WA_Maemo5ShowProgressIndicator , True)
print 'DEBUG : require_update'

@dbus.service.signal(dbus_interface='net.khertan.Khweeteur',
signature='uussssss')
Expand All @@ -61,6 +62,7 @@ def post_tweet(self, \
action = '',
tweet_id = '0',
):
print 'DEBUG : post_tweet'
pass

class KhweeteurAbout(QMainWindow):
Expand Down Expand Up @@ -380,11 +382,12 @@ def listen_dbus(self):
dbus.set_default_main_loop(self.dbus_loop)
self.bus = dbus.SessionBus()
#Connect the new tweet signal
self.bus.add_signal_receiver(self.new_tweets, path='/net/khertan/Khweeteur', dbus_interface='net.khertan.Khweeteur', signal_name='new_tweets')
self.bus.add_signal_receiver(self.stop_spinning, path='/net/khertan/Khweeteur', dbus_interface='net.khertan.Khweeteur', signal_name='refresh_ended')
self.bus.add_signal_receiver(self.new_tweets, path='/net/khertan/Khweeteur', dbus_interface='net.khertan.Khweeteur', signal_name='new_tweets')
self.bus.add_signal_receiver(self.stop_spinning, path='/net/khertan/Khweeteur', dbus_interface='net.khertan.Khweeteur', signal_name='refresh_ended')
self.dbus_handler = KhweeteurDBusHandler(self)

def stop_spinning(self):
print 'DEBUG : stop_spinning'
self.setAttribute(Qt.WA_Maemo5ShowProgressIndicator , False)

def new_tweets(self,count,msg):
Expand All @@ -404,12 +407,16 @@ def new_tweets(self,count,msg):
QApplication.processEvents()

if self.model.call == msg:
print 'DEBUG : new_tweets model.load'
self.model.load(msg)
print 'DEBUG : new_tweet end model.load'

print 'DEBUG : end new_tweet'

@pyqtSlot()
def show_search(self):
terms = self.sender().text()
print 'show_search %s' % (terms,)
self.tb_search_button.setCounter(0)
self.home_button.setChecked(False)
self.msg_button.setChecked(False)
self.tb_search_button.setChecked(True)
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
7 changes: 7 additions & 0 deletions build/scripts-2.5/khweeteur
@@ -0,0 +1,7 @@
#!/bin/sh
if [ $# = 1 ]
then
exec python /usr/lib/python2.5/site-packages/khweeteur/daemon.py
else
exec python /usr/lib/python2.5/site-packages/khweeteur/__init__.py
fi
Binary file added icons/hicolor/128x128/apps/khweeteur.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added icons/hicolor/32x32/apps/khweeteur.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
Binary file removed khweeteur-experimental/daemon.pyo
Binary file not shown.
Binary file removed khweeteur-experimental/retriever.pyo
Binary file not shown.
Binary file removed khweeteur-experimental/tweetslist.pyo
Binary file not shown.
Binary file removed khweeteur-experimental/twitter.pyo
Binary file not shown.
7 changes: 7 additions & 0 deletions khweeteur.desktop
@@ -0,0 +1,7 @@
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Name=Khweeteur
Exec=/usr/bin/khweeteur_launch.py
Icon=khweeteur
Binary file added khweeteur.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions khweeteur.service
@@ -0,0 +1,3 @@
[D-BUS Service]
Name=net.khertan.khweeteur
Exec=/usr/bin/khweeteur_launch.py
16 changes: 16 additions & 0 deletions khweeteur/__init__.py
@@ -0,0 +1,16 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2010 Benoît HERVIER
# Licenced under GPLv3

'''A Twitter client made with Python and Qt'''

from qwidget_gui import Khweeteur
import os.path

if __name__ == '__main__':
from subprocess import Popen
Popen(['/usr/bin/python',os.path.join(os.path.dirname(__file__),'daemon.py'),'start'])
app = Khweeteur()
app.exec_()
213 changes: 213 additions & 0 deletions khweeteur/bitly.py
@@ -0,0 +1,213 @@
#!/usr/bin/python2.4
#
# Copyright 2009 Empeeric LTD. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import simplejson
import urllib,urllib2
import urlparse
import string

BITLY_BASE_URL = "http://api.bit.ly/"
BITLY_API_VERSION = "2.0.1"

VERBS_PARAM = {
'shorten':'longUrl',
'expand':'shortUrl',
'info':'shortUrl',
'stats':'shortUrl',
'errors':'',
}

class BitlyError(Exception):
'''Base class for bitly errors'''

@property
def message(self):
'''Returns the first argument used to construct this error.'''
return self.args[0]

class Api(object):
""" API class for bit.ly """
def __init__(self, login, apikey):
self.login = login
self.apikey = apikey
self._urllib = urllib2

def shorten(self,longURL):
"""
Takes either:
A long URL string and returns shortened URL string
Or a list of long URL strings and returns a list of shortened URL strings.
"""
if not isinstance(longURL, list):
longURL = [longURL]

for index,url in enumerate(longURL):
if not '://' in url:
longURL[index] = "http://" + url

request = self._getURL("shorten",longURL)
result = self._fetchUrl(request)
json = simplejson.loads(result)
self._CheckForError(json)

res = []
for item in json['results'].values():
if item['shortKeywordUrl'] == "":
res.append(item['shortUrl'])
else:
res.append(item['shortKeywordUrl'])

if len(res) == 1:
return res[0]
else:
return res

def expand(self,shortURL):
""" Given a bit.ly url or hash, return long source url """
request = self._getURL("expand",shortURL)
result = self._fetchUrl(request)
json = simplejson.loads(result)
self._CheckForError(json)
return json['results'][string.split(shortURL, '/')[-1]]['longUrl']

def info(self,shortURL):
"""
Given a bit.ly url or hash,
return information about that page,
such as the long source url
"""
request = self._getURL("info",shortURL)
result = self._fetchUrl(request)
json = simplejson.loads(result)
self._CheckForError(json)
return json['results'][string.split(shortURL, '/')[-1]]

def stats(self,shortURL):
""" Given a bit.ly url or hash, return traffic and referrer data. """
request = self._getURL("stats",shortURL)
result = self._fetchUrl(request)
json = simplejson.loads(result)
self._CheckForError(json)
return Stats.NewFromJsonDict(json['results'])

def errors(self):
""" Get a list of bit.ly API error codes. """
request = self._getURL("errors","")
result = self._fetchUrl(request)
json = simplejson.loads(result)
self._CheckForError(json)
return json['results']

def setUrllib(self, urllib):
'''Override the default urllib implementation.
Args:
urllib: an instance that supports the same API as the urllib2 module
'''
self._urllib = urllib

def _getURL(self,verb,paramVal):
if not isinstance(paramVal, list):
paramVal = [paramVal]

params = [
('version',BITLY_API_VERSION),
('format','json'),
('login',self.login),
('apiKey',self.apikey),
]

verbParam = VERBS_PARAM[verb]
if verbParam:
for val in paramVal:
params.append(( verbParam,val ))

encoded_params = urllib.urlencode(params)
return "%s%s?%s" % (BITLY_BASE_URL,verb,encoded_params)

def _fetchUrl(self,url):
'''Fetch a URL
Args:
url: The URL to retrieve
Returns:
A string containing the body of the response.
'''

# Open and return the URL
url_data = self._urllib.urlopen(url).read()
return url_data

def _CheckForError(self, data):
"""Raises a BitlyError if bitly returns an error message.
Args:
data: A python dict created from the bitly json response
Raises:
BitlyError wrapping the bitly error message if one exists.
"""
# bitly errors are relatively unlikely, so it is faster
# to check first, rather than try and catch the exception
if 'ERROR' in data or data['statusCode'] == 'ERROR':
raise BitlyError, data['errorMessage']
for key in data['results']:
if type(data['results']) is dict and type(data['results'][key]) is dict:
if 'statusCode' in data['results'][key] and data['results'][key]['statusCode'] == 'ERROR':
raise BitlyError, data['results'][key]['errorMessage']

class Stats(object):
'''A class representing the Statistics returned by the bitly api.
The Stats structure exposes the following properties:
status.user_clicks # read only
status.clicks # read only
'''

def __init__(self,user_clicks=None,total_clicks=None):
self.user_clicks = user_clicks
self.total_clicks = total_clicks

@staticmethod
def NewFromJsonDict(data):
'''Create a new instance based on a JSON dict.
Args:
data: A JSON dict, as converted from the JSON in the bitly API
Returns:
A bitly.Stats instance
'''
return Stats(user_clicks=data.get('userClicks', None),
total_clicks=data.get('clicks', None))


if __name__ == '__main__':
testURL1="www.yahoo.com"
testURL2="www.cnn.com"
a=Api(login="pythonbitly",apikey="R_06871db6b7fd31a4242709acaf1b6648")
short=a.shorten(testURL1)
print "Short URL = %s" % short
urlList=[testURL1,testURL2]
shortList=a.shorten(urlList)
print "Short URL list = %s" % shortList
long=a.expand(short)
print "Expanded URL = %s" % long
info=a.info(short)
print "Info: %s" % info
stats=a.stats(short)
print "User clicks %s, total clicks: %s" % (stats.user_clicks,stats.total_clicks)
errors=a.errors()
print "Errors: %s" % errors

0 comments on commit afd38e5

Please sign in to comment.