Cleaner fix for #1874, code clean up and reusability.

Translations are now setup on `deluge.common`. Where they used to be setup, a call to `setup_translations(setup_pygtk=False)` is now made.
Every call to `pkg_resources.resource_filename()` is now made through `deluge.common.resource_filename` to make sure that we're loading data from the right deluge install.
This commit is contained in:
Pedro Algarvio 2011-06-04 18:06:45 +01:00
parent 9e9261e6f8
commit df3214168c
23 changed files with 100 additions and 171 deletions

View file

@ -207,7 +207,7 @@ def get_pixmap(fname):
"""
return resource_filename("deluge", os.path.join("ui", "data", "pixmaps", fname))
def resource_filename(package, path):
def resource_filename(module, path):
# While developing, if there's a second deluge package, installed globally
# and another in develop mode somewhere else, while pkg_resources.require("Deluge")
# returns the proper deluge instance, pkg_resources.resource_filename does
@ -215,8 +215,7 @@ def resource_filename(package, path):
# enough.
# This is a work-around that.
return pkg_resources.require("Deluge>=%s" % get_version())[0].get_resource_filename(
pkg_resources.resource_filename.im_self,
os.path.join(package, path)
pkg_resources._manager, os.path.join(*(module.split('.')+[path]))
)
def open_file(path):
@ -682,17 +681,22 @@ def create_localclient_account(append=False):
# Initialize gettext
try:
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", resource_filename("deluge", "i18n"))
except Exception, e:
raise
log.error("Unable to initialize gettext/locale!")
log.exception(e)
import __builtin__
__builtin__.__dict__["_"] = lambda x: x
def setup_translations(setup_pygtk=False):
try:
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", resource_filename("deluge", "i18n"))
if setup_pygtk:
import gtk
import gtk.glade
gtk.glade.bindtextdomain("deluge", resource_filename("deluge", "i18n"))
gtk.glade.textdomain("deluge")
except Exception, e:
log.error("Unable to initialize gettext/locale!")
log.exception(e)
import __builtin__
__builtin__.__dict__["_"] = lambda x: x

View file

@ -33,10 +33,7 @@
#
import os
import gettext
import locale
import logging
import pkg_resources
from twisted.internet import reactor
import twisted.internet.error
@ -101,19 +98,7 @@ class Daemon(object):
)
# Initialize gettext
try:
locale.setlocale(locale.LC_ALL, '')
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n"))
except Exception, e:
log.error("Unable to initialize gettext/locale: %s", e)
import __builtin__
__builtin__.__dict__["_"] = lambda x: x
deluge.common.setup_translations()
# Twisted catches signals to terminate, so just have it call the shutdown
# method.

View file

@ -37,7 +37,6 @@
import os
import logging
import threading
import pkg_resources
from twisted.internet.task import LoopingCall
from deluge._libtorrent import lt
@ -450,10 +449,8 @@ class PreferencesManager(component.Component):
geoip_db = ""
if os.path.exists(value):
geoip_db = value
elif os.path.exists(
pkg_resources.resource_filename("deluge",
os.path.join("data", "GeoIP.dat"))):
geoip_db = pkg_resources.resource_filename(
elif os.path.exists(deluge.common.resource_filename("deluge", os.path.join("data", "GeoIP.dat"))):
geoip_db = deluge.common.resource_filename(
"deluge", os.path.join("data", "GeoIP.dat")
)
else:

View file

@ -89,6 +89,7 @@ def start_ui():
# Setup the logger
deluge.log.setupLogger(level=options.loglevel, filename=options.logfile,
filemode=logfile_mode)
deluge.common.setup_translations()
if options.config:
if not os.path.exists(options.config):
@ -184,6 +185,7 @@ this should be an IP address", metavar="IFACE",
# Setup the logger
deluge.log.setupLogger(level=options.loglevel, filename=options.logfile,
filemode=logfile_mode)
deluge.common.setup_translations()
import deluge.configmanager
if options.config:

View file

@ -4,6 +4,7 @@ import time
import tempfile
from subprocess import Popen, PIPE
import deluge.common
import deluge.configmanager
import deluge.log
@ -22,17 +23,7 @@ import locale
import pkg_resources
# Initialize gettext
try:
locale.setlocale(locale.LC_ALL, '')
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n"))
except Exception, e:
print e
deluge.common.setup_translations()
def start_core():
CWD = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))

View file

@ -37,7 +37,6 @@
import pygtk
pygtk.require('2.0')
import gtk
import pkg_resources
from deluge.ui.client import client
import deluge.common
@ -286,10 +285,10 @@ class AboutDialog:
if not client.is_classicmode():
self.about.set_comments(
self.about.get_comments() + "Server Version: %coreversion%\n")
self.about.set_comments(
self.about.get_comments() + "Libtorrent Version: %ltversion%\n")
def on_lt_version(result):
c = self.about.get_comments()
c = c.replace("%ltversion%", result)

View file

@ -45,8 +45,6 @@ import logging
import os
from urlparse import urljoin
import pkg_resources
import twisted.web.client
import twisted.web.error
from deluge.ui.client import client
@ -64,9 +62,9 @@ log = logging.getLogger(__name__)
class AddTorrentDialog(component.Component):
def __init__(self):
component.Component.__init__(self, "AddTorrentDialog")
self.glade = gtk.glade.XML(
pkg_resources.resource_filename(
"deluge.ui.gtkui", "glade/add_torrent_dialog.glade"))
self.glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "add_torrent_dialog.glade"))
)
self.dialog = self.glade.get_widget("dialog_add_torrent")

View file

@ -42,7 +42,6 @@ pygtk.require('2.0')
import gtk
import gtk.glade
import logging
import pkg_resources
from deluge.ui.client import client
import deluge.component as component
@ -152,9 +151,9 @@ def show_other_dialog(header, type_str, image_stockid=None, image_filename=None,
if type(default) != int and type(default) != float:
raise TypeError("default value needs to be an int or float")
glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/dgtkpopups.glade"))
glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "dgtkpopups.glade"))
)
dialog = glade.get_widget("other_dialog")
dialog.set_transient_for(component.get("MainWindow").window)
dialog.set_title("")

View file

@ -35,12 +35,12 @@
import os
import gtk
import pkg_resources
import time
import hashlib
import logging
from twisted.internet import reactor
import deluge.common
import deluge.component as component
import common
import deluge.configmanager
@ -136,9 +136,9 @@ class ConnectionManager(component.Component):
"""
self.config = self.__load_config()
# Get the glade file for the connection manager
self.glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/connection_manager.glade"))
self.glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "connection_manager.glade"))
)
self.window = component.get("MainWindow")
# Setup the ConnectionManager dialog

View file

@ -36,7 +36,6 @@
import gtk
import sys
import pkg_resources
import os.path
import gobject
import base64
@ -55,9 +54,9 @@ log = logging.getLogger(__name__)
class CreateTorrentDialog:
def show(self):
self.glade = gtk.glade.XML(
pkg_resources.resource_filename(
deluge.common.resource_filename(
"deluge.ui.gtkui",
"glade/create_torrent_dialog.glade"))
os.path.join("glade", "create_torrent_dialog.glade")))
self.config = ConfigManager("gtkui.conf")
@ -396,9 +395,9 @@ class CreateTorrentDialog:
def _on_button_add_clicked(self, widget):
log.debug("_on_button_add_clicked")
glade = gtk.glade.XML(
pkg_resources.resource_filename(
deluge.common.resource_filename(
"deluge.ui.gtkui",
"glade/edit_trackers.glade"))
os.path.join("glade", "edit_trackers.glade")))
dialog = glade.get_widget("add_tracker_dialog")
dialog.set_transient_for(self.dialog)
textview = glade.get_widget("textview_trackers")

View file

@ -33,11 +33,10 @@
#
#
import os.path
import gtk
import gtk.glade
import logging
import pkg_resources
from twisted.internet import defer
import deluge.common
@ -50,10 +49,9 @@ log = logging.getLogger(__name__)
class EditTrackersDialog:
def __init__(self, torrent_id, parent=None):
self.torrent_id = torrent_id
self.glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/edit_trackers.glade"))
self.glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "edit_trackers.glade"))
)
self.dialog = self.glade.get_widget("edit_trackers_dialog")
self.treeview = self.glade.get_widget("tracker_treeview")
self.add_tracker_dialog = self.glade.get_widget("add_tracker_dialog")

View file

@ -34,11 +34,10 @@
#
#
import os
import gtk
import gtk.glade
import logging
import pkg_resources
import glib
import warnings
@ -112,8 +111,8 @@ class FilterTreeView(component.Component):
self.sidebar.notebook.connect("hide", self._on_hide)
#menu
glade_menu = gtk.glade.XML(pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/filtertree_menu.glade"))
glade_menu = gtk.glade.XML(deluge.common.resource_filename("deluge.ui.gtkui",
os.path.join("glade", "filtertree_menu.glade")))
self.menu = glade_menu.get_widget("filtertree_menu")
glade_menu.signal_autoconnect({
"select_all": self.on_select_all,

View file

@ -40,34 +40,12 @@ gobject.set_prgname("deluge")
from twisted.internet import gtk2reactor
reactor = gtk2reactor.install()
import gettext
import locale
import pkg_resources
import gtk
import gtk.glade
import sys
import logging
log = logging.getLogger(__name__)
# Initialize gettext
try:
locale.setlocale(locale.LC_ALL, '')
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gtk.glade.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gtk.glade.textdomain("deluge")
except Exception, e:
log.error("Unable to initialize gettext/locale!")
log.exception(e)
import __builtin__
__builtin__.__dict__["_"] = lambda x: x
import deluge.component as component
from deluge.ui.client import client
from mainwindow import MainWindow
@ -105,7 +83,7 @@ class Gtk(_UI):
def start(self):
super(Gtk, self).start()
deluge.common.setup_translations(setup_pygtk=True)
GtkUI(self.args)
def start():

View file

@ -34,12 +34,12 @@
#
import os.path
import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import logging
import pkg_resources
from urlparse import urlparse
import urllib
@ -59,9 +59,9 @@ class MainWindow(component.Component):
component.Component.__init__(self, "MainWindow", interval=2)
self.config = ConfigManager("gtkui.conf")
# Get the glade file for the main window
self.main_glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/main_window.glade"))
self.main_glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "main_window.glade"))
)
self.window = self.main_glade.get_widget("main_window")

View file

@ -34,13 +34,12 @@
#
#
import os.path
import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import logging
import pkg_resources
import deluge.error
import deluge.component as component
@ -60,9 +59,9 @@ class MenuBar(component.Component):
self.config = ConfigManager("gtkui.conf")
# Get the torrent menu from the glade file
self.torrentmenu_glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/torrent_menu.glade"))
self.torrentmenu_glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "torrent_menu.glade"))
)
self.torrentmenu_glade.get_widget("menuitem_queue").set_submenu(
self.torrentmenu_glade.get_widget("queue_torrent_menu"))
@ -355,8 +354,8 @@ class MenuBar(component.Component):
def show_move_storage_dialog(self, status):
log.debug("show_move_storage_dialog")
glade = gtk.glade.XML(pkg_resources.resource_filename(
"deluge.ui.gtkui", "glade/move_storage_dialog.glade"
glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "move_storage_dialog.glade")
))
# Keep it referenced:
# https://bugzilla.gnome.org/show_bug.cgi?id=546802

View file

@ -34,12 +34,12 @@
#
import os
import gtk
import gtk.glade
import logging
import os.path
import cPickle
import pkg_resources
from itertools import izip
from deluge.ui.client import client
@ -271,7 +271,7 @@ class PeersTab(Tab):
# We haven't created a pixbuf for this country yet
try:
self.cached_flag_pixbufs[country] = gtk.gdk.pixbuf_new_from_file(
pkg_resources.resource_filename(
deluge.common.resource_filename(
"deluge",
os.path.join("ui", "data", "pixmaps", "flags", country.lower() + ".png")))
except Exception, e:
@ -378,9 +378,9 @@ class PeersTab(Tab):
def _on_menuitem_add_peer_activate(self, menuitem):
"""This is a callback for manually adding a peer"""
log.debug("on_menuitem_add_peer")
dialog_glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/dgtkpopups.glade"))
dialog_glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "dgtkpopups.glade"))
)
peer_dialog = dialog_glade.get_widget("connect_peer_dialog")
txt_ip = dialog_glade.get_widget("txt_ip")
response = peer_dialog.run()

View file

@ -34,13 +34,12 @@
#
#
import os
import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import logging
import pkg_resources
import deluge.component as component
from deluge.ui.client import client
@ -66,8 +65,8 @@ class Preferences(component.Component):
def __init__(self):
component.Component.__init__(self, "Preferences")
self.window = component.get("MainWindow")
self.glade = gtk.glade.XML(pkg_resources.resource_filename(
"deluge.ui.gtkui", "glade/preferences_dialog.glade"
self.glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "preferences_dialog.glade")
))
self.pref_dialog = self.glade.get_widget("pref_dialog")
self.pref_dialog.set_icon(common.get_deluge_icon())

View file

@ -40,7 +40,6 @@ import gtk
import gtk.glade
import logging
import gobject
import pkg_resources
import deluge.component as component
from deluge.ui.client import client
@ -57,9 +56,9 @@ class QueuedTorrents(component.Component):
self.status_item = None
self.config = ConfigManager("gtkui.conf")
self.glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/queuedtorrents.glade"))
self.glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "queuedtorrents.glade"))
)
self.glade.get_widget("chk_autoadd").set_active(
self.config["autoadd_queued"])
self.dialog = self.glade.get_widget("queued_torrents_dialog")

View file

@ -33,12 +33,13 @@
#
#
import os
import gtk
import gtk.glade
import logging
import pkg_resources
from deluge.ui.client import client
import deluge.common
import deluge.component as component
log = logging.getLogger(__name__)
@ -63,9 +64,9 @@ class RemoveTorrentDialog(object):
self.__torrent_ids = torrent_ids
glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/remove_torrent_dialog.glade"))
glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "remove_torrent_dialog.glade"))
)
self.__dialog = glade.get_widget("remove_torrent_dialog")
self.__dialog.set_transient_for(component.get("MainWindow").window)

View file

@ -38,9 +38,9 @@ try:
except ImportError:
appindicator = None
import os
import gtk
import logging
import pkg_resources
import deluge.component as component
from deluge.ui.client import client
@ -87,9 +87,9 @@ class SystemTray(component.Component):
def enable(self):
"""Enables the system tray icon."""
self.tray_glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/tray_menu.glade"))
self.tray_glade = gtk.glade.XML(deluge.common.resource_filename(
"deluge.ui.gtkui", os.path.join("glade", "tray_menu.glade"))
)
self.tray_glade.signal_autoconnect({
"on_menuitem_show_deluge_activate": \

View file

@ -33,12 +33,12 @@
#
#
import sys
import logging
from optparse import OptionParser, OptionGroup
import deluge.common
import deluge.configmanager
import deluge.log
import os
DEFAULT_PREFS = {
"default_ui": "gtk"
@ -53,8 +53,6 @@ class _UI(object):
def __init__(self, name="gtk"):
self.__name = name
usage="%prog [options] [actions]",
self.__parser = OptionParser(version=deluge.common.get_version())
group = OptionGroup(self.__parser, "Common Options")
@ -102,6 +100,8 @@ class _UI(object):
filename=self.__options.logfile,
filemode=logfile_mode)
deluge.common.setup_translations()
log = logging.getLogger(__name__)
if self.__options.config:

View file

@ -35,16 +35,13 @@
import os
import time
import locale
import shutil
import urllib
import fnmatch
import gettext
import hashlib
import logging
import tempfile
import mimetypes
import pkg_resources
from twisted.application import service, internet
from twisted.internet import reactor, defer, error
@ -62,23 +59,6 @@ from deluge.ui.web.pluginmanager import PluginManager
log = logging.getLogger(__name__)
# Initialize gettext
try:
locale.setlocale(locale.LC_ALL, "")
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n"))
except Exception, e:
log.error("Unable to initialize gettext/locale: %s", e)
_ = gettext.gettext
current_dir = os.path.dirname(__file__)
CONFIG_DEFAULTS = {
# Misc Settings
"enabled_plugins": [],
@ -121,7 +101,7 @@ def rpath(*paths):
"""Convert a relative path into an absolute path relative to the location
of this script.
"""
return os.path.join(current_dir, *paths)
return common.resource_filename(__name__, os.path.join(*paths))
class GetText(resource.Resource):
def render(self, request):
@ -226,8 +206,7 @@ class Flag(resource.Resource):
def render(self, request):
headers = {}
path = ("data", "pixmaps", "flags", request.country.lower() + ".png")
filename = pkg_resources.resource_filename("deluge",
os.path.join(*path))
filename = common.resource_filename("deluge", os.path.join(*path))
if os.path.exists(filename):
request.setHeader("cache-control",
"public, must-revalidate, max-age=86400")

View file

@ -41,6 +41,9 @@ from optparse import OptionGroup
class WebUI(UI):
def __init__(self, args):
# Setup translations
deluge.common.setup_translations()
import server
deluge_web = server.DelugeWeb()
deluge_web.start()
@ -48,11 +51,11 @@ class WebUI(UI):
class Web(_UI):
help = """Starts the Deluge web interface"""
def __init__(self):
super(Web, self).__init__("web")
self.__server = None
group = OptionGroup(self.parser, "Web Options")
group.add_option("-b", "--base", dest="base",
help="Set the base path that the ui is running on (proxying)",
@ -87,14 +90,14 @@ class Web(_UI):
group.add_option("--ssl", dest="ssl", action="store_true",
help="Forces the webserver to use ssl", default=False)
self.parser.add_option_group(group)
@property
def server(self):
return self.__server
def start(self):
super(Web, self).start()
# Steps taken from http://www.faqs.org/faqs/unix-faq/programmer/faq/
# Section 1.7
if self.options.fork:
@ -102,14 +105,14 @@ class Web(_UI):
# or shell invoking the program.
if os.fork():
os._exit(0)
# setsid() to become a process group and session group leader.
os.setsid()
# fork() again so the parent, (the session group leader), can exit.
if os.fork():
os._exit(0)
# chdir() to esnure that our process doesn't keep any directory in
# use that may prevent a filesystem unmount.
import deluge.configmanager
@ -134,10 +137,10 @@ class Web(_UI):
if self.options.base:
self.server.base = self.options.base
if self.options.port:
self.server.port = self.options.port
if self.options.ssl:
self.server.https = self.options.ssl