Et bien merci pour les quelques eclaircicement je sais pas si ça va faire de beau code mais j'essayerai de mettre ça ici pour rigoler.
Et bien merci pour les quelques eclaircicement je sais pas si ça va faire de beau code mais j'essayerai de mettre ça ici pour rigoler.
Si ça doit marcher sous Linux et Windows, utilise le module de Python qui va bien : os. Il te permettra de gérer de manière unifiée les différents systèmes d’exploitation (ouverture de répertoire, caractère de séparation des noms de répertoires, etc).
Pour lire un fichier, utilise le mot clé with, c’est plus propre :
Code:extensions=set() with open("fichier.lst","ro") as f: for ligne in f: if ligne.startswith("."): extensions.add(ligne.strip()) # vire la fin de ligne moche éventuelle
une balle, un imp (Newstuff #491, Edge, Duke it out in Doom, John Romero, DoomeD again)
Canard zizique : q 4, c, d, c, g, n , t-s, l, d, s, r, t, d, s, c, jv, c, g, b, p, b, m, c, 8 b, a, a-g, b, BOF, BOJV, c, c, c, c, e, e 80, e b, é, e, f, f, f, h r, i, J, j, m-u, m, m s, n, o, p, p-r, p, r, r r, r, r p, s, s d, t, t
Canard lecture
Merci.
Pff pour récupérer les informations sur carte réseau c'est la plaie.
J'ai au moins 80 lignes
Et t'as le droit d'utiliser des librairies externes ou pas du tout? Dans le premier cas y'a des lib crossplatform comme psutil qui peuvent te permettre de récup le nom de l'interface et l'ip en à peine quelques lignes. Dans le second cas par contre va falloir que tu fasses tes propres libs, une pour chaque plateforme. Et que tu appelles ensuite la lib correspondate selon la plateforme :
Après y'a plusieurs méthodes pour faire ça. La plus simple, mais aussi la moins élégante étant d'envoyer des commandes spécifiques au système via subprocess par exemple. Genre 'ipconfig' sous Windows et 'ifconfig' ou 'ip' sous Linux. Et ensuite de parse la réponse pour extraire les valeurs.Code:import platform if platform.system().lower() == 'windows': # importer la lib windows elif platform.system().lower() == 'linux': # importer la lib linux else: ...
Et voila le bousin.
Tout n'est pas finalisé mais j'avais plus le temps et il fonctionne (si vous voulez voir le monstre, oui y'a pas de commentaire mais j'avais vraiment plus de temps) :
Code:#!/usr/bin/python3 # -*- coding: utf-8 -*- import os import csv import re import platform from pathlib import Path import shutil import scapy.all as scapy def lecture(): # fonction chargement des extension fichierExtension = "./extension.lst" fichier = open(fichierExtension, "r") cpt = 0 plop = fichier.readlines() fichier.close() debutLigne = r"^\." regex = re.compile(debutLigne) listeExtension = [] for f in plop: cpt += 1 if re.match(debutLigne, f): f = f[:-1] listeExtension.append(f) return listeExtension list = lecture() def creationRepertoire(): nomMachine = platform.node() #os.removedirs(nomMachine+"\\Sysconfs") os.mkdir(nomMachine) os.mkdir(nomMachine+"/Sysconfs") os.mkdir(nomMachine+ "/SysNets") def lecteurWindows(): lettre = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" drives = [] for d in lettre: if os.path.isdir(d + ":"): drives.append(d) return drives lecteur = lecteurWindows() #c'est moche mais je sais pas faire mieux def parcourtEtCopie(): cpt_lecteur = 0 destination = os.getcwd() + "/"+ platform.node() + "/Sysconfs/" for i in lecteur: racine = lecteur[cpt_lecteur] + ":" for p in Path(racine).glob('.\\**\\*'): #print(racine + os.path.splitext(p)[1]) if (os.path.splitext(p)[1]) in list: aCopier = os.path.abspath(p) try: shutil.copyfile(aCopier, destination + os.path.basename(p)) except: pass cpt_lecteur += 1 def parcourtEtCopie(): cpt_lecteur = 0 destination = os.getcwd() + "/"+ platform.node() + "/Sysconfs/" for i in lecteur: racine = lecteur[cpt_lecteur] + ":" for p in Path(racine).glob('.\\**\\*'): #print(racine + os.path.splitext(p)[1]) if (os.path.splitext(p)[1]) in list: aCopier = os.path.abspath(p) try: shutil.copyfile(aCopier, destination + os.path.basename(p)) except: pass cpt_lecteur += 1 def parcourtEtCopieLinux(): destination = os.getcwd() + "/" + platform.node() for root, dirs, files in os.walk("/"): if dirs == destination: continue else: for name in files: if (os.path.splitext(name)[1]) in list: aCopier = root + "/" + name #print(aCopier) #print(destination+"/Sysconfs/"+ name) shutil.copyfile(aCopier, destination + "/Sysconfs/"+name) def creationFichierReseauLinux(): fichierSortie = open(os.getcwd() + "/" + platform.node() + "/SysNets/reseau.csv", "w", newline='\n') writer = csv.writer(fichierSortie, delimiter=';') writer.writerow(("Nom_Interface", "Type_Interface", "Mac_Interface", "adresse IPv4", "adresse IPv6")) ipconfig = os.popen('ip a').readlines() listeMac = [] listeIp = [] listeNom = [] listeDesc = [] listeIp6 = [] i = 0 p = 0 for ligne in ipconfig: if 'physique' in ligne.lower(): mac = ligne.split(' ')[10].strip() listeMac.append(mac) for i in range(0, len(listeMac)): try: writer.writerow((listeNom[i], listeDesc[i], listeMac[i], listeIp[i],listeIp6[i])) except: pass def creationFichierReseauWindows(): fichierSortie = open(os.getcwd() + "/" + platform.node() + "/SysNets/reseau.csv", "w", newline='\n') writer = csv.writer(fichierSortie, delimiter=';') writer.writerow(("Nom_Interface", "Type_Interface", "Mac_Interface", "adresse IPv4", "adresse IPv6")) ipconfig = os.popen('ipconfig /all').readlines() listeMac = [] listeIp = [] listeNom = [] listeDesc = [] listeIp6 = [] i = 0 p = 0 for ligne in ipconfig: if 'physique' in ligne.lower(): mac = ligne.split(':')[1].strip() listeMac.append(mac) if 'IPv4' in ligne: ip = ligne.split(':')[1].split('(')[0] listeIp.append(ip) if 'Carte ' in ligne: nom = ligne.split(':')[0].strip() listeNom.append(nom) if 'Description' in ligne: ip = ligne.split(':')[1].split('(')[0] listeDesc.append(ip) if 'IPv6' in ligne: ip = ligne.split(' ')[12].split('(')[0] listeIp6.append(ip) for i in range(0, len(listeMac)): try: writer.writerow((listeNom[i], listeDesc[i], listeMac[i], listeIp[i],listeIp6[i])) except: pass def creationDuPcap(timer): timer = int(timer) p = scapy.sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=timer) scapy.wrpcap(os.getcwd() + "/" + platform.node() + "/SysNets/plop.pcap", p) def zippage(): shutil.make_archive(os.getcwd() + "/" + platform.node(), 'zip', os.getcwd() + "/", platform.node()) shutil.rmtree(os.getcwd() + "/" + platform.node()) def plop(): plop = platform.system() return plop def main(args): if plop() == 'Windows': lecture() creationRepertoire() lecteurWindows() parcourtEtCopie() creationFichierReseauWindows() creationDuPcap(args[1]) zippage() else: lecture() creationRepertoire() parcourtEtCopieLinux() creationFichierReseauLinux() creationDuPcap(args[1]) zippage() if __name__ == '__main__': import sys sys.exit(main(sys.argv))
Dernière modification par Mr Ianou ; 09/12/2019 à 18h29.
La programmation est une course entre le développeur, qui s’efforce de produire des applications à l’épreuve des imbéciles, et l’univers qui s’efforce de produire de meilleurs imbéciles... L’univers a une bonne longueur d’avance !!!
La fatigue.
exemple de bons commentaires:
Je ne suis généralement pas fan des commentaires sauf ceux qui explique bien le pourquoi et le comment et qui sont à jour (genre doc du JDK)
Perso je préfère voir du code découpé en méthode et utilisant des variables avec des noms clairs et parlant.
Sinon comment vous faites quand vous avez 3 ou 4 tickets qui tournent autour du même sujet et que vous devez faire des branches dans git ?
Par exemple vous avez une nouvelle feature qui demande d'extraire une méthode, un bug à corriger qui nécessite de modifier la partie du code qui est localisée dans le code à extraire, et enfin virer les warning et les codes smell dans le fichier qui contient ce code.
(Là c'est encore assez simple, généralement le nombre de fichier est un peu plus grand).
Les modifications peuvent se faire dans n'importe quel ordre, mais souvent il y a un ordre logique qui simplifie le travail (par ex: refactoring, bug fix, new feature)
- Naturellement j'ai tendance à ne faire qu'une branche qui regroupera les différents changement avec la ref du ticket dans le commit.
Mais dans ce cas la pull request fait un gros paquet de diffs et obtenir l'aval de mes pairs devient plus compliqué.
- Une autre solution c'est de faire chaque étape individuellement, avec un temps d'attente entre chaque pull request. J'aime moins cette solution car ça empêche de faire du refactoring en passant et ça oblige à faire des pauses entre chaque étape: du coup il faut se replonger dans le code à chaque fois, et pour moi empêche d'avoir une vision globale.
- Une dernière approche que j'ai tenté c'est de faire les changements sous formes de "poupées russes": la première étape se base sur master, puis la deuxième branche se base sur la première et ainsi de suite. Ce système est assez pratique mais peut se transformer en cauchemar quand il y a des problèmes (changement sur une des branches intermédiaires, mêmes conflits à résoudre plusieurs fois...
Je n'ai trouvé aucune solution qui me convienne vraiment, même si généralement je tend vers la solution de tout mettre dans la même pull request.
Vous faites comment ?
Si tu veux documenter tes fonctions, utilise les triple guillemets juste après la signature, tu auras gratuitement l’attribut __doc__.
une balle, un imp (Newstuff #491, Edge, Duke it out in Doom, John Romero, DoomeD again)
Canard zizique : q 4, c, d, c, g, n , t-s, l, d, s, r, t, d, s, c, jv, c, g, b, p, b, m, c, 8 b, a, a-g, b, BOF, BOJV, c, c, c, c, e, e 80, e b, é, e, f, f, f, h r, i, J, j, m-u, m, m s, n, o, p, p-r, p, r, r r, r, r p, s, s d, t, t
Canard lecture
@William :
Si les tickets sont vraiment proches et qu'il n'y a pas non plus beaucoup de changements (ou alors des trucs triviaux comme le renommage d'une variable ou le déplacement d'un fichier), solution 1.
Si par contre y'a pas mal de changements fonctionnels (donc nécessitant une relecture plus poussée), solution 2.
Jamais la solution 3, c'est un nid à emmerdes.
C'est la faute à Arteis
Aussi, il ne fait pas avoir peur de discuter de la façon de faire la relecture de code. Pas mal de monde ne sait pas comment la faire, n'a jamais lu la moindre bonne pratique, et en souffre peut être. Un petit panel de questions que l'on peut se poser :
- qui fait la code review ? Le lead dev ? Les devs, si oui combien ? Un peu des deux ?
- qui teste (s'il faut tester qqchose à la main) ? Comprendre : qui assure que le code a été testé autrement que via les tests unitaires & d'intégration ? Quid d'un cahier de test ? J'ai vu des équipes dire que c'est au dev de tester, d'autres au contraire que le dev a trop le nez dans son code pour bien tester, donc ça serait aux reviewers de tester. Perso j'opterais plutôt pour un effort sur les tests unitaires et d'inté. S'ils ne suffisent pas, c'est qu'à priori on n'a pas assez investi dessus. Quand c'est possible, bien sûr
- comment on se facilite la vie pour la relecture :
--- tout faire dans BitBucket, Gitlab ou bien récupérer la branche et regarder le diff dans son IDE (à titre perso je préfère quand ça commence à causer, ça permet d'avoir le lint de l'IDE, naviguer dans le code et faire des recherches, puis je maîtrise mieux les diff avec - je checkout ça dans un git worktree dédié) / autrement
--- si plusieurs commits, relire le gros diff ou le diff de chaque commit ? Trop de commits ? Ne pas avoir peur de demander à scinder une pull-request si elle est trop grosse ou si elle part dans tous les sens : même si ça va "embêter" le dev, ça va bcp moins embêter les reviewers, et à terme éduquer le dev
- les types de retours : par exemple j'avais un collègue qui faisait PLEIN de retours sur le formatage (genre 30 sur une pull-request, un sur chaque ocurence). Bah c'était chiant, on l'a recadré. A la limite 1 commentaire général pour dire "reformat stp" et voilà. Il faut faire gaffe à comment la review est vécue, ça devient facilement violent, autant pour le dev que le reviewer
- et j'en passe
Qqun avait fait un excellent article su le sujet, je le poste dès que je le retrouve.
---
Les poupées russes, je les conçois lorsque tu fais une feature 1, puis que tu veux faire une feature 2 qui a besoin que la 1 soit mergée. Même si ce n'est pas l'idéal, si ton chef veut absolument que tu commences à bosser sur la 2, tu n'as pas trop le choix. C'est la faute au chef on va dire ^^ (et je n'aime pas les chefs qui s’immiscent trop dans les pratiques de dev, et se fichent royalement de tes conditions de travail du moment que tu es productif).
Dernière modification par gros_bidule ; 09/12/2019 à 22h12.
Dans l'idéal au moins 2 personnes de l'équipe avec un mix profil lead dev/junior histoire :
- d'avoir un regard à la fois expert et neuf (les questions naïves sont très bien pour éviter de s'encrouter dans ses habitudes)
- de faire monter en compétences les nouveaux en leur faisant analyser du code propre
Sujet complexe.
C'est avant tout une question une question de criticité et de cout :
- le cœur métier de ton appli et les règles de gestion ? Si c'est bien découpé ça se teste unitairement plutôt facilement et c'est nickel pour la éviter les régression.
- ton interfaçage avec l'extérieur ? c'est là que l'intégration entre en jeu avec du mocking (ou des bancs de tests pour des trucs plus physique) mais certaines conditions peuvent être très compliquées à simuler
- ton UI ? Arf, là c'est quand même bien la merde à tester automatiquement. Surtout que la grande majorité des technos forcent à écrire les tests à posteriori (donc au revoir le TDD) et sont chiant à maintenir
Se passer de tests manuels est pour moi un erreur car un bon testeur ne fait pas que passer un bêtement un cahier de recette. Normalement il challenge ton ergonomie et cherche les conditions à la cons qui font remonter les cas limites (qui peuvent potentiellement être testés automatiquement plus tard une fois découverts).
De mon point de vue c'est quelqu'un qui doit être externe à l'équipe de dev et qui doit rédiger lui même le contenu des tests en se basant sur la spec (ce qui permet déjà de vérifier si elle même tient la route).
Par contre ça impose quelques contraintes en terme d'organisation des releases.
Les reviewers peuvent aussi tester un peu manuellement les fonctionnalités, mais cela ne permet pas de détecter les effets de bord et les régressions sur les autres fonctionnalités, là où une passe par la QA en fin de sprint permet de tout valider.
Dépend surtout de la taille de la merge-request et de la connaissance du code.
Si t'as posé toi même l'archi du projet et qu'il n'y a que quelques modifs (< 20), l'interface web de Gitlab est largement suffisante.
Au delà, une inspection plus poussée via l'IDE aide quand même pas mal en effet.
Perso je préfère relire uniquement le diff final, le détail des commits variants beaucoup trop d'une personne à l'autre (pleins de petits commits + vs commit par grosse fonctionnalité).
Par contre je suis d'accord que le scope de la merge-request doit être cadré, mais pour ça faut que la tâche et/ou user-story soit correctement définie dès le départ.
D'ailleurs c'est pas mal d'inclure des templates de merge-request avec des check-list pour forcer les devs à fournir un truc un minimum propre dès le départ.
+1
Si une règle générale n'a pas été respectée par le dev (convention de nommage, format, et) un seul commentaire suffit.
Par contre ces règles doivent aussi être définie clairement dans la doc (idéalement située dans les sources).
Après pour tout ce qui est formattage, le mieux c'est d'avoir un outil automatique de formattage (au minimum lié à un githook de pre-commit), ça met court aux débats et tout a la même tête.
Bon par contre tous les domaines ne sont pas aussi bien fournis, quand je fais autre chose que du web je pleure de ne pas avoir https://prettier.io/ tellement c'est pratique.
C'est la faute à Arteis
Petite question transformation XSL.
J'y connais que dalle à cette merde, et je dois faire un truc totalement con mais je ne panne rien aux exemple que je trouve sur le net :
J'ai un fichier XML avec des namespaces classiques :
A la suite, j'ai deux noeuds sans namespaceCode:?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="toto.xsl"?> <MonRoot xmlns="http://sssss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="xxxx eeee.xsd" versione="zzzz">
Sur lesquels je dois ajouter un namespace à blanc :Code:<toto><titi>...</titi><tutu>...</tutu></toto> <tata><xxx>...</xxx></tata>
Pour cela, je peux appliquer une transformation XSL, mais je ne capte pas comment je suis sensé utiliser un match chépakoi pour ajouter le truc sans enlever tout ce qu'il y'a dans le noeud.Code:<toto xmlns=""><titi>...</titi><tutu>...</tutu></toto> <tata xmlns=""><xxx>...</xxx></tata>
Si quelqu'un peut m'aider là-dessus, je lui serai reconnaissant
Ah, XSLT... Du pur langage fonctionnel, avec toute la verbosité de XML. Ca a traumatisé des générations de développeurs.
Pour copier en virant l'espace de noms (ou en le conservant, au choix), il faut utiliser xsl:element. Ca devrait pouvoir se faire avec ces templates :
Code:<xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:element name="{name()}" namespace="{namespace-uri()}"> <xsl:apply-templates /> </xsl:element> </xsl:template> <!-- truc est l'alias de l'espace de nom auquel appartient toto --> <xsl:template match="truc:toto"> <xsl:element name="{local-name()}"> <xsl:apply-templates /> </xsl:element> </xsl:template>
Ton code fait des trucs, mais ce n'est pas tout à fait ce que je veux.
Je vais poser les cas concrets, ça sera plus simple. C'est pour la facture italienne (norme FatturaPA).
J'ai un fichier XML comme ça :
Et je veux sortir un fichier comme ça :Code:<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="fatturapa_v1.2.xsl"?> <FatturaElettronica xmlns="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 fatturaPA12.xsd" versione="FPR12"> <FatturaElettronicaHeader> <DatiTrasmissione> <IdTrasmittente> <IdPaese>xxx</IdPaese> <IdCodice>xxxxx</IdCodice> </IdTrasmittente> <ProgressivoInvio>xxx</ProgressivoInvio> <FormatoTrasmissione>xx</FormatoTrasmissione> <CodiceDestinatario>xx</CodiceDestinatario> </DatiTrasmissione> <CedentePrestatore> <DatiAnagrafici> <IdFiscaleIVA>... </FatturaElettronicaHeader> <FatturaElettronicaBody> <DatiGenerali> <DatiGeneraliDocumento> <TipoDocumento>xx</TipoDocumento> <Divisa>xxx</Divisa>... </FatturaElettronicaBody> </FatturaElettronica>
En bidouillant ton XSL avec ce que je comprends, j'arrive à rajouter le xmlns="", mais après, il m'ajoute le ns http://ivaservizi.agenziaentrate.gov...d/fatture/v1.2 dans le nœud du dessous. Ou alors, j'arrive à ajouter le ns http://ivaservizi.agenziaentrate.gov...d/fatture/v1.2 dans les deux noeuds qui m'intéressent (Header et Body).Code:<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="fatturapa_v1.2.xsl"?> <FatturaElettronica xmlns="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 fatturaPA12.xsd" versione="FPR12"> <FatturaElettronicaHeader xmlns=""> <DatiTrasmissione> <IdTrasmittente> <IdPaese>xxx</IdPaese> <IdCodice>xxxxx</IdCodice> </IdTrasmittente> <ProgressivoInvio>xxx</ProgressivoInvio> <FormatoTrasmissione>xx</FormatoTrasmissione> <CodiceDestinatario>xx</CodiceDestinatario> </DatiTrasmissione> <CedentePrestatore> <DatiAnagrafici> <IdFiscaleIVA>... </FatturaElettronicaHeader> <FatturaElettronicaBody xmlns=""> <DatiGenerali> <DatiGeneraliDocumento> <TipoDocumento>xx</TipoDocumento> <Divisa>xxx</Divisa>... </FatturaElettronicaBody> </FatturaElettronica>
Il me semble que c'est tout à fait juste d'un point de vue de ce qui doit être fait, sauf que techniquement, la facture est refusée par le fisc italien dans ces cas. Et si je ne mets pas de xmlns="" également, c'est rejeté.
Edit :
Ce que je veux faire, c'est ça :
Sauf qu'on n'a pas le droit de tricher, je n'ai pas le droit de nommer mon attribut xmlnsCode:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vbs="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" > <xsl:output omit-xml-declaration="no" method="xml" /> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="/*/*"> <xsl:copy> <xsl:attribute name="xmlns"></xsl:attribute> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Dernière modification par deathdigger ; 18/12/2019 à 12h22.
J'aurai appris qu'on ne peut pas utiliser des axes comme descendant-or-self dans un match mais seulement dans un prédicat. Donc un truc dans ce genre ferait ce que tu veux ?
Code:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="*[ancestor-or-self::*[local-name()='FatturaElettronicaHeader' or local-name()='FatturaElettronicaBody']]"> <xsl:element name="{local-name()}" namespace=""> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Ça marche
Du coup, t'as ma reconnaissance éternelle !
Moi qui déteste cordialement le XSLT, depuis un traumatisme en 2004 ou les sites en XML + XSLT étaient dans le vent, j'aurais fait un rechercher-remplacer à base de regex crados.
Pourquoi tu as voulu t'infliger du XSLT ?
xmlstarlet est parfait pour parcourir un xml avec du parsing pour de vrai. Pas méga-intuitif, mais ça passe.
XMLScarlett ? Qu’est-ce qu’il ne faut pas faire pour attirer les geeks…
une balle, un imp (Newstuff #491, Edge, Duke it out in Doom, John Romero, DoomeD again)
Canard zizique : q 4, c, d, c, g, n , t-s, l, d, s, r, t, d, s, c, jv, c, g, b, p, b, m, c, 8 b, a, a-g, b, BOF, BOJV, c, c, c, c, e, e 80, e b, é, e, f, f, f, h r, i, J, j, m-u, m, m s, n, o, p, p-r, p, r, r r, r, r p, s, s d, t, t
Canard lecture
Ce qu'il faut savoir, c'est qu'on ment beaucoup aux minmatars, surtout lorsqu'ils posent des questions du style: "t'es sûr que ça vole, ce truc ?" Cooking Momo, le 30/08/09
Parce que je n'ai pas le choix
En gros, j'ai un logiciel (MEC pour ceux qui connaissent) qui me permet de sortir des EDI. C'est de la techno Java des familles, mais je ne peux pas faire ce que je veux avec.
Du coup, j'ai un plugin Eclipse qui me permet de taper du "code" :
La sortie du fichier à droite est en fait basé sur le XSD que je choisis (à gauche, ce sont les données de l'ERP que je modifie en JAVA).
Du coup, au début, j'ai triché comme un gros dégueulasse, et j'ai ajouté un attribut nommé xmlns auquel j'affectais la valeur "" sur les deux nœuds qui m'intéressaient.
J'ai ensuite une interface qui me permet de définir un contrat où se passera plusieurs événements :
XMLTransform, c'est le code du dessus. Et si je regarde ce que je peux faire avec, j'ai ça :
Et là, vous voyez la première case cochée (Delete empty elements...).
Oui parce que si je ne les supprime pas, il va me faire dans mon fichier de sortie, un truc avec une valeur blanche ou nulle, ce qui n'est pas faux, mais... non accepté par le FISC italien (si le champ est présent, il doit être renseigné). Du coup, mon attribut xmlns étant blanc, ben il est effacé (ma technique de manouche n'a pas fonctionné ).
Du coup, j'étais parti pour faire un gros truc de dégueulasse d'enculé, de lire le fichier en .Net ou autre, et de faire un gros replace des familles, jusqu'à ce qu'au détour d'un click droit, je vois que je peux faire une transformation XSL. Ne sachant pas ce que c'était, j'ai regardé, et c'est exactement ce dont j'avais besoin.
oui, dans ce cas tu es pardonné XSLT est effectivement à sa place ici.
Il sera bien planqué derrière une petite icône anodine dans un plugin qui forcera ton remplaçant en 2026 a toujours utiliser un Eclipse de 2008 et qui cherchera pendant des heures comment ce XML est généré
C'est souvent ça sur les applis de ce type (trucs soit-disant plus faciles pour les devs, voire, pas obligé d'être dev, mais qui sont en réalité 1000* plus compliqués à comprendre). Mais du coup, c'est mon métier, et c'est là dessus que je me fais bien payer
Bon le coup du XSLT, c'est une première, je ne devrais pas avoir à y retoucher avant 5-10 ans au moins
J'en ai bouffé aussi, pourtant en tant que dev ! Des trucs graphiques probablement vendu par un VRP au chef de l'IT lors d'une partie de golf.
Avec en prime la pression sur les dev: c'est trop simple, même un enfant ou un chef de projet peut y arriver !
Au final des horreurs avec icônes et des flèches partout cachant des infâmes morceaux de XML / XSLT et autre XPath !
Voir ici pour une photo d'époque: https://stackoverflow.com/questions/...business-works
Dernière modification par William Vaurien ; 20/12/2019 à 14h16.