Skip to content
This repository has been archived by the owner on Jan 19, 2025. It is now read-only.

Commit

Permalink
feat: store whether parameters as assigned by position or name or both
Browse files Browse the repository at this point in the history
  • Loading branch information
lars-reimann committed Oct 30, 2021
1 parent d1b4055 commit 9391c2a
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 5 deletions.
2 changes: 1 addition & 1 deletion package_parser/package_parser/commands/get_api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from ._get_api import get_api
from ._model import API, Class, Function, Parameter, ParameterDocstring
from ._model import API, Class, Function, Parameter, ParameterAssignment, ParameterDocstring
from ._package_metadata import distribution, distribution_version, package_files, package_root
11 changes: 7 additions & 4 deletions package_parser/package_parser/commands/get_api/_ast_visitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from package_parser.utils import parent_qname
from ._file_filters import _is_init_file
from ._model import API, Function, Parameter, Class, ParameterDocstring
from ._model import API, Function, Parameter, Class, ParameterDocstring, ParameterAssignment


class _CallableVisitor:
Expand Down Expand Up @@ -77,19 +77,20 @@ def __function_parameters(node: astroid.FunctionDef, function_is_public: bool) -
docstring = node.doc
function_numpydoc = NumpyDocString(docstring or "")

# Arguments that can be passed positionally only ( f(1) works but not f(x=1) )
# Arguments that can be specified positionally only ( f(1) works but not f(x=1) )
result = [
Parameter(
it.name,
default_value=None,
is_public=function_is_public,
assigned_by=ParameterAssignment.POSITION_ONLY,
docstring=_CallableVisitor.__parameter_docstring(function_numpydoc, it.name)
)

for it in parameters.posonlyargs
]

# Arguments that can be passed positionally or by name ( f(1) and f(x=1) both work )
# Arguments that can be specified positionally or by name ( f(1) and f(x=1) both work )
result += [
Parameter(
it.name,
Expand All @@ -98,13 +99,14 @@ def __function_parameters(node: astroid.FunctionDef, function_is_public: bool) -
index - len(parameters.args) + len(parameters.defaults)
),
function_is_public,
ParameterAssignment.POSITION_OR_NAME,
_CallableVisitor.__parameter_docstring(function_numpydoc, it.name)
)

for index, it in enumerate(parameters.args)
]

# Arguments that can be passed by name only ( f(x=1) works but not f(1) )
# Arguments that can be specified by name only ( f(x=1) works but not f(1) )
result += [
Parameter(
it.name,
Expand All @@ -113,6 +115,7 @@ def __function_parameters(node: astroid.FunctionDef, function_is_public: bool) -
index - len(parameters.kwonlyargs) + len(parameters.kw_defaults)
),
function_is_public,
ParameterAssignment.NAME_ONLY,
_CallableVisitor.__parameter_docstring(function_numpydoc, it.name)
)

Expand Down
11 changes: 11 additions & 0 deletions package_parser/package_parser/commands/get_api/_model.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import inspect
from enum import Enum, auto
from typing import Any, Optional

from package_parser.utils import declaration_name, parent_qname
Expand Down Expand Up @@ -189,6 +190,7 @@ def from_json(json: Any) -> Parameter:
json["name"],
json["default_value"],
json["is_public"],
ParameterAssignment[json["assigned_by"]],
ParameterDocstring.from_json(json["docstring"])
)

Expand All @@ -197,22 +199,31 @@ def __init__(
name: str,
default_value: Optional[str],
is_public: bool,
assigned_by: ParameterAssignment,
docstring: ParameterDocstring
) -> None:
self.name: str = name
self.default_value: Optional[str] = default_value
self.is_public: bool = is_public
self.assigned_by: ParameterAssignment = assigned_by
self.docstring = docstring

def to_json(self) -> Any:
return {
"name": self.name,
"default_value": self.default_value,
"is_public": self.is_public,
"assigned_by": self.assigned_by.name,
"docstring": self.docstring.to_json()
}


class ParameterAssignment(Enum):
POSITION_ONLY = auto(),
POSITION_OR_NAME = auto(),
NAME_ONLY = auto(),


class ParameterDocstring:
@staticmethod
def from_json(json: Any) -> ParameterDocstring:
Expand Down

0 comments on commit 9391c2a

Please sign in to comment.