Packaging

Les propositions de correctifs ou d'exercices pour Pyromaths.

Modérateur : Développeurs

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 12 mai 2013, 16:07

Quand elle est appelée avec la commande make app, la fonction clean de Makefile n'efface pas le contenu des dossiers build et dist.
djinn a écrit :J'ai lu pas mal de trucs préconisant la prudence avec -O.
Du coup j'hésite, est-ce que tu aurais un lien pour que je puisse me faire mon opinion ?

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 12 mai 2013, 17:38

Yves a écrit :Quand elle est appelée avec la commande make app, la fonction clean de Makefile n'efface pas le contenu des dossiers build et dist.
En effet, car il s'agit de la macro $(clean) (définie L79) et pas de la cible clean (défnie L113). Elle ne vide donc que le dossier $(BUILDIR) = $(BUILD)/app propre à cette cible -- lequel n'est pas créé/utilisé par py2app.
Yves a écrit :Du coup j'hésite, est-ce que tu aurais un lien pour que je puisse me faire mon opinion ?
Arf, malheureusement je ne me souviens plus précisément où j'ai vu ça. Dans les docs python, distutils, setuptools et/ou py2app je crois…
En tous cas -O0 est le défaut partout, à ma connaissance. Ce qui n'interdit pas pour autant l'usage de -O2. :)

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 12 mai 2013, 22:11

Yves a écrit :(...) les images images/pyromaths-banniere.png, images/pyromaths.ico et le dossier linux sont présents dans le dossier Pyromaths.app/Contents/Resources/data
Est-ce que tu pourrais me donner le contenu des fichiers MANIFEST.in et src/pyromaths.egg-info/SOURCES.txt générés par un make app, s'il te plaît?

Dans setup.py, j'ai simplifié l'argument data_files depuis que j'utilise les MANIFEST.in:
data_files = [('data', glob('data/*'))],
Ceci étant dit, les fichiers/dossiers indésirables étaient néanmoins inclus par py2app, me semble-t-il, même quand ils n'étaient pas inclus dans data_files?

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 12 mai 2013, 23:05

Voilà pour MANIFEST.in:
include AUTHORS COPYING NEWS                
 exclude MANIFEST.in                         
 graft data                                  
 prune test                                  
 prune data/linux                            
 exclude data/images/pyromaths.ico           
 exclude data/images/pyromaths-banniere.png
Il n'y a pas de fichier src/pyromaths.egg-info/SOURCES.txt généré par make app :?

Les fichiers/dossiers indésirables étaient inclus par py2app puis supprimés avec des commandes rm dans standalone.sh.

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 13 mai 2013, 09:29

Ok, le manifeste a l'air correct. Manifestement, py2app ne l'utilise pas. :?
Oui, je voulais m'assurer qu'on avait pas trouvé de meilleure méthode que d'effacer les indésirables en post-processing. C'est bizarre quand-même qu'il n y ait pas moyen de contrôler cette variable en amont…

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 13 mai 2013, 10:38

djinn a écrit :je voulais m'assurer qu'on avait pas trouvé de meilleure méthode que d'effacer les indésirables en post-processing.
En déplaçant les fichiers/dossiers spécifiques du dossier data ?

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 13 mai 2013, 11:31

Oui, c'est une solution qu'on a évoqué mais que je n'ai pas testée. En effet, après réflexion, j'ai craint qu'elle pose d'autres problèmes…
La difficulté c'est que, lors d'un appel à setup.py, on a jusqu'à 3 couches logiques superposées: distutils, setuptools et py2app/py2exe. Il faudrait une méthode qui fonctionne dans tous les cas de figures.

Est-ce que tu pourrais ré-essayer avec dans la section Mac de setup.py:
data_files = [
    ('data/images', ['data/images/pyromaths.png',
                     'data/images/whatsthis.png']),
    ('data/images/vignettes', glob('data/images/vignettes/*.png')),
    ('data/templates',        glob('data/templates/*.tex')),
    ('data/packages',         glob('data/packages/*')),
],
Pour info, j'ai posé la question sur la mailing-list py2app.

PS: Que donnent make src et make egg sur un Mac?

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 13 mai 2013, 12:07

C'est bon avec ce data_files :)
J'ai lu la réponse de Ronald sur la mailing list de py2app, ça a le mérite d'être clair.

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 13 mai 2013, 15:19

djinn a écrit :Ok, le manifeste a l'air correct. Manifestement, py2app ne l'utilise pas. :?
On peut donc supprimer echo "$(MANIFEST-mac)" > MANIFEST.in
djinn a écrit :
Yves a écrit :Quand elle est appelée avec la commande make app, la fonction clean de Makefile n'efface pas le contenu des dossiers build et dist.
En effet, car il s'agit de la macro $(clean) (définie L79) et pas de la cible clean (défnie L113). Elle ne vide donc que le dossier $(BUILDIR) = $(BUILD)/app propre à cette cible -- lequel n'est pas créé/utilisé par py2app.
et supprimer aussi ligne 175 $(clean) ? (je n'ai pas saisi son utilité)
djinn a écrit :Que donnent make src et make egg sur un Mac?
make src, tout comme make egg, donne un dossier src/pyromaths.egg-info
$ ls pyromaths.egg-info 
PKG-INFO		dependency_links.txt	top_level.txt
SOURCES.txt		requires.txt

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 13 mai 2013, 18:21

À propos de la traduction du menu Pyromaths sur OS X, le hack du fichier nib dans le Makefile ne me satisfait qu'à moitié.

J'ai réussi à obtenir un menu d'application en français avec une application PyQt minimaliste avec QTranslator():
  • créer un fichier de traduction french.ts:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE TS>
    <TS version="2.0" language="fr">
    <context>
        <name>MAC_APPLICATION_MENU</name>
        <message>
            <source>Hide %1</source>
            <translation>Masquer %1</translation>
        </message>
        <message>
            <source>Hide Others</source>
            <translation>Masquer les autres</translation>
        </message>
        <message>
            <source>Show All</source>
            <translation>Tout afficher</translation>
        </message>
        <message>
            <source>Quit %1</source>
            <translation>Quitter %1</translation>
        </message>
        <message>
            <source>About %1</source>
            <translation>À propos de %1</translation>
        </message>
    </context>
    </TS>
  • Compiler le .ts en .qm afin d'obtenir french.qm
    lrelease french.ts
  • Intégrer QTranslator() en rajoutant trois lignes de code dans mon application minimaliste:
    import sys
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    
    class Wnd(QDialog):
        def __init__(self):
            QDialog.__init__(self)
            self.setWindowTitle(self.tr("Title"))
    
    def main():
        app = QApplication(sys.argv)
        
        translator = QTranslator()
        translator.load("french")
        app.installTranslator(translator)
        
        wnd = Wnd()
        wnd.show()
        app.exec_()
    
    if __name__ == '__main__':
        main()
  • rajouter DATA_FILES = ['french.qm'] dans setup.py et compiler avec py2app
Je pensais réussir à intégrer QTranslator() en procédant de manière identique et en rajoutant les trois lignes de code suivantes dans pyromaths.py (ainsi que from PyQt4.QtCore import * ):
app = QtGui.QApplication(argv)
    
translator = QTranslator()
translator.load("french")
app.installTranslator(translator)
    
pyromaths = StartQT4()
Mais ce n'est malheureusement pas suffisant… Je suis preneur de tout piste :)

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 13 mai 2013, 20:12

Yves a écrit :C'est bon avec ce data_files :)
J'ai lu la réponse de Ronald sur la mailing list de py2app, ça a le mérite d'être clair.
Cool. :)
La discussion n'est pas terminée! D'ailleurs, il pose une question sur le comportement de bdist_egg à laquelle j'ai du mal à répondre, vu l'état de mon environnement de dev. Si tu te sens le cœur de nous renseigner… ;)
Yves a écrit :On peut donc supprimer echo "$(MANIFEST-mac)" > MANIFEST.in
Tout à fait. :)
Voire, supprimer carrément le MANIFEST-mac qui n'est, pour l'instant du moins, utilisé qu'ici. C'est aussi pour ça que je suis intéressé par le résultat de make src ou make egg sur Mac: est-il utilisable/satisfaisant, ou allons-nous devoir utiliser un MANIFEST-mac pour eux?
En principe, on devrait aussi pouvoir faire touner make rpm et make deb sur un Mac, à condition d'installer les dépendances adéquates…
Yves a écrit :et supprimer aussi ligne 175 $(clean) ? (je n'ai pas saisi son utilité)
Aussi. Quoique je me demande si ça ne vaut pas le coup de le laisser, pour des raisons pédagogiques (même format que les autres cibles make).
C'est normal que tu aies du mal à saisir son utilité: dans le cas py2app elle est à peu près nulle.
$(clean) nettoie les sources en enlevant, outre les fichiers python compilés (*.pyc) et les backups (*~) qui pourraient traîner là, le fichier MANIFEST.in et le dossier egg-info créés lors du précédent build (lesquels décrivent les fichiers inclus lors du build), et un dossier BUILDIR, sous-dossier direct de BUILD nommé comme la cible $@ (à l'origine, plusieurs paquets étaient construits en copiant d'abord les sources dans un dossier destiné à héberger ensuite la construction; Désormais, ce n'est plus le cas que pour deb. Malgré tout, le mécanisme générique de nettoyage de ce sous-dossier a été maintenu dans la macro commune $(clean)). Or py2app n'utilise pas BUILDIR (il construit directement dans BUILD), ignore MANIFEST.in et n'utilise pas non plus egg-info semble-t-il.
Pour résumer:
  • La macro $(clean) sert à nettoyer les sources de manière à ce qu'il ne reste pas de déchets du build précédent et que le prochain build puisse aboutir (il ne doit pas échouer parce qu'un certain fichier/dossier existe déjà). Autrement dit, elle assure l'intégrité et la reproductibilité de chaque build.
  • La cible make clean, elle, nettoie tout le projet -- elle nettoie aussi le reste des dossier build/ et dist/. C'est le comportement standard attendu d'un make clean. :)
Dernière modification par djinn le 14 mai 2013, 09:30, modifié 3 fois.

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 13 mai 2013, 20:40

djinn a écrit :il pose une question sur le comportement de bdist_egg à laquelle j'ai du mal à répondre, vu l'état de mon environnement de dev. Si tu te sens le cœur de nous renseigner… ;
Donne moi des précisions sur ce que tu attends…

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 14 mai 2013, 08:03

Yves a écrit :Donne moi des précisions sur ce que tu attends…
Merci à toi: finalement j'ai pu tester le truc simplement sur ma machine Linux… :P
Yves a écrit :À propos de la traduction du menu Pyromaths sur OS X, le hack du fichier nib dans le Makefile ne me satisfait qu'à moitié.
Je comprends.
Au-delà du Quit Mac, il y a besoin de traductions pour pyromaths. C'est peut-être l'occasion de choisir un outil pour les gérer. Est-ce que QTranslator pourrait également faire l'affaire?
Yves a écrit :Mais ce n'est malheureusement pas suffisant… Je suis preneur de tout piste :)
En lisant ce code, difficile de deviner où une différence a pu se loger!
Est-ce que tu as également essayé de faire tourner pyromaths à partir des sources, ou seulement le bundle py2app? I.e. ne serait-ce pas simplement dû à un nettoyage trop poussé du dossier .app (un framework/.so Qt manquant)?
Quel est le message d'erreur?

Avatar de l’utilisateur
Yves
Messages : 472
Inscription : 21 janv. 2009, 20:40
Contact :

Re: Packaging

Message par Yves » 14 mai 2013, 08:42

djinn a écrit :Au-delà du Quit Mac, il y a besoin de traductions pour pyromaths. C'est peut-être l'occasion de choisir un outil pour les gérer. Est-ce que QTranslator pourrait également faire l'affaire?
Absolument !
djinn a écrit :En lisant ce code, difficile de deviner où une différence a pu se loger!
Et pourtant, j'ai l'impression d'avoir été exhaustif dans ma description… c'est pour cela que je bloque !
djinn a écrit :Est-ce que tu as également essayé de faire tourner pyromaths à partir des sources, ou seulement le bundle py2app?
À partir des sources, il n'y a pas de menu Pyromaths, juste un menu Python. Pour avoir le menu avec le nom de l'application, il faut qu'elle soit encapsulée dans un bundle.
djinn a écrit :I.e. ne serait-ce pas simplement dû à un nettoyage trop poussé du dossier .app (un framework/.so Qt manquant)?
Non, j'y ai pensé également mais j'ai fait l'essai et ce n'est pas ça.
djinn a écrit :Quel est le message d'erreur?
Il n'y a pas d'erreur, le menu de l'application reste en anglais, c'est tout.

En tout cas, merci de t'intéresser à ce problème :)

Avatar de l’utilisateur
djinn
Messages : 183
Inscription : 03 mars 2013, 10:38

Re: Packaging

Message par djinn » 14 mai 2013, 09:09

Yves a écrit :À partir des sources, il n'y a pas de menu Pyromaths, juste un menu Python. Pour avoir le menu avec le nom de l'application, il faut qu'elle soit encapsulée dans un bundle.
D'accord pour le menu de Quit, mais pour le reste?
Il n'y a vraiment aucun des menus pyromaths habituels? Comment se fait-ce?
Ce n'est pas de bon augure pour l'installation sur Mac de pyromaths au format egg
Yves a écrit :En tout cas, merci de t'intéresser à ce problème :)
C'est plus motivant d'être deux sur un projet, même quand au final un seul fait l'essentiel du boulot. :)

Répondre