11import os
22import re
33import sys
4- import textwrap
54from pathlib import Path
65from typing import Any , Dict , List , Optional , Pattern , Tuple , Union
76
8- import rich_click as click
7+ try :
8+ import rich_click as click
99
10- from robotidy import skip
11- from robotidy .app import Robotidy
10+ RICH_PRESENT = True
11+ except ImportError : # Fails on vendored-in LSP plugin
12+ import click
13+
14+ RICH_PRESENT = False
15+
16+ from robotidy import app , decorators , exceptions , files , skip , utils , version
1217from robotidy .config import Config , FormattingConfig
13- from robotidy .decorators import catch_exceptions
14- from robotidy .files import DEFAULT_EXCLUDES , find_and_read_config , read_pyproject_config
1518from robotidy .rich_console import console
16- from robotidy .transformers import load_transformers
17- from robotidy .utils import ROBOT_VERSION , RecommendationFinder , TargetVersion , split_args_from_name_or_path
18- from robotidy .version import __version__
19-
20- click .rich_click .USE_RICH_MARKUP = True
21- click .rich_click .USE_MARKDOWN = True
22- click .rich_click .STYLE_OPTION = "bold sky_blue3"
23- click .rich_click .STYLE_SWITCH = "bold sky_blue3"
24- click .rich_click .STYLE_METAVAR = "bold white"
25- click .rich_click .STYLE_OPTION_DEFAULT = "grey37"
26- click .rich_click .STYLE_OPTIONS_PANEL_BORDER = "grey66"
27- click .rich_click .STYLE_USAGE = "magenta"
19+ from robotidy .transformers import TransformType , load_transformers
20+
2821CLI_OPTIONS_LIST = [
2922 {
3023 "name" : "Run only selected transformers" ,
6255 "options" : ["--target-version" , "--language" , "--verbose" , "--color" , "--output" , "--version" , "--help" ],
6356 },
6457]
65- click .rich_click .OPTION_GROUPS = {
66- "robotidy" : CLI_OPTIONS_LIST ,
67- "python -m robotidy" : CLI_OPTIONS_LIST ,
68- }
6958
70-
71- CONTEXT_SETTINGS = dict (help_option_names = ["-h" , "--help" ])
59+ if RICH_PRESENT :
60+ click .rich_click .USE_RICH_MARKUP = True
61+ click .rich_click .USE_MARKDOWN = True
62+ click .rich_click .STYLE_OPTION = "bold sky_blue3"
63+ click .rich_click .STYLE_SWITCH = "bold sky_blue3"
64+ click .rich_click .STYLE_METAVAR = "bold white"
65+ click .rich_click .STYLE_OPTION_DEFAULT = "grey37"
66+ click .rich_click .STYLE_OPTIONS_PANEL_BORDER = "grey66"
67+ click .rich_click .STYLE_USAGE = "magenta"
68+ click .rich_click .OPTION_GROUPS = {
69+ "robotidy" : CLI_OPTIONS_LIST ,
70+ "python -m robotidy" : CLI_OPTIONS_LIST ,
71+ }
7272
7373
74- class TransformType (click .ParamType ):
75- name = "transform"
76-
77- def convert (self , value , param , ctx ):
78- name , args = split_args_from_name_or_path (value .replace (" " , "" ))
79- return name , args
74+ CONTEXT_SETTINGS = dict (help_option_names = ["-h" , "--help" ])
8075
8176
8277def parse_opt (opt ):
@@ -91,17 +86,17 @@ def validate_config_options(params, config):
9186 allowed = {parse_opt (opt ) for param in params for opt in param .opts }
9287 for conf in config :
9388 if conf not in allowed :
94- rec_finder = RecommendationFinder ()
89+ rec_finder = utils . RecommendationFinder ()
9590 similar = rec_finder .find (conf , list (allowed ))
9691 raise click .NoSuchOption (conf , possibilities = similar )
9792
9893
9994def read_config (ctx : click .Context , param : click .Parameter , value : Optional [str ]) -> Optional [str ]:
10095 # if --config was not used, try to find pyproject.toml or robotidy.toml file
10196 if value :
102- config = read_pyproject_config (value )
97+ config = files . read_pyproject_config (value )
10398 else :
104- config = find_and_read_config (ctx .params ["src" ] or (str (Path ("." ).resolve ()),))
99+ config = files . find_and_read_config (ctx .params ["src" ] or (str (Path ("." ).resolve ()),))
105100 if not config :
106101 return
107102 # Sanitize the values to be Click friendly. For more information please see:
@@ -123,7 +118,7 @@ def validate_regex_callback(
123118 param : click .Parameter ,
124119 value : Optional [str ],
125120) -> Optional [Pattern ]:
126- return validate_regex (value )
121+ return utils . validate_regex (value )
127122
128123
129124def validate_target_version (
@@ -132,22 +127,16 @@ def validate_target_version(
132127 value : Optional [str ],
133128) -> Optional [int ]:
134129 if value is None :
135- return ROBOT_VERSION .major
136- version = TargetVersion [value .upper ()].value
137- if version > ROBOT_VERSION .major :
130+ return utils . ROBOT_VERSION .major
131+ version = utils . TargetVersion [value .upper ()].value
132+ if version > utils . ROBOT_VERSION .major :
138133 raise click .BadParameter (
139- f"Target Robot Framework version ({ version } ) should not be higher than installed version ({ ROBOT_VERSION } )."
134+ f"Target Robot Framework version ({ version } ) should not be higher than "
135+ f"installed version ({ utils .ROBOT_VERSION } )."
140136 )
141137 return version
142138
143139
144- def validate_regex (value : Optional [str ]) -> Optional [Pattern ]:
145- try :
146- return re .compile (value ) if value is not None else None
147- except re .error :
148- raise click .BadParameter ("Not a valid regular expression" )
149-
150-
151140def csv_list_type (ctx : click .Context , param : Union [click .Option , click .Parameter ], value : Optional [str ]) -> List [str ]:
152141 if not value :
153142 return []
@@ -161,6 +150,7 @@ def print_transformer_docs(transformer):
161150 console .print (md )
162151
163152
153+ @decorators .optional_rich
164154def print_description (name : str , target_version : int ):
165155 transformers = load_transformers (None , {}, allow_disabled = True , target_version = target_version )
166156 transformer_by_names = {transformer .name : transformer for transformer in transformers }
@@ -170,13 +160,14 @@ def print_description(name: str, target_version: int):
170160 elif name in transformer_by_names :
171161 print_transformer_docs (transformer_by_names [name ])
172162 else :
173- rec_finder = RecommendationFinder ()
163+ rec_finder = utils . RecommendationFinder ()
174164 similar = rec_finder .find_similar (name , transformer_by_names .keys ())
175165 click .echo (f"Transformer with the name '{ name } ' does not exist.{ similar } " )
176166 return 1
177167 return 0
178168
179169
170+ @decorators .optional_rich
180171def print_transformers_list (target_version : int ):
181172 from rich .table import Table
182173
@@ -232,7 +223,7 @@ def print_transformers_list(target_version: int):
232223 " excluded on recursive searches. An empty value means no paths are excluded."
233224 " Use forward slashes for directories on all platforms."
234225 ),
235- show_default = f"{ DEFAULT_EXCLUDES } " ,
226+ show_default = f"{ files . DEFAULT_EXCLUDES } " ,
236227)
237228@click .option (
238229 "--extend-exclude" ,
@@ -388,7 +379,7 @@ def print_transformers_list(target_version: int):
388379@click .option (
389380 "--target-version" ,
390381 "-tv" ,
391- type = click .Choice ([v .name .lower () for v in TargetVersion ], case_sensitive = False ),
382+ type = click .Choice ([v .name .lower () for v in utils . TargetVersion ], case_sensitive = False ),
392383 callback = validate_target_version ,
393384 help = "Only enable transformers supported in set target version" ,
394385 show_default = "installed Robot Framework version" ,
@@ -413,9 +404,9 @@ def print_transformers_list(target_version: int):
413404@skip .return_option
414405@skip .tags_option
415406@skip .block_comments_option
416- @click .version_option (version = __version__ , prog_name = "robotidy" )
407+ @click .version_option (version = version . __version__ , prog_name = "robotidy" )
417408@click .pass_context
418- @catch_exceptions
409+ @decorators . catch_exceptions
419410def cli (
420411 ctx : click .Context ,
421412 transform : List [Tuple [str , List ]],
@@ -476,7 +467,7 @@ def cli(
476467 sys .exit (1 )
477468
478469 if exclude is None :
479- exclude = re .compile (DEFAULT_EXCLUDES )
470+ exclude = re .compile (files . DEFAULT_EXCLUDES )
480471
481472 if config and verbose :
482473 click .echo (f"Loaded { config } configuration file" )
@@ -533,6 +524,6 @@ def cli(
533524 color = color ,
534525 language = language ,
535526 )
536- tidy = Robotidy (config = config )
527+ tidy = app . Robotidy (config = config )
537528 status = tidy .transform_files ()
538529 sys .exit (status )
0 commit comments