Le projet ruby-type-inference est une approche complètement nouvelle pour résoudre les problèmes de la nature dynamique de Ruby et fournir une résolution de symboles et une inférence de type plus fiables. Il collecte des données d'exécution pour créer des contrats de type pour les méthodes.
Chaque fois qu'une méthode est appelée, certains arguments de types particuliers y sont transmis. Type Tracker recueille toutes ces combinaisons d'arguments, puis construit un contrat spécial qui satisfait tous les tuples de type argument rencontrés.
L'approche a ses propres avantages et inconvénients:
Cette implémentation aborde le problème de couverture indiqué en offrant la possibilité de fusionner tout type de contrat à tout moment.
Pour une utilisation simple, vous devez installer le plugin Ruby Dynamic Code Insight pour Rumbymine. Ensuite, ce plugin nécessitera l'installation du joyau arg_scanner. Voir Instruction d'installation Arg_Scanner Si vous avez des problèmes lors de l'installation.
Après cela, vous aurez la possibilité d'exécuter vos programmes sous Type Tracker:

Ou vous pouvez exécuter vos programmes dans Terminal via le binaire rubymine-type-tracker (mais vous devez garder votre projet ouvert dans Rumbymine). Par exemple:
rubymine-type-tracker bin/rails server
Le binaire rubymine-type-tracker est inclus dans le joyau arg_scanner.
Voir les fonctionnalités.md pour comprendre les avantages que vous aurez après avoir exécuté votre programme sous Type Tracker.
Arg_scanner est un gemme avec une extension native pour attacher les processus Ruby et tracer et intercepter tous les appels de méthode pour journaliser le flux de données de type type dans l'exécution.
Voir la documentation arg_scanner pour plus de détails sur l'utilisation.
Le serveur de processeur de contrat de type écoute les données de type entrant (à partir de arg_scanner ) et les traite au format compact.
Les données stockées peuvent être utilisées plus tard pour une meilleure analyse de code et peuvent également être partagées avec d'autres utilisateurs.
Les clients de l'analyse de code (un plugin Rumbymine / IJ + Ruby) utilisent les données du contrat pour fournir des fonctionnalités pour les utilisateurs tels que la réalisation de code, une meilleure résolution, etc.
( TODO ) Signature Server reçoit des contrats de manière anonyme des utilisateurs et fournit des collections de contrats compilées pour les gemmes populaires.
Le joyau arg_scanner est utilisé pour collecter des informations de type. Il peut être installé manuellement sur le SDK cible et nécessite une IRM Ruby au moins 2,3.
Il y a deux possibilités d'utiliser le tracker de type: (i) en utilisant le plugin IJ / rubymine ou (ii) l'exiger à partir du code Ruby.
Le moyen le plus simple d'exécuter le plugin (et le plus pratique pour son développement) est de l'exécuter avec une tâche Gradle spéciale contre IJ Ultimate Snapshot:
./gradlew ide-plugin:runIde
La tâche compilera le plugin, exécutera ij ultimate avec le plugin "installé". Il n'est pas nécessaire d'exécuter quoi que ce soit manuellement dans ce cas.
Si vous souhaitez l'essayer avec une instance Rubymine existante, vous devez:
./gradlew ide-plugin:buildPluginFile | Settings | Plugins | Install plugin from disk...ide-plugin/build/distributions et sélectionnez.Notez qu'en raison des modifications de l'API, le plugin peut être incompatible avec des instances RM plus anciennes.
Afin de collecter les données du script, un serveur de contrat a besoin d'être opérationnel; il pourrait être exécuté en courant
./gradlew contract-creator:runServer --args path-to-db.mv.db où path-to-db.mv.db est le chemin où les contrats de type seront stockés (fichier de base de données H2).
Exécutez le script Ruby à traiter via arg-scanner Binary.
Utilisez les données collectées par le serveur de contrat.
Tout type d'idées, de cas d'utilisation, de contributions et de questions est la bienvenue car le projet incube. N'hésitez pas à créer des problèmes pour toute demande raisonnable.