Merge pull request #13 from cis-navjot-g/UiChanges

refactoring for kivy app
This commit is contained in:
surbhi 2019-09-27 13:32:08 +05:30 committed by GitHub
commit ba350e817f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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.recipe import PythonRecipe
# from pythonforandroid.util import ensure_dir # from pythonforandroid.util import ensure_dir
class KivyMDRecipe(PythonRecipe): 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' version = 'master'
url = 'https://github.com/surbhicis/kivymd/archive/master.zip' url = 'https://github.com/surbhicis/kivymd/archive/master.zip'
depends = ['kivy'] depends = ['kivy']
site_packages_name = 'kivymd' site_packages_name = 'kivymd'
call_hostpython_via_targetpython = False 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 return True
def get_recipe_env(self, arch): def get_recipe_env(self, arch):
"""Method is used for getting all the env paths"""
env = super(KivyMDRecipe, self).get_recipe_env(arch) env = super(KivyMDRecipe, self).get_recipe_env(arch)
env['PYTHON_ROOT'] = self.ctx.get_python_install_dir() env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7' 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', 'SDL', 'include'),
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_image'), 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_mixer'),
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'), join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'), ])
])
return env return env

View File

@ -2,11 +2,13 @@
src/identiconGeneration.py src/identiconGeneration.py
================================= =================================
""" """
# pylint: disable=import-error
import hashlib import hashlib
from io import BytesIO
from PIL import Image from PIL import Image
from kivy.core.image import Image as CoreImage from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image as kiImage from kivy.uix.image import Image as kiImage
from io import BytesIO
""" Core classes for loading images and converting them to a Texture. """ Core classes for loading images and converting them to a Texture.
The raw image data can be keep in memory for further access """ 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): 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 != "": if what is not None and what != "":
what = "%" + what + "%" what = "%" + what + "%"
else: else:
@ -27,7 +33,7 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w
else: else:
sqlStatementParts.append(xAddress + " = ? ") sqlStatementParts.append(xAddress + " = ? ")
sqlArguments.append(account) sqlArguments.append(account)
if folder is not "addressbook": if folder != "addressbook":
if folder is not None: if folder is not None:
if folder == "new": if folder == "new":
folder = "inbox" folder = "inbox"
@ -50,7 +56,7 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w
sqlStatementParts.append(filter_col) sqlStatementParts.append(filter_col)
if unreadOnly: if unreadOnly:
sqlStatementParts.append("read = 0") sqlStatementParts.append("read = 0")
if len(sqlStatementParts) > 0: if sqlStatementParts:
sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts) sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts)
if folder == "sent": if folder == "sent":
sqlStatementBase += " ORDER BY lastactiontime DESC" sqlStatementBase += " ORDER BY lastactiontime DESC"

View File

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

View File

@ -2,6 +2,7 @@
src/bitmessagekivy/mpybit.py src/bitmessagekivy/mpybit.py
================================= =================================
""" """
# pylint: disable=relative-import, unused-variable, import-error, no-name-in-module, too-many-lines
import os import os
import time import time
from functools import partial from functools import partial
@ -42,7 +43,6 @@ from kivymd.list import (
ILeftBody, ILeftBody,
ILeftBodyTouch, ILeftBodyTouch,
IRightBodyTouch, IRightBodyTouch,
ThreeLineAvatarIconListItem,
TwoLineAvatarIconListItem, TwoLineAvatarIconListItem,
TwoLineListItem) TwoLineListItem)
from kivymd.navigationdrawer import ( from kivymd.navigationdrawer import (
@ -55,11 +55,8 @@ import queues
from semaphores import kivyuisignaler from semaphores import kivyuisignaler
import state import state
from uikivysignaler import UIkivySignaler from uikivysignaler import UIkivySignaler
# pylint: disable=unused-argument, too-few-public-methods, import-error
import identiconGeneration import identiconGeneration
import os
from kivy.core.clipboard import Clipboard
# pylint: disable=unused-argument, too-few-public-methods # pylint: disable=unused-argument, too-few-public-methods
@ -1036,14 +1033,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
state.association = text state.association = text
self.root.ids.sc1.clear_widgets() self.root.ids.sc1.clear_widgets()
self.root.ids.sc1.add_widget(Inbox()) 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' self.root.ids.scr_mngr.current = 'inbox'
msg_counter_objs = \ msg_counter_objs = \
@ -1091,6 +1080,12 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
if BMConfigParser().addresses(): if BMConfigParser().addresses():
img = identiconGeneration.generate(BMConfigParser().addresses()[0]) img = identiconGeneration.generate(BMConfigParser().addresses()[0])
self.createFolder('./images/default_identicon/') 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])) img.texture.save('./images/default_identicon/{}.png'.format(BMConfigParser().addresses()[0]))
return BMConfigParser().addresses()[0] return BMConfigParser().addresses()[0]
return 'Select Address' return 'Select Address'
@ -1125,8 +1120,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
self.root.ids.scr_mngr.current = 'sent'\ self.root.ids.scr_mngr.current = 'sent'\
if state.detailPageType == 'sent' else 'inbox' \ if state.detailPageType == 'sent' else 'inbox' \
if state.detailPageType == 'inbox' else 'draft' if state.detailPageType == 'inbox' else 'draft'
# if state.detailPageType in ['sent', 'inbox']:
# self.add_search_bar()
self.back_press() self.back_press()
elif self.root.ids.scr_mngr.current == "create": elif self.root.ids.scr_mngr.current == "create":
composer_objs = self.root composer_objs = self.root
@ -1306,16 +1299,9 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
class GrashofPopup(Popup): class GrashofPopup(Popup):
"""Methods for saving contacts, error messages.""" """Methods for saving contacts, error messages."""
def __init__(self, **kwargs): def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""Grash of pop screen settings.""" """Grash of pop screen settings."""
super(GrashofPopup, self).__init__(**kwargs) 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): def savecontact(self):
"""Method is used for Saving Contacts.""" """Method is used for Saving Contacts."""
@ -1571,15 +1557,9 @@ class MyaddDetailPopup(Popup):
address_label = StringProperty() address_label = StringProperty()
address = StringProperty() address = StringProperty()
def __init__(self, **kwargs): def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""My Address Details screen setting.""" """My Address Details screen setting."""
super(MyaddDetailPopup, self).__init__(**kwargs) 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): def set_address(self, address, label):
"""Getting address for displaying details on popup.""" """Getting address for displaying details on popup."""
@ -1609,15 +1589,9 @@ class AddbookDetailPopup(Popup):
address_label = StringProperty() address_label = StringProperty()
address = StringProperty() address = StringProperty()
def __init__(self, **kwargs): def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""Method used set screen of address detail page.""" """Method used set screen of address detail page."""
super(AddbookDetailPopup, self).__init__(**kwargs) 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): def set_addbook_data(self, address, label):
"""Getting address book data for detial dipaly.""" """Getting address book data for detial dipaly."""
@ -1694,10 +1668,6 @@ class Draft(Screen):
xAddress, account, "draft", where, what, False) xAddress, account, "draft", where, what, False)
if state.msg_counter_objs: if state.msg_counter_objs:
state.msg_counter_objs.draft_cnt.badge_text = str(len(queryreturn)) 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: if queryreturn:
src_mng_obj = state.kivyapp.root.children[2].children[0].ids src_mng_obj = state.kivyapp.root.children[2].children[0].ids
src_mng_obj.draft_cnt.badge_text = str(len(queryreturn)) src_mng_obj.draft_cnt.badge_text = str(len(queryreturn))
@ -1772,13 +1742,7 @@ class Draft(Screen):
if int(state.draft_count) > 0: if int(state.draft_count) > 0:
msg_count_objs.draft_cnt.badge_text = str( msg_count_objs.draft_cnt.badge_text = str(
int(state.draft_count) - 1) 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.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) self.ids.ml.remove_widget(instance.parent.parent)
toast('Deleted') toast('Deleted')
@ -1840,8 +1804,6 @@ class CustomSpinner(Spinner):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
"""Method used for setting size of spinner.""" """Method used for setting size of spinner."""
super(CustomSpinner, self).__init__(*args, **kwargs) 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 self.dropdown_cls.max_height = Window.size[1] / 3
@ -2026,6 +1988,7 @@ class Archieve(Screen):
pass pass
class Spam(Screen): class Spam(Screen):
"""Spam Screen show widgets of page.""" """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...) resends msg messages in 5 days (then 10 days, then 20 days, etc...)
""" """
# pylint: disable=relative-import, protected-access
import gc import gc
import os import os
import shared
import time import time
import shared
import tr import tr
from bmconfigparser import BMConfigParser from bmconfigparser import BMConfigParser
@ -36,11 +36,12 @@ import state
class singleCleaner(StoppableThread): class singleCleaner(StoppableThread):
"""Base method that Cleanup knownnodes and handle possible severe exception"""
name = "singleCleaner" name = "singleCleaner"
cycleLength = 300 cycleLength = 300
expireDiscoveredPeers = 300 expireDiscoveredPeers = 300
def run(self): def run(self): # pylint: disable=too-many-branches
gc.disable() gc.disable()
timeWeLastClearedInventoryAndPubkeysTables = 0 timeWeLastClearedInventoryAndPubkeysTables = 0
try: try:
@ -73,7 +74,7 @@ class singleCleaner(StoppableThread):
# If we are running as a daemon then we are going to fill up the UI # 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 # queue which will never be handled by a UI. We should clear it to
# save memory. # save memory.
# FIXME redundant? # ..FIXME redundant?
if shared.thisapp.daemon or not state.enableGUI: if shared.thisapp.daemon or not state.enableGUI:
queues.UISignalQueue.queue.clear() queues.UISignalQueue.queue.clear()
if timeWeLastClearedInventoryAndPubkeysTables < \ if timeWeLastClearedInventoryAndPubkeysTables < \
@ -130,7 +131,8 @@ class singleCleaner(StoppableThread):
' is full. Bitmessage will now exit.'), ' is full. Bitmessage will now exit.'),
True) True)
)) ))
# FIXME redundant? # ..FIXME redundant?
# pylint: disable=no-member
if shared.daemon or not state.enableGUI: if shared.daemon or not state.enableGUI:
os._exit(1) os._exit(1)
@ -153,7 +155,7 @@ class singleCleaner(StoppableThread):
del state.discoveredPeers[k] del state.discoveredPeers[k]
except KeyError: except KeyError:
pass pass
# TODO: cleanup pending upload / download # ..TODO: cleanup pending upload / download
gc.collect() gc.collect()
@ -162,6 +164,7 @@ class singleCleaner(StoppableThread):
def resendPubkeyRequest(address): def resendPubkeyRequest(address):
"""After a long time, method send getpubkey request"""
logger.debug( logger.debug(
'It has been a long time and we haven\'t heard a response to our' 'It has been a long time and we haven\'t heard a response to our'
' getpubkey request. Sending again.' ' getpubkey request. Sending again.'
@ -186,6 +189,7 @@ def resendPubkeyRequest(address):
def resendMsg(ackdata): def resendMsg(ackdata):
"""After a long time, method send acknowledgement msg"""
logger.debug( logger.debug(
'It has been a long time and we haven\'t heard an acknowledgement' 'It has been a long time and we haven\'t heard an acknowledgement'
' to our msg. Sending again.' ' to our msg. Sending again.'

View File

@ -2,8 +2,8 @@
src/class_singleWorker.py 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 from __future__ import division
import hashlib import hashlib
@ -34,6 +34,7 @@ from inventory import Inventory
# This thread, of which there is only one, does the heavy lifting: # This thread, of which there is only one, does the heavy lifting:
# calculating POWs. # calculating POWs.
def sizeof_fmt(num, suffix='h/s'): def sizeof_fmt(num, suffix='h/s'):
"""Format hashes per seconds nicely (SI prefix)""" """Format hashes per seconds nicely (SI prefix)"""
@ -469,7 +470,7 @@ class singleWorker(StoppableThread):
def sendOnionPeerObj(self, peer=None): def sendOnionPeerObj(self, peer=None):
"""Send onionpeer object representing peer""" """Send onionpeer object representing peer"""
if not peer: # find own onionhostname 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'): if peer.host.endswith('.onion'):
break break
else: else:
@ -478,7 +479,7 @@ class singleWorker(StoppableThread):
embeddedTime = int(time.time() + TTL) embeddedTime = int(time.time() + TTL)
streamNumber = 1 # Don't know yet what should be here streamNumber = 1 # Don't know yet what should be here
objectType = protocol.OBJECT_ONIONPEER 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) objectPayload = encodeVarint(peer.port) + protocol.encodeHost(peer.host)
tag = calculateInventoryHash(objectPayload) 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 importlib import import_module
from os import path, listdir from os import path, listdir
from string import lower from string import lower
@ -9,12 +14,15 @@ from debug import logger
import messagetypes import messagetypes
import paths 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__)} self.data = {"": lower(type(self).__name__)}
def constructObject(data): def constructObject(data):
"""Construct an object"""
whitelist = ["message"] whitelist = ["message"]
if data[""] not in whitelist: if data[""] not in whitelist:
return None return None
@ -35,6 +43,7 @@ def constructObject(data):
else: else:
return returnObj return returnObj
if paths.frozen is not None or platform == "android": if paths.frozen is not None or platform == "android":
import messagetypes.message import messagetypes.message
import messagetypes.vote import messagetypes.vote

View File

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

View File

@ -1,15 +1,25 @@
"""
src/messagetypes/vote.py
=================================
"""
from debug import logger from debug import logger
from messagetypes import MsgBase from messagetypes import MsgBase
# pylint: disable=attribute-defined-outside-init
class Vote(MsgBase): 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 return
def decode(self, data): def decode(self, data):
"""Method used for decoding the message"""
self.msgid = data["msgid"] self.msgid = data["msgid"]
self.vote = data["vote"] self.vote = data["vote"]
def encode(self, data): def encode(self, data):
"""Method used for encoding the message"""
# pylint: disable=no-member
super(Vote, self).encode() super(Vote, self).encode()
try: try:
self.data["msgid"] = data["msgid"] self.data["msgid"] = data["msgid"]
@ -19,5 +29,6 @@ class Vote(MsgBase):
return self.data return self.data
def process(self): def process(self):
"""Method used for process the message"""
logger.debug("msgid: %s", self.msgid) logger.debug("msgid: %s", self.msgid)
logger.debug("vote: %s", self.vote) logger.debug("vote: %s", self.vote)

View File

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

View File

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

View File

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

View File

@ -1,25 +1,43 @@
"""
src/tr.py
=================================
"""
# pylint: disable=relative-import
import os import os
import state 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. """This is used so that the translateText function can be used """
class translateClass: """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): def __init__(self, context, text):
self.context = context self.context = context
self.text = text self.text = text
def arg(self,argument):
def arg(self, argument): # pylint: disable=unused-argument
"""Replace argument placeholders"""
if '%' in self.text: 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. return translateClass(self.context, self.text.replace('%', '', 1))
else: # 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 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) return translateText(context, text, n)
# def _translate(context, text, disambiguation = None, encoding = None, n = None): # def _translate(context, text, disambiguation = None, encoding = None, n = None):
# return translateClass(context, text.replace('%','',1)) # return translateClass(context, text.replace('%','',1))
def translateText(context, text, n = None):
def translateText(context, text, n=None):
"""Translate text in context"""
try: try:
enableGUI = state.enableGUI enableGUI = state.enableGUI
except AttributeError: # inside the plugin except AttributeError: # inside the plugin
@ -28,15 +46,16 @@ def translateText(context, text, n = None):
try: try:
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
except Exception as err: 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 print 'Error message:', err
os._exit(0) os._exit(0) # pylint: disable=protected-access
if n is None: if n is None:
return QtGui.QApplication.translate(context, text) return QtGui.QApplication.translate(context, text)
else:
return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n) return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n)
else: else:
if '%' in text: if '%' in text:
return translateClass(context, text.replace('%','',1)) return translateClass(context, text.replace('%', '', 1))
else:
return text return text