Update the origin by upstream and Made changes on the api file

This commit is contained in:
jai.s 2020-07-09 19:43:12 +05:30
commit 31437f1f42
No known key found for this signature in database
GPG Key ID: 360CFA25EFC67D12
12 changed files with 261 additions and 153 deletions

View File

@ -6,12 +6,14 @@ addons:
packages: packages:
- build-essential - build-essential
- libcap-dev - libcap-dev
- python-qt4
- tor - tor
- xvfb
install: install:
- pip install -r requirements.txt - pip install -r requirements.txt
- ln -s src pybitmessage # tests environment - ln -s src pybitmessage # tests environment
- python setup.py install - python setup.py install
script: script:
- python checkdeps.py - python checkdeps.py
- src/bitmessagemain.py -t - xvfb-run src/bitmessagemain.py -t
- python setup.py test - python setup.py test

View File

@ -15,7 +15,8 @@ import socket
import subprocess import subprocess
import time import time
from binascii import hexlify, unhexlify from binascii import hexlify, unhexlify
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler, \
SimpleXMLRPCServer
from struct import pack from struct import pack
import defaults import defaults

View File

@ -193,8 +193,7 @@ def ShowTimeHistoy(act_time):
action_time.strftime("%d/%m/%Y") action_time.strftime("%d/%m/%Y")
if duration.days >= 365 if duration.days >= 365
else action_time.strftime("%I:%M %p").lstrip("0") else action_time.strftime("%I:%M %p").lstrip("0")
if duration.days == 0 if duration.days == 0 and crnt_date.strftime("%d/%m/%Y") == action_time.strftime("%d/%m/%Y")
and crnt_date.strftime("%d/%m/%Y") == action_time.strftime("%d/%m/%Y")
else action_time.strftime("%d %b") else action_time.strftime("%d %b")
) )
return display_data return display_data
@ -311,33 +310,39 @@ class Inbox(Screen):
def inboxDataQuery(self, xAddress, where, what, start_indx=0, end_indx=20): def inboxDataQuery(self, xAddress, where, what, start_indx=0, end_indx=20):
"""This method is used for retrieving inbox data""" """This method is used for retrieving inbox data"""
self.queryreturn = kivy_helper_search.search_sql( self.queryreturn = kivy_helper_search.search_sql(
xAddress, self.account, "inbox", where, what, xAddress, self.account, "inbox", where, what, False, start_indx, end_indx
False, start_indx, end_indx) )
def set_mdList(self, data): def set_mdList(self, data):
"""This method is used to create the mdList""" """This method is used to create the mdList"""
total_message = len(self.ids.ml.children) total_message = len(self.ids.ml.children)
for item in data: for item in data:
meny = TwoLineAvatarIconListItem( meny = TwoLineAvatarIconListItem(
text=item['text'], secondary_text=item['secondary_text'], text=item["text"],
theme_text_color='Custom', secondary_text=item["secondary_text"],
text_color=ThemeClsColor) theme_text_color="Custom",
text_color=NavigateApp().theme_cls.primary_color
)
meny._txt_right_pad = dp(70) meny._txt_right_pad = dp(70)
meny.add_widget(AvatarSampleWidget( meny.add_widget(
source= state.imageDir +'/text_images/{}.png'.format( AvatarSampleWidget(
avatarImageFirstLetter(item['secondary_text'].strip())))) source="./images/text_images/{}.png".format(
meny.bind(on_press=partial(self.inbox_detail, item['msgid'])) avatarImageFirstLetter(item["secondary_text"].strip())
meny.add_widget(AddTimeWidget(item['received'])) )
carousel = Carousel(direction='right') )
)
meny.bind(on_press=partial(self.inbox_detail, item["msgid"]))
meny.add_widget(AddTimeWidget(item["received"]))
carousel = Carousel(direction="right")
carousel.height = meny.height carousel.height = meny.height
carousel.size_hint_y = None carousel.size_hint_y = None
carousel.ignore_perpendicular_swipes = True carousel.ignore_perpendicular_swipes = True
carousel.data_index = 0 carousel.data_index = 0
carousel.min_move = 0.2 carousel.min_move = 0.2
del_btn = Button(text='Delete') del_btn = Button(text="Delete")
del_btn.background_normal = '' del_btn.background_normal = ""
del_btn.background_color = (1, 0, 0, 1) del_btn.background_color = (1, 0, 0, 1)
del_btn.bind(on_press=partial(self.delete, item['msgid'])) del_btn.bind(on_press=partial(self.delete, item["msgid"]))
carousel.add_widget(del_btn) carousel.add_widget(del_btn)
carousel.add_widget(meny) carousel.add_widget(meny)
# ach_btn = Button(text='Achieve') # ach_btn = Button(text='Achieve')
@ -351,8 +356,9 @@ class Inbox(Screen):
def check_scroll_y(self, instance, somethingelse): def check_scroll_y(self, instance, somethingelse):
"""Loads data on scroll""" """Loads data on scroll"""
if self.children[2].children[0].children[ if (
0].scroll_y <= -0.0 and self.has_refreshed: self.children[2].children[0].children[0].scroll_y <= -0.0 and self.has_refreshed
):
self.children[2].children[0].children[0].scroll_y = 0.06 self.children[2].children[0].children[0].scroll_y = 0.06
total_message = len(self.ids.ml.children) total_message = len(self.ids.ml.children)
self.update_inbox_screen_on_scroll(total_message) self.update_inbox_screen_on_scroll(total_message)
@ -363,24 +369,27 @@ class Inbox(Screen):
"""This method is used to load more data on scroll down""" """This method is used to load more data on scroll down"""
data = [] data = []
if state.searcing_text: if state.searcing_text:
where = ['subject', 'message'] where = ["subject", "message"]
what = state.searcing_text what = state.searcing_text
self.inboxDataQuery('toaddress', where, what, total_message, 5) self.inboxDataQuery("toaddress", where, what, total_message, 5)
for mail in self.queryreturn: for mail in self.queryreturn:
# third_text = mail[3].replace('\n', ' ') # third_text = mail[3].replace('\n', ' ')
subject = mail[3].decode() if isinstance(mail[3], bytes) else mail[3] subject = mail[3].decode() if isinstance(mail[3], bytes) else mail[3]
body = mail[5].decode() if isinstance(mail[5], bytes) else mail[5] body = mail[5].decode() if isinstance(mail[5], bytes) else mail[5]
data.append({ data.append(
'text': mail[4].strip(), {
'secondary_text': body[:50] + '........' if len( "text": mail[4].strip(),
body) >= 50 else (body + ',' + subject.replace( "secondary_text": body[:50] + "........"
'\n', ''))[0:50] + '........', if len(body) >= 50
'msgid': mail[1]}) else (body + "," + subject.replace("\n", ""))[0:50] + "........",
"msgid": mail[1]
}
)
self.set_mdList(data) self.set_mdList(data)
def inbox_detail(self, msg_id, *args): def inbox_detail(self, msg_id, *args):
"""Load inbox page details""" """Load inbox page details"""
state.detailPageType = 'inbox' state.detailPageType = "inbox"
state.mail_id = msg_id state.mail_id = msg_id
if self.manager: if self.manager:
src_mng_obj = self.manager src_mng_obj = self.manager
@ -388,34 +397,34 @@ class Inbox(Screen):
src_mng_obj = self.parent.parent src_mng_obj = self.parent.parent
src_mng_obj.screens[13].clear_widgets() src_mng_obj.screens[13].clear_widgets()
src_mng_obj.screens[13].add_widget(MailDetail()) src_mng_obj.screens[13].add_widget(MailDetail())
src_mng_obj.current = 'mailDetail' src_mng_obj.current = "mailDetail"
def delete(self, data_index, instance, *args): def delete(self, data_index, instance, *args):
"""Delete inbox mail from inbox listing""" """Delete inbox mail from inbox listing"""
sqlExecute( sqlExecute("UPDATE inbox SET folder = 'trash' WHERE msgid = ?;", data_index)
"UPDATE inbox SET folder = 'trash' WHERE msgid = ?;", data_index)
msg_count_objs = self.parent.parent.ids.content_drawer.ids msg_count_objs = self.parent.parent.ids.content_drawer.ids
if int(state.inbox_count) > 0: if int(state.inbox_count) > 0:
msg_count_objs.inbox_cnt.children[0].children[0].text = showLimitedCnt(int(state.inbox_count) - 1) msg_count_objs.inbox_cnt.children[0].children[0].text = showLimitedCnt(
msg_count_objs.trash_cnt.children[0].children[0].text = showLimitedCnt(int(state.trash_count) + 1) int(state.inbox_count) - 1
msg_count_objs.allmail_cnt.children[0].children[0].text = showLimitedCnt(int(state.all_count) - 1) )
state.inbox_count = str( msg_count_objs.trash_cnt.children[0].children[0].text = showLimitedCnt(
int(state.inbox_count) - 1) int(state.trash_count) + 1
state.trash_count = str( )
int(state.trash_count) + 1) msg_count_objs.allmail_cnt.children[0].children[0].text = showLimitedCnt(
state.all_count = str( int(state.all_count) - 1
int(state.all_count) - 1) )
state.inbox_count = str(int(state.inbox_count) - 1)
state.trash_count = str(int(state.trash_count) + 1)
state.all_count = str(int(state.all_count) - 1)
if int(state.inbox_count) <= 0: if int(state.inbox_count) <= 0:
self.ids.identi_tag.children[0].text = '' self.ids.identi_tag.children[0].text = ""
self.ids.ml.remove_widget( self.ids.ml.remove_widget(instance.parent.parent)
instance.parent.parent) toast("Deleted")
toast('Deleted')
self.update_trash() self.update_trash()
def archive(self, data_index, instance, *args): def archive(self, data_index, instance, *args):
"""Archive inbox mail from inbox listing""" """Archive inbox mail from inbox listing"""
sqlExecute( sqlExecute("UPDATE inbox SET folder = 'trash' WHERE msgid = ?;", data_index)
"UPDATE inbox SET folder = 'trash' WHERE msgid = ?;", data_index)
self.ids.ml.remove_widget(instance.parent.parent) self.ids.ml.remove_widget(instance.parent.parent)
self.update_trash() self.update_trash()
@ -431,20 +440,23 @@ class Inbox(Screen):
def refresh_callback(self, *args): def refresh_callback(self, *args):
"""Method updates the state of application, """Method updates the state of application,
While the spinner remains on the screen""" While the spinner remains on the screen"""
def refresh_callback(interval): def refresh_callback(interval):
"""Method used for loading the inbox screen data""" """Method used for loading the inbox screen data"""
state.searcing_text = '' state.searcing_text = ""
self.children[2].children[1].ids.search_field.text = '' self.children[2].children[1].ids.search_field.text = ""
self.ids.ml.clear_widgets() self.ids.ml.clear_widgets()
self.loadMessagelist(state.association) self.loadMessagelist(state.association)
self.has_refreshed = True self.has_refreshed = True
self.ids.refresh_layout.refresh_done() self.ids.refresh_layout.refresh_done()
self.tick = 0 self.tick = 0
Clock.schedule_once(refresh_callback, 1) Clock.schedule_once(refresh_callback, 1)
class CustomTwoLineAvatarIconListItem(TwoLineAvatarIconListItem): class CustomTwoLineAvatarIconListItem(TwoLineAvatarIconListItem):
"""Custom Two Line Avatar Icon List""" """Custom Two Line Avatar Icon List"""
pass pass
@ -539,8 +551,9 @@ class MyAddress(Screen):
my_addresses = len(self.ids.ml.children) my_addresses = len(self.ids.ml.children)
if my_addresses != len(self.addresses_list): if my_addresses != len(self.addresses_list):
self.update_addressBook_on_scroll(my_addresses) self.update_addressBook_on_scroll(my_addresses)
self.has_refreshed = True if my_addresses != len( self.has_refreshed = (
self.addresses_list) else False True if my_addresses != len(self.addresses_list) else False
)
else: else:
pass pass
@ -551,7 +564,7 @@ class MyAddress(Screen):
# @staticmethod # @staticmethod
def myadd_detail(self, fromaddress, label, *args): def myadd_detail(self, fromaddress, label, *args):
"""Load myaddresses details""" """Load myaddresses details"""
if BMConfigParser().get(fromaddress, 'enabled') == 'true': if BMConfigParser().get(fromaddress, "enabled") == "true":
p = MyaddDetailPopup() p = MyaddDetailPopup()
p.open() p.open()
p.set_address(fromaddress, label) p.set_address(fromaddress, label)
@ -721,8 +734,9 @@ class AddressBook(Screen):
exist_addresses = len(self.ids.ml.children) exist_addresses = len(self.ids.ml.children)
if exist_addresses != len(self.queryreturn): if exist_addresses != len(self.queryreturn):
self.update_addressBook_on_scroll(exist_addresses) self.update_addressBook_on_scroll(exist_addresses)
self.has_refreshed = True if exist_addresses != len( self.has_refreshed = (
self.queryreturn) else False True if exist_addresses != len(self.queryreturn) else False
)
else: else:
pass pass
@ -749,14 +763,15 @@ class AddressBook(Screen):
self.ids.ml.remove_widget(instance.parent.parent) self.ids.ml.remove_widget(instance.parent.parent)
# if len(self.ids.ml.children) == 0: # if len(self.ids.ml.children) == 0:
if self.ids.ml.children is not None: if self.ids.ml.children is not None:
self.ids.identi_tag.children[0].text = '' self.ids.identi_tag.children[0].text = ""
sqlExecute( sqlExecute("DELETE FROM addressbook WHERE address = '{}';".format(address))
"DELETE FROM addressbook WHERE address = '{}';".format(address))
class SelectableRecycleBoxLayout( class SelectableRecycleBoxLayout(
FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout): FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout
):
"""Adds selection and focus behaviour to the view""" """Adds selection and focus behaviour to the view"""
# pylint: disable = duplicate-bases # pylint: disable = duplicate-bases
pass pass
@ -772,8 +787,7 @@ class SelectableLabel(RecycleDataViewBehavior, Label):
def refresh_view_attrs(self, rv, index, data): def refresh_view_attrs(self, rv, index, data):
"""Catch and handle the view changes""" """Catch and handle the view changes"""
self.index = index self.index = index
return super(SelectableLabel, self).refresh_view_attrs( return super(SelectableLabel, self).refresh_view_attrs(rv, index, data)
rv, index, data)
def on_touch_down(self, touch): # pylint: disable=inconsistent-return-statements def on_touch_down(self, touch): # pylint: disable=inconsistent-return-statements
"""Add selection on touch down""" """Add selection on touch down"""
@ -788,7 +802,8 @@ class SelectableLabel(RecycleDataViewBehavior, Label):
if is_selected: if is_selected:
print("selection changed to {0}".format(rv.data[index])) print("selection changed to {0}".format(rv.data[index]))
rv.parent.txt_input.text = rv.parent.txt_input.text.replace( rv.parent.txt_input.text = rv.parent.txt_input.text.replace(
rv.parent.txt_input.text, rv.data[index]['text']) rv.parent.txt_input.text, rv.data[index]["text"]
)
class RV(RecycleView): class RV(RecycleView):
@ -801,6 +816,7 @@ class RV(RecycleView):
class DropDownWidget(BoxLayout): class DropDownWidget(BoxLayout):
"""Adding Dropdown Widget""" """Adding Dropdown Widget"""
# pylint: disable=too-many-statements # pylint: disable=too-many-statements
txt_input = ObjectProperty() txt_input = ObjectProperty()
@ -816,13 +832,13 @@ class DropDownWidget(BoxLayout):
print("message: ", self.ids.body.text) print("message: ", self.ids.body.text)
sendMessageToPeople = True sendMessageToPeople = True
if sendMessageToPeople: if sendMessageToPeople:
if toAddress != '' and subject and message: if toAddress != "" and subject and message:
status, addressVersionNumber, streamNumber, ripe = ( status, addressVersionNumber, streamNumber, ripe = decodeAddress(
decodeAddress(toAddress)) toAddress
if status == 'success': )
if status == "success":
navApp.root.ids.sc3.children[0].active = True navApp.root.ids.sc3.children[0].active = True
if state.detailPageType == 'draft' \ if state.detailPageType == "draft" and state.send_draft_mail:
and state.send_draft_mail:
sqlExecute( sqlExecute(
"UPDATE sent SET toaddress = ?" "UPDATE sent SET toaddress = ?"
", fromaddress = ? , subject = ?" ", fromaddress = ? , subject = ?"
@ -907,7 +923,7 @@ class DropDownWidget(BoxLayout):
state.kivyapp.root.ids.sc3.children[0].active = False state.kivyapp.root.ids.sc3.children[0].active = False
state.in_sent_method = True state.in_sent_method = True
state.kivyapp.back_press() state.kivyapp.back_press()
toast('sent') toast("sent")
def address_error_message(self, msg): def address_error_message(self, msg):
"""Generates error message""" """Generates error message"""
@ -927,6 +943,7 @@ class DropDownWidget(BoxLayout):
dialog_box.dismiss() dialog_box.dismiss()
toast(text_item) toast(text_item)
# @staticmethod # @staticmethod
# def callback_for_menu_items(text_item, *arg): # def callback_for_menu_items(text_item, *arg):
# """Callback of alert box""" # """Callback of alert box"""
@ -934,11 +951,11 @@ class DropDownWidget(BoxLayout):
def reset_composer(self): def reset_composer(self):
"""Method will reset composer""" """Method will reset composer"""
self.ids.ti.text = '' self.ids.ti.text = ""
self.ids.btn.text = 'Select' self.ids.btn.text = "Select"
self.ids.txt_input.text = '' self.ids.txt_input.text = ""
self.ids.subject.text = '' self.ids.subject.text = ""
self.ids.body.text = '' self.ids.body.text = ""
toast("Reset message") toast("Reset message")
def auto_fill_fromaddr(self): def auto_fill_fromaddr(self):
@ -950,57 +967,60 @@ class DropDownWidget(BoxLayout):
"""This method is used for scanning Qr code""" """This method is used for scanning Qr code"""
pass pass
class ScanScreen(Screen): class ScanScreen(Screen):
def on_pre_enter(self): def on_pre_enter(self):
''' """
on_pre_enter works little better on android on_pre_enter works little better on android
It affects screen transition on linux It affects screen transition on linux
''' """
if not self.children: if not self.children:
tmp= Builder.load_file(os.path.join(os.path.dirname(__file__), "kv/{}.kv").format('scanner')) tmp = Builder.load_file(
self.add_widget(tmp) os.path.join(os.path.dirname(__file__), "kv/{}.kv").format("scanner")
if platform=='android': )
Clock.schedule_once(self.start_camera, 0) self.add_widget(tmp)
if platform == "android":
def on_enter(self): Clock.schedule_once(self.start_camera, 0)
'''
def on_enter(self):
"""
on_enter works better on linux on_enter works better on linux
It creates a black screen on android until camera gets loaded It creates a black screen on android until camera gets loaded
''' """
#print(self.children) # print(self.children)
if platform!='android': if platform != "android":
#pass # pass
Clock.schedule_once(self.start_camera, 0) Clock.schedule_once(self.start_camera, 0)
def on_leave(self): def on_leave(self):
#pass # pass
Clock.schedule_once(self.stop_camera, 0)
def start_camera(self, *args):
self.xcam = self.children[0].ids.zbarcam.ids.xcamera
# pass
# self.xxx= self.children[0].ids.zbarcam.ids.xcamera
# print(self.cam._device.isOpened())
if platform == "android":
self.xcam.play = True
else:
Clock.schedule_once(self.open_cam, 0)
def stop_camera(self, *args):
# print(self.children[0].ids.zbarcam.ids.xcamera.play)
self.xcam.play = False
# self.xcam._camera.stop()
# self.children[0].ids.zbarcam.stop()
if platform != "android":
self.xcam._camera._device.release()
def open_cam(self, *args):
if not self.xcam._camera._device.isOpened():
self.xcam._camera._device.open(self.xcam._camera._index)
self.xcam.play = True
Clock.schedule_once(self.stop_camera, 0)
def start_camera(self, *args):
self.xcam= self.children[0].ids.zbarcam.ids.xcamera
#pass
#self.xxx= self.children[0].ids.zbarcam.ids.xcamera
#print(self.cam._device.isOpened())
if platform=='android':
self.xcam.play= True
else:
Clock.schedule_once(self.open_cam, 0)
def stop_camera(self, *args):
#print(self.children[0].ids.zbarcam.ids.xcamera.play)
self.xcam.play= False
#self.xcam._camera.stop()
#self.children[0].ids.zbarcam.stop()
if platform != 'android':
self.xcam._camera._device.release()
def open_cam(self, *args):
if not self.xcam._camera._device.isOpened():
self.xcam._camera._device.open(self.xcam._camera._index)
self.xcam.play= True
class MyTextInput(TextInput): class MyTextInput(TextInput):
"""Takes the text input in the field""" """Takes the text input in the field"""
@ -1071,24 +1091,31 @@ class Payment(Screen):
payloadLengthExtraBytes)) payloadLengthExtraBytes))
toast('hidden payment address Creating for buying subscription....') toast('hidden payment address Creating for buying subscription....')
class Category(BoxLayout, RectangularElevationBehavior): class Category(BoxLayout, RectangularElevationBehavior):
elevation_normal= .01 elevation_normal = .01
class ProductLayout(BoxLayout, RectangularElevationBehavior): class ProductLayout(BoxLayout, RectangularElevationBehavior):
elevation_normal= .01 elevation_normal = .01
class PaymentMethodLayout(BoxLayout): class PaymentMethodLayout(BoxLayout):
pass pass
class ListItemWithLabel(OneLineAvatarIconListItem): class ListItemWithLabel(OneLineAvatarIconListItem):
pass pass
class RightLabel(IRightBodyTouch, MDLabel): class RightLabel(IRightBodyTouch, MDLabel):
pass pass
class HomeScreen(Screen): class HomeScreen(Screen):
pass pass
class Credits(Screen): class Credits(Screen):
"""Credits Method""" """Credits Method"""
@ -2284,23 +2311,24 @@ class NavigateApp(MDApp):
# self.root.ids.sc7.ids.add_random_bx.clear_widgets() # self.root.ids.sc7.ids.add_random_bx.clear_widgets()
def open_payment_layout(self, sku): def open_payment_layout(self, sku):
pml= PaymentMethodLayout() pml = PaymentMethodLayout()
self.product_id= sku self.product_id = sku
self.custom_sheet= MDCustomBottomSheet(screen= pml) self.custom_sheet = MDCustomBottomSheet(screen=pml)
self.custom_sheet.open() self.custom_sheet.open()
def initiate_purchase(self, method_name): def initiate_purchase(self, method_name):
#self.custom_sheet.dismiss() # self.custom_sheet.dismiss()
print("Purchasing {} through {}".format(self.product_id, method_name)) print("Purchasing {} through {}".format(self.product_id, method_name))
def _after_scan(self, text): def _after_scan(self, text):
if platform=='android': if platform == 'android':
text= cast(CharSequence, String(text)) text = cast(CharSequence, String(text))
show_toast(text,Toast.LENGTH_SHORT) show_toast(text, Toast.LENGTH_SHORT)
else: else:
self.root.ids.sc3.children[1].ids.txt_input.text = text self.root.ids.sc3.children[1].ids.txt_input.text = text
self.root.ids.scr_mngr.current = 'create' self.root.ids.scr_mngr.current = 'create'
class GrashofPopup(Popup): class GrashofPopup(Popup):
"""Moule for save contacts and error messages""" """Moule for save contacts and error messages"""
@ -2415,9 +2443,11 @@ class GrashofPopup(Popup):
text = "Some data encoded in the address is malformed." text = "Some data encoded in the address is malformed."
return text return text
class InfoLayout(BoxLayout, RectangularElevationBehavior): class InfoLayout(BoxLayout, RectangularElevationBehavior):
pass pass
class AvatarSampleWidget(ILeftBody, Image): class AvatarSampleWidget(ILeftBody, Image):
"""Avatar Sample Widget""" """Avatar Sample Widget"""
@ -2582,8 +2612,7 @@ class MailDetail(Screen): # pylint: disable=too-many-instance-attributes
# sender_name = BMConfigParser().get(data[0][1], 'label') # sender_name = BMConfigParser().get(data[0][1], 'label')
sender_name = data[0][1] sender_name = data[0][1]
composer_obj.body.text = ( composer_obj.body.text = (
'\n\n --------------On ' + time_tag + ', ' '\n\n --------------On ' + time_tag + ', ' + sender_name + ' wrote:--------------\n' + data[0][3])
+ sender_name + ' wrote:--------------\n' + data[0][3])
composer_obj.body.focus = True composer_obj.body.focus = True
composer_obj.body.cursor = (0, 0) composer_obj.body.cursor = (0, 0)
state.kivyapp.root.ids.sc3.children[1].ids.rv.data = '' state.kivyapp.root.ids.sc3.children[1].ids.rv.data = ''

View File

@ -362,11 +362,12 @@ class Main(object):
while state.shutdown == 0: while state.shutdown == 0:
time.sleep(1) time.sleep(1)
if ( if (
state.testmode and time.time() - state.testmode
state.last_api_response >= 30 and time.time() - state.last_api_response >= 30
): ):
self.stop() self.stop()
elif not state.enableGUI: elif not state.enableGUI:
state.enableGUI = True
# pylint: disable=relative-import # pylint: disable=relative-import
from tests import core as test_core from tests import core as test_core
test_core_result = test_core.run() test_core_result = test_core.run()

View File

@ -1,8 +1,7 @@
""" """
src/bitmessageqt/dialogs.py Custom dialog classes
===========================
""" """
# pylint: disable=too-few-public-methods
from PyQt4 import QtGui from PyQt4 import QtGui
import paths import paths

View File

@ -4,6 +4,7 @@ This module setting file is for settings
import ConfigParser import ConfigParser
import os import os
import sys import sys
import tempfile
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
@ -15,7 +16,6 @@ import openclpow
import paths import paths
import queues import queues
import state import state
import tempfile
import widgets import widgets
from bmconfigparser import BMConfigParser from bmconfigparser import BMConfigParser
from helper_sql import sqlExecute, sqlStoredProcedure from helper_sql import sqlExecute, sqlStoredProcedure
@ -30,7 +30,7 @@ def getSOCKSProxyType(config):
result = ConfigParser.SafeConfigParser.get( result = ConfigParser.SafeConfigParser.get(
config, 'bitmessagesettings', 'socksproxytype') config, 'bitmessagesettings', 'socksproxytype')
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
return return None
else: else:
if result.lower() in ('', 'none', 'false'): if result.lower() in ('', 'none', 'false'):
result = None result = None
@ -429,15 +429,14 @@ class SettingsDialog(QtGui.QDialog):
acceptableDifficultyChanged = False acceptableDifficultyChanged = False
if ( if (
float(self.lineEditMaxAcceptableTotalDifficulty.text()) >= 1 float(self.lineEditMaxAcceptableTotalDifficulty.text()) >= 1
or float(self.lineEditMaxAcceptableTotalDifficulty.text()) == 0 or float(self.lineEditMaxAcceptableTotalDifficulty.text()) == 0
): ):
if self.config.get( if self.config.get(
'bitmessagesettings', 'maxacceptablenoncetrialsperbyte' 'bitmessagesettings', 'maxacceptablenoncetrialsperbyte'
) != str(int( ) != str(int(
float(self.lineEditMaxAcceptableTotalDifficulty.text()) float(self.lineEditMaxAcceptableTotalDifficulty.text())
* defaults.networkDefaultProofOfWorkNonceTrialsPerByte) * defaults.networkDefaultProofOfWorkNonceTrialsPerByte)):
):
# the user changed the max acceptable total difficulty # the user changed the max acceptable total difficulty
acceptableDifficultyChanged = True acceptableDifficultyChanged = True
self.config.set( self.config.set(
@ -447,15 +446,14 @@ class SettingsDialog(QtGui.QDialog):
* defaults.networkDefaultProofOfWorkNonceTrialsPerByte)) * defaults.networkDefaultProofOfWorkNonceTrialsPerByte))
) )
if ( if (
float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) >= 1 float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) >= 1
or float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) == 0 or float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) == 0
): ):
if self.config.get( if self.config.get(
'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes' 'bitmessagesettings', 'maxacceptablepayloadlengthextrabytes'
) != str(int( ) != str(int(
float(self.lineEditMaxAcceptableSmallMessageDifficulty.text()) float(self.lineEditMaxAcceptableSmallMessageDifficulty.text())
* defaults.networkDefaultPayloadLengthExtraBytes) * defaults.networkDefaultPayloadLengthExtraBytes)):
):
# the user changed the max acceptable small message difficulty # the user changed the max acceptable small message difficulty
acceptableDifficultyChanged = True acceptableDifficultyChanged = True
self.config.set( self.config.set(
@ -540,8 +538,8 @@ class SettingsDialog(QtGui.QDialog):
self.parent.updateStartOnLogon() self.parent.updateStartOnLogon()
if ( if (
state.appdata != paths.lookupExeFolder() state.appdata != paths.lookupExeFolder()
and self.checkBoxPortableMode.isChecked() and self.checkBoxPortableMode.isChecked()
): ):
# If we are NOT using portable mode now but the user selected # If we are NOT using portable mode now but the user selected
# that we should... # that we should...
@ -563,8 +561,8 @@ class SettingsDialog(QtGui.QDialog):
pass pass
if ( if (
state.appdata == paths.lookupExeFolder() state.appdata == paths.lookupExeFolder()
and not self.checkBoxPortableMode.isChecked() and not self.checkBoxPortableMode.isChecked()
): ):
# If we ARE using portable mode now but the user selected # If we ARE using portable mode now but the user selected
# that we shouldn't... # that we shouldn't...

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Sound Module"""
# sound type constants # sound type constants
SOUND_NONE = 0 SOUND_NONE = 0
@ -12,10 +13,12 @@ SOUND_CONNECTION_GREEN = 5
# returns true if the given sound category is a connection sound # returns true if the given sound category is a connection sound
# rather than a received message sound # rather than a received message sound
def is_connection_sound(category): def is_connection_sound(category):
"""Check if sound type is related to connectivity"""
return category in ( return category in (
SOUND_CONNECTED, SOUND_CONNECTED,
SOUND_DISCONNECTED, SOUND_DISCONNECTED,
SOUND_CONNECTION_GREEN SOUND_CONNECTION_GREEN
) )
extensions = ('wav', 'mp3', 'oga') extensions = ('wav', 'mp3', 'oga')

View File

@ -88,7 +88,7 @@ def createAddressIfNeeded(myapp):
if not checkHasNormalAddress(): if not checkHasNormalAddress():
queues.addressGeneratorQueue.put(( queues.addressGeneratorQueue.put((
'createRandomAddress', 4, 1, 'createRandomAddress', 4, 1,
SUPPORT_MY_LABEL.toUtf8(), str(SUPPORT_MY_LABEL.toUtf8()),
1, "", False, 1, "", False,
defaults.networkDefaultProofOfWorkNonceTrialsPerByte, defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
defaults.networkDefaultPayloadLengthExtraBytes defaults.networkDefaultPayloadLengthExtraBytes

View File

@ -0,0 +1,6 @@
"""bitmessageqt tests"""
from main import TestMain
from support import TestSupport
__all__ = ["TestMain", "TestSupport"]

View File

@ -0,0 +1,30 @@
"""Common definitions for bitmessageqt tests"""
import unittest
from PyQt4 import QtCore, QtGui
import bitmessageqt
from tr import _translate
class TestBase(unittest.TestCase):
"""Base class for bitmessageqt test case"""
def setUp(self):
self.app = QtGui.QApplication([])
self.window = bitmessageqt.MyForm()
def tearDown(self):
self.app.deleteLater()
class TestMain(unittest.TestCase):
"""Test case for main window - basic features"""
def test_translate(self):
"""Check the results of _translate() with various args"""
self.assertIsInstance(
_translate("MainWindow", "Test"),
QtCore.QString
)

View File

@ -0,0 +1,33 @@
# from PyQt4 import QtTest
import sys
from shared import isAddressInMyAddressBook
from main import TestBase
class TestSupport(TestBase):
"""A test case for support module"""
SUPPORT_ADDRESS = 'BM-2cUdgkDDAahwPAU6oD2A7DnjqZz3hgY832'
SUPPORT_SUBJECT = 'Support request'
def test(self):
"""trigger menu action "Contact Support" and check the result"""
ui = self.window.ui
self.assertEqual(ui.lineEditTo.text(), '')
self.assertEqual(ui.lineEditSubject.text(), '')
ui.actionSupport.trigger()
self.assertTrue(
isAddressInMyAddressBook(self.SUPPORT_ADDRESS))
self.assertEqual(
ui.tabWidget.currentIndex(), ui.tabWidget.indexOf(ui.send))
self.assertEqual(
ui.lineEditTo.text(), self.SUPPORT_ADDRESS)
self.assertEqual(
ui.lineEditSubject.text(), self.SUPPORT_SUBJECT)
self.assertIn(
sys.version, ui.textEditMessage.toPlainText())

View File

@ -30,7 +30,6 @@ try:
except ImportError: except ImportError:
stem_version = None stem_version = None
knownnodes_file = os.path.join(state.appdata, 'knownnodes.dat') knownnodes_file = os.path.join(state.appdata, 'knownnodes.dat')
@ -245,7 +244,14 @@ class TestCore(unittest.TestCase):
def run(): def run():
"""Starts all tests defined in this module""" """Starts all tests defined in this module"""
loader = unittest.TestLoader() loader = unittest.defaultTestLoader
loader.sortTestMethodsUsing = None loader.sortTestMethodsUsing = None
suite = loader.loadTestsFromTestCase(TestCore) suite = loader.loadTestsFromTestCase(TestCore)
try:
import bitmessageqt.tests
except ImportError:
pass
else:
qt_tests = loader.loadTestsFromModule(bitmessageqt.tests)
suite.addTests(qt_tests)
return unittest.TextTestRunner(verbosity=2).run(suite) return unittest.TextTestRunner(verbosity=2).run(suite)