From 10ef5309f125034f88db1494a6f7fd2e631d76d9 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Tue, 7 Feb 2017 22:20:55 -0500 Subject: [PATCH 01/19] Recipe object is now largely process-safe. On Ubuntu systems, Openroast could not automatically moving to the next roasting step in the recipe because the Recipe object is accessed from multiple processes, and the data in the object needed to reside in shared memory. --- openroast/controllers/recipe.py | 94 ++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 31 deletions(-) diff --git a/openroast/controllers/recipe.py b/openroast/controllers/recipe.py index 5f151f7..12e9b06 100644 --- a/openroast/controllers/recipe.py +++ b/openroast/controllers/recipe.py @@ -3,77 +3,102 @@ import json import openroast - +from multiprocessing import sharedctypes, Array +import ctypes class Recipe(object): - def __init__(self): - self.currentRecipeStep = 0 + def __init__(self, max_recipe_size_bytes=64*1024): + # this object is accessed by multiple processes, in part because + # freshroastsr700 calls Recipe.move_to_next_section() from a + # child process. Therefore, all data shandling must be process-safe. + # recipe step currently being applied + self.currentRecipeStep = sharedctypes.Value('i', 0) # Stores recipe - self.recipe = {} + # Here, we need shared memory to store the recipe. + # Tried multiprocessing.Manager, wasn't very successful with that, + # resortign to allocating a fixed-size large buffer to store JSON + # string. This Array needs to live for the lifetime of the object. + self.recipe_str = Array(ctypes.c_char, max_recipe_size_bytes) # Tells if a recipe has been loaded - self.recipeLoaded = False + self.recipeLoaded = sharedctypes.Value('i', 0) # boolean + + def _recipe(self): + # retrieve the recipe as a JSON string in shared memory + # needed to allow freshroastsr700 to access recipe from + # its child process + if self.recipeLoaded.value: + return json.loads(self.recipe_str.value.decode('utf_8')) + else: + return {} def load_recipe_json(self, recipeJson): - self.recipe = recipeJson - self.recipeLoaded = True + # recipeJson is actually a dict... + self.recipe_str.value = json.dumps(recipeJson).encode('utf_8') + self.recipeLoaded.value = 1 def load_recipe_file(self, recipeFile): # Load recipe file recipeFileHandler = open(recipeFile) - self.recipe = json.load(recipeFileHandler) + recipe_dict = json.load(recipeFileHandler) recipeFileHandler.close() - self.recipeLoaded = True + self.load_recipe_json(recipe_dict) def clear_recipe(self): - self.recipeLoaded = False - self.recipe = {} - self.currentRecipeStep = 0 + self.recipeLoaded.value = 0 + self.recipe_str.value = ''.encode('utf_8') + self.currentRecipeStep.value = 0 def check_recipe_loaded(self): - return self.recipeLoaded + return self.recipeLoaded.value != 0 def get_num_recipe_sections(self): - return len(self.recipe["steps"]) + return len(self._recipe()["steps"]) def get_current_step_number(self): - return self.currentRecipeStep + return self.currentRecipeStep.value def get_current_fan_speed(self): - return self.recipe["steps"][self.currentRecipeStep]["fanSpeed"] + crnt_step = self.currentRecipeStep.value + return self._recipe()["steps"][crnt_step]["fanSpeed"] def get_current_target_temp(self): - if(self.recipe["steps"][self.currentRecipeStep].get("targetTemp")): - return self.recipe["steps"][self.currentRecipeStep]["targetTemp"] + crnt_step = self.currentRecipeStep.value + if(self._recipe()["steps"][crnt_step].get("targetTemp")): + return self._recipe()["steps"][crnt_step]["targetTemp"] else: return 150 def get_current_section_time(self): - return self.recipe["steps"][self.currentRecipeStep]["sectionTime"] + crnt_step = self.currentRecipeStep.value + return self._recipe()["steps"][crnt_step]["sectionTime"] def restart_current_recipe(self): - self.currentRecipeStep = 0 + self.currentRecipeStep.value = 0 self.load_current_section() def more_recipe_sections(self): - if(len(self.recipe["steps"]) - self.currentRecipeStep == 0): + if not self.check_recipe_loaded(): + return False + if(len(self._recipe()["steps"]) - self.currentRecipeStep.value == 0): return False else: return True def get_current_cooling_status(self): - if(self.recipe["steps"][self.currentRecipeStep].get("cooling")): - return self.recipe["steps"][self.currentRecipeStep]["cooling"] + crnt_step = self.currentRecipeStep.value + if(self._recipe()["steps"][crnt_step].get("cooling")): + return self._recipe()["steps"][crnt_step]["cooling"] else: return False def get_section_time(self, index): - return self.recipe["steps"][index]["sectionTime"] + return self._recipe()["steps"][index]["sectionTime"] def get_section_temp(self, index): - if(self.recipe["steps"][index].get("targetTemp")): - return self.recipe["steps"][index]["targetTemp"] + if(self._recipe()["steps"][index].get("targetTemp")): + return self._recipe()["steps"][index]["targetTemp"] else: return 150 @@ -87,7 +112,8 @@ def set_roaster_settings(self, targetTemp, fanSpeed, sectionTime, cooling): openroast.roaster.cool() # Prevent the roaster from starting when section time = 0 (ex clear) - if(not cooling and sectionTime > 0 and self.currentRecipeStep > 0): + if(not cooling and sectionTime > 0 and + self.currentRecipeStep.value > 0): openroast.roaster.roast() openroast.roaster.target_temp = targetTemp @@ -101,15 +127,21 @@ def load_current_section(self): self.get_current_cooling_status()) def move_to_next_section(self): + # this gets called from freshroastsr700's timer process, which + # is spawned using multiprocessing. Therefore, all things + # accessed in theis function must be process-safe if self.check_recipe_loaded(): - if (self.currentRecipeStep + 1) >= self.get_num_recipe_sections(): + if( + (self.currentRecipeStep.value + 1) >= + self.get_num_recipe_sections()): openroast.roaster.idle() else: - self.currentRecipeStep += 1 + self.currentRecipeStep.value += 1 self.load_current_section() - openroast.window.roast.update_controllers() + openroast.window.roast.update_controllers() # TODO - check for + # process-safe else: openroast.roaster.idle() def get_current_recipe(self): - return self.recipe + return self._recipe() From 644351efefd16ede99162ae31e06444cf03bcf3e Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Tue, 7 Feb 2017 22:43:09 -0500 Subject: [PATCH 02/19] Comment spelling review. --- openroast/controllers/recipe.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/openroast/controllers/recipe.py b/openroast/controllers/recipe.py index 12e9b06..88d83da 100644 --- a/openroast/controllers/recipe.py +++ b/openroast/controllers/recipe.py @@ -10,14 +10,14 @@ class Recipe(object): def __init__(self, max_recipe_size_bytes=64*1024): # this object is accessed by multiple processes, in part because # freshroastsr700 calls Recipe.move_to_next_section() from a - # child process. Therefore, all data shandling must be process-safe. + # child process. Therefore, all data handling must be process-safe. # recipe step currently being applied self.currentRecipeStep = sharedctypes.Value('i', 0) # Stores recipe - # Here, we need shared memory to store the recipe. + # Here, we need to use shared memory to store the recipe. # Tried multiprocessing.Manager, wasn't very successful with that, - # resortign to allocating a fixed-size large buffer to store JSON + # resorting to allocating a fixed-size, large buffer to store a JSON # string. This Array needs to live for the lifetime of the object. self.recipe_str = Array(ctypes.c_char, max_recipe_size_bytes) @@ -25,8 +25,8 @@ def __init__(self, max_recipe_size_bytes=64*1024): self.recipeLoaded = sharedctypes.Value('i', 0) # boolean def _recipe(self): - # retrieve the recipe as a JSON string in shared memory - # needed to allow freshroastsr700 to access recipe from + # retrieve the recipe as a JSON string in shared memory. + # needed to allow freshroastsr700 to access Recipe from # its child process if self.recipeLoaded.value: return json.loads(self.recipe_str.value.decode('utf_8')) @@ -54,6 +54,8 @@ def check_recipe_loaded(self): return self.recipeLoaded.value != 0 def get_num_recipe_sections(self): + if not self.check_recipe_loaded(): + return 0 return len(self._recipe()["steps"]) def get_current_step_number(self): @@ -129,7 +131,7 @@ def load_current_section(self): def move_to_next_section(self): # this gets called from freshroastsr700's timer process, which # is spawned using multiprocessing. Therefore, all things - # accessed in theis function must be process-safe + # accessed in this function must be process-safe! if self.check_recipe_loaded(): if( (self.currentRecipeStep.value + 1) >= From 7269a818e1287f87a66cac57733520dd6831703b Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 21:07:52 -0500 Subject: [PATCH 03/19] Fixed target temp and fan level updates at recipe section boundaries on Ubuntu. --- openroast/controllers/recipe.py | 3 +-- openroast/views/roasttab.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/openroast/controllers/recipe.py b/openroast/controllers/recipe.py index 88d83da..e8596c9 100644 --- a/openroast/controllers/recipe.py +++ b/openroast/controllers/recipe.py @@ -140,8 +140,7 @@ def move_to_next_section(self): else: self.currentRecipeStep.value += 1 self.load_current_section() - openroast.window.roast.update_controllers() # TODO - check for - # process-safe + openroast.window.roast.schedule_update_controllers() else: openroast.roaster.idle() diff --git a/openroast/views/roasttab.py b/openroast/views/roasttab.py index 18e3490..1a37c05 100644 --- a/openroast/views/roasttab.py +++ b/openroast/views/roasttab.py @@ -6,6 +6,7 @@ import math import datetime import openroast +from multiprocessing import sharedctypes from PyQt5 import QtCore from PyQt5 import QtWidgets @@ -34,6 +35,10 @@ def __init__(self): self.timer.timeout.connect(self.update_data) self.timer.start() + # Create a shared memory flag for scheduling the occasional call to + # update_controllers() from the the timer. + self._schedule_controller_update_flag = sharedctypes.Value('i', 0) + # Set the roast tab diabled when starting. self.setEnabled(False) @@ -104,6 +109,12 @@ def update_data(self): self.connectionStatusLabel.setHidden(False) self.setEnabled(False) + # if openroast.roaster has moved the recipe to the next section, + # update the controller-related info onscreen. + if(self._schedule_controller_update_flag.value): + self._schedule_controller_update_flag.value=0 + self.update_controllers() + def create_right_pane(self): rightPane = QtWidgets.QVBoxLayout() @@ -444,5 +455,17 @@ def update_controllers(self): self.update_target_temp() self.update_fan_info() + def schedule_update_controllers(self): + """This is designed to be called from other processes. Currently, + the openroast.roaster instance calls this function from a + child process. This object's timer routine (which periodically + calls update_data()) will pick up this flag at the next timer tick + and call update_controllers() at that time. + Alternately, we could have set up a complicated system to + support calling into the Pyqt app from a separate process - this + is easier, at the expense of being not quite immediate, graphically. + """ + self._schedule_controller_update_flag.value = 1 + def get_recipe_object(self): return openroast.recipes From 4228c8644f61234873034c70519d0ad26c86f8ac Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 22:23:05 -0500 Subject: [PATCH 04/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d4326cb..80ba436 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,8 @@ python: # command to install dependencies sudo: required install: - - "pip install -r requirements.txt" + - apt-get update + - apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev + - "pip3 install -r requirements.txt" # command to run tests script: nosetests From 6b3853b64a626a7bc7fa6c07c56debaaa3157943 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 22:33:19 -0500 Subject: [PATCH 05/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 80ba436..94612da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ python: # command to install dependencies sudo: required install: - - apt-get update - - apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev + - sudo apt-get update + - sudo apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev - "pip3 install -r requirements.txt" # command to run tests script: nosetests From d1cc1675a72b5832d2b42ef5b6eee8e514e0a1d5 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 22:47:54 -0500 Subject: [PATCH 06/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 3. --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94612da..3a7f0ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,7 @@ python: # command to install dependencies sudo: required install: - - sudo apt-get update - - sudo apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev + - sudo pip3 install python-qt5 - "pip3 install -r requirements.txt" # command to run tests script: nosetests From f9a889fe481952279f1359c6bcfcc386f3a7fb4f Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:07:11 -0500 Subject: [PATCH 07/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 4. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3a7f0ff..8c43681 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: # command to install dependencies sudo: required install: - - sudo pip3 install python-qt5 + - pip3 install python-qt5 - "pip3 install -r requirements.txt" # command to run tests script: nosetests From 61d888589e11cd2bfd3f45f0d09357e12f0e8960 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:20:10 -0500 Subject: [PATCH 08/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 5. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8c43681..3a7f0ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: # command to install dependencies sudo: required install: - - pip3 install python-qt5 + - sudo pip3 install python-qt5 - "pip3 install -r requirements.txt" # command to run tests script: nosetests From f98720aa6f70752d94773f0dcf021cb8ec36013e Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:31:05 -0500 Subject: [PATCH 09/19] Revert "Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 5." This reverts commit 61d888589e11cd2bfd3f45f0d09357e12f0e8960. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3a7f0ff..8c43681 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: # command to install dependencies sudo: required install: - - sudo pip3 install python-qt5 + - pip3 install python-qt5 - "pip3 install -r requirements.txt" # command to run tests script: nosetests From 8759b3c2f62120e63fe9a6a7d3487e7052c30b18 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:31:47 -0500 Subject: [PATCH 10/19] Revert "Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 4." This reverts commit f9a889fe481952279f1359c6bcfcc386f3a7fb4f. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8c43681..3a7f0ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: # command to install dependencies sudo: required install: - - pip3 install python-qt5 + - sudo pip3 install python-qt5 - "pip3 install -r requirements.txt" # command to run tests script: nosetests From 358b412e3af347e2a0261193260bdc3a72183618 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:32:21 -0500 Subject: [PATCH 11/19] Revert "Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 3." This reverts commit d1cc1675a72b5832d2b42ef5b6eee8e514e0a1d5. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3a7f0ff..94612da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,8 @@ python: # command to install dependencies sudo: required install: - - sudo pip3 install python-qt5 + - sudo apt-get update + - sudo apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev - "pip3 install -r requirements.txt" # command to run tests script: nosetests From 0f02c8bdf26ec7af7054c2689a6805628373e74b Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:32:41 -0500 Subject: [PATCH 12/19] Revert "Proposing a change to .travis.yml to deliberately include PyQt5 for testing." This reverts commit 6b3853b64a626a7bc7fa6c07c56debaaa3157943. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 94612da..80ba436 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ python: # command to install dependencies sudo: required install: - - sudo apt-get update - - sudo apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev + - apt-get update + - apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev - "pip3 install -r requirements.txt" # command to run tests script: nosetests From 72ccdabee6c3b264888a1a18c727c3f516ac517a Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:33:02 -0500 Subject: [PATCH 13/19] Revert "Proposing a change to .travis.yml to deliberately include PyQt5 for testing." This reverts commit 4228c8644f61234873034c70519d0ad26c86f8ac. --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 80ba436..d4326cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,6 @@ python: # command to install dependencies sudo: required install: - - apt-get update - - apt-get -y install python3-pyqt5 python3-pip libfreetype6 libfreetype6-dev - - "pip3 install -r requirements.txt" + - "pip install -r requirements.txt" # command to run tests script: nosetests From 83e6b8181d25915eee985e1f509ad3e8e60de77b Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:49:00 -0500 Subject: [PATCH 14/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 6. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index d4326cb..fc7cc97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,8 @@ python: - "3.4" # command to install dependencies sudo: required +before_install: + - sudo apt-get install python-qt5 install: - "pip install -r requirements.txt" # command to run tests From 911e92cfa5d69f4ae91b9705e674cfd758ddd008 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:51:04 -0500 Subject: [PATCH 15/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 7. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fc7cc97..04c0e6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ python: # command to install dependencies sudo: required before_install: - - sudo apt-get install python-qt5 + - apt-get install python-qt5 install: - "pip install -r requirements.txt" # command to run tests From d7d4c7296f50e84123646f98253a3408cf46e782 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Thu, 9 Feb 2017 23:59:00 -0500 Subject: [PATCH 16/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 8. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 04c0e6d..9bb34a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,9 @@ python: - "3.4" # command to install dependencies sudo: required +dist: trusty before_install: - - apt-get install python-qt5 + - sudo apt-get -y install python-qt5 install: - "pip install -r requirements.txt" # command to run tests From 935b710b3124690df0142fc0875afa654fc22c9b Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Fri, 10 Feb 2017 00:03:15 -0500 Subject: [PATCH 17/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 9. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9bb34a0..f2cf380 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ python: sudo: required dist: trusty before_install: - - sudo apt-get -y install python-qt5 + - sudo apt-get -y install python3-pip python3-qt5 libfreetype6 libfreetype6-dev install: - "pip install -r requirements.txt" # command to run tests From e6bd4e43cb3443dc5f968f0bf6a716a1ad325748 Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Fri, 10 Feb 2017 00:07:53 -0500 Subject: [PATCH 18/19] Proposing a change to .travis.yml to deliberately include PyQt5 for testing. Take 10, I wish it was easier to test this offline... --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index f2cf380..050ca36 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ python: sudo: required dist: trusty before_install: + - sudo apt-get update - sudo apt-get -y install python3-pip python3-qt5 libfreetype6 libfreetype6-dev install: - "pip install -r requirements.txt" From eaa7f617536e0523984ff9c04426d0ba5adbfc9b Mon Sep 17 00:00:00 2001 From: "Alan@int3ll3ct" Date: Fri, 10 Feb 2017 16:14:51 -0500 Subject: [PATCH 19/19] Removed .travis.yml, as Travis CI cannot easily deal with python3-qt5 package (it's not a whitelisted package in the Travis CI system). --- .travis.yml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 050ca36..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: python -python: - - "3.4" -# command to install dependencies -sudo: required -dist: trusty -before_install: - - sudo apt-get update - - sudo apt-get -y install python3-pip python3-qt5 libfreetype6 libfreetype6-dev -install: - - "pip install -r requirements.txt" -# command to run tests -script: nosetests