mirror of
https://github.com/ModOrganizer2/pystubs-generation.git
synced 2026-07-27 14:07:13 -07:00
Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aef132643e | ||
|
|
1b8b0679f2 | ||
|
|
951f9f5193 | ||
|
|
6e9919fb94 | ||
|
|
422e29417c | ||
|
|
ece93e7cb3 | ||
|
|
4fa50f89a4 |
@@ -15,7 +15,7 @@ jobs:
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
- uses: abatilo/actions-poetry@v2
|
||||
- name: Install
|
||||
run: |
|
||||
|
||||
@@ -10,15 +10,11 @@ jobs:
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
- uses: abatilo/actions-poetry@v2
|
||||
- name: Install
|
||||
run: |
|
||||
poetry install
|
||||
- name: Lint
|
||||
run: |
|
||||
poetry run black src --check --diff
|
||||
poetry run isort -c src
|
||||
poetry run mypy src
|
||||
poetry run ruff src
|
||||
poetry run pyright src
|
||||
poetry run poe lint
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
replace-with: "$1"
|
||||
- uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.11
|
||||
python-version: 3.12
|
||||
- uses: abatilo/actions-poetry@v2
|
||||
- name: Build
|
||||
run: |
|
||||
|
||||
+232
-33
@@ -3,7 +3,7 @@
|
||||
version: 2
|
||||
|
||||
# version of the stubs - this is overridden when publishing
|
||||
__version__: "2.5.0"
|
||||
__version__: "2.5.1"
|
||||
|
||||
# This is the root of the mobase module and will contain everything
|
||||
# related to functions / classes, including their documentation.
|
||||
@@ -114,6 +114,12 @@ mobase:
|
||||
DATE:
|
||||
LITERAL:
|
||||
|
||||
GameFeature:
|
||||
__doc__: |
|
||||
Base class for all game features, cannot be inherited, used only for typing
|
||||
purpose in Python.
|
||||
__abstract__: true
|
||||
|
||||
# TODO:
|
||||
BSAInvalidation:
|
||||
__doc__:
|
||||
@@ -349,6 +355,141 @@ mobase:
|
||||
The last extension of this entry, or an empty string if the file has no extension
|
||||
or is directory.
|
||||
|
||||
IGameFeatures:
|
||||
__doc__: |
|
||||
Interface for the game features, accessible through IOrganizer.gameFeatures().
|
||||
|
||||
gameFeature:
|
||||
__doc__: Retrieve the given game feature, if one exists.
|
||||
abstract: false
|
||||
args:
|
||||
feature_type:
|
||||
__doc__: The class of feature to retrieve.
|
||||
type: Type[GameFeatureType]
|
||||
returns:
|
||||
__doc__: |
|
||||
The game feature corresponding to the given type, or `None` if the feature is
|
||||
not available.
|
||||
type: GameFeatureType
|
||||
|
||||
registerFeature.1:
|
||||
__doc__: |
|
||||
Register game feature for the specified game.
|
||||
|
||||
This method register a game feature to combine or replace with other features
|
||||
of the same kind. Some features are merged (e.g., ModDataContent,
|
||||
ModDataChecker), while other override previous features (e.g., SaveGameInfo).
|
||||
|
||||
For features that can be combined, the priority argument indicates the order of
|
||||
priority (e.g., the order of the checks for ModDataChecker). For other features,
|
||||
the feature with the highest priority will be used. The features provided by the
|
||||
game plugin itself always have lowest priority.
|
||||
|
||||
The feature is associated to the plugin that registers it, if the plugin is
|
||||
disabled, the feature will not be available.
|
||||
|
||||
This function will return True if the feature was registered, even if the
|
||||
feature is not used du to its low priority.
|
||||
|
||||
args:
|
||||
games: Names of the game to enable the feature for.
|
||||
feature: Game feature to register.
|
||||
priority: |
|
||||
Priority of the game feature. If the plugin registering the feature
|
||||
is a game plugin, this parameter is ignored.
|
||||
replace: |
|
||||
If True, remove features of the same kind registered by the current plugin,
|
||||
otherwise add the feature alongside existing ones.
|
||||
|
||||
returns: True if the game feature was properly registered, False otherwise.
|
||||
|
||||
registerFeature.2:
|
||||
__doc__: |
|
||||
Register game feature for the specified game.
|
||||
|
||||
This method register a game feature to combine or replace with other features
|
||||
of the same kind. Some features are merged (e.g., ModDataContent,
|
||||
ModDataChecker), while other override previous features (e.g., SaveGameInfo).
|
||||
|
||||
For features that can be combined, the priority argument indicates the order of
|
||||
priority (e.g., the order of the checks for ModDataChecker). For other features,
|
||||
the feature with the highest priority will be used. The features provided by the
|
||||
game plugin itself always have lowest priority.
|
||||
|
||||
The feature is associated to the plugin that registers it, if the plugin is
|
||||
disabled, the feature will not be available.
|
||||
|
||||
This function will return True if the feature was registered, even if the
|
||||
feature is not used du to its low priority.
|
||||
|
||||
args:
|
||||
game: Game to enable the feature for.
|
||||
feature: Game feature to register.
|
||||
priority: |
|
||||
Priority of the game feature. If the plugin registering the feature
|
||||
is a game plugin, this parameter is ignored.
|
||||
replace: |
|
||||
If True, remove features of the same kind registered by the current plugin,
|
||||
otherwise add the feature alongside existing ones.
|
||||
|
||||
returns: True if the game feature was properly registered, False otherwise.
|
||||
|
||||
registerFeature.3:
|
||||
__doc__: |
|
||||
Register game feature for all games.
|
||||
|
||||
This method register a game feature to combine or replace with other features
|
||||
of the same kind. Some features are merged (e.g., ModDataContent,
|
||||
ModDataChecker), while other override previous features (e.g., SaveGameInfo).
|
||||
|
||||
For features that can be combined, the priority argument indicates the order of
|
||||
priority (e.g., the order of the checks for ModDataChecker). For other features,
|
||||
the feature with the highest priority will be used. The features provided by the
|
||||
game plugin itself always have lowest priority.
|
||||
|
||||
The feature is associated to the plugin that registers it, if the plugin is
|
||||
disabled, the feature will not be available.
|
||||
|
||||
This function will return True if the feature was registered, even if the
|
||||
feature is not used du to its low priority.
|
||||
|
||||
args:
|
||||
feature: Game feature to register.
|
||||
priority: |
|
||||
Priority of the game feature. If the plugin registering the feature
|
||||
is a game plugin, this parameter is ignored.
|
||||
replace: |
|
||||
If True, remove features of the same kind registered by the current plugin,
|
||||
otherwise add the feature alongside existing ones.
|
||||
|
||||
returns: True if the game feature was properly registered, False otherwise.
|
||||
|
||||
unregisterFeature:
|
||||
__doc__: |
|
||||
Unregister the given game feature.
|
||||
|
||||
This function is safe to use even if the given feature was never registered.
|
||||
args:
|
||||
feature: Feature to unregister.
|
||||
returns: True if the feature was successfully unregistered, False otherwise.
|
||||
|
||||
unregisterFeatures:
|
||||
__doc__: |
|
||||
Unregister all features of the given type registered by the calling plugin.
|
||||
|
||||
This function is safe to use even if the plugin has no feature of the given type
|
||||
register.
|
||||
|
||||
args:
|
||||
feature_type:
|
||||
__doc__: The class of feature to unregister.
|
||||
type: Type[GameFeatureType]
|
||||
|
||||
returns: The number of unregistered features.
|
||||
|
||||
|
||||
|
||||
|
||||
GamePlugins:
|
||||
__abstract__: true
|
||||
getLoadOrder:
|
||||
@@ -1476,6 +1617,9 @@ mobase:
|
||||
pattern: The glob pattern to use to filter files.
|
||||
returns: The list of matching files.
|
||||
|
||||
gameFeatures:
|
||||
returns: The interface to the game features.
|
||||
|
||||
getFileOrigins:
|
||||
__doc__: |
|
||||
Retrieve the file origins for the specified file.
|
||||
@@ -1531,17 +1675,36 @@ mobase:
|
||||
modsPath:
|
||||
returns: The (absolute) path to the mods directory.
|
||||
|
||||
onAboutToRun:
|
||||
onAboutToRun.1:
|
||||
__doc__: |
|
||||
Install a new handler to be called when an application is about to run.
|
||||
|
||||
Multiple handlers can be installed. If any of the handler returns `False`, the application will
|
||||
not run.
|
||||
Multiple handlers can be installed. If any of the handler returns `False`, the
|
||||
application will not run.
|
||||
args:
|
||||
callback: |
|
||||
The function to call when an application is about to run. The parameter is the absolute path
|
||||
to the application to run. The function can return False to prevent the application from running.
|
||||
returns: True if the handler was installed properly (there are currently no reasons for this to fail).
|
||||
The function to call when an application is about to run. The function
|
||||
receives the absolute path to the application to run, the working directory
|
||||
for the run and a string containing the arguments passed to the executable.
|
||||
The function can return False to prevent the application from running.
|
||||
returns: |
|
||||
True if the handler was installed properly (there are currently no
|
||||
reasons for this to fail).
|
||||
|
||||
onAboutToRun.2:
|
||||
__doc__: |
|
||||
Install a new handler to be called when an application is about to run.
|
||||
|
||||
Multiple handlers can be installed. If any of the handler returns `False`, the
|
||||
application will not run.
|
||||
args:
|
||||
callback: |
|
||||
The function to call when an application is about to run. The parameter
|
||||
is the absolute path to the application to run. The function can return False
|
||||
to prevent the application from running.
|
||||
returns: |
|
||||
True if the handler was installed properly (there are currently no reasons for
|
||||
this to fail).
|
||||
|
||||
onFinishedRun:
|
||||
__doc__: Install a new handler to be called when an application has finished running.
|
||||
@@ -1549,7 +1712,19 @@ mobase:
|
||||
callback: |
|
||||
The function to call when an application has finished running. The first parameter is the absolute
|
||||
path to the application, and the second parameter is the exit code of the application.
|
||||
returns: True if the handler was installed properly (there are currently no reasons for this to fail).
|
||||
returns: |
|
||||
True if the handler was installed properly (there are currently no reasons for
|
||||
this to fail).
|
||||
|
||||
onNextRefresh:
|
||||
__doc__: Install a new handler to be called on the next refresh or immediately.
|
||||
args:
|
||||
callback: Function to call on the next refresh (or immediately).
|
||||
immediate_if_possible: |
|
||||
If True, immediately run the callback if no refresh is currently running.
|
||||
returns: |
|
||||
True if the handler was installed properly (there are currently no reasons for
|
||||
this to fail).
|
||||
|
||||
onPluginDisabled.1:
|
||||
__doc__: Install a new handler to be called when a plugin is disabled.
|
||||
@@ -1951,9 +2126,11 @@ mobase:
|
||||
See `IPlugin.init()` for more.
|
||||
|
||||
CCPlugins:
|
||||
abstract: false
|
||||
returns: The current list of active Creation Club plugins.
|
||||
|
||||
DLCPlugins:
|
||||
abstract: false
|
||||
returns: The list of esp/esm files that are part of known DLCs.
|
||||
|
||||
binaryName:
|
||||
@@ -1962,38 +2139,24 @@ mobase:
|
||||
dataDirectory:
|
||||
returns: The path to the directory containing data (absolute path).
|
||||
|
||||
displayGameName:
|
||||
abstract: False
|
||||
returns: The name of the game to user for display, default to gameName().
|
||||
|
||||
documentsDirectory:
|
||||
returns: The directory of the documents folder where configuration files and such for this game reside.
|
||||
|
||||
enabledPlugins:
|
||||
abstract: false
|
||||
returns: A list of plugins enabled by the game but not in a strict load order.
|
||||
|
||||
executableForcedLoads:
|
||||
returns: A list of automatically discovered libraries that can be force loaded with executables.
|
||||
|
||||
executables:
|
||||
abstract: false
|
||||
returns: A list of automatically discovered executables of the game itself and tools surrounding it.
|
||||
|
||||
feature:
|
||||
__doc__: Retrieve a specified game feature from this plugin.
|
||||
abstract: false
|
||||
args:
|
||||
feature_type:
|
||||
__doc__: The class of feature to retrieve.
|
||||
type: Type[GameFeatureType]
|
||||
returns:
|
||||
__doc__: |
|
||||
The game feature corresponding to the given type, or `None` if the feature is
|
||||
not implemented.
|
||||
type: GameFeatureType
|
||||
|
||||
featureList:
|
||||
__doc__: |
|
||||
Retrieve the list of game features implemented for this plugin.
|
||||
|
||||
Python plugin should not implement this method but `_featureList()`.
|
||||
abstract: false
|
||||
returns:
|
||||
__doc__: A mapping from feature type to actual game features.
|
||||
type: dict[Type[GameFeatureType], GameFeatureType]
|
||||
|
||||
gameDirectory:
|
||||
returns: The directory containing the game installation.
|
||||
|
||||
@@ -2001,15 +2164,17 @@ mobase:
|
||||
returns: The icon representing the game.
|
||||
|
||||
gameName:
|
||||
returns: The name of the game (as displayed to the user).
|
||||
returns: The name of the game (for internal usage).
|
||||
|
||||
gameNexusName:
|
||||
abstract: false
|
||||
returns: The name of the game identifier for Nexus.
|
||||
|
||||
gameShortName:
|
||||
returns: The short name of the game.
|
||||
|
||||
gameVariants:
|
||||
abstract: false
|
||||
__doc__: |
|
||||
Retrieve the list of variants for this game.
|
||||
|
||||
@@ -2030,6 +2195,7 @@ mobase:
|
||||
returns: An URL for the support page of this game.
|
||||
|
||||
iniFiles:
|
||||
abstract: false
|
||||
returns: |
|
||||
The list of INI files this game uses. The first file in the list should be the
|
||||
'main' INI file.
|
||||
@@ -2057,6 +2223,7 @@ mobase:
|
||||
returns: The list of game saves in the given folder.
|
||||
|
||||
loadOrderMechanism:
|
||||
abstract: false
|
||||
returns: The load order mechanism used by this game.
|
||||
|
||||
looksValid:
|
||||
@@ -2065,6 +2232,11 @@ mobase:
|
||||
directory: Directory to check.
|
||||
returns: True if the directory looks like a valid installation of this game, False otherwise.
|
||||
|
||||
lootGameName:
|
||||
abstract: False
|
||||
returns: |
|
||||
The game name to use when calling LOOT from MO2, default to gameShortName().
|
||||
|
||||
nexusGameID:
|
||||
__doc__: |
|
||||
Retrieve the Nexus game ID for this game.
|
||||
@@ -2073,6 +2245,7 @@ mobase:
|
||||
returns: The Nexus game ID for this game.
|
||||
|
||||
nexusModOrganizerID:
|
||||
abstract: false
|
||||
__doc__: |
|
||||
Retrieve the Nexus mod ID of Mod Organizer for this game.
|
||||
|
||||
@@ -2081,9 +2254,11 @@ mobase:
|
||||
returns: The Nexus mod ID of Mod Organizer for this game.
|
||||
|
||||
primaryPlugins:
|
||||
abstract: false
|
||||
returns: The list of plugins that are part of the game and not considered optional.
|
||||
|
||||
primarySources:
|
||||
abstract: false
|
||||
__doc__: |
|
||||
Retrieve primary alternative 'short' names for this game.
|
||||
|
||||
@@ -2095,11 +2270,11 @@ mobase:
|
||||
returns: The directory where save games are stored.
|
||||
|
||||
secondaryDataDirectories:
|
||||
abstract: false
|
||||
__doc__: |
|
||||
Retrieve the list of secondary data directories. Each directories should be
|
||||
assigned a unique name that differs from "data" which is the name of the main
|
||||
data directory returned by dataDirectory().
|
||||
|
||||
returns: A mapping from unique name to secondary data directories.
|
||||
|
||||
setGamePath:
|
||||
@@ -2122,9 +2297,11 @@ mobase:
|
||||
variant: The game variant selected by the user.
|
||||
|
||||
sortMechanism:
|
||||
abstract: false
|
||||
returns: The sort mechanism for this game.
|
||||
|
||||
steamAPPId:
|
||||
abstract: false
|
||||
__doc__: |
|
||||
Retrieve the Steam app ID for this game.
|
||||
|
||||
@@ -2341,6 +2518,16 @@ mobase:
|
||||
True if the given file has a .esm extension, False otherwise or if the
|
||||
file does not exist.
|
||||
|
||||
hasNoRecords:
|
||||
__doc__: |
|
||||
Determine if a plugin has no records.
|
||||
args:
|
||||
name: Filename of the plugin (without path but with file extension).
|
||||
returns: |
|
||||
True if the given file plugin contains no records, False if it does OR if the
|
||||
file does not exist.
|
||||
|
||||
|
||||
isLightFlagged:
|
||||
__doc__: |
|
||||
Determine if a plugin is flagged as light
|
||||
@@ -2353,6 +2540,18 @@ mobase:
|
||||
True if the given plugin is a light plugin, False otherwise or if the
|
||||
file does not exist.
|
||||
|
||||
isOverlayFlagged:
|
||||
__doc__: |
|
||||
Determine if a plugin is flagged as overlay
|
||||
|
||||
This plugin flag was added in Starfield and signifies plugin records that
|
||||
update existing records
|
||||
args:
|
||||
name: Filename of the plugin (without path but with file extension).
|
||||
returns: |
|
||||
True if the given plugin is an overlay plugin, False otherwise or if the
|
||||
file does not exist.
|
||||
|
||||
hasLightExtension:
|
||||
__doc__: |
|
||||
Determine if a plugin has a .esl extension.
|
||||
|
||||
Generated
+769
File diff suppressed because it is too large
Load Diff
+25
-31
@@ -11,51 +11,45 @@ packages = [{ include = "mo2", from = "src" }]
|
||||
mo2-stubs-generator = "mo2.stubs.generator.__main__:main"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.11"
|
||||
pyqt6 = "^6.5.2"
|
||||
python = "^3.12"
|
||||
pyqt6 = "^6.7.0"
|
||||
pyyaml = "^6.0.1"
|
||||
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
black = "^23.9.1"
|
||||
mypy = "^1.5.1"
|
||||
pyright = "^1.1.327"
|
||||
isort = "^5.12.0"
|
||||
ruff = "^0.0.290"
|
||||
flake8 = "^6.1.0"
|
||||
flake8-black = "^0.3.6"
|
||||
flake8-pyproject = "^1.2.3"
|
||||
types-pyyaml = "^6.0.12.11"
|
||||
|
||||
pyright = "^1.1.365"
|
||||
ruff = "^0.4.7"
|
||||
types-pyyaml = "^6.0.12.20240311"
|
||||
poethepoet = "^0.26.1"
|
||||
|
||||
[tool.poetry.group.doc.dependencies]
|
||||
sphinx-rtd-theme = "^1.3.0"
|
||||
sphinx-autodoc-typehints = "^1.24.0"
|
||||
sphinx-rtd-theme = "^2.0.0"
|
||||
sphinx-autodoc-typehints = "^2.1.0"
|
||||
sphinx-automodapi = "^0.16.0"
|
||||
sphinx = "^7.2.6"
|
||||
sphinx = "^7.3.7"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.flake8]
|
||||
max-line-length = 88
|
||||
extend-ignore = ["E203"]
|
||||
|
||||
[tool.isort]
|
||||
profile = "black"
|
||||
multi_line_output = 3
|
||||
[tool.poe.tasks]
|
||||
format-imports = "ruff check --select I src --fix"
|
||||
format-ruff = "ruff format src"
|
||||
format.sequence = ["format-imports", "format-ruff"]
|
||||
lint-ruff = "ruff check src"
|
||||
lint-ruff-format = "ruff format --check src"
|
||||
lint-pyright = "pyright src"
|
||||
lint.sequence = ["lint-ruff", "lint-ruff-format", "lint-pyright"]
|
||||
lint.ignore_fail = "return_non_zero"
|
||||
|
||||
[tool.ruff]
|
||||
line-length = 88
|
||||
target-version = "py311"
|
||||
target-version = "py310"
|
||||
|
||||
[tool.mypy]
|
||||
warn_return_any = true
|
||||
warn_unused_configs = true
|
||||
namespace_packages = true
|
||||
[tool.ruff.lint]
|
||||
extend-select = ["B", "Q", "I"]
|
||||
|
||||
[tool.ruff.lint.isort]
|
||||
known-first-party = ['tas']
|
||||
|
||||
[tool.pyright]
|
||||
# reportMissingTypeStubs = true
|
||||
# reportUntypedBaseClass = false
|
||||
typeCheckingMode = "strict"
|
||||
reportMissingTypeStubs = true
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import argparse
|
||||
import inspect
|
||||
import logging
|
||||
import subprocess
|
||||
import types
|
||||
from collections.abc import Sequence
|
||||
from pathlib import Path
|
||||
from typing import Callable
|
||||
|
||||
import black
|
||||
import isort
|
||||
|
||||
from .loader import load_mobase
|
||||
from .mtypes import Class, PyTyping
|
||||
from .parser import is_enum
|
||||
@@ -18,7 +17,9 @@ from .writer import Writer, is_list_of_functions
|
||||
LOGGER = logging.getLogger(__package__)
|
||||
|
||||
|
||||
def extract_objects(module: object, skips: list[str] = []) -> list[tuple[str, type]]:
|
||||
def extract_objects(
|
||||
module: object, skips: Sequence[str] = []
|
||||
) -> list[tuple[str, type]]:
|
||||
objects: list[tuple[str, type]] = []
|
||||
|
||||
assert hasattr(module, "__name__")
|
||||
@@ -56,12 +57,9 @@ def add_mobase_header(writer: Writer):
|
||||
"Callable",
|
||||
"Dict",
|
||||
"Iterator",
|
||||
"List",
|
||||
"Optional",
|
||||
"overload",
|
||||
"Sequence",
|
||||
"Set",
|
||||
"Tuple",
|
||||
"Type",
|
||||
"TypeVar",
|
||||
"Union",
|
||||
@@ -150,7 +148,7 @@ def main() -> None:
|
||||
"IPlugin",
|
||||
],
|
||||
),
|
||||
"mobase.widgets": extract_objects(getattr(mobase, "widgets")),
|
||||
"mobase.widgets": extract_objects(mobase.widgets), # type: ignore
|
||||
}
|
||||
|
||||
for name, objects in module_objects.items():
|
||||
@@ -210,19 +208,31 @@ def main() -> None:
|
||||
|
||||
module_headers[name](writer)
|
||||
|
||||
for n, o in objects:
|
||||
for n, _o in objects:
|
||||
# Get the corresponding object:
|
||||
c = register.get_object(n)
|
||||
|
||||
writer.print_object(c)
|
||||
|
||||
black.format_file_in_place(
|
||||
output_folder.joinpath("__init__.pyi"),
|
||||
fast=False,
|
||||
mode=black.Mode(is_pyi=True),
|
||||
write_back=black.WriteBack.YES,
|
||||
subprocess.run(
|
||||
[
|
||||
"ruff",
|
||||
"--silent",
|
||||
"format",
|
||||
output_folder.joinpath("__init__.pyi").as_posix(),
|
||||
]
|
||||
)
|
||||
subprocess.run(
|
||||
[
|
||||
"ruff",
|
||||
"--silent",
|
||||
"check",
|
||||
"--select",
|
||||
"I",
|
||||
"--fix",
|
||||
output_folder.joinpath("__init__.pyi").as_posix(),
|
||||
]
|
||||
)
|
||||
isort.api.sort_file(output_folder.joinpath("__init__.pyi"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from collections.abc import Sequence
|
||||
from typing import Final, TypeVar
|
||||
|
||||
|
||||
@@ -164,7 +165,6 @@ class Argument:
|
||||
|
||||
|
||||
class Exception:
|
||||
|
||||
"""
|
||||
Small class representing exception that can be raised from functions.
|
||||
"""
|
||||
@@ -313,20 +313,20 @@ class Class:
|
||||
self,
|
||||
package: str,
|
||||
name: str,
|
||||
bases: list[Class],
|
||||
methods: list[Method],
|
||||
constants: list[Constant] = [],
|
||||
properties: list[Property] = [],
|
||||
inner_classes: list[Class] = [],
|
||||
bases: Sequence[Class],
|
||||
methods: Sequence[Method],
|
||||
constants: Sequence[Constant] = [],
|
||||
properties: Sequence[Property] = [],
|
||||
inner_classes: Sequence[Class] = [],
|
||||
doc: str = "",
|
||||
):
|
||||
self.package = package
|
||||
self.name = name
|
||||
self.bases = bases
|
||||
self.methods = methods
|
||||
self.properties = properties
|
||||
self.constants = constants
|
||||
self.inner_classes = inner_classes
|
||||
self.bases = list(bases)
|
||||
self.methods = list(methods)
|
||||
self.properties = list(properties)
|
||||
self.constants = list(constants)
|
||||
self.inner_classes = list(inner_classes)
|
||||
self.doc = ""
|
||||
self.abstract = False
|
||||
self.outer_class = None
|
||||
@@ -385,7 +385,6 @@ class Class:
|
||||
|
||||
|
||||
class PyClass(Class):
|
||||
|
||||
"""
|
||||
Class use to wrap Python class to be used as parent class for some classes
|
||||
in mobase.
|
||||
@@ -401,7 +400,6 @@ class PyClass(Class):
|
||||
|
||||
|
||||
class Enum(Class):
|
||||
|
||||
"""
|
||||
Class representing an enum.
|
||||
"""
|
||||
|
||||
@@ -108,9 +108,12 @@ def parse_python_signature(s: str, name: str) -> tuple[PyType, list[Argument]]:
|
||||
raise ValueError(f"invalid argument: {pa}, {s}")
|
||||
|
||||
matches = m.groupdict()
|
||||
arguments.append(
|
||||
Argument(matches["name"], PyType(matches["type"]), matches["value"])
|
||||
)
|
||||
type_ = matches["type"]
|
||||
if matches["value"] == "None":
|
||||
if "None" not in type_ and "MoVariant" not in type_:
|
||||
type_ = type_ + " | None"
|
||||
|
||||
arguments.append(Argument(matches["name"], PyType(type_), matches["value"]))
|
||||
|
||||
return PyType(return_type), arguments
|
||||
|
||||
@@ -131,7 +134,6 @@ def is_enum(e: type) -> bool:
|
||||
|
||||
|
||||
class Overload:
|
||||
|
||||
"""Small class to avoid mypy issues..."""
|
||||
|
||||
return_type: PyType
|
||||
@@ -173,8 +175,8 @@ def parse_pybind11_function_docstring(e: type) -> list[Overload]:
|
||||
|
||||
try:
|
||||
return_type, arguments = parse_python_signature(signature, e.__name__)
|
||||
except ValueError:
|
||||
raise ValueError(f"invalid signature: {e.__name__}, {e.__doc__}")
|
||||
except ValueError as err:
|
||||
raise ValueError(f"invalid signature: {e.__name__}, {e.__doc__}") from err
|
||||
overloads.append(Overload(return_type=return_type, arguments=arguments))
|
||||
|
||||
return overloads
|
||||
@@ -218,7 +220,8 @@ def make_class(e: type, register: MobaseRegister) -> Class:
|
||||
|
||||
# This contains ALL the parent classes, not the direct ones:
|
||||
base_classes: list[Class] = [
|
||||
register.make_object(name) for name in base_classes_s # type: ignore
|
||||
register.make_object(name)
|
||||
for name in base_classes_s # type: ignore
|
||||
]
|
||||
|
||||
# retrieve all the attributes that are not in a base class
|
||||
|
||||
@@ -220,7 +220,9 @@ class Settings:
|
||||
f"mobase.{setting_name}."
|
||||
)
|
||||
|
||||
for setting_arg, method_arg in zip(function_settings.args, fn.args):
|
||||
for setting_arg, method_arg in zip(
|
||||
function_settings.args, fn.args, strict=True
|
||||
):
|
||||
method_arg.doc = setting_arg.doc
|
||||
if not setting_arg.type.is_none():
|
||||
method_arg.type = setting_arg.type
|
||||
@@ -371,7 +373,7 @@ class Settings:
|
||||
)
|
||||
|
||||
for settings_arg, method_arg in zip(
|
||||
function_settings.args, method_arguments
|
||||
function_settings.args, method_arguments, strict=True
|
||||
):
|
||||
method_arg.doc = settings_arg.doc
|
||||
if (
|
||||
|
||||
@@ -163,7 +163,7 @@ class Writer:
|
||||
if not prop.is_read_only():
|
||||
self._print("{}@{}.setter".format(indent, prop.name))
|
||||
self._print(
|
||||
"{}def {}(self, arg0: {}): ...".format(
|
||||
"{}def {}(self, arg0: {}) -> None: ...".format(
|
||||
indent, prop.name, self._fix_typing(prop.type.typing())
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1639,7 +1639,7 @@ class IModList:
|
||||
"""
|
||||
...
|
||||
def allModsByProfilePriority(
|
||||
self: IModList, profile: IProfile = None
|
||||
self: IModList, profile: IProfile | None = None
|
||||
) -> Sequence[str]:
|
||||
"""
|
||||
Returns:
|
||||
@@ -2141,19 +2141,43 @@ class IOrganizer:
|
||||
The (absolute) path to the mods directory.
|
||||
"""
|
||||
...
|
||||
@overload
|
||||
def onAboutToRun(
|
||||
self: IOrganizer, callback: Callable[[str, PyQt6.QtCore.QDir, str], bool]
|
||||
) -> bool:
|
||||
"""
|
||||
Install a new handler to be called when an application is about to run.
|
||||
|
||||
Multiple handlers can be installed. If any of the handler returns `False`, the
|
||||
application will not run.
|
||||
|
||||
Args:
|
||||
callback: The function to call when an application is about to run. The function
|
||||
receives the absolute path to the application to run, the working directory
|
||||
for the run and a string containing the arguments passed to the executable.
|
||||
The function can return False to prevent the application from running.
|
||||
|
||||
Returns:
|
||||
True if the handler was installed properly (there are currently no
|
||||
reasons for this to fail).
|
||||
"""
|
||||
...
|
||||
@overload
|
||||
def onAboutToRun(self: IOrganizer, callback: Callable[[str], bool]) -> bool:
|
||||
"""
|
||||
Install a new handler to be called when an application is about to run.
|
||||
|
||||
Multiple handlers can be installed. If any of the handler returns `False`, the application will
|
||||
not run.
|
||||
Multiple handlers can be installed. If any of the handler returns `False`, the
|
||||
application will not run.
|
||||
|
||||
Args:
|
||||
callback: The function to call when an application is about to run. The parameter is the absolute path
|
||||
to the application to run. The function can return False to prevent the application from running.
|
||||
callback: The function to call when an application is about to run. The parameter
|
||||
is the absolute path to the application to run. The function can return False
|
||||
to prevent the application from running.
|
||||
|
||||
Returns:
|
||||
True if the handler was installed properly (there are currently no reasons for this to fail).
|
||||
True if the handler was installed properly (there are currently no reasons for
|
||||
this to fail).
|
||||
"""
|
||||
...
|
||||
def onFinishedRun(self: IOrganizer, callback: Callable[[str, int], None]) -> bool:
|
||||
@@ -2165,7 +2189,25 @@ class IOrganizer:
|
||||
path to the application, and the second parameter is the exit code of the application.
|
||||
|
||||
Returns:
|
||||
True if the handler was installed properly (there are currently no reasons for this to fail).
|
||||
True if the handler was installed properly (there are currently no reasons for
|
||||
this to fail).
|
||||
"""
|
||||
...
|
||||
def onNextRefresh(
|
||||
self: IOrganizer,
|
||||
callback: Callable[[], None],
|
||||
immediate_if_possible: bool = True,
|
||||
) -> bool:
|
||||
"""
|
||||
Install a new handler to be called on the next refresh or immediately.
|
||||
|
||||
Args:
|
||||
callback: Function to call on the next refresh (or immediately).
|
||||
immediate_if_possible: If True, immediately run the callback if no refresh is currently running.
|
||||
|
||||
Returns:
|
||||
True if the handler was installed properly (there are currently no reasons for
|
||||
this to fail).
|
||||
"""
|
||||
...
|
||||
@overload
|
||||
@@ -2719,14 +2761,12 @@ class IPluginGame(IPlugin):
|
||||
"""
|
||||
|
||||
def __init__(self: IPluginGame) -> None: ...
|
||||
@abc.abstractmethod
|
||||
def CCPlugins(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Returns:
|
||||
The current list of active Creation Club plugins.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def DLCPlugins(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Returns:
|
||||
@@ -2773,6 +2813,12 @@ class IPluginGame(IPlugin):
|
||||
The directory of the documents folder where configuration files and such for this game reside.
|
||||
"""
|
||||
...
|
||||
def enabledPlugins(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Returns:
|
||||
A list of plugins enabled by the game but not in a strict load order.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def executableForcedLoads(
|
||||
self: IPluginGame,
|
||||
@@ -2782,7 +2828,6 @@ class IPluginGame(IPlugin):
|
||||
A list of automatically discovered libraries that can be force loaded with executables.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def executables(self: IPluginGame) -> Sequence[ExecutableInfo]:
|
||||
"""
|
||||
Returns:
|
||||
@@ -2834,7 +2879,6 @@ class IPluginGame(IPlugin):
|
||||
The name of the game (as displayed to the user).
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def gameNexusName(self: IPluginGame) -> str:
|
||||
"""
|
||||
Returns:
|
||||
@@ -2848,7 +2892,6 @@ class IPluginGame(IPlugin):
|
||||
The short name of the game.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def gameVariants(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Retrieve the list of variants for this game.
|
||||
@@ -2883,7 +2926,6 @@ class IPluginGame(IPlugin):
|
||||
An URL for the support page of this game.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def iniFiles(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Returns:
|
||||
@@ -2928,7 +2970,6 @@ class IPluginGame(IPlugin):
|
||||
The list of game saves in the given folder.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def loadOrderMechanism(self: IPluginGame) -> LoadOrderMechanism:
|
||||
"""
|
||||
Returns:
|
||||
@@ -2958,7 +2999,6 @@ class IPluginGame(IPlugin):
|
||||
The Nexus game ID for this game.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def nexusModOrganizerID(self: IPluginGame) -> int:
|
||||
"""
|
||||
Retrieve the Nexus mod ID of Mod Organizer for this game.
|
||||
@@ -2970,14 +3010,12 @@ class IPluginGame(IPlugin):
|
||||
The Nexus mod ID of Mod Organizer for this game.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def primaryPlugins(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Returns:
|
||||
The list of plugins that are part of the game and not considered optional.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def primarySources(self: IPluginGame) -> Sequence[str]:
|
||||
"""
|
||||
Retrieve primary alternative 'short' names for this game.
|
||||
@@ -2996,7 +3034,6 @@ class IPluginGame(IPlugin):
|
||||
The directory where save games are stored.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def secondaryDataDirectories(self: IPluginGame) -> Dict[str, PyQt6.QtCore.QDir]:
|
||||
"""
|
||||
Retrieve the list of secondary data directories. Each directories should be
|
||||
@@ -3032,14 +3069,12 @@ class IPluginGame(IPlugin):
|
||||
variant: The game variant selected by the user.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def sortMechanism(self: IPluginGame) -> SortMechanism:
|
||||
"""
|
||||
Returns:
|
||||
The sort mechanism for this game.
|
||||
"""
|
||||
...
|
||||
@abc.abstractmethod
|
||||
def steamAPPId(self: IPluginGame) -> str:
|
||||
"""
|
||||
Retrieve the Steam app ID for this game.
|
||||
@@ -3818,7 +3853,7 @@ class ISaveGameInfoWidget(PyQt6.QtWidgets.QWidget):
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self: ISaveGameInfoWidget, parent: PyQt6.QtWidgets.QWidget = None
|
||||
self: ISaveGameInfoWidget, parent: PyQt6.QtWidgets.QWidget | None = None
|
||||
) -> None:
|
||||
"""
|
||||
Args:
|
||||
|
||||
@@ -15,7 +15,7 @@ class TaskDialog:
|
||||
|
||||
def __init__(
|
||||
self: TaskDialog,
|
||||
parent: PyQt6.QtWidgets.QWidget = None,
|
||||
parent: PyQt6.QtWidgets.QWidget | None = None,
|
||||
title: str = "",
|
||||
main: str = "",
|
||||
content: str = "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,159 @@
|
||||
from __future__ import annotations
|
||||
|
||||
__version__ = "2.5.1"
|
||||
|
||||
from typing import List, Tuple, Union, overload
|
||||
|
||||
import PyQt6.QtCore
|
||||
import PyQt6.QtGui
|
||||
import PyQt6.QtWidgets
|
||||
|
||||
class TaskDialog:
|
||||
"""
|
||||
Customizable choice dialog.
|
||||
"""
|
||||
|
||||
def __init__(self: TaskDialog, parent: PyQt6.QtWidgets.QWidget | None = None, title: str = '', main: str = '', content: str = '', details: str = '', icon: PyQt6.QtWidgets.QMessageBox.Icon = PyQt6.QtWidgets.QMessageBox.Icon.NoIcon, buttons: list[TaskDialogButton] = [], remember: Union[str, tuple[str, str]] = '') -> None:
|
||||
"""
|
||||
Construct a new TaskDialog.
|
||||
|
||||
Args:
|
||||
parent: Parent widget of the dialog.
|
||||
title: Title of the dialog.
|
||||
main: Header of the dialog (big text at the top).
|
||||
content: Main message of the dialog (text below main).
|
||||
details: Details for the dialog, initially collapsed (bottom of the dialog).
|
||||
icon: Icon for the dialog.
|
||||
buttons: List of buttons for the dialog.
|
||||
remember: Remember the choice for this dialog.
|
||||
"""
|
||||
...
|
||||
def addButton(self: TaskDialog, button: TaskDialogButton) -> TaskDialog:
|
||||
"""
|
||||
Add a custom button to this TaskDialog.
|
||||
|
||||
Args:
|
||||
button: Button to add to the dialog.
|
||||
"""
|
||||
...
|
||||
def addContent(self: TaskDialog, widget: PyQt6.QtWidgets.QWidget) -> None:
|
||||
"""
|
||||
Add a custom widget content to this TaskDialog. Widget content are put between
|
||||
content and buttons (above buttons).
|
||||
|
||||
Args:
|
||||
widget: Widget to add.
|
||||
"""
|
||||
...
|
||||
def exec(self: TaskDialog) -> PyQt6.QtWidgets.QMessageBox.StandardButton:
|
||||
"""
|
||||
Display this dialog and wait for user-interaction to return. This is a blocking
|
||||
function.
|
||||
|
||||
Returns:
|
||||
The button clicked by the user. Without custom buttons, this return Ok,
|
||||
otherwise it returns the button set in the TaskDialogButton.
|
||||
"""
|
||||
...
|
||||
def setContent(self: TaskDialog, content: str) -> TaskDialog:
|
||||
"""
|
||||
Set the top-level message of this dialog.
|
||||
|
||||
Args:
|
||||
content: Top-level message to set.
|
||||
"""
|
||||
...
|
||||
def setDetails(self: TaskDialog, details: str) -> TaskDialog:
|
||||
"""
|
||||
Set the details for this TaskDialog.
|
||||
|
||||
The details are hidden by default and the user can display them by clicking
|
||||
the "Details" button at the bottom of the TaskDialog.
|
||||
|
||||
Args:
|
||||
details: Details content to display. Can be a multi-line string.
|
||||
"""
|
||||
...
|
||||
def setIcon(self: TaskDialog, icon: PyQt6.QtWidgets.QMessageBox.Icon) -> TaskDialog:
|
||||
"""
|
||||
Set the icon of the dialog.
|
||||
|
||||
Args:
|
||||
icon: Icon of the dialog.
|
||||
"""
|
||||
...
|
||||
def setMain(self: TaskDialog, main: str) -> TaskDialog:
|
||||
"""
|
||||
Set the main message of the dialog. The main message is displayed at the top of
|
||||
the dialog in large font.
|
||||
|
||||
Args:
|
||||
main: Main message of the dialog.
|
||||
"""
|
||||
...
|
||||
def setRemember(self: TaskDialog, action: str, file: str = '') -> TaskDialog:
|
||||
"""
|
||||
Configure the dialog to remember user-choice.
|
||||
"""
|
||||
...
|
||||
def setTitle(self: TaskDialog, title: str) -> TaskDialog:
|
||||
"""
|
||||
Set the title of the dialog.
|
||||
|
||||
Args:
|
||||
title: Title of the dialog.
|
||||
"""
|
||||
...
|
||||
def setWidth(self: TaskDialog, width: int) -> None:
|
||||
"""
|
||||
Set the width of the dialog.
|
||||
|
||||
Args:
|
||||
width: Width of the dialog.
|
||||
"""
|
||||
...
|
||||
|
||||
|
||||
class TaskDialogButton:
|
||||
"""
|
||||
Special button to be used inside TaskDialog widgets.
|
||||
"""
|
||||
|
||||
@property
|
||||
def button(self) -> PyQt6.QtWidgets.QMessageBox.StandardButton: ...
|
||||
@button.setter
|
||||
def button(self, arg0: PyQt6.QtWidgets.QMessageBox.StandardButton) -> None: ...
|
||||
|
||||
@property
|
||||
def description(self) -> str: ...
|
||||
@description.setter
|
||||
def description(self, arg0: str) -> None: ...
|
||||
|
||||
@property
|
||||
def text(self) -> str: ...
|
||||
@text.setter
|
||||
def text(self, arg0: str) -> None: ...
|
||||
|
||||
@overload
|
||||
def __init__(self: TaskDialogButton, text: str, description: str, button: PyQt6.QtWidgets.QMessageBox.StandardButton) -> None:
|
||||
"""
|
||||
Create a TaskDialogButton.
|
||||
|
||||
Args:
|
||||
text: Label of the button.
|
||||
description: Description of the button.
|
||||
button: Value returned by TaskDialog.exec() if this button is clicked.
|
||||
"""
|
||||
...
|
||||
@overload
|
||||
def __init__(self: TaskDialogButton, text: str, button: PyQt6.QtWidgets.QMessageBox.StandardButton) -> None:
|
||||
"""
|
||||
Create a TaskDialogButton without description.
|
||||
|
||||
Args:
|
||||
text: Label of the button.
|
||||
button: Value returned by TaskDialog.exec() if this button is clicked.
|
||||
"""
|
||||
...
|
||||
|
||||
|
||||
Generated
+3
-3
@@ -1,7 +1,7 @@
|
||||
# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand.
|
||||
# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
|
||||
package = []
|
||||
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.11"
|
||||
content-hash = "81b2fa642d7f2d1219cf80112ace12d689d053d81be7f7addb98144d56fc0fb2"
|
||||
python-versions = "^3.12"
|
||||
content-hash = "34e39677d8527182346093002688d17a5d2fc204b9eb3e094b2e6ac519028228"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "mobase-stubs"
|
||||
version = "v2.5.0.dev12"
|
||||
version = "v2.5.0.dev17"
|
||||
description = "PEP561 stub files for the mobase Python API."
|
||||
authors = ["Holt59 <capelle.mikael@gmail.com>"]
|
||||
license = "MIT"
|
||||
@@ -11,7 +11,7 @@ documentation = "https://www.modorganizer.org/python-plugins-doc/"
|
||||
repository = "https://github.com/ModOrganizer2/mo2-pystubs-generation"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.11"
|
||||
python = "^3.12"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
|
||||
Reference in New Issue
Block a user