Merge branch 'UiChanges' of https://github.com/cis-navjot-g/PyBitmessage into UiChanges

This commit is contained in:
Navjot 2019-09-27 13:15:01 +05:30
commit ccc83af75c
No known key found for this signature in database
GPG Key ID: 9EE70AFD71357F1C
16 changed files with 196 additions and 129 deletions

View File

@ -1,24 +1,28 @@
from os import environ
from os.path import exists, join
"""
src/bitmessagekivy/android/python-for-android/recipes/kivymd/__init__.py
=================================
"""
# pylint: disable=import-error
from os.path import join
import sh
from pythonforandroid.logger import shprint, info_main, info
from pythonforandroid.recipe import PythonRecipe
# from pythonforandroid.util import ensure_dir
class KivyMDRecipe(PythonRecipe):
# This recipe installs KivyMD into the android dist from source
"""This recipe installs KivyMD into the android dist from source"""
version = 'master'
url = 'https://github.com/surbhicis/kivymd/archive/master.zip'
depends = ['kivy']
site_packages_name = 'kivymd'
call_hostpython_via_targetpython = False
def should_build(self, arch):
def should_build(self, arch): # pylint: disable=no-self-use, unused-argument
"""Method helps to build the application"""
return True
def get_recipe_env(self, arch):
"""Method is used for getting all the env paths"""
env = super(KivyMDRecipe, self).get_recipe_env(arch)
env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
@ -30,8 +34,7 @@ class KivyMDRecipe(PythonRecipe):
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL', 'include'),
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_image'),
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_mixer'),
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'),
])
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'), ])
return env

View File

@ -2,11 +2,13 @@
src/identiconGeneration.py
=================================
"""
# pylint: disable=import-error
import hashlib
from io import BytesIO
from PIL import Image
from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image as kiImage
from io import BytesIO
""" Core classes for loading images and converting them to a Texture.
The raw image data can be keep in memory for further access """

View File

@ -1,7 +1,13 @@
from helper_sql import *
"""
src/bitmessagekivy/kivy_helper_search.py
=================================
"""
from helper_sql import sqlQuery
def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, what=None, unreadOnly=False):
"""Method helping for searching mails"""
# pylint: disable=too-many-arguments, too-many-branches
if what is not None and what != "":
what = "%" + what + "%"
else:
@ -27,7 +33,7 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w
else:
sqlStatementParts.append(xAddress + " = ? ")
sqlArguments.append(account)
if folder is not "addressbook":
if folder != "addressbook":
if folder is not None:
if folder == "new":
folder = "inbox"
@ -50,7 +56,7 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w
sqlStatementParts.append(filter_col)
if unreadOnly:
sqlStatementParts.append("read = 0")
if len(sqlStatementParts) > 0:
if sqlStatementParts:
sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts)
if folder == "sent":
sqlStatementBase += " ORDER BY lastactiontime DESC"

View File

@ -72,9 +72,9 @@
on_text:app.getCurrentAccountData(self.text)
Image:
source: app.get_default_image()
x: self.width/4-2
y: self.parent.y + self.parent.height/2 - self.height + 14
size: 28, 28
x: self.width/6
y: self.parent.y + self.parent.height/4
size: self.parent.height/2, self.parent.height/2
ArrowImg:
NavigationDrawerIconButton:
id: inbox_cnt
@ -821,11 +821,13 @@ NavigationLayout:
<GrashofPopup>:
id: popup
size_hint : (None,None)
height: 2*(label.height + address.height) + 10
width :app.window_size[0] - app.window_size[0]/10
title: 'add contact\'s'
background: './images/popup.jpeg'
title_size: sp(20)
title_color: 0.4, 0.3765, 0.3451, 1
size_hint: 1, 1
auto_dismiss: False
separator_color: 0.3529, 0.3922, 0.102, 0.7
BoxLayout:
@ -1050,19 +1052,23 @@ NavigationLayout:
<MyaddDetailPopup>:
id: myadd_popup
size_hint : (None,None)
height: 4.5*(myaddr_label.height+ my_add_btn.children[0].height)
width :app.window_size[0] - app.window_size[0]/10
background: './images/popup.jpeg'
separator_height: 0
auto_dismiss: False
separator_height: 0
BoxLayout:
id: myadd_popup_box
size_hint_y: None
spacing:dp(70)
id: myadd_popup_box
orientation: 'vertical'
BoxLayout:
size_hint_y: None
orientation: 'vertical'
spacing:dp(25)
MDLabel:
id: myaddr_label
font_style: 'Title'
theme_text_color: 'Primary'
text: "Label"
@ -1087,6 +1093,7 @@ NavigationLayout:
font_size: '15sp'
halign: 'left'
BoxLayout:
id: my_add_btn
spacing:5
orientation: 'horizontal'
MDRaisedButton:
@ -1125,6 +1132,9 @@ NavigationLayout:
<AddbookDetailPopup>:
id: addbook_popup
size_hint : (None,None)
height: 4*(add_label.height)
width :app.window_size[0] - app.window_size[0]/10
background: './images/popup.jpeg'
separator_height: 0
auto_dismiss: False
@ -1165,6 +1175,7 @@ NavigationLayout:
font_size: '15sp'
halign: 'left'
BoxLayout:
id: addbook_btn
spacing:5
orientation: 'horizontal'
MDRaisedButton:

View File

@ -2,6 +2,7 @@
src/bitmessagekivy/mpybit.py
=================================
"""
# pylint: disable=relative-import, unused-variable, import-error, no-name-in-module, too-many-lines
import os
import time
from functools import partial
@ -42,7 +43,6 @@ from kivymd.list import (
ILeftBody,
ILeftBodyTouch,
IRightBodyTouch,
ThreeLineAvatarIconListItem,
TwoLineAvatarIconListItem,
TwoLineListItem)
from kivymd.navigationdrawer import (
@ -55,11 +55,8 @@ import queues
from semaphores import kivyuisignaler
import state
from uikivysignaler import UIkivySignaler
# pylint: disable=unused-argument, too-few-public-methods, import-error
import identiconGeneration
import os
from kivy.core.clipboard import Clipboard
# pylint: disable=unused-argument, too-few-public-methods
@ -1036,14 +1033,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
state.association = text
self.root.ids.sc1.clear_widgets()
self.root.ids.sc1.add_widget(Inbox())
# self.root.ids.sc4.clear_widgets()
# self.root.ids.sc5.clear_widgets()
# self.root.ids.sc16.clear_widgets()
# self.root.ids.sc17.clear_widgets()
# self.root.ids.sc4.add_widget(Sent())
# self.root.ids.sc5.add_widget(Trash())
# self.root.ids.sc16.add_widget(Draft())
# self.root.ids.sc17.add_widget(Allmails())
self.root.ids.scr_mngr.current = 'inbox'
msg_counter_objs = \
@ -1091,6 +1080,12 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
if BMConfigParser().addresses():
img = identiconGeneration.generate(BMConfigParser().addresses()[0])
self.createFolder('./images/default_identicon/')
if platform == 'android':
# android_path = os.path.expanduser("~/user/0/org.test.bitapp/files/app/")
android_path = os.path.join(os.environ['ANDROID_PRIVATE'] + '/app/')
img.texture.save('{1}/images/default_identicon/{0}.png'.format(
BMConfigParser().addresses()[0], android_path))
else:
img.texture.save('./images/default_identicon/{}.png'.format(BMConfigParser().addresses()[0]))
return BMConfigParser().addresses()[0]
return 'Select Address'
@ -1125,8 +1120,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
self.root.ids.scr_mngr.current = 'sent'\
if state.detailPageType == 'sent' else 'inbox' \
if state.detailPageType == 'inbox' else 'draft'
# if state.detailPageType in ['sent', 'inbox']:
# self.add_search_bar()
self.back_press()
elif self.root.ids.scr_mngr.current == "create":
composer_objs = self.root
@ -1306,16 +1299,9 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
class GrashofPopup(Popup):
"""Methods for saving contacts, error messages."""
def __init__(self, **kwargs):
def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""Grash of pop screen settings."""
super(GrashofPopup, self).__init__(**kwargs)
print("sssssssssssssssssssiiiiiiiiiiiiiiizzzzzzzzzzeeeeee...............", state.screen_density)
if state.screen_density[0] <= 720:
self.size_hint_y = 0.4
self.size_hint_x = 0.9
else:
self.size_hint_y = 0.42
self.size_hint_x = 0.7
def savecontact(self):
"""Method is used for Saving Contacts."""
@ -1571,15 +1557,9 @@ class MyaddDetailPopup(Popup):
address_label = StringProperty()
address = StringProperty()
def __init__(self, **kwargs):
def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""My Address Details screen setting."""
super(MyaddDetailPopup, self).__init__(**kwargs)
if state.screen_density[0] <= 720:
self.size_hint_y = 0.32
self.size_hint_x = 0.9
else:
self.size_hint_y = 0.32
self.size_hint_x = 0.7
def set_address(self, address, label):
"""Getting address for displaying details on popup."""
@ -1609,15 +1589,9 @@ class AddbookDetailPopup(Popup):
address_label = StringProperty()
address = StringProperty()
def __init__(self, **kwargs):
def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""Method used set screen of address detail page."""
super(AddbookDetailPopup, self).__init__(**kwargs)
if state.screen_density[0] <= 720:
self.size_hint_y = 0.35
self.size_hint_x = 0.95
else:
self.size_hint_y = 0.35
self.size_hint_x = 0.7
def set_addbook_data(self, address, label):
"""Getting address book data for detial dipaly."""
@ -1694,10 +1668,6 @@ class Draft(Screen):
xAddress, account, "draft", where, what, False)
if state.msg_counter_objs:
state.msg_counter_objs.draft_cnt.badge_text = str(len(queryreturn))
# state.all_count = str(int(state.all_count) + 1)
# state.msg_counter_objs.allmail_cnt.badge_text = state.all_count
# state.msg_counter_objs = None
if queryreturn:
src_mng_obj = state.kivyapp.root.children[2].children[0].ids
src_mng_obj.draft_cnt.badge_text = str(len(queryreturn))
@ -1772,13 +1742,7 @@ class Draft(Screen):
if int(state.draft_count) > 0:
msg_count_objs.draft_cnt.badge_text = str(
int(state.draft_count) - 1)
# msg_count_objs.allmail_cnt.badge_text = str(
# int(state.all_count) - 1)
# msg_count_objs.trash_cnt.badge_text = str(
# int(state.trash_count) + 1)
state.draft_count = str(int(state.draft_count) - 1)
# state.all_count = str(int(state.all_count) - 1)
# state.trash_count = str(int(state.trash_count) + 1)
self.ids.ml.remove_widget(instance.parent.parent)
toast('Deleted')
@ -1840,8 +1804,6 @@ class CustomSpinner(Spinner):
def __init__(self, *args, **kwargs):
"""Method used for setting size of spinner."""
super(CustomSpinner, self).__init__(*args, **kwargs)
# max_value = 2.8
# self.dropdown_cls.max_height = self.height / 2 * max_value + max_value * 4
self.dropdown_cls.max_height = Window.size[1] / 3
@ -2026,6 +1988,7 @@ class Archieve(Screen):
pass
class Spam(Screen):
"""Spam Screen show widgets of page."""

View File

@ -17,11 +17,11 @@ resends getpubkey messages in 5 days (then 10 days, then 20 days, etc...)
resends msg messages in 5 days (then 10 days, then 20 days, etc...)
"""
# pylint: disable=relative-import, protected-access
import gc
import os
import shared
import time
import shared
import tr
from bmconfigparser import BMConfigParser
@ -36,11 +36,12 @@ import state
class singleCleaner(StoppableThread):
"""Base method that Cleanup knownnodes and handle possible severe exception"""
name = "singleCleaner"
cycleLength = 300
expireDiscoveredPeers = 300
def run(self):
def run(self): # pylint: disable=too-many-branches
gc.disable()
timeWeLastClearedInventoryAndPubkeysTables = 0
try:
@ -73,7 +74,7 @@ class singleCleaner(StoppableThread):
# If we are running as a daemon then we are going to fill up the UI
# queue which will never be handled by a UI. We should clear it to
# save memory.
# FIXME redundant?
# ..FIXME redundant?
if shared.thisapp.daemon or not state.enableGUI:
queues.UISignalQueue.queue.clear()
if timeWeLastClearedInventoryAndPubkeysTables < \
@ -130,7 +131,8 @@ class singleCleaner(StoppableThread):
' is full. Bitmessage will now exit.'),
True)
))
# FIXME redundant?
# ..FIXME redundant?
# pylint: disable=no-member
if shared.daemon or not state.enableGUI:
os._exit(1)
@ -153,7 +155,7 @@ class singleCleaner(StoppableThread):
del state.discoveredPeers[k]
except KeyError:
pass
# TODO: cleanup pending upload / download
# ..TODO: cleanup pending upload / download
gc.collect()
@ -162,6 +164,7 @@ class singleCleaner(StoppableThread):
def resendPubkeyRequest(address):
"""After a long time, method send getpubkey request"""
logger.debug(
'It has been a long time and we haven\'t heard a response to our'
' getpubkey request. Sending again.'
@ -186,6 +189,7 @@ def resendPubkeyRequest(address):
def resendMsg(ackdata):
"""After a long time, method send acknowledgement msg"""
logger.debug(
'It has been a long time and we haven\'t heard an acknowledgement'
' to our msg. Sending again.'

View File

@ -2,8 +2,8 @@
src/class_singleWorker.py
=========================
"""
# pylint: disable=protected-access,too-many-branches,too-many-statements,no-self-use,too-many-lines,too-many-locals
# pylint: disable=protected-access,too-many-branches,too-many-statements
# pylint: disable=no-self-use,too-many-lines,too-many-locals,relative-import
from __future__ import division
import hashlib
@ -34,6 +34,7 @@ from inventory import Inventory
# This thread, of which there is only one, does the heavy lifting:
# calculating POWs.
def sizeof_fmt(num, suffix='h/s'):
"""Format hashes per seconds nicely (SI prefix)"""
@ -469,7 +470,7 @@ class singleWorker(StoppableThread):
def sendOnionPeerObj(self, peer=None):
"""Send onionpeer object representing peer"""
if not peer: # find own onionhostname
for peer in state.ownAddresses:
for peer in state.ownAddresses: # pylint: disable=redefined-argument-from-local
if peer.host.endswith('.onion'):
break
else:
@ -478,7 +479,7 @@ class singleWorker(StoppableThread):
embeddedTime = int(time.time() + TTL)
streamNumber = 1 # Don't know yet what should be here
objectType = protocol.OBJECT_ONIONPEER
# FIXME: ideally the objectPayload should be signed
# ..FIXME: ideally the objectPayload should be signed
objectPayload = encodeVarint(peer.port) + protocol.encodeHost(peer.host)
tag = calculateInventoryHash(objectPayload)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 475 B

View File

@ -1,3 +1,8 @@
"""
src/messagetypes/__init__.py
============================
"""
# pylint: disable=import-error
from importlib import import_module
from os import path, listdir
from string import lower
@ -9,12 +14,15 @@ from debug import logger
import messagetypes
import paths
class MsgBase(object):
def encode(self):
class MsgBase(object): # pylint: disable=too-few-public-methods
"""Base class for message types"""
def __init__(self):
self.data = {"": lower(type(self).__name__)}
def constructObject(data):
"""Construct an object"""
whitelist = ["message"]
if data[""] not in whitelist:
return None
@ -35,6 +43,7 @@ def constructObject(data):
else:
return returnObj
if paths.frozen is not None or platform == "android":
import messagetypes.message
import messagetypes.vote

View File

@ -1,13 +1,21 @@
"""
src/messagetypes/message.py
=================================
"""
from debug import logger
from messagetypes import MsgBase
# pylint: disable=attribute-defined-outside-init
class Message(MsgBase):
def __init__(self):
"""Base method, helps to decode, encode and process the message"""
def __init__(self): # pylint: disable=super-init-not-called
return
def decode(self, data):
"""Method used for decoding the message"""
# UTF-8 and variable type validator
# pylint: disable=unidiomatic-typecheck
if type(data["subject"]) is str:
self.subject = unicode(data["subject"], 'utf-8', 'replace')
else:
@ -18,6 +26,8 @@ class Message(MsgBase):
self.body = unicode(str(data["body"]), 'utf-8', 'replace')
def encode(self, data):
"""Method used for encoding the message"""
# pylint: disable=no-member
super(Message, self).encode()
try:
self.data["subject"] = data["subject"]
@ -27,5 +37,6 @@ class Message(MsgBase):
return self.data
def process(self):
"""Method used for process the message"""
logger.debug("Subject: %i bytes", len(self.subject))
logger.debug("Body: %i bytes", len(self.body))

View File

@ -1,15 +1,25 @@
"""
src/messagetypes/vote.py
=================================
"""
from debug import logger
from messagetypes import MsgBase
# pylint: disable=attribute-defined-outside-init
class Vote(MsgBase):
def __init__(self):
"""Base method, helps to decode, encode and process the message"""
def __init__(self): # pylint: disable=super-init-not-called
return
def decode(self, data):
"""Method used for decoding the message"""
self.msgid = data["msgid"]
self.vote = data["vote"]
def encode(self, data):
"""Method used for encoding the message"""
# pylint: disable=no-member
super(Vote, self).encode()
try:
self.data["msgid"] = data["msgid"]
@ -19,5 +29,6 @@ class Vote(MsgBase):
return self.data
def process(self):
"""Method used for process the message"""
logger.debug("msgid: %s", self.msgid)
logger.debug("vote: %s", self.vote)

View File

@ -1,3 +1,8 @@
"""
src/paths.py
============
"""
# pylint: disable=import-error
from os import environ, path
import sys
import re
@ -9,7 +14,12 @@ from kivy.utils import platform
# binary distributions vs source distributions.
frozen = getattr(sys, 'frozen', None)
def lookupExeFolder():
"""
Folder with PyBitmessage binary (.exe, .app, ...). If it is run from source, it returns the source root
directory
"""
if frozen:
if frozen == "macosx_app":
# targetdir/Bitmessage.app/Contents/MacOS/Bitmessage
@ -22,10 +32,12 @@ def lookupExeFolder():
exeFolder = ''
return exeFolder
def lookupAppdataFolder():
def lookupAppdataFolder(): # pylint: disable=too-many-branches
"""Folder with runtime data (like configuration, database, ...)"""
# flake8: noqa=F821
import traceback
print(traceback.print_tb)
print traceback.print_tb
APPNAME = "PyBitmessage"
if "BITMESSAGE_HOME" in environ:
dataFolder = environ["BITMESSAGE_HOME"]
@ -35,9 +47,11 @@ def lookupAppdataFolder():
if "HOME" in environ:
dataFolder = path.join(environ["HOME"], "Library/Application Support/", APPNAME) + '/'
else:
stringToLog = 'Could not find home folder, please report this message and your OS X version to the BitMessage Github.'
stringToLog = (
'Could not find home folder, please report this message'
' and your OS X version to the BitMessage Github.')
if 'logger' in globals():
logger.critical(stringToLog)
logger.critical(stringToLog) # pylint: disable=undefined-variable
else:
print stringToLog
sys.exit()
@ -58,7 +72,7 @@ def lookupAppdataFolder():
move(path.join(environ["HOME"], ".%s" % APPNAME), dataFolder)
stringToLog = "Moving data folder to %s" % (dataFolder)
if 'logger' in globals():
logger.info(stringToLog)
logger.info(stringToLog) # pylint: disable=undefined-variable
else:
print stringToLog
except IOError:
@ -67,16 +81,21 @@ def lookupAppdataFolder():
dataFolder = dataFolder + '/'
return dataFolder
def codePath():
"""Return the code path of the running instance"""
# pylint: disable=redefined-outer-name
if frozen == "macosx_app":
codePath = environ.get("RESOURCEPATH")
elif frozen: # windows
codePath = sys._MEIPASS
codePath = sys._MEIPASS # pylint: disable=no-member,protected-access
else:
codePath = path.dirname(__file__)
return codePath
def tail(f, lines=20):
"""Read last lines of a file. Like tail(1)"""
total_lines_wanted = lines
BLOCK_SIZE = 1024
@ -84,10 +103,11 @@ def tail(f, lines=20):
block_end_byte = f.tell()
lines_to_go = total_lines_wanted
block_number = -1
blocks = [] # blocks of size BLOCK_SIZE, in reverse order starting
blocks = []
# blocks of size BLOCK_SIZE, in reverse order starting
# from the end of the file
while lines_to_go > 0 and block_end_byte > 0:
if (block_end_byte - BLOCK_SIZE > 0):
if block_end_byte - BLOCK_SIZE > 0:
# read the last block we haven't yet read
f.seek(block_number * BLOCK_SIZE, 2)
blocks.append(f.read(BLOCK_SIZE))
@ -105,6 +125,7 @@ def tail(f, lines=20):
def lastCommit():
"""Git commitish of the currently checked out repository"""
githeadfile = path.join(codePath(), '..', '.git', 'logs', 'HEAD')
result = {}
if path.isfile(githeadfile):

View File

@ -2,6 +2,7 @@
src/pyelliptic/openssl.py
=================================
"""
# pylint: disable=import-error
import sys
import ctypes
from kivy.utils import platform
@ -646,7 +647,8 @@ class _OpenSSL: # pylint: disable=too-many-instance-attributes, old-style-cl
def loadOpenSSL():
"""Method find and load the OpenSSL library"""
# pylint: disable=global-statement, protected-access, too-many-branches
# pylint: disable=global-statement, protected-access, too-many-branches, no-member
global OpenSSL
from os import path, environ
from ctypes.util import find_library

View File

@ -1,20 +1,21 @@
"""
src/state.py
=================================
"""
import collections
neededPubkeys = {}
streamsInWhichIAmParticipating = []
# For UPnP
extPort = None
# for Tor hidden service
socksIP = None
# Network protocols availability, initialised below
networkProtocolAvailability = None
appdata = '' # holds the location of the application data storage directory
# Set to 1 by the doCleanShutdown function.
# Used to tell the proof of work worker threads to exit.
shutdown = 0
# Component control flags - set on startup, do not change during runtime
# The defaults are for standalone GUI (default operating mode)
enableNetwork = True # enable network threads
@ -23,18 +24,13 @@ enableAPI = True # enable API (if configured)
enableGUI = True # enable GUI (QT or ncurses)
enableSTDIO = False # enable STDIO threads
curses = False
sqlReady = False # set to true by sqlTread when ready for processing
maximumNumberOfHalfOpenConnections = 0
invThread = None
addrThread = None
downloadThread = None
uploadThread = None
ownAddresses = {}
# If the trustedpeer option is specified in keys.dat then this will
# contain a Peer which will be connected to instead of using the
# addresses advertised by other peers. The client will only connect to
@ -46,11 +42,19 @@ ownAddresses = {}
# it will sync with the network a lot faster without compromising
# security.
trustedPeer = None
discoveredPeers = {}
Peer = collections.namedtuple('Peer', ['host', 'port'])
def resetNetworkProtocolAvailability():
"""This method helps to reset the availability of network protocol"""
# pylint: disable=global-statement
global networkProtocolAvailability
networkProtocolAvailability = {'IPv4': None, 'IPv6': None, 'onion': None}
resetNetworkProtocolAvailability()
dandelion = 0
testmode = False

View File

@ -1,25 +1,43 @@
"""
src/tr.py
=================================
"""
# pylint: disable=relative-import
import os
import state
# This is used so that the translateText function can be used when we are in daemon mode and not using any QT functions.
class translateClass:
"""This is used so that the translateText function can be used """
"""when we are in daemon mode and not using any QT functions."""
class translateClass: # pylint: disable=old-style-class, too-few-public-methods
"""
This is used so that the translateText function can be used when we are
in daemon mode and not using any QT functions.
"""
def __init__(self, context, text):
self.context = context
self.text = text
def arg(self,argument):
def arg(self, argument): # pylint: disable=unused-argument
"""Replace argument placeholders"""
if '%' in self.text:
return translateClass(self.context, self.text.replace('%','',1)) # This doesn't actually do anything with the arguments because we don't have a UI in which to display this information anyway.
else:
return translateClass(self.context, self.text.replace('%', '', 1))
# This doesn't actually do anything with the arguments
# because we don't have a UI in which to display this information anyway.
return self.text
def _translate(context, text, disambiguation = None, encoding = None, n = None):
def _translate(context, text, disambiguation=None, encoding=None, n=None): # pylint: disable=unused-argument
return translateText(context, text, n)
# def _translate(context, text, disambiguation = None, encoding = None, n = None):
# return translateClass(context, text.replace('%','',1))
def translateText(context, text, n=None):
"""Translate text in context"""
try:
enableGUI = state.enableGUI
except AttributeError: # inside the plugin
@ -28,15 +46,16 @@ def translateText(context, text, n = None):
try:
from PyQt4 import QtCore, QtGui
except Exception as err:
print 'PyBitmessage requires PyQt unless you want to run it as a daemon and interact with it using the API. You can download PyQt from http://www.riverbankcomputing.com/software/pyqt/download or by searching Google for \'PyQt Download\'. If you want to run in daemon mode, see https://bitmessage.org/wiki/Daemon'
print 'PyBitmessage requires PyQt unless you want to run it as a daemon and interact with it using the API\
.You can download PyQt from http://www.riverbankcomputing.com/software/pyqt/download\
or by searching Google for \'PyQt Download\'.\
If you want to run in daemon mode, see https://bitmessage.org/wiki/Daemon'
print 'Error message:', err
os._exit(0)
os._exit(0) # pylint: disable=protected-access
if n is None:
return QtGui.QApplication.translate(context, text)
else:
return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n)
else:
if '%' in text:
return translateClass(context, text.replace('%', '', 1))
else:
return text