@@ -1726,6 +1726,52 @@ def get_robot_library_html_doc_str(
1726
1726
return output .getvalue ()
1727
1727
1728
1728
1729
+ class _Logger (AbstractLogger ):
1730
+ def __init__ (self ) -> None :
1731
+ super ().__init__ ()
1732
+ self .messages : List [Tuple [str , str , bool ]] = []
1733
+
1734
+ def write (self , message : str , level : str , html : bool = False ) -> None :
1735
+ self .messages .append ((message , level , html ))
1736
+
1737
+
1738
+ def _import_test_library (name : str ) -> Union [Any , Tuple [Any , str ]]:
1739
+ with OutputCapturer (library_import = True ):
1740
+ importer = Importer ("test library" , LOGGER )
1741
+ return importer .import_class_or_module (name , return_source = True )
1742
+
1743
+
1744
+ def _get_test_library (
1745
+ libcode : Any ,
1746
+ source : str ,
1747
+ name : str ,
1748
+ args : Optional [Tuple [Any , ...]] = None ,
1749
+ variables : Optional [Dict [str , Optional [Any ]]] = None ,
1750
+ create_handlers : bool = True ,
1751
+ logger : Any = LOGGER ,
1752
+ ) -> Any :
1753
+ if get_robot_version () < (7 , 0 ):
1754
+ libclass = robot .running .testlibraries ._get_lib_class (libcode )
1755
+ lib = libclass (libcode , name , args or [], source , logger , variables )
1756
+ if create_handlers :
1757
+ lib .create_handlers ()
1758
+ else :
1759
+ lib = robot .running .testlibraries .TestLibrary .from_code (
1760
+ libcode ,
1761
+ name ,
1762
+ source = Path (source ),
1763
+ args = args or [],
1764
+ variables = variables ,
1765
+ create_keywords = create_handlers ,
1766
+ logger = logger ,
1767
+ )
1768
+
1769
+ return lib
1770
+
1771
+
1772
+ _T = TypeVar ("_T" )
1773
+
1774
+
1729
1775
def get_library_doc (
1730
1776
name : str ,
1731
1777
args : Optional [Tuple [Any , ...]] = None ,
@@ -1734,45 +1780,6 @@ def get_library_doc(
1734
1780
command_line_variables : Optional [Dict [str , Optional [Any ]]] = None ,
1735
1781
variables : Optional [Dict [str , Optional [Any ]]] = None ,
1736
1782
) -> LibraryDoc :
1737
- class Logger (AbstractLogger ):
1738
- def __init__ (self ) -> None :
1739
- super ().__init__ ()
1740
- self .messages : List [Tuple [str , str , bool ]] = []
1741
-
1742
- def write (self , message : str , level : str , html : bool = False ) -> None :
1743
- self .messages .append ((message , level , html ))
1744
-
1745
- def import_test_library (name : str ) -> Union [Any , Tuple [Any , str ]]:
1746
- with OutputCapturer (library_import = True ):
1747
- importer = Importer ("test library" , LOGGER )
1748
- return importer .import_class_or_module (name , return_source = True )
1749
-
1750
- def get_test_library (
1751
- libcode : Any ,
1752
- source : str ,
1753
- name : str ,
1754
- args : Optional [Tuple [Any , ...]] = None ,
1755
- variables : Optional [Dict [str , Optional [Any ]]] = None ,
1756
- create_handlers : bool = True ,
1757
- logger : Any = LOGGER ,
1758
- ) -> Any :
1759
- if get_robot_version () < (7 , 0 ):
1760
- libclass = robot .running .testlibraries ._get_lib_class (libcode )
1761
- lib = libclass (libcode , name , args or [], source , logger , variables )
1762
- if create_handlers :
1763
- lib .create_handlers ()
1764
- else :
1765
- lib = robot .running .testlibraries .TestLibrary .from_code (
1766
- libcode ,
1767
- name ,
1768
- source = Path (source ),
1769
- args = args or [],
1770
- variables = variables ,
1771
- create_keywords = create_handlers ,
1772
- logger = logger ,
1773
- )
1774
-
1775
- return lib
1776
1783
1777
1784
with _std_capture () as std_capturer :
1778
1785
import_name , robot_variables = _find_library_internal (
@@ -1796,7 +1803,7 @@ def get_test_library(
1796
1803
1797
1804
source = None
1798
1805
try :
1799
- libcode , source = import_test_library (import_name )
1806
+ libcode , source = _import_test_library (import_name )
1800
1807
except (SystemExit , KeyboardInterrupt ):
1801
1808
raise
1802
1809
except BaseException as e :
@@ -1836,7 +1843,7 @@ def get_test_library(
1836
1843
1837
1844
lib = None
1838
1845
try :
1839
- lib = get_test_library (
1846
+ lib = _get_test_library (
1840
1847
libcode ,
1841
1848
source ,
1842
1849
library_name ,
@@ -1866,7 +1873,7 @@ def get_test_library(
1866
1873
1867
1874
if args :
1868
1875
try :
1869
- lib = get_test_library (libcode , source , library_name , (), create_handlers = False )
1876
+ lib = _get_test_library (libcode , source , library_name , (), create_handlers = False )
1870
1877
if get_robot_version () < (7 , 0 ):
1871
1878
_ = lib .get_instance ()
1872
1879
else :
@@ -1881,6 +1888,10 @@ def get_test_library(
1881
1888
libdoc = LibraryDoc (
1882
1889
name = library_name ,
1883
1890
source = real_source ,
1891
+ line_no = lib .lineno if lib is not None else - 1 ,
1892
+ version = str (lib .version ) if lib is not None else "" ,
1893
+ scope = str (lib .scope ) if lib is not None else ROBOT_DEFAULT_SCOPE ,
1894
+ doc_format = (str (lib .doc_format ) or ROBOT_DOC_FORMAT ) if lib is not None else ROBOT_DOC_FORMAT ,
1884
1895
module_spec = (
1885
1896
module_spec
1886
1897
if module_spec is not None
@@ -1889,16 +1900,33 @@ def get_test_library(
1889
1900
else None
1890
1901
),
1891
1902
python_path = sys .path ,
1892
- line_no = lib .lineno if lib is not None else - 1 ,
1893
- doc = str (lib .doc ) if lib is not None else "" ,
1894
- version = str (lib .version ) if lib is not None else "" ,
1895
- scope = str (lib .scope ) if lib is not None else ROBOT_DEFAULT_SCOPE ,
1896
- doc_format = (str (lib .doc_format ) or ROBOT_DOC_FORMAT ) if lib is not None else ROBOT_DOC_FORMAT ,
1897
1903
member_name = module_spec .member_name if module_spec is not None else None ,
1898
1904
)
1899
1905
1900
1906
if lib is not None :
1901
1907
try :
1908
+
1909
+ def _get (handler : Callable [[], _T ]) -> Optional [_T ]:
1910
+ try :
1911
+ return handler ()
1912
+ except (SystemExit , KeyboardInterrupt ):
1913
+ raise
1914
+ except BaseException as e :
1915
+ errors .append (
1916
+ error_from_exception (
1917
+ e ,
1918
+ source or module_spec .origin if module_spec is not None else None ,
1919
+ (
1920
+ 1
1921
+ if source is not None or module_spec is not None and module_spec .origin is not None
1922
+ else None
1923
+ ),
1924
+ )
1925
+ )
1926
+ return None
1927
+
1928
+ libdoc .doc = _get (lambda : str (lib .doc ) if lib is not None else "" ) or ""
1929
+
1902
1930
if get_robot_version () < (7 , 0 ):
1903
1931
libdoc .has_listener = lib .has_listener
1904
1932
@@ -1928,10 +1956,10 @@ def get_test_library(
1928
1956
keywords = [
1929
1957
KeywordDoc (
1930
1958
name = libdoc .name ,
1931
- arguments = [ArgumentInfo .from_robot (a ) for a in kw [0 ].args ],
1932
- doc = kw [0 ].doc ,
1933
- tags = list (kw [0 ].tags ),
1934
- source = kw [0 ].source ,
1959
+ arguments = _get ( lambda : [ArgumentInfo .from_robot (a ) for a in kw [0 ].args ]) or [ ],
1960
+ doc = _get ( lambda : kw [0 ].doc ) or "" ,
1961
+ tags = _get ( lambda : list (kw [0 ].tags )) or [] ,
1962
+ source = _get ( lambda : kw [0 ].source ) or "" ,
1935
1963
line_no = kw [0 ].lineno if kw [0 ].lineno is not None else - 1 ,
1936
1964
col_offset = - 1 ,
1937
1965
end_col_offset = - 1 ,
@@ -1942,20 +1970,23 @@ def get_test_library(
1942
1970
longname = f"{ libdoc .name } .{ kw [0 ].name } " ,
1943
1971
doc_format = str (lib .doc_format ) or ROBOT_DOC_FORMAT ,
1944
1972
is_initializer = True ,
1945
- arguments_spec = ArgumentSpec .from_robot_argument_spec (
1946
- kw [1 ].arguments if get_robot_version () < (7 , 0 ) else kw [1 ].args
1973
+ arguments_spec = _get (
1974
+ lambda : ArgumentSpec .from_robot_argument_spec (
1975
+ kw [1 ].arguments if get_robot_version () < (7 , 0 ) else kw [1 ].args
1976
+ )
1947
1977
),
1948
1978
)
1949
1979
for kw in init_keywords
1950
1980
]
1951
1981
)
1952
1982
1953
- logger = Logger ()
1954
- lib .logger = logger
1983
+ logger = _Logger ()
1955
1984
1956
1985
if get_robot_version () < (7 , 0 ):
1986
+ lib .logger = logger
1957
1987
lib .create_handlers ()
1958
1988
else :
1989
+ lib ._logger = logger
1959
1990
lib .create_keywords ()
1960
1991
1961
1992
for m in logger .messages :
@@ -1988,10 +2019,10 @@ def get_args_to_process(libdoc_name: str, kw_name: str) -> Any:
1988
2019
keywords = [
1989
2020
KeywordDoc (
1990
2021
name = kw [0 ].name ,
1991
- arguments = [ArgumentInfo .from_robot (a ) for a in kw [0 ].args ],
1992
- doc = kw [0 ].doc ,
1993
- tags = list (kw [0 ].tags ),
1994
- source = kw [0 ].source ,
2022
+ arguments = _get ( lambda : [ArgumentInfo .from_robot (a ) for a in kw [0 ].args ]) or [ ],
2023
+ doc = _get ( lambda : kw [0 ].doc ) or "" ,
2024
+ tags = _get ( lambda : list (kw [0 ].tags )) or [] ,
2025
+ source = _get ( lambda : kw [0 ].source ) or "" ,
1995
2026
line_no = kw [0 ].lineno if kw [0 ].lineno is not None else - 1 ,
1996
2027
col_offset = - 1 ,
1997
2028
end_col_offset = - 1 ,
@@ -2006,21 +2037,26 @@ def get_args_to_process(libdoc_name: str, kw_name: str) -> Any:
2006
2037
is_registered_run_keyword = RUN_KW_REGISTER .is_run_keyword (libdoc .name , kw [0 ].name ),
2007
2038
args_to_process = get_args_to_process (libdoc .name , kw [0 ].name ),
2008
2039
deprecated = kw [0 ].deprecated ,
2009
- arguments_spec = (
2010
- ArgumentSpec .from_robot_argument_spec (
2011
- kw [1 ].arguments if get_robot_version () < (7 , 0 ) else kw [1 ].args
2040
+ arguments_spec = _get (
2041
+ lambda : (
2042
+ ArgumentSpec .from_robot_argument_spec (
2043
+ kw [1 ].arguments if get_robot_version () < (7 , 0 ) else kw [1 ].args
2044
+ )
2045
+ if not kw [1 ].is_error_handler
2046
+ else None
2012
2047
)
2013
- if not kw [1 ].is_error_handler
2014
- else None
2015
2048
),
2016
- return_type = (
2017
- (
2018
- str (kw [1 ].args .return_type )
2019
- if kw [1 ].args .return_type is not None and kw [1 ].args .return_type is not type (None )
2049
+ return_type = _get (
2050
+ lambda : (
2051
+ (
2052
+ str (kw [1 ].args .return_type )
2053
+ if kw [1 ].args .return_type is not None
2054
+ and kw [1 ].args .return_type is not type (None )
2055
+ else None
2056
+ )
2057
+ if get_robot_version () >= (7 , 0 )
2020
2058
else None
2021
2059
)
2022
- if get_robot_version () >= (7 , 0 )
2023
- else None
2024
2060
),
2025
2061
)
2026
2062
for kw in keyword_docs
0 commit comments