Première version beta pour le framework open-source Dvp.NET pour le langage .NET !
Le 2010-03-08 18:03:40, par Skalp, Rédacteur/Modérateur
La première version beta de la librairie Dvp.NET vient de paraitre !
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.
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 :
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.
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
-
Laurent DardenneRédacteurSalut,
sous PowerShell j'aime bien les classes suivantes (je n'ai pas encore tout testé) :
Developpez.Dotnet.Text.StringTemplate, simple et efficace :
Code : 1
2Get-Service|% {[Developpez.Dotnet.Text.StringTemplate]::Format("Nom={DisplayName} Status={Status}",$_)}
Code : 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.le 20/05/2010 à 19:44 -
tomlevRédacteur/ModérateurSalut,
Arf, tu dois nous détester d'avoir pris des namespaces aussi longs
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
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
C'est envisageable
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
C'est vrai qu'on y a pas pensé... je vais aller jeter un coup d'oeil à tes demandes quand j'aurai un moment
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
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"
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
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# : 1
2var charFrequencies = new DefaultDictionary<char, int>(); foreach(char c in inputString) dict[c]++; // pas besoin de tester l'existence de la clé
Content que ça te plaise, et merci pour ton retourle 21/05/2010 à 14:46 -
Laurent DardenneRédacteurNon la version 2 de PS permet de créer ses propres raccourcis :
Code : 1
2
3
4#http://poshcode.org/762 Add-Accelerator "StrTemplate" Developpez.Dotnet.Text.StringTemplate Get-Service|% {[StrTemplate]::Format("Nom={DisplayName} Status={Status}",$_)}
C'est ce que je craignais, connais-tu une classe opensource qui proposerait un comportement identique sans être dédié à WPF ?
C'est bien ce qui me semblait, ça a un goût de Dreamshield :-)le 21/05/2010 à 16:27 -
tomlevRédacteur/ModérateurBindingList<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...le 21/05/2010 à 17:19 -
Laurent DardenneRédacteurEffectivement 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 : 1
2
3
4
5#ok [Developpez.Dotnet.DateExtensions]::Previous((Get-Date),"Sunday") #erreur [Developpez.Dotnet.DateExtensions]::Previous((Get-Date),"Dimanche")
Code : 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
le 21/05/2010 à 19:05 -
tomlevRédacteur/ModérateurEuh... 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...
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# : var fiveMinutesAgo = 5.Minutes().Ago();
Si tu dois l'utiliser sous forme de méthode statique :Code C# : var fiveMinutesAgo = DateExtensions.Ago(DateTime.Now, DateExtensions.Minutes(5));
Ca n'a plus aucun intérêt... autant écrire directement :Code C# : var fiveMinutesAgo = DateTime.Now.AddMinutes(-5);
le 21/05/2010 à 19:39 -
Laurent DardenneRédacteurBon je ferai avec.
Oui c'est une facilité d'écriture.
Oui c'était juste une précision, car ceci reste possible :
Code : 1
2
3int Mn = -5; var f = Mn.Minutes().Ago();
Code : 1
2
3
4
5
6
7Update-TypeData -prependPath DvpExtensions.ps1xml #Erreur, pb avec l'interpréteur 5.Minutes().Ago() #Ok $I=5 $I.Minutes().Ago()
Code : 1
2
3
4#Crée un filtre recherchant les fichiers #de la semaine dernière $AfterThisDate1=$Filtre.AfterThisDate(-7)
le 22/05/2010 à 9:51