Skip to content

Commit

Permalink
Implement CrossLanguageDefinitionId for classes and functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
tjprescott committed Feb 17, 2022
1 parent 523e9e1 commit 92a1e80
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

def console_entry_point():
stub_generator = StubGenerator()
stub_generator.load_mapping()
apiview = stub_generator.generate_tokens()
json_tokens = stub_generator.serialize(apiview)
# Write to JSON file
Expand Down
14 changes: 12 additions & 2 deletions packages/python-packages/api-stub-generator/apistub/_apiview.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class ApiView:
:param str: ver_string
"""

def __init__(self, nodeindex, pkg_name="", namespace = ""):
def __init__(self, nodeindex, pkg_name="", namespace = "", cross_language_map=None):
self.name = pkg_name
self.version = 0
self.version_string = ""
Expand All @@ -40,6 +40,7 @@ def __init__(self, nodeindex, pkg_name="", namespace = ""):
self.namespace = namespace
self.nodeindex = nodeindex
self.package_name = pkg_name
self.cross_language_map = cross_language_map
self.add_token(Token("", TokenKind.SkipDiffRangeStart))
self.add_literal(HEADER_TEXT)
self.add_token(Token("", TokenKind.SkipDiffRangeEnd))
Expand Down Expand Up @@ -110,9 +111,10 @@ def add_line_marker(self, text):
token.definition_id = text
self.add_token(token)

def add_text(self, id, text):
def add_text(self, id, text, cross_language_id=None):
token = Token(text, TokenKind.Text)
token.definition_id = id
token.cross_language_definition_id = cross_language_id
self.add_token(token)

def add_keyword(self, keyword, prefix_space=False, postfix_space=False):
Expand Down Expand Up @@ -202,6 +204,12 @@ def add_literal(self, value):
def add_navigation(self, navigation):
self.navigation.append(navigation)

def _cross_language_id(self, namespace, name):
if name.startswith(namespace):
key = name[len(namespace) + 1:]
else:
key = name
return self.cross_language_map.get(key, None)

class APIViewEncoder(JSONEncoder):
"""Encoder to generate json for APIview object
Expand Down Expand Up @@ -230,6 +238,8 @@ def default(self, obj):
del obj_dict["DefinitionId"]
if not obj.navigate_to_id:
del obj_dict["NavigateToId"]
if not obj.cross_language_definition_id:
del obj_dict["CrossLanguageDefinitionId"]
elif isinstance(obj, Diagnostic):
obj_dict = {self._snake_to_pascal(k):v for k, v in obj.__dict__.items()}
if not obj.help_link_uri:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,16 @@ def __init__(self):
self.filter_namespace = ''
if args.filter_namespace:
self.filter_namespace = args.filter_namespace



def load_mapping(self) -> dict:
# FIXME: Will need to address this!
if self.pkg_path.endswith(".whl") or self.pkg_path.endswith(".zip"):
return {}
mapping_path = os.path.join(self.pkg_path, "apiview_mapping.json")
with open(mapping_path, "r") as json_file:
mapping = json.load(json_file)
return mapping.get("CrossLanguageDefinitionId", None) or {}

def generate_tokens(self):
# Extract package to temp directory if it is wheel or sdist
Expand Down Expand Up @@ -176,7 +185,7 @@ def _generate_tokens(self, pkg_root_path, package_name, version, namespace):

self.module_dict = {}
nodeindex = NodeIndex()
apiview = ApiView(nodeindex, package_name, namespace)
apiview = ApiView(nodeindex, package_name, namespace, cross_language_map=self.load_mapping())
modules = self._find_modules(pkg_root_path)
logging.debug("Modules to generate tokens: {}".format(modules))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,8 @@ def generate_tokens(self, apiview):
apiview.add_whitespace()
apiview.add_line_marker(self.namespace_id)
apiview.add_keyword("class", False, True)
apiview.add_text(self.namespace_id, self.full_name)
cross_lang_id = apiview._cross_language_id(self.namespace, self.full_name)
apiview.add_text(self.namespace_id, self.full_name, cross_language_id=cross_lang_id)

# Add inherited base classes
if self.base_class_names:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,9 +335,11 @@ def generate_tokens(self, apiview):
apiview.add_keyword("async", False, True)

apiview.add_keyword("def", False, True)
cross_lang_id = apiview._cross_language_id(self.namespace, self.full_name)
# Show fully qualified name for module level function and short name for instance functions
apiview.add_text(
self.namespace_id, self.full_name if self.is_module_level else self.name
self.namespace_id, self.full_name if self.is_module_level else self.name,
cross_language_id=cross_lang_id
)
# Add parameters
self._generate_signature_token(apiview)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"CrossLanguageDefinitionId": {
"DocstringClass.docstring_with_formal_default": "Docstring_DocstringWithFormalDefault",
"DocstringClass.docstring_with_default_formal": "Docstring_DocstringWithFormalDefault",
"DocstringClass": "Formal_Model_Id"
}
}

0 comments on commit 92a1e80

Please sign in to comment.