Première version beta pour le framework open-source Dvp.NET pour le langage .NET !

Le , par Skalp, Rédacteur/Modérateur
La première version beta de la librairie Dvp.NET vient de paraitre !



Dvp.NET est une librairie open source .Net regroupant des fonctionnalités issues des membres du club Developpez.com.
Vous pouvez ajouter cette librairie dans vos projets de développement .NET et bénéficier de ses nombreuses fonctionnalités telles que :
  • Des méthodes d'extensions sur les collections, les chaînes de caractères, les dates, les objets de données, etc. pour faciliter les tâches courantes.
  • Des algorithmes métier fréquemment utilisés (vérification de numéros Siret, Siren, IBAN, RIB, carte de crédit...).
  • Des classes de conversion de nombres en toutes lettres ou en chiffres romains.
  • Des contrôles et utilitaires pour Windows Forms et WPF.
  • Et encore bien d'autres choses !


Elle est distribuée selon les termes de la GNU Lesser General Public License, qui autorise son utilisation aussi bien dans des logiciels libres que propriétaires.

Le projet est actuellement en beta test.
La librairie et le code source sont fournis "en l'état", sans garantie expresse ou implicite d'aucune sorte.


Essayez-la et donnez-nous ici vos retours sur son intérêt, ses fonctionnalités, son utilisation, des améliorations, d'éventuelles corrections...

Cliquez sur le lien ci-contre pour la télécharger Librairie Dvp.NET.



Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Laurent Dardenne Laurent Dardenne - Rédacteur https://www.developpez.com
le 20/05/2010 à 19:44
Salut,
sous PowerShell j'aime bien les classes suivantes (je n'ai pas encore tout testé) :
Developpez.Dotnet.Text.StringTemplate, simple et efficace :
Code : Sélectionner tout
1
2
 
  Get-Service|% {[Developpez.Dotnet.Text.StringTemplate]::Format("Nom={DisplayName} Status={Status}",$_)}
Du coup elle ouvre l'appétit, j'aimerais bien pouvoir manipuler + objets en combinant les 2 approches :
Code : Sélectionner tout
1
2
 
  [Developpez.Dotnet.Text.StringTemplate]::Format("Nom={0.DisplayName} Status={0.Status} Thread={1.Threads}",$Service,$Process)}

ReadOnlyDictionary facilite la création de hashtable en lecture seule, la hashtable étant une structure de base très utilisée sous PowerShell.
Petit embarras sous PowerShell, les constructeurs ne gérent que des génériques, ce qui oblige à créer une instance transitoire.

Developpez.Dotnet.Windows.Collections.RangeObservableCollection couplé avec des event et des jobs peut rendre qq service sous PowerShell.
L'ajout d'une méthode ReplaceRange pourrait être intéressante.

Ensuite le soucis que je trouve à cette classe se situe dans les events déclenchés sur certaines opérations.
Par exemple :
Insert concerne à mon avis l'évenement Add ET l'évenement Move, car en interne on déplace les possibles items de la collection situés en fin de liste.
Remove concerne soit Remove+Reset (suppression du ou des derniers éléments) soit Remove + Move
Et ce dans l'optique d'observer ce qui se passe vraiment sur cette collection, mais ce n'est peut être pas l'objectif de cette classe...

J'ai posté qq demandes sur le gestionnaire du projet, en passant vous ne le mettez pas en avant dans vos posts, c'est voulu ?
Et je n'ai pas vu d'annonce sur le portail projet ni sur le blog de la rubrique dotnet, vous pourriez aussi l'ajouter dans la page composant de la rubrique dotnet.

J'apprécie la documentation . Un petit soucis avec celle en ligne (http://dvp-net.developpez.com/doc/), celle-ci propose un Send Feedback, mais le champ destinataire du mail n'est pas renseigné, juste l'objet.
Il manque à mon avis qq exemples de démonstration des principales classes. Par exemple je suis perplexe sur l'usage de
Developpez.Dotnet.Collections.DefaultDictionary<(K, V>.

Et pour finir l'énumération Developpez.Dotnet.SystemUtils.RebootReason propose None (Aucune information), j'aurais plutôt indiqué à la place Unknown.
C'est juste une histoire de sémantique, rebooter sans raison ce n'est pas courant :-)
De plus vous devriez indiquer que la classe Developpez.Dotnet.SystemUtils.WindowsProvider est dépendante du service WMI (supposez-vous qu'il soit tjr à l'état running ?).

Même si je n'en ai utilisé qu'une infime partie, qui plus est sous PowerShell pour le moment, je trouve que vous avez fait du bon boulot.
Merci.
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 21/05/2010 à 14:46
Salut,

Citation Envoyé par Laurent Dardenne  Voir le message
sous PowerShell

Arf, tu dois nous détester d'avoir pris des namespaces aussi longs

Citation Envoyé par Laurent Dardenne  Voir le message
Developpez.Dotnet.Text.StringTemplate, simple et efficace :
Code : Sélectionner tout
1
2
 
  Get-Service|% {[Developpez.Dotnet.Text.StringTemplate]::Format("Nom={DisplayName} Status={Status}",$_)}
Du coup elle ouvre l'appétit, j'aimerais bien pouvoir manipuler + objets en combinant les 2 approches :
Code : Sélectionner tout
1
2
 
  [Developpez.Dotnet.Text.StringTemplate]::Format("Nom={0.DisplayName} Status={0.Status} Thread={1.Threads}",$Service,$Process)}

Effectivement ça pourrait être sympa. Mais il faudrait complètement revoir l'implémentation... J'essaierai de regarder si c'est faisable un de ces jours

Citation Envoyé par Laurent Dardenne  Voir le message
Developpez.Dotnet.Windows.Collections.RangeObservableCollection couplé avec des event et des jobs peut rendre qq service sous PowerShell.

Ben en fait à la base c'est plutôt pour WPF (ObservableCollection est dans l'assembly WindowsBase, du moins en 3.5). Je voulais avoir la possibilité d'ajouter des items par lot en déclenchant une seule notification CollectionChanged. Le problème, c'est qu'en fait WPF ne sait pas gérer cet évènement pour plus d'un item à la fois, et donc cette classe ne sert à rien pour WPF

Citation Envoyé par Laurent Dardenne  Voir le message
L'ajout d'une méthode ReplaceRange pourrait être intéressante.

C'est envisageable

Citation Envoyé par Laurent Dardenne  Voir le message
Ensuite le soucis que je trouve à cette classe se situe dans les events déclenchés sur certaines opérations.
Par exemple :
Insert concerne à mon avis l'évenement Add ET l'évenement Move, car en interne on déplace les possibles items de la collection situés en fin de liste.
Remove concerne soit Remove+Reset (suppression du ou des derniers éléments) soit Remove + Move
Et ce dans l'optique d'observer ce qui se passe vraiment sur cette collection, mais ce n'est peut être pas l'objectif de cette classe...

Ben en fait, comme j'hérite d'ObservableCollection, il faut pas que je modifie le contrat... donc j'ai gardé la même logique

Citation Envoyé par Laurent Dardenne  Voir le message
J'ai posté qq demandes sur le gestionnaire du projet, en passant vous ne le mettez pas en avant dans vos posts, c'est voulu ?

C'est vrai qu'on y a pas pensé... je vais aller jeter un coup d'oeil à tes demandes quand j'aurai un moment

Citation Envoyé par Laurent Dardenne  Voir le message
Et je n'ai pas vu d'annonce sur le portail projet ni sur le blog de la rubrique dotnet, vous pourriez aussi l'ajouter dans la page composant de la rubrique dotnet.

Il y a eu des annonces il y a 2 mois environ sur le portail principal et sur celui de la rubrique .NET (elles ont disparu depuis), et celle du portail projets est encore visible

Citation Envoyé par Laurent Dardenne  Voir le message
J'apprécie la documentation . Un petit soucis avec celle en ligne (http://dvp-net.developpez.com/doc/), celle-ci propose un Send Feedback, mais le champ destinataire du mail n'est pas renseigné, juste l'objet.

En fait on préfère pas mettre une adresse mail en clair pour éviter le spam... je la mettrai peut-être sous la forme "user (at) domain (dot) com"

Citation Envoyé par Laurent Dardenne  Voir le message
Il manque à mon avis qq exemples de démonstration des principales classes.

Hum... oui, c'est clair que c'est pas très complet à ce niveau là. L'idée était d'utiliser le Wiki pour ça, mais on a pas beaucoup avancé là dessus ces derniers temps

Citation Envoyé par Laurent Dardenne  Voir le message
Par exemple je suis perplexe sur l'usage de
Developpez.Dotnet.Collections.DefaultDictionary<(K, V>.

C'est l'équivalent de la classe defaultdict de Python. En gros, c'est comme un dictionnaire normal, à une différence près : si tu essaies d'accéder à une clé manquante, au lieu de lever une KeyNotFoundException, ça génère une valeur pour cette clé d'après ce que tu as passé en paramètre du constructeur :
- pas de valeur : génère la valeur par défaut du type TValue
- une valeur TValue : génère cette valeur
- un delegate Func<TKey, TValue> : génère une valeur pour la clé recherchée en utilisant ce delegate
La clé et la valeur générée sont ajoutées au dictionnaire (dans la prochaine version, un paramètre du constructeur permettra de changer ce comportement si on ne veut pas conserver les valeurs générées).

Exemple d'utilisation :
Code C# : Sélectionner tout
1
2
var charFrequencies = new DefaultDictionary<char, int>(); 
foreach(char c in inputString) dict[c]++; // pas besoin de tester l'existence de la clé
Citation Envoyé par Laurent Dardenne  Voir le message
Et pour finir l'énumération Developpez.Dotnet.SystemUtils.RebootReason propose None (Aucune information), j'aurais plutôt indiqué à la place Unknown.
C'est juste une histoire de sémantique, rebooter sans raison ce n'est pas courant :-)
De plus vous devriez indiquer que la classe Developpez.Dotnet.SystemUtils.WindowsProvider est dépendante du service WMI (supposez-vous qu'il soit tjr à l'état running ?).

Ca je connais pas trop, faudra voir avec Smyley...

Citation Envoyé par Laurent Dardenne  Voir le message
Même si je n'en ai utilisé qu'une infime partie, qui plus est sous PowerShell pour le moment, je trouve que vous avez fait du bon boulot.
Merci.

Content que ça te plaise, et merci pour ton retour
Avatar de Laurent Dardenne Laurent Dardenne - Rédacteur https://www.developpez.com
le 21/05/2010 à 16:27
Citation Envoyé par tomlev  Voir le message
Salut,
Arf, tu dois nous détester d'avoir pris des namespaces aussi longs

Non la version 2 de PS permet de créer ses propres raccourcis :
Code : Sélectionner tout
1
2
3
4
 
 #http://poshcode.org/762 
Add-Accelerator "StrTemplate" Developpez.Dotnet.Text.StringTemplate 
Get-Service|% {[StrTemplate]::Format("Nom={DisplayName} Status={Status}",$_)}
Citation Envoyé par tomlev  Voir le message
J'essaierai de regarder si c'est faisable un de ces jours

Je suis entrain de regarder une implémentation sous PS directement, l'idée m'a bien plut en tout cas.
Citation Envoyé par tomlev  Voir le message
Ben en fait, comme j'hérite d'ObservableCollection, il faut pas que je modifie le contrat

C'est ce que je craignais, connais-tu une classe opensource qui proposerait un comportement identique sans être dédié à WPF ?
Citation Envoyé par tomlev  Voir le message
faudra voir avec Smyley...

C'est bien ce qui me semblait, ça a un goût de Dreamshield :-)
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 21/05/2010 à 17:19
Citation Envoyé par Laurent Dardenne  Voir le message
C'est ce que je craignais, connais-tu une classe opensource qui proposerait un comportement identique sans être dédié à WPF ?

BindingList<T> peut-être... y a un évènement ListChanged déclenché quand la collection est modifiée. A la base c'est surtout utilisé pour le data binding en Windows Forms, mais c'est dans l'assembly System, donc pas de dépendence à WinForms

Quand même, je me demande qui est le génie chez MS qui a foutu INotifyCollectionChanged et ObservableCollection dans l'assembly WindowsBase
D'ailleurs ils ont du se dire aussi que c'était con, parce qu'en 4.0 c'est dans System...
Avatar de Laurent Dardenne Laurent Dardenne - Rédacteur https://www.developpez.com
le 21/05/2010 à 19:05
Citation Envoyé par tomlev  Voir le message
BindingList<T> peut-être...

Effectivement je n'y avais pas pensé, je vais regarder ça,merci.

Vous est-il possible de localiser la méthode d'extension Developpez.Dotnet.DateExtensions.Previous ?
Code : Sélectionner tout
1
2
3
4
5
  
#ok 
[Developpez.Dotnet.DateExtensions]::Previous((Get-Date),"Sunday") 
#erreur 
[Developpez.Dotnet.DateExtensions]::Previous((Get-Date),"Dimanche")
Une autre remarque concernant la documentation des méthodes Before et Ago de la même classe, on peut passer un interval négatif ce qui fait la date retournée peut être dans le futur :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
  
#Sous PS on voit les méthodes d'extensions comme des méthodes statique 
Get-Date;[Developpez.Dotnet.DateExtensions]::Ago(([TimeSpan]"-1.0:0:0")) 
vendredi 21 mai 2010 18:24:29 
samedi 22 mai 2010 18:24:29 
  
Get-Date;[Developpez.Dotnet.DateExtensions]::before(([TimeSpan]"-1.0:0:0"),(get-date)) 
vendredi 21 mai 2010 18:25:08 
samedi 22 mai 2010 18:25:08
Pour ces méthodes le paramètrage via une date formatée telle que 21/05/2010 ou un nombre de jours -7 serait appréciable.
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 21/05/2010 à 19:39
Citation Envoyé par Laurent Dardenne  Voir le message
Vous est-il possible de localiser la méthode d'extension Developpez.Dotnet.DateExtensions.Previous ?

Code : Sélectionner tout
1
2
3
4
5
  
#ok 
[Developpez.Dotnet.DateExtensions]::Previous((Get-Date),"Sunday") 
#erreur 
[Developpez.Dotnet.DateExtensions]::Previous((Get-Date),"Dimanche")

Euh... y'a rien à localiser, la méthode ne travaille que sur des dates... le paramètre dayOfWeek est un enum, pas une chaine. Sunday fait partie de l'énumération DayOfWeek, pas Dimanche... Si j'en crois ton code, en PowerShell les enum s'écrivent sous forme de chaine ? Si c'est ça j'y peux pas grand chose...

Citation Envoyé par Laurent Dardenne  Voir le message
Une autre remarque concernant la documentation des méthodes Before et Ago de la même classe, on peut passer un interval négatif ce qui fait la date retournée peut être dans le futur :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
 
#Sous PS on voit les méthodes d'extensions comme des méthodes statique 
Get-Date;[Developpez.Dotnet.DateExtensions]::Ago(([TimeSpan]"-1.0:0:0")) 
vendredi 21 mai 2010 18:24:29 
samedi 22 mai 2010 18:24:29 
  
Get-Date;[Developpez.Dotnet.DateExtensions]::before(([TimeSpan]"-1.0:0:0"),(get-date)) 
vendredi 21 mai 2010 18:25:08 
samedi 22 mai 2010 18:25:08

Ben en même temps, tu dis "il y a 1 jour", pas "il y a -1 jour"... donc ça n'a pas beaucoup de sens d'appeler Ago avec une durée négative. Qu'est-ce que tu voudrais qu'on dise dans la doc ?

De toutes façons, je pense que les méthodes de cette classe ont un intérêt limité en PowerShell, vu que c'est des méthodes d'extension. C'est prévu pour s'utiliser comme ça :

Code C# : Sélectionner tout
var fiveMinutesAgo = 5.Minutes().Ago();

Si tu dois l'utiliser sous forme de méthode statique :

Code C# : Sélectionner tout
var fiveMinutesAgo = DateExtensions.Ago(DateTime.Now, DateExtensions.Minutes(5));

Ca n'a plus aucun intérêt... autant écrire directement :

Code C# : Sélectionner tout
var fiveMinutesAgo = DateTime.Now.AddMinutes(-5);
Citation Envoyé par Laurent Dardenne  Voir le message
Pour ces méthodes le paramètrage via une date formatée telle que 21/05/2010 ou un nombre de jours -7 serait appréciable.

C'est à dire ? la méthode prend une date, tu voudrais qu'elle prenne une chaine ? Ca pour le coup ce n'est pas envisageable : sinon la méthode d'extension deviendrait disponible pour toutes les chaines, même quand ça n'a aucun sens... En fait j'ai l'impression que ton besoin est spécifique à PowerShell, en C# ce ne serait pas du tout une bonne chose.
Avatar de Laurent Dardenne Laurent Dardenne - Rédacteur https://www.developpez.com
le 22/05/2010 à 9:51
Citation Envoyé par tomlev  Voir le message
Euh... y'a rien à localiser,

Bon je ferai avec.
Citation Envoyé par tomlev  Voir le message
Si j'en crois ton code, en PowerShell les enum s'écrivent sous forme de chaine ?

Oui c'est une facilité d'écriture.
Citation Envoyé par tomlev  Voir le message

donc ça n'a pas beaucoup de sens d'appeler Ago avec une durée négative.

Oui c'était juste une précision, car ceci reste possible :
Code : Sélectionner tout
1
2
3
  
 int Mn = -5; 
 var f = Mn.Minutes().Ago();
Citation Envoyé par tomlev  Voir le message
De toutes façons, je pense que les méthodes de cette classe ont un intérêt limité en PowerShell, vu que c'est des méthodes d'extension.

Si on utilise un fichier d'extension de type (ETS), comme indiqué ici, cela reste possible de les utiliser sur des variables :
Code : Sélectionner tout
1
2
3
4
5
6
7
 
Update-TypeData -prependPath DvpExtensions.ps1xml 
 #Erreur, pb avec l'interpréteur 
5.Minutes().Ago() 
 #Ok 
$I=5 
$I.Minutes().Ago()
Citation Envoyé par tomlev  Voir le message
En fait j'ai l'impression que ton besoin est spécifique à PowerShell, en C# ce ne serait pas du tout une bonne chose.

Effectivement je vois ça de ma fenêtre :-), je suis allez plus vite que la musique j'imaginais combiner ce code avec ce script:
Code : Sélectionner tout
1
2
3
4
  
 #Crée un filtre recherchant les fichiers  
 #de la semaine dernière  
$AfterThisDate1=$Filtre.AfterThisDate(-7)
C'est vrai que je n'aurais pas ces besoins si j'utilisais votre code pour développer des cmdlets PowerShell en C#.
Offres d'emploi IT
Chef projet big data - pse flotte H/F
Safran - Ile de France - Évry (91090)
Architecte systèmes études & scientifiques H/F
Safran - Ile de France - Vélizy-Villacoublay (78140)
Responsable protection des données H/F
Safran - Ile de France - Magny-les-Hameaux (78114)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Projets