Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

change package name from appinspector to uiauto-dev #7

Merged
merged 1 commit into from
Apr 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ cov:
poetry run pytest --cov=. --cov-report xml --cov-report term

dev: format
poetry run appinspector server --reload --port 20242
poetry run uiauto.dev server --reload --port 20242

mock:
poetry run appinspector server --mock --port 20242 --reload
poetry run uiauto.dev server --mock --port 20242 --reload

build:
rm -fr dist/ && poetry build
17 changes: 8 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
# appinspector
[![codecov](https://codecov.io/gh/codeskyblue/appinspector/graph/badge.svg?token=aLTg4VOyQH)](https://codecov.io/gh/codeskyblue/appinspector)
[![PyPI version](https://badge.fury.io/py/appinspector.svg)](https://badge.fury.io/py/appinspector)
# uiauto-dev
[![codecov](https://codecov.io/gh/codeskyblue/uiauto-dev/graph/badge.svg?token=aLTg4VOyQH)](https://codecov.io/gh/codeskyblue/uiauto-dev)
[![PyPI version](https://badge.fury.io/py/uiauto-dev.svg)](https://badge.fury.io/py/uiauto-dev)

appinspector.devsleep.com client
https://uiauto.dev

Based on
UI Inspector for Android and iOS, help inspector element properties, and auto generate XPath, script.

- fastapi
- adbutils
- tidevice3

# DEVELOP
```bash
# install poetry (python package manager)
pip install poetry # pipx install poetry

# install deps
pip install poetry
poetry install

# format import
Expand Down
20 changes: 0 additions & 20 deletions appinspector/exceptions.py

This file was deleted.

2 changes: 1 addition & 1 deletion chrome_plugin/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

chrome.runtime.onInstalled.addListener(async () => {
chrome.storage.sync.set({ port });
console.log(`[AppInspector] default client port is set to: ${port}`);
console.log(`[uiauto.dev] default client port is set to: ${port}`);
try {
const data = await fetchByMessage({ url: "/info" });
console.log(JSON.stringify(data));
Expand Down
6 changes: 3 additions & 3 deletions chrome_plugin/manifest.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "App Inspector Extension",
"short_name": "App Inspector",
"name": "uiauto.dev Extension",
"short_name": "uiauto.dev",
"author": "codeskyblue",
"description": "AppInspector Extension helps the website app-inspector.devsleep.com communicate with the client.",
"description": "uiauto.dev Extension helps the website app-inspector.devsleep.com communicate with the client.",
"version": "0.1.0",
"manifest_version": 3,
"background": {
Expand Down
8 changes: 4 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[tool.poetry]
name = "appinspector"
name = "uiauto-dev"
version = "0.0.0"
description = "client for app-inspector.devsleep.com"
homepage = "https://github.com/codeskyblue/appinspector"
description = "Mobile UI Automation, include UI hierarchy inspector, script recorder"
homepage = "https://uiauto.dev"
authors = ["codeskyblue <[email protected]>"]
license = "MIT"
readme = "README.md"
Expand All @@ -24,7 +24,7 @@ appium-python-client = {version = "^4.0.0", optional = true}
appium = ["appium-python-client", "httppretty"]

[tool.poetry.scripts]
appinspector = "appinspector.__main__:main"
"uiauto.dev" = "uiauto_dev.__main__:main"

[tool.poetry.group.dev.dependencies]
pytest = "^8.0.1"
Expand Down
10 changes: 5 additions & 5 deletions runtest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

set -e

poetry run appinspector android --help
poetry run appinspector appium --help
poetry run appinspector ios --help
poetry run appinspector version
poetry run appinspector server --help
poetry run uiauto.dev android --help
poetry run uiauto.dev appium --help
poetry run uiauto.dev ios --help
poetry run uiauto.dev version
poetry run uiauto.dev server --help
2 changes: 1 addition & 1 deletion tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from fastapi.testclient import TestClient

from appinspector.app import app
from uiauto_dev.app import app

client = TestClient(app)

Expand Down
2 changes: 1 addition & 1 deletion appinspector/__init__.py → uiauto_dev/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
from importlib.metadata import PackageNotFoundError, version

try:
__version__ = version("appinspector")
__version__ = version("uiauto_dev")
except PackageNotFoundError:
__version__ = "0.0.0"
2 changes: 1 addition & 1 deletion appinspector/__main__.py → uiauto_dev/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""Created on Sun Feb 18 2024 14:20:15 by codeskyblue
"""

from appinspector.cli import main
from uiauto_dev.cli import main

if __name__ == "__main__":
main()
16 changes: 8 additions & 8 deletions appinspector/app.py → uiauto_dev/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
from fastapi.responses import FileResponse, RedirectResponse
from pydantic import BaseModel

from appinspector import __version__
from appinspector.provider import AndroidProvider, IOSProvider, MockProvider
from appinspector.router.device import make_router
from appinspector.router.xml import router as xml_router
from uiauto_dev import __version__
from uiauto_dev.provider import AndroidProvider, IOSProvider, MockProvider
from uiauto_dev.router.device import make_router
from uiauto_dev.router.xml import router as xml_router

logger = logging.getLogger(__name__)

Expand All @@ -39,7 +39,7 @@

app.include_router(mock_router, prefix="/api/mock", tags=["mock"])

if os.environ.get("APPINSPECTOR_MOCK"):
if os.environ.get("uiauto_dev_MOCK"):
app.include_router(mock_router, prefix="/api/android", tags=["mock"])
app.include_router(mock_router, prefix="/api/ios", tags=["mock"])
else:
Expand All @@ -63,7 +63,7 @@ def info() -> InfoResponse:
"""Information about the application"""
return InfoResponse(
version=__version__,
description="client for appinspector.devsleep.com",
description="client for uiauto_dev.devsleep.com",
platform=platform.system(), # Linux | Darwin | Windows
code_language="Python",
cwd=os.getcwd(),
Expand All @@ -88,5 +88,5 @@ def demo() -> str:

@app.get("/")
def index_redirect():
""" redirect to appinspector.devsleep.com """
return RedirectResponse("https://appinspector.devsleep.com")
""" redirect to uiauto_dev.devsleep.com """
return RedirectResponse("https://uiauto_dev.devsleep.com")
File renamed without changes.
18 changes: 9 additions & 9 deletions appinspector/cli.py → uiauto_dev/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
import pydantic
import uvicorn

from appinspector import __version__, command_proxy
from appinspector.command_types import Command
from appinspector.provider import AndroidProvider, BaseProvider, IOSProvider
from appinspector.utils.common import convert_params_to_model, print_json
from uiauto_dev import __version__, command_proxy
from uiauto_dev.command_types import Command
from uiauto_dev.provider import AndroidProvider, BaseProvider, IOSProvider
from uiauto_dev.utils.common import convert_params_to_model, print_json

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -91,8 +91,8 @@ def ios(command: Command, params: list[str] = None):
@click.argument("command", type=Command, required=True)
@click.argument("params", required=False, nargs=-1)
def appium(command: Command, params: list[str] = None):
from appinspector.driver.appium import AppiumProvider
from appinspector.exceptions import AppiumDriverException
from uiauto_dev.driver.appium import AppiumProvider
from uiauto_dev.exceptions import AppiumDriverException

provider = AppiumProvider()
try:
Expand Down Expand Up @@ -120,19 +120,19 @@ def server(port: int, host: str, reload: bool, force: bool):
pass

# if args.mock:
# os.environ["APPINSPECTOR_MOCK"] = "1"
# os.environ["uiauto_dev_MOCK"] = "1"
use_color = True
if platform.system() == 'Windows':
use_color = False
uvicorn.run("appinspector.app:app", host=host, port=port, reload=reload, use_colors=use_color)
uvicorn.run("uiauto_dev.app:app", host=host, port=port, reload=reload, use_colors=use_color)


def main():
# set logger level to INFO
# logging.basicConfig(level=logging.INFO)
logger.setLevel(logging.INFO)
if len(sys.argv) == 1:
cli.main(args=["server"], prog_name="appinspector")
cli.main(args=["server"], prog_name="uiauto_dev")
else:
cli()

Expand Down
19 changes: 12 additions & 7 deletions appinspector/command_proxy.py → uiauto_dev/command_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,33 @@

from pydantic import BaseModel

from appinspector.command_types import Command, CurrentAppResponse, DumpResponse, InstallAppRequest, \
from uiauto_dev.command_types import Command, CurrentAppResponse, DumpResponse, InstallAppRequest, \
InstallAppResponse, TapRequest, WindowSizeResponse
from appinspector.driver.base import BaseDriver
from uiauto_dev.driver.base_driver import BaseDriver

_COMMANDS: Dict[Command, Callable] = {}
COMMANDS: Dict[Command, Callable] = {}


def register(command: Command):
def wrapper(func):
_COMMANDS[command] = func
COMMANDS[command] = func
return func

return wrapper


def get_command_params_type(command: Command) -> Optional[BaseModel]:
func = _COMMANDS.get(command)
func = COMMANDS.get(command)
if func is None:
return None
type_hints = typing.get_type_hints(func)
return type_hints.get("params")


def send_command(driver: BaseDriver, command: Command, params=None):
if command not in _COMMANDS:
if command not in COMMANDS:
raise NotImplementedError(f"command {command} not implemented")
func = _COMMANDS[command]
func = COMMANDS[command]
type_hints = typing.get_type_hints(func)
if type_hints.get("params"):
if params is None:
Expand Down Expand Up @@ -92,3 +92,8 @@ def home(driver: BaseDriver):
def dump(driver: BaseDriver) -> DumpResponse:
source, _ = driver.dump_hierarchy()
return DumpResponse(value=source)


@register(Command.WAKE_UP)
def wake_up(driver: BaseDriver):
driver.wake_up()
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Command(str, enum.Enum):
GET_WINDOW_SIZE = "getWindowSize"
HOME = "home"
DUMP = "dump"
WAKE_UP = "wakeUp"

LIST = "list"

Expand Down
13 changes: 8 additions & 5 deletions appinspector/driver/android.py → uiauto_dev/driver/android.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
import requests
from PIL import Image

from appinspector.command_types import CurrentAppResponse
from appinspector.driver.base import BaseDriver
from appinspector.exceptions import AndroidDriverException
from appinspector.model import Hierarchy, ShellResponse, WindowSize
from appinspector.utils.common import fetch_through_socket
from uiauto_dev.command_types import CurrentAppResponse
from uiauto_dev.driver.base_driver import BaseDriver
from uiauto_dev.exceptions import AndroidDriverException
from uiauto_dev.model import Hierarchy, ShellResponse, WindowSize
from uiauto_dev.utils.common import fetch_through_socket

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -135,6 +135,9 @@ def app_current(self) -> CurrentAppResponse:

def home(self):
self.device.keyevent("HOME")

def wake_up(self):
self.device.keyevent("WAKEUP")


def parse_xml(xml_data: str, wsize: WindowSize) -> Hierarchy:
Expand Down
12 changes: 6 additions & 6 deletions appinspector/driver/appium.py → uiauto_dev/driver/appium.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@
from PIL import Image
from selenium.webdriver.common.proxy import Proxy, ProxyType

from appinspector.command_types import CurrentAppResponse
from appinspector.driver.android import parse_xml
from appinspector.driver.base import BaseDriver
from appinspector.exceptions import AppiumDriverException
from appinspector.model import DeviceInfo, Hierarchy, ShellResponse, WindowSize
from appinspector.provider import BaseProvider
from uiauto_dev.command_types import CurrentAppResponse
from uiauto_dev.driver.android import parse_xml
from uiauto_dev.driver.base_driver import BaseDriver
from uiauto_dev.exceptions import AppiumDriverException
from uiauto_dev.model import DeviceInfo, Hierarchy, ShellResponse, WindowSize
from uiauto_dev.provider import BaseProvider

logger = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
from PIL import Image
from pydantic import BaseModel

from appinspector.command_types import CurrentAppResponse
from appinspector.model import Hierarchy, ShellResponse, WindowSize
from uiauto_dev.command_types import CurrentAppResponse
from uiauto_dev.model import Hierarchy, ShellResponse, WindowSize


class BaseDriver(abc.ABC):
Expand Down Expand Up @@ -61,4 +61,8 @@ def app_current(self) -> CurrentAppResponse:

def home(self):
""" press home button """
raise NotImplementedError()

def wake_up(self):
""" wake up the device """
raise NotImplementedError()
12 changes: 7 additions & 5 deletions appinspector/driver/ios.py → uiauto_dev/driver/ios.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@

from PIL import Image

from appinspector.command_types import CurrentAppResponse
from appinspector.driver.base import BaseDriver
from appinspector.exceptions import IOSDriverException
from appinspector.model import Hierarchy, WindowSize
from appinspector.utils.usbmux import MuxDevice, select_device
from uiauto_dev.command_types import CurrentAppResponse
from uiauto_dev.driver.base_driver import BaseDriver
from uiauto_dev.exceptions import IOSDriverException
from uiauto_dev.model import Hierarchy, WindowSize
from uiauto_dev.utils.usbmux import MuxDevice, select_device


class IOSDriver(BaseDriver):
Expand Down Expand Up @@ -77,6 +77,8 @@ def app_current(self) -> CurrentAppResponse:
value = self._request_json_value("GET", "/wda/activeAppInfo")
return CurrentAppResponse(package=value["bundleId"], pid=value["pid"])

def home(self):
self._request("POST", "/wda/homescreen")


def parse_xml_element(element, wsize: WindowSize, indexes: List[int]=[0]) -> Hierarchy:
Expand Down
Loading
Loading