FlowChartCore icon indicating copy to clipboard operation
FlowChartCore copied to clipboard

Add example for find-FlowchartNode

Open LxLeChat opened this issue 5 years ago • 17 comments

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})

LxLeChat avatar Oct 11 '20 14:10 LxLeChat

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.

LaurentDardenne avatar Oct 14 '20 17:10 LaurentDardenne

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 ...

LaurentDardenne avatar Oct 14 '20 18:10 LaurentDardenne

pebkac ...

$Sb = {
  If ( $x ) {
    Foreach ( $y in $x ) {
      "Do Something"
    }
  }
}
$x = Find-FlowChartNodes -ScriptBlock $Sb

$x[0].<Tab>

LaurentDardenne avatar Oct 14 '20 18:10 LaurentDardenne

pebkac ?

LxLeChat avatar Oct 14 '20 18:10 LxLeChat

Problem Exists Between Keyboard And Chair.

LaurentDardenne avatar Oct 14 '20 20:10 LaurentDardenne

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.

LaurentDardenne avatar Nov 16 '20 19:11 LaurentDardenne

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

LxLeChat avatar Nov 16 '20 21:11 LxLeChat

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.

LaurentDardenne avatar Nov 16 '20 21:11 LaurentDardenne

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

LxLeChat avatar Nov 16 '20 22:11 LxLeChat

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 :-)

LaurentDardenne avatar Nov 16 '20 22:11 LaurentDardenne

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

LaurentDardenne avatar Nov 28 '20 12:11 LaurentDardenne

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... :)

LxLeChat avatar Nov 28 '20 15:11 LxLeChat

Donc si je résume:

  • Une fonction Convertto-FlowChartNodes qui s'occuperait de faire la decouverte des noeud, et transformer direct en DOT
  • Renommer Find-FlowChartNodes en New-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 ?

LxLeChat avatar Dec 04 '20 13:12 LxLeChat

Une fonction Convertto-FlowChartNodes qui 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-FlowChartNodes en New-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 que Get-FlowChartNode ne 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.

LaurentDardenne avatar Dec 04 '20 16:12 LaurentDardenne

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

LxLeChat avatar Dec 05 '20 09:12 LxLeChat

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 :-)

LaurentDardenne avatar Dec 05 '20 20:12 LaurentDardenne

Allay on va faire : Get-FlowChartNode New-FlowChartGraph

Je changerai ça, faut que je regarde l'issue #92 et #93 en même temps

LxLeChat avatar Dec 06 '20 09:12 LxLeChat