diff --git a/.appveyor.yml b/.appveyor.yml index da2ea31..8cfadbc 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -18,9 +18,13 @@ test_script: # build is done in build_script build: off build_script: - - python build.py bdist_msi + # build exe file using pyinstaller from main run script + - IF "%PYTHON_VERSION%"=="3.5" ( + pip install pyinstaller && + pyinstaller --onefile --windowed --name=auxiclean_windows run.py + ) artifacts: - - path: auxiclean_windows.zip + - path: dist/auxiclean_windows.exe name: auxiclean_windows # deploy only when making a new release on master branch @@ -35,7 +39,9 @@ deploy: auth_token: secure: x2ous7RX857j64h4DSkiEBCSU8kUQYCL31UBrPLUSgosixVS/XDXGA6TWr0DLPm9 artifact: auxiclean_windows - draft: true on: - branch: master + branch: + - master + - test_deploy appveyor_repo_tag: true + PYTHON_VERSION: 3.5 diff --git a/.gitignore b/.gitignore index 967245b..22383ce 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ # Python files ############## build +*.spec dist *.egg-info .eggs diff --git a/.travis.yml b/.travis.yml index fdfd053..bd191b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,27 @@ fast_finish: true -env: - matrix: - - PYTHON_VERSION=3.5 - - PYTHON_VERSION=3.6 -language: generic # since we use miniconda everywhere -os: - - linux - - osx -## only launch CI on those branches -branches: - only: - - master - - develop - - test_deploy +language: python +# use matrix implementation for osx build +# this is needed to use the language:generic +env: DEPLOY_FILE="dist/auxiclean_linux" +matrix: + include: + - os: osx + language: generic + python: 3.5 + env: + - TRAVIS_PYTHON_VERSION=3.5 + - DEPLOY_FILE="dist/auxiclean_osx.zip" + + - os: osx + language: generic + python: 3.6 + env: + - TRAVIS_PYTHON_VERSION=3.6 + - DEPLOY_FILE="dist/auxiclean_osx.zip" +os: linux +python: + - 3.5 + - 3.6 # we use python from miniconda in order to be able to create virtual environments easily before_install: @@ -27,7 +36,7 @@ before_install: - export PATH="$HOME/miniconda/bin:$PATH" - source $HOME/miniconda/bin/activate - conda update --yes conda - - conda create -q --yes -n test-environment python=$PYTHON_VERSION + - conda create -q --yes -n test-environment python=$TRAVIS_PYTHON_VERSION - source activate test-environment # install auxiclean package install: @@ -37,11 +46,36 @@ script: - python tests.py after_success: # report coverage in coveralls only for linux build with python 3.6 - - if ([[ "$PYTHON_VERSION" == "3.6" ]] && + - if ([[ "$TRAVIS_PYTHON_VERSION" == "3.6" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]); then pip install coveralls; fi - - if ([[ "$PYTHON_VERSION" == "3.6" ]] && + - if ([[ "$TRAVIS_PYTHON_VERSION" == "3.6" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]); then coveralls; fi + +before_deploy: + - if [[ "$TRAVIS_PYTHON_VERSION" == "3.5" ]]; then pip install pyinstaller; fi + # for macos we compress the .app bundle to be able to upload it on github + - if [[ "$TRAVIS_PYTHON_VERSION" == "3.5" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then pyinstaller --onefile --windowed --clean --name=auxiclean_osx run.py; fi + - if [[ "$TRAVIS_PYTHON_VERSION" == "3.5" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then cd dist; fi + - if [[ "$TRAVIS_PYTHON_VERSION" == "3.5" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then zip -r auxiclean_osx.zip auxiclean_osx.app; fi + - if [[ "$TRAVIS_PYTHON_VERSION" == "3.5" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then cd ..; fi + - if [[ "$TRAVIS_PYTHON_VERSION" == "3.5" ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]]; then pyinstaller --onefile --windowed --clean --name=auxiclean_linux run.py; fi + +deploy: + - provider: releases + api_key: + secure: "a1HB75QQK1XKUCNjNdBv7ZT/vn4WV+9PAycEiOgBDWpyi8VqDzeOLIqkoZ6mmXgy7ORztTMYW5QbU/ztIptg+g58JV49rxr2oAFKHweeA3CykkcWuEx4h0/RgSmdHoFbsuZuIYswV5FPFjSaokyd0szcnPBS1Fuo4u4TiPo5xEmMhNVhIKZUmIlqmWZ18yElk2DyTA84zTY86HJaQPjYGKxS7EIZ1q7hfTgBFFRVD4hnoFeP5R1eXfR8TIU0/IgY46AXnrezfLowmsv1XOrS+81sLH7h6LBj/QGI4WujXXT9KWqxtFHiBB9ikapTmL1XSBLA3XeZGe160FyyRhvHUpO1lHrFxFieTYCgMyRgPbGkLrFKIRzy97pHFkSpASX9Jis4Zp1PF2hKvpNaXOn7AwcwD4Wu7Gt7NWLLsGRc7GYumIaVWnL8GT0ZqxaqR3NihXiG8ILytWzcEMF6gTsAvZjKcnio/1I9LFAYI5xti5npZjWMt0/T498UcFVdMIt5en5T+YPgW7rMrswG4WvDdvk3oHtk6ZKSUKibVvAzUfsEMD6BRngTXOEFH7pSUJo8N+leF+UeeuWYScCAVGHf9op0N6eJC4ETImXTtxGDYZ7Tyf0ZEfdesCtzL0rP5IUJbMSUg+DveflbHjm991dxDJQwedvka8TNwmsGeo2Z3kQ=" + file: $DEPLOY_FILE + skip_cleanup: true + on: + tags: true + python: 3.5 + + file: $DEPLOY_FILE + skip_cleanup: true + on: + tags: true + python: 3.5 diff --git a/README.rst b/README.rst index b35ae6f..ab37177 100644 --- a/README.rst +++ b/README.rst @@ -25,21 +25,22 @@ Ce projet fonctionne au moins sur Python version 3.5 et 3.6. Il fonctionne possiblement pour d'autres versions plus grande ou égale à la version 3 de Python mais ne sont pas testées. **Ne fonctionne pas pour Python 2.7 ou inférieur.** -Installation simple (Windows seulement) ---------------------------------------- +Installation simple +------------------- Pour les utilisateurs qui ne sont pas familier avec la programmation et la ligne de commande, il est possible d'installer et utiliser ce projet sans installer d'interpréteur Python. Simplement télécharger le fichier compressé sur la page de la `dernière version disponible `__ sur GitHub. -Il faut télécharger le fichier zip correspondant à la plateforme (pour l'instant uniquement Windows). -Ensuite, décompresser le fichier compressé et le tour est joué! Pour exécuter le programme, il suffit -de cliquer sur le fichier exécutable nommé `auxiclean.exe` et le script s'exécutera tout seul. +Il faut télécharger le fichier correspondant à la plateforme souhaitée. Pour MacOS, le fichier à télécharger +est un fichier zip qu'il faut décompresser avant de pouvoir exécuter le .app. +Pour exécuter le programme, il suffit +de cliquer sur le fichier exécutable téléchargé et le tour est joué! Installation pour Développement ------------------------------- -Pour installer le projet, il faut un interpréteur python 3. +Pour installer le projet de sorte à avoir accès à l'API, il faut un interpréteur python 3. Un bon example est `Miniconda `__ produit par Continuum Analytics. @@ -153,21 +154,28 @@ Et pour exécuter les tests, il suffit d'exécuter le script ``tests.py``:: $ python tests.py +Pour recréer les fichiers exécutables comme sur la page des `releases `__ sur GitHub, +il faut installer **pyinstaller**:: -Fichier Exécutables - Windows ------------------------------ + $ pip install pyinstaller -Il y a un script ``build.py`` qui permet de créer un fichier exécutable -windows pour le script python ``run.py`` (pour une exécution sans ligne de commande). -Il suffit d'exécuter ce script et l'exécutable ``auxiclean.exe`` sera crée sous le -répertoire ``build``. L'argument ``build`` doit être utilisé lorsque ce script est -appelé:: - - $ python build.py bdist_msi - -Si tout s'est bien déroulé, l'exécutable sera crée et il sera possible de rouler -le code simplement en cliquant sur cet exécutable. Il sera possible aussi de créer un -raccourci vers ce fichier exécutable une foix qu'il est crée. +et exécuter la commande:: + + $ pyinstaller --onefile --windowed --clean --name=auxiclean_executable run.py + +Cette commande compilera le fichier `run.py` sous une forme exécutable dépendamment de +la plateforme utilisée. Attention, pyinstaller ne fonctionne pas en python 3.6. Il faut donc exécuter +cette commande soit sous une version de python 3.5 ou inférieure ou soit dans un environnement +virtuel. + +POUR LES ADMINS: lorsqu'un PR est fait, les tests sont roulés à la fois sur Windows (Appveyor) que +sur MacOS et linux (travis). Le code coverage est rapporté avec coveralls, ceci permet de toujours s'assurer +que le code fonctionne après chaque modification. Il est donc important d'écrire des tests en conséquence si +l'API change. De plus, les fichiers exécutables pour chaque release sont compilés et uploadés automatiquement +sur GitHub. Ainsi, dès qu'une nouvelle release est crée, Appveyor s'occupera de créer le fichier exécutable +pour Windows et travis pour MacOS et Linux, pas besoin de les créer manuellement (voir les fichiers +`.travis.yml `__ et +`.appveyor.yml `__ ) Contributeurs ------------- diff --git a/auxiclean/browser.py b/auxiclean/browser.py index e201ea5..da9fb93 100644 --- a/auxiclean/browser.py +++ b/auxiclean/browser.py @@ -2,9 +2,11 @@ from .handler import TextHandler from tkinter import filedialog, scrolledtext from auxiclean import MAINLOGGER +import auxiclean import tkinter as tk import os import logging +import webbrowser class Browser: @@ -12,7 +14,8 @@ def __init__(self, master): self.master = master self.frame = tk.Frame(self.master) self.frame.grid(sticky=tk.E + tk.W) - self.master.title("Auxiclean - GUI") + self.master.title("Auxiclean - GUI - version: %s" % + auxiclean.__version__) # browser logger self.logger = logging.getLogger("auxiclean.browser") self.createMainWindow() @@ -56,6 +59,16 @@ def createMainWindow(self): # Logging configuration MAINLOGGER.addHandler(self.text_handler) + # bug report link (button) + self.bug_report = tk.Label(self.frame, + text="Il y a un bug? Écrivez le ici!", + fg="blue", + cursor="hand2") + self.bug_report.grid(column=0) + self.bug_report.bind("", self.bug_callback) + + def bug_callback(self, event): + webbrowser.open_new(r"https://github.com/physumasso/auxiclean/issues") def run_selector(self): path = self.pathBox.get() diff --git a/build.py b/build.py deleted file mode 100644 index edd377b..0000000 --- a/build.py +++ /dev/null @@ -1,50 +0,0 @@ -import versioneer -import sys -import os -import shutil -from cx_Freeze import setup as setupcx, Executable - - -if sys.platform == "darwin": - # need to find an alternative for mac OS - raise OSError("Build does not work on MacOS because of cx_freeze.") -#if "build" not in sys.argv: -# raise ValueError("Run this script using the 'build' option.") - -base = None -include_files = [] -if sys.platform == "win32": - base = 'Win32GUI' - # there's a bug in cx_freeze for windows while searching for some library - # this manually fixes it. see link below - # https://bitbucket.org/anthony_tuininga/cx_freeze/issues/155/required-environment-variables-tcl_library - - PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) - os.environ["TCL_LIBRARY"] = os.path.join(PYTHON_INSTALL_DIR, "tcl", - "tcl8.6") - os.environ["TK_LIBRARY"] = os.path.join(PYTHON_INSTALL_DIR, "tcl", "tk8.6") - include_files = [os.path.join(PYTHON_INSTALL_DIR, "DLLs", "tk86t.dll"), - os.path.join(PYTHON_INSTALL_DIR, "DLLs", "tcl86t.dll")] - -executables = [Executable("run.py", base=base, targetName="auxiclean.exe")] -version = versioneer.get_version() -short = version.strip("v") -if "+" in version: - short = version[:version.find("+")].strip("v") -setupcx(name="auxiclean", - version=short, - executables=executables, - options={"build_exe": {"include_files": include_files, - "silent": True}}) - -# find directory and zip it -dirs = os.listdir("build") -tozip = None -for d in dirs: - if d.startswith("exe."): - # this is it. - tozip = os.path.join("build", d) - break -if tozip is None: - raise FileNotFoundError("build directory not found") -shutil.make_archive("auxiclean_windows", "zip", tozip) diff --git a/setup.py b/setup.py index d5504a3..f02bfdb 100644 --- a/setup.py +++ b/setup.py @@ -14,9 +14,9 @@ def win_pip_install(package, install_list): # package required install_packages = ["openpyxl", # to manage excel spreadsheets - "cx_freeze", ] + develop_packages = ["nose", "pep8", "coverage"] print("Installing auxiclean, the following packages are required:", install_packages) @@ -28,7 +28,7 @@ def win_pip_install(package, install_list): # if on windows, there is a bug when installing some packages with setuptools. # installing them with pip before setup fixes this. -problematics = ("cx_freeze", "coverage") +problematics = ("coverage", ) if sys.platform == "win32": for problematic in problematics: win_pip_install(problematic, install_packages)