@@ -851,13 +851,57 @@ def _create_toc(self, doc: str, only_doc: bool = True) -> str:
851
851
return "\n " .join (f"- [{ entry } ](#{ entry .lower ().replace (' ' , '-' )} )" for entry in entries )
852
852
853
853
854
+ def var_repr (value : Any ) -> str :
855
+ if value is None :
856
+ return ""
857
+
858
+ if isinstance (value , NativeValue ):
859
+ value = value .value
860
+
861
+ if value is None :
862
+ return "${None}"
863
+
864
+ if isinstance (value , (int , float , bool )):
865
+ return f"${{{ value !r} }}"
866
+
867
+ if isinstance (value , str ) and value == "" :
868
+ return "${EMPTY}"
869
+
870
+ if isinstance (value , str ) and value == "\\ \\ " :
871
+ return "${SPACE}"
872
+
873
+ if isinstance (value , str ):
874
+ return value
875
+
876
+ return "${{ " + repr (value ) + " }}"
877
+
878
+
854
879
@dataclass
855
880
class VariablesDoc (LibraryDoc ):
856
881
type : str = "VARIABLES"
857
882
scope : str = "GLOBAL"
858
883
859
884
variables : List [ImportedVariableDefinition ] = field (default_factory = list )
860
885
886
+ def to_markdown (self , add_signature : bool = True , only_doc : bool = True , header_level : int = 2 ) -> str :
887
+ result = super ().to_markdown (add_signature , only_doc , header_level )
888
+
889
+ if self .variables :
890
+ result += "\n ---\n \n "
891
+
892
+ result += "\n ```robotframework"
893
+ result += "\n *** Variables ***"
894
+
895
+ for var in self .variables :
896
+ result += "\n " + var .name
897
+ if var .has_value :
898
+ result += " " + var_repr (var .value )
899
+ else :
900
+ result += " ..."
901
+ result += "\n ```"
902
+
903
+ return result
904
+
861
905
862
906
def is_library_by_path (path : str ) -> bool :
863
907
return path .lower ().endswith ((".py" , "/" , os .sep ))
@@ -1563,7 +1607,7 @@ def get_variables_doc(
1563
1607
) -> VariablesDoc :
1564
1608
from robot .libdocpkg .robotbuilder import KeywordDocBuilder
1565
1609
from robot .output import LOGGER
1566
- from robot .running .handlers import _PythonHandler
1610
+ from robot .running .handlers import _PythonHandler , _PythonInitHandler
1567
1611
from robot .utils .importer import Importer
1568
1612
from robot .variables .filesetter import PythonImporter , YamlImporter
1569
1613
@@ -1575,6 +1619,8 @@ def get_variables_doc(
1575
1619
module_spec : Optional [ModuleSpec ] = None
1576
1620
source : Optional [str ] = None
1577
1621
try :
1622
+ python_import = False
1623
+
1578
1624
with _std_capture () as std_capturer :
1579
1625
import_name = find_variables (name , working_dir , base_dir , command_line_variables , variables )
1580
1626
get_variables = None
@@ -1586,6 +1632,8 @@ def get_variables_doc(
1586
1632
source = import_name
1587
1633
importer = JsonImporter ()
1588
1634
else :
1635
+ python_import = True
1636
+
1589
1637
if not is_variables_by_path (import_name ):
1590
1638
module_spec = get_module_spec (import_name )
1591
1639
@@ -1645,43 +1693,80 @@ def is_dynamic(self) -> bool:
1645
1693
python_path = sys .path ,
1646
1694
)
1647
1695
1648
- if get_variables is not None :
1649
-
1650
- class VarHandler (_PythonHandler ):
1651
- def _get_name (self , handler_name : Any , handler_method : Any ) -> Any :
1652
- return get_variables .__name__ if get_variables is not None else ""
1653
-
1654
- def _get_initial_handler (self , library : Any , name : Any , method : Any ) -> Any :
1655
- return None
1656
-
1657
- vars_initializer = VarHandler (libdoc , get_variables .__name__ , get_variables )
1658
-
1659
- libdoc .inits = KeywordStore (
1660
- keywords = [
1661
- KeywordDoc (
1662
- name = libdoc .name ,
1663
- args = [KeywordArgumentDoc .from_robot (a ) for a in kw [0 ].args ],
1664
- doc = kw [0 ].doc ,
1665
- tags = list (kw [0 ].tags ),
1666
- source = kw [0 ].source ,
1667
- line_no = kw [0 ].lineno if kw [0 ].lineno is not None else - 1 ,
1668
- col_offset = - 1 ,
1669
- end_col_offset = - 1 ,
1670
- end_line_no = - 1 ,
1671
- type = "library" ,
1672
- libname = libdoc .name ,
1673
- libtype = libdoc .type ,
1674
- longname = f"{ libdoc .name } .{ kw [0 ].name } " ,
1675
- is_initializer = True ,
1676
- arguments = ArgumentSpec .from_robot_argument_spec (kw [1 ].arguments ),
1677
- parent = libdoc .digest ,
1678
- )
1679
- for kw in [
1680
- (KeywordDocBuilder ().build_keyword (k ), k )
1681
- for k in [KeywordWrapper (vars_initializer , libdoc .source or "" )]
1696
+ if python_import :
1697
+ if get_variables is not None :
1698
+
1699
+ class VarHandler (_PythonHandler ):
1700
+ def _get_name (self , handler_name : Any , handler_method : Any ) -> Any :
1701
+ return get_variables .__name__ if get_variables is not None else ""
1702
+
1703
+ def _get_initial_handler (self , library : Any , name : Any , method : Any ) -> Any :
1704
+ return None
1705
+
1706
+ vars_initializer = VarHandler (libdoc , get_variables .__name__ , get_variables )
1707
+
1708
+ libdoc .inits = KeywordStore (
1709
+ keywords = [
1710
+ KeywordDoc (
1711
+ name = libdoc .name ,
1712
+ args = [KeywordArgumentDoc .from_robot (a ) for a in kw [0 ].args ],
1713
+ doc = kw [0 ].doc ,
1714
+ source = kw [0 ].source ,
1715
+ line_no = kw [0 ].lineno if kw [0 ].lineno is not None else - 1 ,
1716
+ col_offset = - 1 ,
1717
+ end_col_offset = - 1 ,
1718
+ end_line_no = - 1 ,
1719
+ type = "library" ,
1720
+ libname = libdoc .name ,
1721
+ libtype = libdoc .type ,
1722
+ longname = f"{ libdoc .name } .{ kw [0 ].name } " ,
1723
+ is_initializer = True ,
1724
+ arguments = ArgumentSpec .from_robot_argument_spec (kw [1 ].arguments ),
1725
+ parent = libdoc .digest ,
1726
+ )
1727
+ for kw in [
1728
+ (KeywordDocBuilder ().build_keyword (k ), k )
1729
+ for k in [KeywordWrapper (vars_initializer , libdoc .source or "" )]
1730
+ ]
1682
1731
]
1683
- ]
1684
- )
1732
+ )
1733
+ else :
1734
+ get_variables = getattr (libcode , "__init__" , None ) or getattr (libcode , "__init__" , None )
1735
+
1736
+ class InitVarHandler (_PythonInitHandler ):
1737
+ def _get_name (self , handler_name : Any , handler_method : Any ) -> Any :
1738
+ return get_variables .__name__ if get_variables is not None else ""
1739
+
1740
+ def _get_initial_handler (self , library : Any , name : Any , method : Any ) -> Any :
1741
+ return None
1742
+
1743
+ if get_variables is not None :
1744
+ vars_initializer = InitVarHandler (libdoc , get_variables .__name__ , get_variables , None )
1745
+
1746
+ libdoc .inits = KeywordStore (
1747
+ keywords = [
1748
+ KeywordDoc (
1749
+ name = libdoc .name ,
1750
+ args = [],
1751
+ doc = kw [0 ].doc ,
1752
+ source = kw [0 ].source ,
1753
+ line_no = kw [0 ].lineno if kw [0 ].lineno is not None else - 1 ,
1754
+ col_offset = - 1 ,
1755
+ end_col_offset = - 1 ,
1756
+ end_line_no = - 1 ,
1757
+ type = "library" ,
1758
+ libname = libdoc .name ,
1759
+ libtype = libdoc .type ,
1760
+ longname = f"{ libdoc .name } .{ kw [0 ].name } " ,
1761
+ is_initializer = True ,
1762
+ parent = libdoc .digest ,
1763
+ )
1764
+ for kw in [
1765
+ (KeywordDocBuilder ().build_keyword (k ), k )
1766
+ for k in [KeywordWrapper (vars_initializer , libdoc .source or "" )]
1767
+ ]
1768
+ ]
1769
+ )
1685
1770
1686
1771
return libdoc
1687
1772
except (SystemExit , KeyboardInterrupt , IgnoreEasterEggLibraryWarning ):
0 commit comments