Polyglotpiranha est un ensemble d'outils de transformation de code léger pour automatiser les modifications à grande échelle. Chez Uber, il est principalement utilisé pour nettoyer les drapeaux de caractéristiques périmées.
Nous ne soutenons que les langues utilisées à Uber. Nous ne pourrons probablement pas ajouter de nouvelles langues dans ce dépôt. Il existe un certain nombre de fourches (voir https://github.com/uber/piranha/frks pour une liste complète) qui peuvent fournir des fonctionnalités supplémentaires.
Pour installer Polyglot Piranha, vous pouvez l'utiliser comme bibliothèque Python ou comme outil de ligne de commande.
Pour installer l'API Python, exécutez la commande suivante:
pip install polyglot-piranha
Pour installer l'interface de ligne de commande, suivez ces étapes:
git clone https://github.com/uber/piranha.git
cd piranha
cargo build --release
(ou cargo build --release --no-default-features
pour MacOS)target/release
from polyglot_piranha import execute_piranha , PiranhaArguments , Rule , RuleGraph , OutgoingEdges
# Original code snippet
code = """
if (obj.isLocEnabled() || x > 0) {
// do something
} else {
// do something else!
}
"""
# Define the rule to replace the method call
r1 = Rule (
name = "replace_method" ,
query = "cs :[x].isLocEnabled()" , # cs indicates we are using concrete syntax
replace_node = "*" ,
replace = "true" ,
is_seed_rule = True
)
# Define the edges for the rule graph.
# In this case, boolean_literal_cleanup is already defined for java [see src/cleanup_rules]
edge = OutgoingEdges ( "replace_method" , to = [ "boolean_literal_cleanup" ], scope = "parent" )
# Create Piranha arguments
piranha_arguments = PiranhaArguments (
code_snippet = code ,
language = "java" ,
rule_graph = RuleGraph ( rules = [ r1 ], edges = [ edge ])
)
# Execute Piranha and print the transformed code
piranha_summary = execute_piranha ( piranha_arguments )
print ( piranha_summary [ 0 ]. content )
Pour plus d'exemples et d'explications de l'ensemble d'outils, veuillez consulter nos démos et le fichier étendu polyglot_readme.md.
Les drapeaux de fonction sont couramment utilisés pour permettre le déploiement progressif ou expérimenter avec de nouvelles fonctionnalités. Dans quelques cas, même après l'obtention de l'objectif du drapeau, le code concernant le drapeau de fonction n'est pas supprimé. Nous faisons référence à des drapeaux comme des drapeaux périmés. La présence de code concernant les drapeaux périmés peut avoir les inconvénients suivants:
Polyglotpiranha est un outil qui peut automatiquement refacter le code lié aux drapeaux périmés. À un niveau supérieur, l'entrée de l'outil est le nom du drapeau et le comportement attendu, après avoir spécifié une liste d'API liée aux drapeaux dans un fichier de propriétés. Piranha utilisera ces entrées pour refacter automatiquement le code en fonction du comportement attendu.
Polyglotpiranha (en mai 2022) est un outil de refactorisation commun pour prendre en charge plusieurs langues et les API de drapeau de caractéristiques. Pour les implémentations spécifiques au langage hérité, veuillez vérifier la balise suivante.
Quelques liens supplémentaires sur Piranha:
Si vous avez des questions sur la façon d'utiliser Piranha ou de trouver des bogues, veuillez ouvrir un problème GitHub.
Piranha est autorisé sous la licence Apache 2.0. Voir le fichier de licence pour plus d'informations.
Ce n'est pas un produit Uber officiel et fourni tel quel.