diff --git a/.buildbot/kivy/test.sh b/.buildbot/kivy/test.sh index 429db9d0..3231f250 100755 --- a/.buildbot/kivy/test.sh +++ b/.buildbot/kivy/test.sh @@ -1,3 +1,4 @@ #!/bin/bash +export INSTALL_TESTS=True xvfb-run --server-args="-screen 0, 720x1280x24" python3 tests-kivy.py diff --git a/setup.py b/setup.py index 5e0386d8..3bd0d29e 100644 --- a/setup.py +++ b/setup.py @@ -84,7 +84,7 @@ if __name__ == "__main__": ) if os.environ.get('INSTALL_TESTS', False): - packages.extend(['pybitmessage.mock', 'pybitmessage.backend']) + packages.extend(['pybitmessage.mock', 'pybitmessage.backend', 'pybitmessage.bitmessagekivy.tests']) # this will silently accept alternative providers of msgpack # if they are already installed diff --git a/src/backend/address_generator.py b/src/backend/address_generator.py index 39220e01..312c313b 100644 --- a/src/backend/address_generator.py +++ b/src/backend/address_generator.py @@ -2,9 +2,9 @@ Common methods and functions for kivy and qt. """ -import queues -from bmconfigparser import config -from defaults import ( +from pybitmessage import queues +from pybitmessage.bmconfigparser import config +from pybitmessage.defaults import ( networkDefaultProofOfWorkNonceTrialsPerByte, networkDefaultPayloadLengthExtraBytes ) diff --git a/src/bitmessagekivy/main.kv b/src/bitmessagekivy/main.kv index 99aacdd0..e92a2b23 100644 --- a/src/bitmessagekivy/main.kv +++ b/src/bitmessagekivy/main.kv @@ -212,12 +212,6 @@ MDNavigationLayout: id:sc6 Random: id:id_newidentity - Payment: - id:id_payment - MailDetail: - id:sc14 - ShowQRCode: - id:id_showqrcode MDNavigationDrawer: id: nav_drawer diff --git a/src/bitmessagekivy/mpybit.py b/src/bitmessagekivy/mpybit.py index d9a4665e..1cff0b2e 100644 --- a/src/bitmessagekivy/mpybit.py +++ b/src/bitmessagekivy/mpybit.py @@ -1,6 +1,6 @@ -# pylint: disable=unused-import, too-many-public-methods, unused-variable, too-many-ancestors -# pylint: disable=no-name-in-module, too-few-public-methods, import-error, unused-argument -# pylint: disable=attribute-defined-outside-init, global-variable-not-assigned, too-many-instance-attributes +# pylint: disable=too-many-public-methods, unused-variable, too-many-ancestors +# pylint: disable=no-name-in-module, too-few-public-methods, unused-argument +# pylint: disable=attribute-defined-outside-init, too-many-instance-attributes """ Bitmessage android(mobile) interface @@ -10,6 +10,7 @@ import os import logging import sys from functools import partial +from PIL import Image as PilImage from kivy.clock import Clock from kivy.lang import Builder @@ -39,6 +40,7 @@ from pybitmessage.bitmessagekivy.baseclass.common import toast, load_image_path, from pybitmessage.bitmessagekivy.load_kivy_screens_data import load_screen_json from pybitmessage.bitmessagekivy.baseclass.popup import AddAddressPopup +from pybitmessage.bitmessagekivy.baseclass.login import * # noqa: F401, F403 logger = logging.getLogger('default') @@ -90,8 +92,13 @@ class NavigateApp(MDApp): window_size = kivy_state.screen_density tr = Lang("en") # for changing in franch replace en with fr + if os.environ.get('INSTALL_TESTS', False): + # Set kivy app resolution while running kivy tests + window_size = (720, 1280) + def __init__(self): super(NavigateApp, self).__init__() + # workaround for relative imports sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) self.data_screens, self.all_data, self.data_screen_dict, response = load_screen_json() self.kivy_state_obj = KivyStateVariables() @@ -164,18 +171,12 @@ class NavigateApp(MDApp): def savecontact(self, instance): """Method is used for saving contacts""" - pupup_obj = self.add_popup.content_cls - label = pupup_obj.ids.label.text.strip() - address = pupup_obj.ids.address.text.strip() - if label == '' and address == '': - pupup_obj.ids.label.focus = True - pupup_obj.ids.address.focus = True - elif address == '': - pupup_obj.ids.address.focus = True - elif label == '': - pupup_obj.ids.label.focus = True - else: - pupup_obj.ids.address.focus = True + popup_obj = self.add_popup.content_cls + label = popup_obj.ids.label.text.strip() + address = popup_obj.ids.address.text.strip() + popup_obj.ids.label.focus = not label + # default focus on address field + popup_obj.ids.address.focus = label or not address def close_pop(self, instance): """Close the popup""" @@ -233,6 +234,7 @@ class NavigateApp(MDApp): self.file_manager.previous = False self.file_manager.current_path = '/' if platform == 'android': + # pylint: disable=import-error from android.permissions import request_permissions, Permission, check_permission if check_permission(Permission.WRITE_EXTERNAL_STORAGE) and \ check_permission(Permission.READ_EXTERNAL_STORAGE): @@ -247,21 +249,21 @@ class NavigateApp(MDApp): def select_path(self, path): """This method is used to set the select image""" try: - from PIL import Image as PilImage newImg = PilImage.open(path).resize((300, 300)) if platform == 'android': android_path = os.path.join( - os.environ['ANDROID_PRIVATE'] + '/app' + '/images' + '/kivy/') - if not os.path.exists(android_path + '/default_identicon/'): - os.makedirs(android_path + '/default_identicon/') - newImg.save('{1}/default_identicon/{0}.png'.format( - self.kivy_state_obj.association, android_path) + os.path.join(os.environ['ANDROID_PRIVATE'], 'app', 'images', 'kivy') + ) + if not os.path.exists(os.path.join(android_path, 'default_identicon')): + os.makedirs(os.path.join(android_path, 'default_identicon')) + newImg.save(os.path.join(android_path, 'default_identicon', '{}.png'.format( + self.kivy_state_obj.association)) ) else: - if not os.path.exists(self.image_dir + '/default_identicon/'): - os.makedirs(self.image_dir + '/default_identicon/') - newImg.save(self.image_dir + '/default_identicon/{0}.png'.format( - self.kivy_state_obj.association) + if not os.path.exists(os.path.join(self.image_dir, 'default_identicon')): + os.makedirs(os.path.join(self.image_dir, 'default_identicon')) + newImg.save(os.path.join(self.image_dir, 'default_identicon', '{0}.png'.format( + self.kivy_state_obj.association)) ) self.load_selected_Image(self.kivy_state_obj.association) toast('Image changed') @@ -277,7 +279,7 @@ class NavigateApp(MDApp): def load_selected_Image(self, curerentAddr): """This method load the selected image on screen""" top_box_obj = self.root.ids.content_drawer.ids.top_box.children[0] - top_box_obj.source = self.image_dir + '/default_identicon/{0}.png'.format(curerentAddr) + top_box_obj.source = os.path.join(self.image_dir, 'default_identicon', '{0}.png'.format(curerentAddr)) self.root.ids.content_drawer.ids.reset_image.opacity = 1 self.root.ids.content_drawer.ids.reset_image.disabled = False top_box_obj.reload() @@ -285,8 +287,8 @@ class NavigateApp(MDApp): def rest_default_avatar_img(self): """set default avatar generated image""" self.set_identicon(self.kivy_state_obj.association) - img_path = self.image_dir + '/default_identicon/{}.png'.format( - self.kivy_state_obj.association + img_path = os.path.join( + self.image_dir, 'default_identicon', '{}.png'.format(self.kivy_state_obj.association) ) try: if os.path.exists(img_path): @@ -303,14 +305,18 @@ class NavigateApp(MDApp): first_addr = self.identity_list[0] if config.getboolean(str(first_addr), 'enabled'): if os.path.exists( - self.image_dir + '/default_identicon/{}.png'.format(first_addr) + os.path.join( + self.image_dir, 'default_identicon', '{}.png'.format(first_addr) + ) ): - return self.image_dir + '/default_identicon/{}.png'.format(first_addr) + return os.path.join( + self.image_dir, 'default_identicon', '{}.png'.format(first_addr) + ) else: img = identiconGeneration.generate(first_addr) instance.texture = img.texture return - return self.image_dir + '/drawer_logo1.png' + return os.path.join(self.image_dir, 'drawer_logo1.png') def reset_login_screen(self): """This method is used for clearing the widgets of random screen""" @@ -334,5 +340,4 @@ class PaymentMethodLayout(BoxLayout): if __name__ == '__main__': - # workaround for relative imports NavigateApp().run() diff --git a/src/bitmessagekivy/screens_data.json b/src/bitmessagekivy/screens_data.json index 06398463..4628ef8e 100644 --- a/src/bitmessagekivy/screens_data.json +++ b/src/bitmessagekivy/screens_data.json @@ -1,25 +1,6 @@ { - "Address Book": { - "kv_string": "addressbook", - "name_screen": "addressbook", - "Import": "from pybitmessage.bitmessagekivy.baseclass.addressbook import AddressBook" - }, - "Payment": { - "kv_string": "payment", - "name_screen": "payment", - "Import": "from pybitmessage.bitmessagekivy.baseclass.payment import Payment" - }, - "MailDetail": { - "kv_string": "maildetail", - "name_screen": "mailDetail", - "Import": "from pybitmessage.bitmessagekivy.baseclass.maildetail import MailDetail" - }, "Login": { "kv_string": "login", "Import": "from pybitmessage.bitmessagekivy.baseclass.login import *" - }, - "Qrcode": { - "kv_string": "qrcode", - "Import": "from pybitmessage.bitmessagekivy.baseclass.qrcode import ShowQRCode" } } diff --git a/src/bitmessagekivy/tests/test_load_screen_data_file.py b/src/bitmessagekivy/tests/test_load_screen_data_file.py index 0a7556d0..619daf25 100644 --- a/src/bitmessagekivy/tests/test_load_screen_data_file.py +++ b/src/bitmessagekivy/tests/test_load_screen_data_file.py @@ -1,21 +1,18 @@ import unittest from pybitmessage.bitmessagekivy.load_kivy_screens_data import load_screen_json -from .common import skip_screen_checks from .common import ordered class TestLoadScreenData(unittest.TestCase): """Screen Data Json test""" - @skip_screen_checks @ordered def test_load_json(self): """Test to load a valid json""" loaded_screen_names = load_screen_json() - self.assertEqual(loaded_screen_names[2], 'success') + self.assertEqual(loaded_screen_names[3], 'success') - @skip_screen_checks @ordered def test_load_invalid_file(self): """Test to load an invalid json""" diff --git a/tests-kivy.py b/tests-kivy.py index 43132652..c5e3dcd0 100644 --- a/tests-kivy.py +++ b/tests-kivy.py @@ -35,6 +35,7 @@ if __name__ == "__main__": ]) sleep(2) # let ffmpeg start result = unittest.TextTestRunner(verbosity=2).run(unittest_discover()) + sleep(1) if in_docker: ffmpeg.terminate() try: