Skip to content
This repository has been archived by the owner on Nov 29, 2023. It is now read-only.

Commit

Permalink
Code should be working - Still need to write a test
Browse files Browse the repository at this point in the history
  • Loading branch information
GideonKoenig committed Apr 22, 2022
1 parent 1284bff commit e83df6e
Show file tree
Hide file tree
Showing 4 changed files with 373 additions and 5 deletions.
4 changes: 2 additions & 2 deletions package-parser/package-parser.iml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<sourceFolder url="file://$MODULE_DIR$/refined_types" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
</content>
<orderEntry type="jdk" jdkName="Poetry (api-editor)" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Poetry (package-parser)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
</module>
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from __future__ import annotations

import json
from io import TextIOWrapper
from pathlib import Path
from typing import Any
from enum import Enum, auto

from package_parser.commands.find_usages import (
ClassUsage,
Expand Down Expand Up @@ -123,9 +126,7 @@ def __add_implicit_usages_of_default_value(usages: UsageStore, api: API) -> None
usages.add_value_usage(parameter_qname, default_value, location)


def __find_constant_parameters(
usages: UsageStore, api: API
) -> dict[str, dict[str, str]]:
def __find_constant_parameters(usages: UsageStore, api: API) -> dict[str, dict[str, str]]:
"""
Returns all parameters that are only ever assigned a single value.
Expand Down Expand Up @@ -188,3 +189,43 @@ def __get_default_type_from_value(default_value: str) -> tuple[str, str]:
default_value = default_value

return default_type, default_value


def __get_required_annotations(usages: UsageStore, api: API) -> dict[str, dict[str, dict[str, str]]]:
result = {}

parameters = (api.parameters())
optional_parameter = [(it, parameters[it]) for it in parameters if parameters[it].default_value is not None]

for qname, parameter in optional_parameter:
values = usages.value_usages[qname].items()
values = [(it[0], len(it[1])) for it in values]
if __get_parameter_type(values)[0] is ParameterType.Required:
target_name = __qname_to_target_name(api, qname)
result[target_name] = {"target": target_name}

return {"requireds": result}


def __get_parameter_type(values: list[tuple[str, int]]) -> (ParameterType, str):
if len(values) == 0:
return ParameterType.Unused, None
elif len(values) == 1:
return ParameterType.Constant, values[0][0]

n = len(values)
m = sum([count for value, count in values])

most_used_value, seconds_most_used_value = sorted(values, key=lambda tup: tup[1])[:2]

if most_used_value[1] - seconds_most_used_value[1] <= n/m:
return ParameterType.Required, None
else:
return ParameterType.Optional, most_used_value[0]


class ParameterType(Enum):
Constant = 0
Optional = 1
Required = 2
Unused = 3
118 changes: 118 additions & 0 deletions package-parser/tests/data/requried/api_data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
{
"distribution": "test",
"package": "test",
"version": "0.0.1",
"modules": [
{
"name": "test",
"imports": [],
"from_imports": [],
"classes": [],
"functions": [
"test.unused_global_function",
"test.commonly_used_global_function"
]
}
],
"classes": [],
"functions": [
{
"name": "unused_global_function",
"unique_name": "unused_global_function",
"qname": "test.unused_global_function",
"unique_qname": "test.unused_global_function",
"decorators": [],
"parameters": [
{
"name": "unused_required_parameter",
"default_value": null,
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
},
{
"name": "unused_optional_parameter",
"default_value": "'bla'",
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
}
],
"results": [],
"is_public": true,
"description": "",
"docstring": "",
"source_code": ""
},
{
"name": "commonly_used_global_function",
"unique_name": "commonly_used_global_function",
"qname": "test.commonly_used_global_function",
"unique_qname": "test.commonly_used_global_function",
"decorators": [],
"parameters": [
{
"name": "useless_required_parameter",
"default_value": null,
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
},
{
"name": "useful_required_parameter",
"default_value": null,
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
},
{
"name": "unused_optional_parameter",
"default_value": "'bla'",
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
},
{
"name": "useless_optional_parameter",
"default_value": "'bla'",
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
},
{
"name": "useful_optional_parameter",
"default_value": "'bla'",
"is_public": true,
"assigned_by": "POSITION_OR_NAME",
"docstring": {
"type": "str",
"description": ""
}
}
],
"results": [],
"is_public": true,
"description": "",
"docstring": "",
"source_code": ""
}
]
}
Loading

0 comments on commit e83df6e

Please sign in to comment.