Permalink
Browse files

Added necessary file for packaging and script to start ui and daemon

  • Loading branch information...
Benoit HERVIER (Khertan)
Benoit HERVIER (Khertan) committed Apr 4, 2011
1 parent 4830021 commit afd38e571a99818c26216b810a6a3a241ac48344
Showing with 7,903 additions and 4 deletions.
  1. 0 {khweeteur-experimental → build/lib/khweeteur}/__init__.py
  2. 0 {khweeteur-experimental → build/lib/khweeteur}/bitly.py
  3. +1 −1 {khweeteur-experimental → build/lib/khweeteur}/daemon.py
  4. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/favorite.png
  5. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/general_chat_button.png
  6. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/general_presence_home.png
  7. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/geoloc.png
  8. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/khweeteur.png
  9. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/reply.png
  10. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/retweet.png
  11. BIN {khweeteur-experimental → build/lib/khweeteur}/icons/tasklaunch_sms_chat.png
  12. 0 {khweeteur-experimental → build/lib/khweeteur}/list_model.py
  13. 0 {khweeteur-experimental → build/lib/khweeteur}/list_view.py
  14. 0 {khweeteur-experimental → build/lib/khweeteur}/notifications.py
  15. 0 {khweeteur-experimental → build/lib/khweeteur}/qbadgebutton.py
  16. 0 {khweeteur-experimental → build/lib/khweeteur}/qml_gui.py
  17. +10 −3 {khweeteur-experimental → build/lib/khweeteur}/qwidget_gui.py
  18. 0 {khweeteur-experimental → build/lib/khweeteur}/retriever.py
  19. 0 {khweeteur-experimental → build/lib/khweeteur}/settings.py
  20. 0 {khweeteur-experimental → build/lib/khweeteur}/tweetslist.py
  21. 0 {khweeteur-experimental → build/lib/khweeteur}/twitpic.py
  22. 0 {khweeteur-experimental → build/lib/khweeteur}/twitter.py
  23. +7 −0 build/scripts-2.5/khweeteur
  24. BIN icons/hicolor/128x128/apps/khweeteur.png
  25. BIN icons/hicolor/32x32/apps/khweeteur.png
  26. BIN {khweeteur-experimental/qml → icons/hicolor/64x64/apps}/khweeteur.png
  27. BIN khweeteur-experimental/daemon.pyo
  28. BIN khweeteur-experimental/retriever.pyo
  29. BIN khweeteur-experimental/tweetslist.pyo
  30. BIN khweeteur-experimental/twitter.pyo
  31. +7 −0 khweeteur.desktop
  32. BIN khweeteur.png
  33. +3 −0 khweeteur.service
  34. +16 −0 khweeteur/__init__.py
  35. +213 −0 khweeteur/bitly.py
  36. +625 −0 khweeteur/daemon.py
  37. BIN khweeteur/icons/favorite.png
  38. BIN khweeteur/icons/general_chat_button.png
  39. BIN khweeteur/icons/general_presence_home.png
  40. BIN khweeteur/icons/geoloc.png
  41. BIN khweeteur/icons/khweeteur.png
  42. BIN khweeteur/icons/reply.png
  43. BIN khweeteur/icons/retweet.png
  44. BIN khweeteur/icons/tasklaunch_sms_chat.png
  45. +227 −0 khweeteur/list_model.py
  46. +649 −0 khweeteur/list_view.py
  47. +84 −0 khweeteur/notifications.py
  48. 0 {khweeteur-experimental → khweeteur}/old/__init__.py
  49. 0 {khweeteur-experimental → khweeteur}/old/client.py
  50. 0 {khweeteur-experimental → khweeteur}/old/client2.py
  51. 0 {khweeteur-experimental → khweeteur}/old/daemon.py
  52. 0 {khweeteur-experimental → khweeteur}/old/oauth2/__init__.py
  53. BIN {khweeteur-experimental → khweeteur}/old/oauth2/__init__.pyc
  54. BIN {khweeteur-experimental → khweeteur}/old/oauth2/__init__.pyo
  55. 0 {khweeteur-experimental → khweeteur}/old/oauth2/clients/__init__.py
  56. BIN {khweeteur-experimental → khweeteur}/old/oauth2/clients/__init__.pyc
  57. 0 {khweeteur-experimental → khweeteur}/old/oauth2/clients/imap.py
  58. BIN {khweeteur-experimental → khweeteur}/old/oauth2/clients/imap.pyc
  59. 0 {khweeteur-experimental → khweeteur}/old/oauth2/clients/smtp.py
  60. BIN {khweeteur-experimental → khweeteur}/old/oauth2/clients/smtp.pyc
  61. 0 {khweeteur-experimental → khweeteur}/old/objects.py
  62. 0 {khweeteur-experimental → khweeteur}/old/tweetslist.py
  63. BIN {khweeteur-experimental → khweeteur}/old/tweetslist.pyo
  64. 0 {khweeteur-experimental → khweeteur}/old/tweetslist.qml
  65. 0 {khweeteur-experimental → khweeteur}/old/twitter.py
  66. BIN {khweeteur-experimental → khweeteur}/old/twitter.pyo
  67. +145 −0 khweeteur/qbadgebutton.py
  68. BIN {khweeteur-experimental → khweeteur}/qml/add.png
  69. BIN {khweeteur-experimental → khweeteur}/qml/default.png
  70. BIN {khweeteur-experimental → khweeteur}/qml/fullsize.png
  71. BIN {khweeteur-experimental → khweeteur}/qml/house.png
  72. BIN khweeteur/qml/khweeteur.png
  73. BIN {khweeteur-experimental → khweeteur}/qml/refresh.png
  74. 0 {khweeteur-experimental → khweeteur}/qml/tweetslist.qml
  75. +106 −0 khweeteur/qml_gui.py
  76. +773 −0 khweeteur/qwidget_gui.py
  77. +216 −0 khweeteur/retriever.py
  78. +448 −0 khweeteur/settings.py
  79. +205 −0 khweeteur/tweetslist.py
  80. +451 −0 khweeteur/twitpic.py
  81. +3,597 −0 khweeteur/twitter.py
  82. BIN khweeteur_32.png
  83. BIN khweeteur_64.png
  84. +15 −0 khweeteurd
  85. +7 −0 scripts/khweeteur
  86. +98 −0 setup.py
File renamed without changes.
@@ -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()
File renamed without changes.
@@ -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')
@@ -61,6 +62,7 @@ def post_tweet(self, \
action = '',
tweet_id = '0',
):
+ print 'DEBUG : post_tweet'
pass
class KhweeteurAbout(QMainWindow):
@@ -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):
@@ -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)
File renamed without changes.
File renamed without changes.
@@ -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 not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View
@@ -0,0 +1,7 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Name=Khweeteur
+Exec=/usr/bin/khweeteur_launch.py
+Icon=khweeteur
View
Binary file not shown.
View
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=net.khertan.khweeteur
+Exec=/usr/bin/khweeteur_launch.py
View
@@ -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_()
View
@@ -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
Oops, something went wrong.

0 comments on commit afd38e5

Please sign in to comment.