Skip to content

Commit f070beb

Browse files
committed
Add API Doc
1 parent d1ba4ce commit f070beb

22 files changed

+587
-8
lines changed

Diff for: docs/source/API/api_index.rst

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
====================================
2+
AutoControl API Documentation
3+
====================================
4+
5+
.. toctree::
6+
:maxdepth: 4
7+
8+
wrapper/image.rst
9+
wrapper/keyboard.rst
10+
wrapper/mouse.rst
11+
wrapper/record.rst
12+
wrapper/screen.rst
13+
utils/callback.rst
14+
utils/critical_exit.rst
15+
utils/executor.rst
16+
utils/file.rst
17+
utils/generate_report.rst
18+
utils/package_manager.rst
19+
utils/socket_server.rst

Diff for: docs/source/API/utils/callback.rst

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
Callback Function API
2+
----
3+
4+
.. code-block:: python
5+
6+
def callback_function(
7+
self,
8+
trigger_function_name: str,
9+
callback_function: typing.Callable,
10+
callback_function_param: [dict, None] = None,
11+
callback_param_method: str = "kwargs",
12+
**kwargs
13+
):
14+
"""
15+
:param trigger_function_name: what function we want to trigger only accept function in event_dict
16+
:param callback_function: what function we want to callback
17+
:param callback_function_param: callback function's param only accept dict
18+
:param callback_param_method: what type param will use on callback function only accept kwargs and args
19+
:param kwargs: trigger_function's param
20+
:return: trigger_function_name return value
21+
"""

Diff for: docs/source/API/utils/critical_exit.rst

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
Critical Exit API
2+
----
3+
4+
.. code-block:: python
5+
6+
class CriticalExit(Thread):
7+
"""
8+
use to make program interrupt
9+
"""
10+
11+
def __init__(self, default_daemon: bool = True):
12+
"""
13+
default interrupt is keyboard F7 key
14+
:param default_daemon bool thread setDaemon
15+
"""
16+
super().__init__()
17+
self.daemon = default_daemon
18+
self._exit_check_key: int = keyboard_keys_table.get("f7")
19+
20+
def set_critical_key(self, keycode: [int, str] = None) -> None:
21+
"""
22+
set interrupt key
23+
:param keycode interrupt key
24+
"""
25+
if isinstance(keycode, int):
26+
self._exit_check_key = keycode
27+
else:
28+
self._exit_check_key = keyboard_keys_table.get(keycode)
29+
30+
def run(self) -> None:
31+
"""
32+
listener keycode _exit_check_key to interrupt
33+
"""
34+
try:
35+
while True:
36+
if keyboard_check.check_key_is_press(self._exit_check_key):
37+
_thread.interrupt_main()
38+
except Exception as error:
39+
print(repr(error), file=sys.stderr)
40+
41+
def init_critical_exit(self) -> None:
42+
"""
43+
should only use this to start critical exit
44+
may this function will add more
45+
"""
46+
critical_thread = self
47+
critical_thread.start()

Diff for: docs/source/API/utils/executor.rst

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
Executor API
2+
----
3+
4+
.. code-block:: python
5+
6+
def execute_action(self, action_list: [list, dict]) -> dict:
7+
"""
8+
use to execute all action on action list(action file or program list)
9+
:param action_list the list include action
10+
for loop the list and execute action
11+
"""
12+
13+
.. code-block:: python
14+
15+
def execute_files(self, execute_files_list: list) -> list:
16+
"""
17+
:param execute_files_list: list include execute files path
18+
:return: every execute detail as list
19+
"""
20+
21+
.. code-block:: python
22+
23+
def add_command_to_executor(command_dict: dict):
24+
"""
25+
:param command_dict: dict include command we want to add to event_dict
26+
"""

Diff for: docs/source/API/utils/file.rst

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
File process API
2+
----
3+
4+
.. code-block:: python
5+
6+
def get_dir_files_as_list(
7+
dir_path: str = getcwd(),
8+
default_search_file_extension: str = ".json") -> List[str]:
9+
"""
10+
get dir file when end with default_search_file_extension
11+
:param dir_path: which dir we want to walk and get file list
12+
:param default_search_file_extension: which extension we want to search
13+
:return: [] if nothing searched or [file1, file2.... files] file was searched
14+
"""

Diff for: docs/source/API/utils/generate_report.rst

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
Generate Report API
2+
----
3+
4+
.. code-block:: python
5+
6+
def generate_html() -> str:
7+
"""
8+
this function will create html string
9+
:return: html_string
10+
"""
11+
12+
.. code-block:: python
13+
14+
def generate_html_report(html_name: str = "default_name"):
15+
"""
16+
Output html report file
17+
:param html_name: save html file name
18+
"""
19+
20+
.. code-block:: python
21+
22+
def generate_json():
23+
"""
24+
:return: two dict {success_dict}, {failure_dict}
25+
"""
26+
27+
.. code-block:: python
28+
29+
def generate_json_report(json_file_name: str = "default_name"):
30+
"""
31+
Output json report file
32+
:param json_file_name: save json file's name
33+
"""
34+
35+
.. code-block:: python
36+
37+
def generate_xml():
38+
"""
39+
:return: two dict {success_dict}, {failure_dict}
40+
"""
41+
42+
.. code-block:: python
43+
44+
def generate_xml_report(xml_file_name: str = "default_name"):
45+
"""
46+
:param xml_file_name: save xml file name
47+
"""

Diff for: docs/source/API/utils/package_manager.rst

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
Package Manager API
2+
----
3+
4+
.. code-block:: python
5+
6+
from importlib import import_module
7+
from importlib.util import find_spec
8+
from inspect import getmembers, isfunction, isbuiltin, isclass
9+
from sys import stderr
10+
11+
12+
class PackageManager(object):
13+
14+
def __init__(self):
15+
self.installed_package_dict = {
16+
}
17+
self.executor = None
18+
self.callback_executor = None
19+
20+
def check_package(self, package: str):
21+
"""
22+
:param package: package to check exists or not
23+
:return: package if find else None
24+
"""
25+
if self.installed_package_dict.get(package, None) is None:
26+
found_spec = find_spec(package)
27+
if found_spec is not None:
28+
try:
29+
installed_package = import_module(found_spec.name)
30+
self.installed_package_dict.update(
31+
{found_spec.name: installed_package})
32+
except ModuleNotFoundError as error:
33+
print(repr(error), file=stderr)
34+
return self.installed_package_dict.get(package, None)
35+
36+
def add_package_to_executor(self, package):
37+
"""
38+
:param package: package's function will add to executor
39+
"""
40+
self.add_package_to_target(
41+
package=package,
42+
target=self.executor
43+
)
44+
45+
def add_package_to_callback_executor(self, package):
46+
"""
47+
:param package: package's function will add to callback_executor
48+
"""
49+
self.add_package_to_target(
50+
package=package,
51+
target=self.callback_executor
52+
)
53+
54+
def get_member(self, package, predicate, target):
55+
"""
56+
:param package: package we want to get member
57+
:param predicate: predicate
58+
:param target: which event_dict will be added
59+
"""
60+
installed_package = self.check_package(package)
61+
if installed_package is not None and target is not None:
62+
for member in getmembers(installed_package, predicate):
63+
target.event_dict.update(
64+
{str(package) + "_" + str(member[0]): member[1]})
65+
elif installed_package is None:
66+
print(repr(ModuleNotFoundError(f"Can't find package {package}")),
67+
file=stderr)
68+
else:
69+
print(f"Executor error {self.executor}", file=stderr)
70+
71+
def add_package_to_target(self, package, target):
72+
"""
73+
:param package: package we want to get member
74+
:param target: which event_dict will be added
75+
"""
76+
try:
77+
self.get_member(
78+
package=package,
79+
predicate=isfunction,
80+
target=target
81+
)
82+
self.get_member(
83+
package=package,
84+
predicate=isbuiltin,
85+
target=target
86+
)
87+
self.get_member(
88+
package=package,
89+
predicate=isfunction,
90+
target=target
91+
)
92+
self.get_member(
93+
package=package,
94+
predicate=isclass,
95+
target=target
96+
)
97+
except Exception as error:
98+
print(repr(error), file=stderr)
99+
100+
101+
package_manager = PackageManager()

Diff for: docs/source/API/utils/socket_server.rst

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
Socket Server API
2+
----
3+
4+
.. code-block:: python
5+
6+
import json
7+
import socketserver
8+
import sys
9+
import threading
10+
11+
from je_auto_control.utils.executor.action_executor import execute_action
12+
13+
14+
class TCPServerHandler(socketserver.BaseRequestHandler):
15+
16+
def handle(self):
17+
command_string = str(self.request.recv(8192).strip(), encoding="utf-8")
18+
socket = self.request
19+
print("command is: " + command_string, flush=True)
20+
if command_string == "quit_server":
21+
self.server.shutdown()
22+
self.server.close_flag = True
23+
print("Now quit server", flush=True)
24+
else:
25+
try:
26+
execute_str = json.loads(command_string)
27+
for execute_function, execute_return in execute_action(execute_str).items():
28+
socket.sendto(str(execute_return).encode("utf-8"), self.client_address)
29+
socket.sendto("\n".encode("utf-8"), self.client_address)
30+
socket.sendto("Return_Data_Over_JE".encode("utf-8"), self.client_address)
31+
socket.sendto("\n".encode("utf-8"), self.client_address)
32+
except Exception as error:
33+
print(repr(error), file=sys.stderr)
34+
try:
35+
socket.sendto(str(error).encode("utf-8"), self.client_address)
36+
socket.sendto("\n".encode("utf-8"), self.client_address)
37+
socket.sendto("Return_Data_Over_JE".encode("utf-8"), self.client_address)
38+
socket.sendto("\n".encode("utf-8"), self.client_address)
39+
except Exception as error:
40+
print(repr(error))
41+
42+
43+
class TCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
44+
45+
def __init__(self, server_address, RequestHandlerClass):
46+
super().__init__(server_address, RequestHandlerClass)
47+
self.close_flag: bool = False
48+
49+
50+
def start_autocontrol_socket_server(host: str = "localhost", port: int = 9938):
51+
if len(sys.argv) == 2:
52+
host = sys.argv[1]
53+
elif len(sys.argv) == 3:
54+
host = sys.argv[1]
55+
port = int(sys.argv[2])
56+
server = TCPServer((host, port), TCPServerHandler)
57+
server_thread = threading.Thread(target=server.serve_forever)
58+
server_thread.daemon = True
59+
server_thread.start()
60+
return server

Diff for: docs/source/API/wrapper/image.rst

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
Image API
2+
----
3+
4+
.. code-block:: python
5+
6+
def locate_all_image(image, detect_threshold: [float, int] = 1,
7+
draw_image: bool = False) -> List[int]:
8+
"""
9+
use to locate all image that detected and then return detected images list
10+
:param image which image we want to find on screen (png or PIL ImageGrab.grab())
11+
:param detect_threshold detect precision 0.0 ~ 1.0; 1 is absolute equal (float or int)
12+
:param draw_image draw detect tag on return image (bool)
13+
"""
14+
15+
16+
.. code-block:: python
17+
18+
def locate_image_center(image, detect_threshold: [float, int] = 1, draw_image: bool = False) -> List[Union[int, int]]:
19+
"""
20+
use to locate image and return image center position
21+
:param image which image we want to find on screen (png or PIL ImageGrab.grab())
22+
:param detect_threshold detect precision 0.0 ~ 1.0; 1 is absolute equal (float or int)
23+
:param draw_image draw detect tag on return image (bool)
24+
"""
25+
26+
.. code-block:: python
27+
28+
def locate_and_click(
29+
image, mouse_keycode: [int, str],
30+
detect_threshold: [float, int] = 1,
31+
draw_image: bool = False) -> List[Union[int, int]]:
32+
"""
33+
use to locate image and click image center position and the return image center position
34+
:param image which image we want to find on screen (png or PIL ImageGrab.grab())
35+
:param mouse_keycode which mouse keycode we want to click
36+
:param detect_threshold detect precision 0.0 ~ 1.0; 1 is absolute equal (float or int)
37+
:param draw_image draw detect tag on return image (bool)
38+
"""
39+
40+
.. code-block:: python
41+
42+
def screenshot(file_path: str = None, region: list = None) -> List[Union[int, int]]:
43+
"""
44+
use to get now screen image return image
45+
:param file_path save screenshot path (None is no save)
46+
:param region screenshot screen_region (screenshot screen_region on screen)
47+
"""

0 commit comments

Comments
 (0)