Add example for find-FlowchartNode
after retrieving the tree of a script you have an intersting method : FindNodes
this methods take 2 parameters : A predicate and a boolean for recursion
Put an interesting example in the readme for this method.
Findnodes({$args[0].depth -eq 2})
Salut, pour info cette méthode n'est pas proposée via la complétion dans la console (avec PSReadline non plus).
A vérifier si sa signature est en cause :
public IEnumerable<Node> FindNodes (Predicate<Node> predicate,bool recurse) {
Le type Interface étant difficile à gérer sous Powershell. Si on saisie dans la console $x.FindNodes on obtient bien sa signature.
Même problème avec ceci :
public List<Node> FindNodes (Predicate<Node> predicate,bool recurse)
cela ne provient pas du type de la valeur de retour ...
pebkac ...
$Sb = {
If ( $x ) {
Foreach ( $y in $x ) {
"Do Something"
}
}
}
$x = Find-FlowChartNodes -ScriptBlock $Sb
$x[0].<Tab>
pebkac ?
Problem Exists Between Keyboard And Chair.
Je reviens sur ce sujet car ici
comme ça on pourrait avoir des fichiers séparé pour les fonctions
On peut les obtenir mais il faut coder en dehors du projet. Et par le même vérifier s'il le permet.
La doc (les infos sur ce sujet, indiqué dans le readme) ne me semble pas en phase avec ce qu'il est réellement possible de faire/d'obtenir. Exemple :
$Env:GRAPHVIZ_DOT='C:\Tools\Graphviz\bin'
$path='G:\PS\FlowChartCore'
$TempPath='c:\temp'
$FileName="$TempPath\CallMainFunctionInsideNestedFunction.ps1"
cd "$path\Src\bin\Debug\netcoreapp3.1"
ipmo .\FlowChartCore.dll
@'
function Get-Main{
function nestedOne {
function nestedTwo{
Get-MyDatas
}
nestedTwo
}
nestedOne
}
function set-datas {
Get-MyDatas
}
function Get-MyDatas{
}
Get-Main
'@ > $FileName
Find-FLowChartNodes -Path $FileName|
Where-Object {
$_ -is [FlowChartCore.FunctionNode]
}
#nothing
Find-FLowChartNodes -Path $FileName|
Foreach-object {$_}|
Where-Object {
$_ -is [FlowChartCore.FunctionNode]
}
# FunctionName : Get-Main
# Name : FunctionNode
# Children : {}
#...
$r=Find-FLowChartNodes -Path $FileName
$r.FindNodes({$args[0] -is [FLowChartCore.FunctionNode]},$true)
#nothing
$r[0].FindNodes({$args[0] -is [FLowChartCore.FunctionNode]},$true)
#nothing
$r.FindAll({$args[0] -is [FLowChartCore.FunctionNode]})
# FunctionName : Get-Main
# Name : FunctionNode
# Children : {}
#...
Dans le readme, l'exemple que tu proposes est correct, mais on ne peut pas généraliser la démarche, car il faut que ce que l'on recherche soit dans le nœud précisé en entrée.
Pour 'généraliser', on doit passer par la méthode FindAll de la classe générique [System.Collections.Generic.List`1[[FlowChartCore.Node]].
Je pense qu'ici il faut préciser que Find-FLowChartNodes renvoit un objet liste et pas une collection de nœuds (i.e. Find-FLowChartNodes n'énumére pas 'ses' objets)
ps J'ai un tuto en cours de finalisation sur la gestion des classes générique sous Powershell.
c'est pour ça que j'avais créer une issue pour créer une cmdlet de recherche ! #4
ça serait tet le plus simple ...
find-flowchartnodes -scriptblock $a | Search-Nodes -Type FunctionNode par exemple ... si tu trouves que c'est une bonne idée on recloture celle la et on en discute dans l'issue #4
c'est pour ça que j'avais créer une issue pour créer une cmdlet de recherche ! #4
... si tu trouves que c'est une bonne idée ...
Je ne sais pas trop, faut cogiter ( ce qui par essence prend du temps.)
Il restait ce point à revoir.
Et pour ceci :
find-flowchartnodes -scriptblock $a | Search-Nodes -Type FunctionNode
L'objectif du scénario était de retrouver l'AST de chaque fonction afin de créer une graph dédié. On a besoin, il me semble , de Search-Nodes uniquement pour ce scénario où on recherche un type de nœud conteneur. On peut aussi gérer la recherche à la racine, Find-FlowChartNodes -scriptblock $a -Type FunctionNode.
Ici il n'est pas question de remettre en cause ce qui été fait mais de savoir qu'est-ce qu'il m'est possible de faire avec les objets renvoyés par les cmdlets et comment je le fait. Ni plus ni moins.
ce qui est peut interssant c'est que si tu as envie de chercher un noeud en particulier, et grapher uniquement ce neoud et ces enfants tu pourrais faire
find-flow... | search-node -type functionnode | new-flochart
l idée c'est que pour le mec qui fait du ps en occasionnel, et qui ne sait pas trouver des méthodes (en gros un get-member ...) et ou qu'un prédicat ça ne lui parle pas, on lui facilite la vie, en lui fournissant une cmdlet qui lui mache le travail d'exploration si il a envie de trouver des trucs
l idée c'est que pour le mec qui fait du ps en occasionnel, et qui ne sait pas trouver des méthodes (en gros un get-member ...) et ou qu'un prédicat ça ne lui parle pas, on lui facilite la vie, en lui fournissant une cmdlet qui lui mache le travail d'exploration si il a envie de trouver des trucs
Je suis d'accord sur le fond, sur la forme il faut déjà savoir ce que l'on cherche pour le trouver. FlowChartCore s'adresse à un public qui connait un tant soit peu la gestion/maintenance d'un projet codé en Powershell. On a besoin d'outil qu'à partir du moment où l'on commence à œuvrer. Le mieux eut été d'avoir l'avis de ces personnes pour qui ceci n'est pas trivial,
Bref, ici y a un truc qui me chiffonne et je vais repasser dessus :-)
Il y a un truc que je n'avais pas compris, c'est que le paramètre -Path de Find-FLowChartNodes attend une liste de noms de fichier :
$r=Find-FLowChartNodes -Path $FileName,$filename2
$r.count
#2
Dans ce cas on comprend mieux la nécessité d'itérer sur chaque objet :
Find-FLowChartNodes -Path $FileName,$filename2|
Foreach-Object { $_ }|
Where-Object { $_ -is [FLowChartCore.FunctionNode] }
Donc pour le nommage et la présence d'un cmdlet de recherche ceci me semble préférable:
New-FLowChartNodes -Path $FileName|
Find-FLowChartNodes -Type SwitchNode|
New-FLowChartGraph
Un usage simple étant :
New-FLowChartNodes -Path $FileName|
New-FLowChartGraph
Il reste la propagation du nom de fichier associé à chaque liste de noeud :
Get-ChildItem -Path C\temp\*.ps1 -PipelineVariable FileName|
New-FLowChartNodes|
New-FLowChartGraph|
Foreach-Object {
$_
"${FileName}.graph"
}
Si l'objectif est de générer un graph, les cmdlets devraient gérer nativement cette information :
Get-ChildItem -Path C\temp\*.ps1 |
New-FLowChartNodes|
New-FLowChartGraph|
Foreach-Object {
$_
"$($_.FileName).graph"
}
Et avec une fonction on pourrait simplifier en allant à l'essentiel :
Get-ChildItem -Path C:\temp\*.ps1|
ConvertTo-FLowChartNodes -Path C:\Projets\Graph
Très intéressant cette réflexion !!! J essaierai de regarder de plus près ce we! Sorry j avance pas trop en ce moment je suis dans des travaux chez moi... :)
Donc si je résume:
- Une fonction
Convertto-FlowChartNodesqui s'occuperait de faire la decouverte des noeud, et transformer direct en DOT - Renommer
Find-FlowChartNodesenNew-FlowChartNodes - NE PAS Renomme
New-FlowChartNodes
En revanche le New-FlowChartNodes ça implique, à mon sens, qu'on va crééer des noeuds. Est-ce que Get-FlowChartNode ne serait pas plus approprier ??
D'ailleurs c'est tout au singulier non ?
Une fonction
Convertto-FlowChartNodesqui s'occuperait de faire la découverte des noeuds, et transformer direct en DOT
Disons que c'est un pattern de command (c'est tjr la même construction), un peu comme ici. Il est préférable de la créer une fois les reste figé, le pb potentiel est que l'on couple sa signature avec celle des cmdlets utilisé en interne, au pire la placer dans un répertoire Demo.
Renommer
Find-FlowChartNodesenNew-FlowChartNodes
Oui.
NE PAS Renomme `New-FlowChartNodes`En revanche le
New-FlowChartNodesça implique, à mon sens, qu'on va crééer des noeuds. Est-ce queGet-FlowChartNodene serait pas plus approprier ??
Tu parles du cmdlet New-FLowChartGraph ?
D'ailleurs c'est tout au singulier non ?
Oui, comme les noms de paramètre.
ah oui je me suis trompé Find-Flowchartode -> New/Get-FlowChartNode New-FlowChartGraph -> New-FlowChartGraph (inchangé)
En revanche le New-FlowChartNodes ça implique, à mon sens, qu'on va crééer des noeuds. Est-ce que Get-FlowChartNode ne serait pas plus approprier ??
Enfait c'est juste pour le renommage de find-flowchartnode je pense juste que le verb Get est plus a proprié que le verb New
En fait c'est juste pour le renommage de find-flowchartnode je pense juste que le verbe Get est plus approprié que le verbe New
C'est souvent une plaie le choix d'un nom de cmdlet... Les deux sont possibles. Le nom New-FlowChartGraph est adéquate car il correspond bien je trouve à l'action que l'on effectue et à ce que l'on crée.
Comme je te disais dans l'autre post le verbe Powershgell 'Find' recherche, à mon avis, qq chose qui existe. Get récupère une ressource et New crée une ressource. Après on coupe les cheveux en quatre et c'est aussi l'appauvrissement du langage de cette norme qui pointe le bout de son nez ici :-)
Allay on va faire : Get-FlowChartNode New-FlowChartGraph
Je changerai ça, faut que je regarde l'issue #92 et #93 en même temps