데이터베이스 관련 파일 삭제: check_db.py, clean_database_admin.py, clean_database.py, create_additional_tables.py, excel_to_sqlite.py 파일을 삭제하여 코드 정리 및 불필요한 기능 제거
This commit is contained in:
parent
0012c66b49
commit
723013e22b
75
README.md
75
README.md
|
|
@ -1,36 +1,69 @@
|
|||
# 고장 코드 조회 앱
|
||||
# 고장코드 검색기
|
||||
|
||||
차량별(로템, 우진) 고장 코드를 조회할 수 있는 안드로이드 앱입니다.
|
||||
부산1호선 전동차 차량 고장코드 검색 애플리케이션입니다.
|
||||
|
||||
## 기능
|
||||
## 특징
|
||||
|
||||
- 차량 제작사 선택
|
||||
- 실시간 검색 (고장코드, 분류, 내용, 등급)
|
||||
- 반응형 UI (가로/세로 모드, 태블릿 지원)
|
||||
- 고장코드 검색 및 상세 정보 조회
|
||||
- 약어, 도면, 신호 목록 조회
|
||||
- 제작사 및 장치분류별 필터링
|
||||
- 라이트/다크 테마 변경 지원
|
||||
- 안드로이드 모바일 지원
|
||||
|
||||
## 설치 방법
|
||||
## 개발 환경 설정
|
||||
|
||||
1. Poetry 설치:
|
||||
```bash
|
||||
pip install poetry
|
||||
1. Poetry를 사용한 환경 설정:
|
||||
```
|
||||
|
||||
2. 의존성 설치:
|
||||
```bash
|
||||
poetry install
|
||||
poetry env activate
|
||||
```
|
||||
|
||||
3. 앱 실행:
|
||||
```bash
|
||||
2. 애플리케이션 실행:
|
||||
```
|
||||
poetry run python main.py
|
||||
```
|
||||
|
||||
## 데이터베이스
|
||||
## 안드로이드 앱 빌드
|
||||
|
||||
SQLite 데이터베이스를 사용하며, 앱 실행 시 자동으로 초기화됩니다.
|
||||
### 준비 사항
|
||||
|
||||
## 개발 환경
|
||||
Android 앱 빌드를 위해 다음이 설치되어 있어야 합니다:
|
||||
|
||||
- Python 3.9+
|
||||
- Flet 0.21.0
|
||||
- SQLite3
|
||||
1. Java JDK 11 이상
|
||||
2. Android SDK
|
||||
3. Flutter SDK
|
||||
4. flet-cli: `pip install flet`
|
||||
|
||||
### 앱 아이콘 준비
|
||||
|
||||
1. 앱 아이콘을 준비하여 `assets/app_icon.png` 경로에 저장하세요.
|
||||
|
||||
### 빌드 방법
|
||||
|
||||
1. 앱 설정 확인:
|
||||
`flet_app_config.py` 파일에서 앱 이름, 패키지명, 버전 등을 원하는 값으로 수정하세요.
|
||||
|
||||
2. 안드로이드 SDK 환경 변수 설정:
|
||||
```
|
||||
set ANDROID_SDK_ROOT=C:\Users\username\AppData\Local\Android\Sdk
|
||||
```
|
||||
|
||||
3. 빌드 스크립트 실행:
|
||||
```
|
||||
python android_build.py
|
||||
```
|
||||
|
||||
4. 빌드 완료 후 생성된 APK 파일을 안드로이드 기기에 설치하세요.
|
||||
|
||||
## 데이터베이스 정보
|
||||
|
||||
- 테이블 구조:
|
||||
- `fault_code_list`: 고장코드 정보
|
||||
- `manufacturers`: 제작사 정보
|
||||
- `abbreviations`: 약어 목록
|
||||
- `drawings`: 도면 목록
|
||||
- `signals`: 신호 목록
|
||||
|
||||
## 제작자 정보
|
||||
|
||||
- 신평-Choi KyungHwan
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
"""
|
||||
고장코드 검색기 앱을 PyInstaller를 사용하여 직접 빌드하는 스크립트
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
def build_app():
|
||||
"""PyInstaller를 사용하여 앱을 빌드합니다."""
|
||||
print("고장코드 검색기 앱 빌드를 시작합니다...")
|
||||
|
||||
# 1. 빌드 디렉토리 정리
|
||||
build_dir = Path("build")
|
||||
dist_dir = Path("dist")
|
||||
for dir_path in [build_dir, dist_dir]:
|
||||
if dir_path.exists():
|
||||
shutil.rmtree(dir_path)
|
||||
print(f"{dir_path} 디렉토리를 삭제했습니다.")
|
||||
|
||||
# 2. 필요한 파일 준비
|
||||
icon_path = "assets/app_icon.png"
|
||||
if not os.path.exists(icon_path):
|
||||
print(f"경고: 아이콘 파일이 없습니다. 기본 아이콘이 사용됩니다.")
|
||||
|
||||
# 3. 앱 ID 및 이름 설정
|
||||
app_name = "고장코드검색기"
|
||||
company_name = "신평-Choi KyungHwan"
|
||||
|
||||
# 4. PyInstaller 명령어 구성
|
||||
cmd = [
|
||||
"pyinstaller",
|
||||
"--name", app_name,
|
||||
"--onefile", # 단일 실행 파일로 빌드
|
||||
"--windowed", # 콘솔 창 표시 안 함
|
||||
"--clean", # 빌드 전 이전 빌드 파일 정리
|
||||
"--noconfirm", # 기존 빌드 파일 덮어쓰기 확인 안 함
|
||||
"--add-data", "database;database", # 데이터베이스 모듈 포함
|
||||
"--add-data", "ui;ui", # UI 모듈 포함
|
||||
"--add-data", "fault_codes.db;.", # 데이터베이스 파일 포함
|
||||
]
|
||||
|
||||
# 아이콘이 있는 경우 추가
|
||||
if os.path.exists(icon_path):
|
||||
cmd.extend(["--icon", icon_path])
|
||||
|
||||
# 메인 스크립트 추가
|
||||
cmd.append("main.py")
|
||||
|
||||
# 5. PyInstaller 실행
|
||||
print("명령어 실행:", " ".join(cmd))
|
||||
try:
|
||||
subprocess.run(cmd, check=True)
|
||||
print("앱 빌드 완료!")
|
||||
|
||||
# 빌드된 실행 파일 경로
|
||||
exe_path = Path(f"dist/{app_name}.exe")
|
||||
if exe_path.exists():
|
||||
print(f"실행 파일이 생성되었습니다: {exe_path}")
|
||||
else:
|
||||
print("실행 파일을 찾을 수 없습니다. 빌드 로그를 확인하세요.")
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"빌드 중 오류 발생: {e}")
|
||||
except Exception as e:
|
||||
print(f"예상치 못한 오류 발생: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
build_app()
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
"""
|
||||
안드로이드 앱 빌드 스크립트
|
||||
고장코드 검색기 앱을 안드로이드 APK로 패키징합니다.
|
||||
"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
import flet_app_config as config
|
||||
|
||||
def build_android_app():
|
||||
"""Flet 앱을 안드로이드 APK로 빌드합니다."""
|
||||
print("고장코드 검색기 안드로이드 앱 빌드를 시작합니다...")
|
||||
|
||||
# 1. assets 디렉토리가 없으면 생성
|
||||
if not os.path.exists("assets"):
|
||||
os.makedirs("assets")
|
||||
print("assets 디렉토리 생성 완료")
|
||||
|
||||
# 2. 아이콘이 없으면 기본 아이콘 생성 (실제 앱에서는 아이콘 파일을 준비해야 함)
|
||||
icon_path = "assets/app_icon.png"
|
||||
if not os.path.exists(icon_path):
|
||||
print(f"앱 아이콘이 필요합니다. {icon_path}에 아이콘을 준비해주세요.")
|
||||
return
|
||||
|
||||
# 3. 빌드 디렉토리 생성
|
||||
build_dir = Path("build")
|
||||
if build_dir.exists():
|
||||
shutil.rmtree(build_dir)
|
||||
build_dir.mkdir()
|
||||
|
||||
# 4. 필요한 파일 복사
|
||||
files_to_copy = [
|
||||
"main.py",
|
||||
"fault_codes.db",
|
||||
icon_path
|
||||
]
|
||||
|
||||
# ui 및 database 모듈 복사
|
||||
for dir_name in ["ui", "database"]:
|
||||
src_dir = Path(dir_name)
|
||||
if src_dir.exists():
|
||||
shutil.copytree(src_dir, build_dir / dir_name)
|
||||
|
||||
for file in files_to_copy:
|
||||
if os.path.exists(file):
|
||||
shutil.copy2(file, build_dir)
|
||||
|
||||
# 5. flet build 명령어 실행
|
||||
try:
|
||||
# flet 0.21.2 버전에 맞는 명령어 형식으로 수정
|
||||
cmd = [
|
||||
"flet", "build", "apk",
|
||||
"--project", config.APP_NAME,
|
||||
"--org", config.APP_PACKAGE_NAME.rsplit(".", 1)[0], # "com.shinpyung"
|
||||
"--build-version", config.APP_VERSION,
|
||||
"--build-number", config.APP_BUILD,
|
||||
str(build_dir) # 마지막 인수로 Python 앱 경로 지정
|
||||
]
|
||||
|
||||
print("명령어 실행:", " ".join(cmd))
|
||||
subprocess.run(cmd, check=True)
|
||||
print("앱 빌드 완료!")
|
||||
|
||||
# 빌드된 APK 파일 위치 찾기 (경로가 다를 수 있음)
|
||||
possible_apk_paths = [
|
||||
build_dir / "build" / "app" / "outputs" / "flutter-apk" / "app-release.apk",
|
||||
Path("build/build/app/outputs/flutter-apk/app-release.apk"),
|
||||
Path(f"build/{config.APP_NAME}/build/app/outputs/flutter-apk/app-release.apk"),
|
||||
Path(f"build/build/{config.APP_NAME}/app/outputs/flutter-apk/app-release.apk")
|
||||
]
|
||||
|
||||
found_apk = False
|
||||
for apk_path in possible_apk_paths:
|
||||
if apk_path.exists():
|
||||
# 최종 위치로 APK 복사
|
||||
final_apk = Path(f"{config.APP_NAME}_{config.APP_VERSION}.apk")
|
||||
shutil.copy2(apk_path, final_apk)
|
||||
print(f"APK 파일이 생성되었습니다: {final_apk}")
|
||||
found_apk = True
|
||||
break
|
||||
|
||||
if not found_apk:
|
||||
print("APK 파일을 찾을 수 없습니다. 빌드 디렉토리를 검색합니다...")
|
||||
# 빌드 디렉토리 검색
|
||||
for root, dirs, files in os.walk("build"):
|
||||
for file in files:
|
||||
if file.endswith(".apk"):
|
||||
apk_path = os.path.join(root, file)
|
||||
final_apk = Path(f"{config.APP_NAME}_{config.APP_VERSION}.apk")
|
||||
shutil.copy2(apk_path, final_apk)
|
||||
print(f"APK 파일을 찾았습니다: {apk_path}")
|
||||
print(f"APK 파일을 복사했습니다: {final_apk}")
|
||||
found_apk = True
|
||||
break
|
||||
if found_apk:
|
||||
break
|
||||
|
||||
if not found_apk:
|
||||
print("어떤 APK 파일도 찾을 수 없습니다. 다음 경로에서 빌드 결과 확인이 필요합니다:")
|
||||
print(f"- {os.path.abspath(build_dir)}")
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"빌드 중 오류 발생: {e}")
|
||||
except Exception as e:
|
||||
print(f"예상치 못한 오류 발생: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
build_android_app()
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
|
|
@ -0,0 +1,92 @@
|
|||
from PIL import Image, ImageDraw
|
||||
import math
|
||||
|
||||
# 아이콘 이미지 사이즈 (픽셀)
|
||||
size = (512, 512)
|
||||
|
||||
# 새 이미지를 투명 배경(RGBA)으로 생성
|
||||
img = Image.new("RGBA", size, (255, 255, 255, 0))
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
# 색상 정의
|
||||
lens_color = (100, 149, 237, 255) # 옅은 파란색 (돋보기 렌즈 채움색)
|
||||
lens_outline = (50, 50, 50, 255) # 진한 회색 (돋보기 테두리)
|
||||
handle_color = (80, 80, 80, 255) # 어두운 회색 (돋보기 손잡이)
|
||||
exclamation_color = (255, 69, 0, 255) # 붉은색 (느낌표)
|
||||
|
||||
# --- 1. 돋보기 렌즈 (원) 그리기 ---
|
||||
lens_center = (256, 256) # 이미지 중앙
|
||||
lens_radius = 150 # 렌즈의 반지름
|
||||
|
||||
# 원(타원) 좌표: (좌상, 우하)
|
||||
lens_bbox = (
|
||||
lens_center[0] - lens_radius,
|
||||
lens_center[1] - lens_radius,
|
||||
lens_center[0] + lens_radius,
|
||||
lens_center[1] + lens_radius
|
||||
)
|
||||
# 채움 색상과 테두리 두께 지정
|
||||
draw.ellipse(lens_bbox, fill=lens_color, outline=lens_outline, width=8)
|
||||
|
||||
# --- 2. 돋보기 손잡이 그리기 ---
|
||||
# 손잡이는 렌즈 오른쪽 아래쪽에서 시작하여 45도 각도로 뻗어나갑니다.
|
||||
angle = 45 # 손잡이 각도 (45도)
|
||||
handle_length = 180 # 손잡이 길이
|
||||
handle_width = 30 # 손잡이 두께
|
||||
|
||||
# 렌즈 테두리의 끝점: 렌즈의 45도 지점 계산
|
||||
theta = math.radians(angle)
|
||||
start_x = lens_center[0] + lens_radius * math.cos(theta)
|
||||
start_y = lens_center[1] + lens_radius * math.sin(theta)
|
||||
|
||||
# 손잡이 끝점
|
||||
end_x = lens_center[0] + (lens_radius + handle_length) * math.cos(theta)
|
||||
end_y = lens_center[1] + (lens_radius + handle_length) * math.sin(theta)
|
||||
|
||||
# 손잡이를 사각형(회전한 형태)로 표현하기 위해, 수직(법선) 방향 벡터 계산
|
||||
dx = end_x - start_x
|
||||
dy = end_y - start_y
|
||||
length = math.hypot(dx, dy)
|
||||
offset_x = -dy/length * (handle_width/2)
|
||||
offset_y = dx/length * (handle_width/2)
|
||||
|
||||
# 사각형 네 꼭짓점 계산
|
||||
p1 = (start_x + offset_x, start_y + offset_y)
|
||||
p2 = (start_x - offset_x, start_y - offset_y)
|
||||
p3 = (end_x - offset_x, end_y - offset_y)
|
||||
p4 = (end_x + offset_x, end_y + offset_y)
|
||||
|
||||
draw.polygon([p1, p2, p3, p4], fill=handle_color)
|
||||
|
||||
# --- 3. 돋보기 렌즈 내부에 느낌표 그리기 ---
|
||||
# 느낌표는 중앙에 큰 직사각형과 아래쪽에 작은 원(점)으로 구성합니다.
|
||||
# 느낌표의 중심 좌표 및 크기 설정
|
||||
exclamation_center = (256, 230)
|
||||
exclamation_height = 80
|
||||
exclamation_width = 20
|
||||
|
||||
# 느낌표 막대: 사각형 좌표
|
||||
ex_mark_top_left = (
|
||||
exclamation_center[0] - exclamation_width // 2,
|
||||
exclamation_center[1] - exclamation_height // 2
|
||||
)
|
||||
ex_mark_bottom_right = (
|
||||
exclamation_center[0] + exclamation_width // 2,
|
||||
exclamation_center[1] + exclamation_height // 2
|
||||
)
|
||||
draw.rectangle([ex_mark_top_left, ex_mark_bottom_right], fill=exclamation_color)
|
||||
|
||||
# 느낌표 점: 원을 그림
|
||||
dot_radius = 12
|
||||
dot_center = (256, 300)
|
||||
dot_bbox = (
|
||||
dot_center[0] - dot_radius,
|
||||
dot_center[1] - dot_radius,
|
||||
dot_center[0] + dot_radius,
|
||||
dot_center[1] + dot_radius
|
||||
)
|
||||
draw.ellipse(dot_bbox, fill=exclamation_color)
|
||||
|
||||
# --- 4. 아이콘 파일 저장 ---
|
||||
img.save("app_icon.png")
|
||||
print("아이콘 파일 'app_icon.png'이 생성되었습니다.")
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,309 @@
|
|||
|
||||
This file lists modules PyInstaller was not able to find. This does not
|
||||
necessarily mean this module is required for running your program. Python and
|
||||
Python 3rd-party packages include a lot of conditional or optional modules. For
|
||||
example the module 'ntpath' only exists on Windows, whereas the module
|
||||
'posixpath' only exists on Posix systems.
|
||||
|
||||
Types if import:
|
||||
* top-level: imported at the top-level - look at these first
|
||||
* conditional: imported within an if-statement
|
||||
* delayed: imported within a function
|
||||
* optional: imported within a try-except-statement
|
||||
|
||||
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||
tracking down the missing module yourself. Thanks!
|
||||
|
||||
missing module named pyimod02_importers - imported by D:\py\codeSearch\.venv\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), D:\py\codeSearch\.venv\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
|
||||
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed), webbrowser (delayed), http.server (delayed, optional)
|
||||
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
|
||||
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||
missing module named fcntl - imported by subprocess (optional), pty (delayed, optional)
|
||||
missing module named org - imported by copy (optional)
|
||||
missing module named 'org.python' - imported by pickle (optional), xml.sax (delayed, conditional)
|
||||
missing module named posix - imported by os (conditional, optional), shutil (conditional), importlib._bootstrap_external (conditional), posixpath (optional)
|
||||
missing module named resource - imported by posix (top-level)
|
||||
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level), watchfiles.run (top-level)
|
||||
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||
missing module named _scproxy - imported by urllib.request (conditional)
|
||||
missing module named termios - imported by getpass (optional), click._termui_impl (conditional), tty (top-level)
|
||||
missing module named 'java.lang' - imported by platform (delayed, optional), xml.sax._exceptions (conditional)
|
||||
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||
missing module named multiprocessing.Pipe - imported by multiprocessing (top-level), uvicorn.supervisors.multiprocess (top-level)
|
||||
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||
missing module named _manylinux - imported by pkg_resources._vendor.packaging._manylinux (delayed, optional), packaging._manylinux (delayed, optional)
|
||||
missing module named pyparsing - imported by pkg_resources._vendor.pyparsing.diagram (top-level)
|
||||
missing module named railroad - imported by pkg_resources._vendor.pyparsing.diagram (top-level)
|
||||
missing module named readline - imported by websockets.cli (delayed, optional), cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional)
|
||||
missing module named 'pkg_resources.extern.pyparsing' - imported by pkg_resources._vendor.packaging.markers (top-level), pkg_resources._vendor.packaging.requirements (top-level)
|
||||
missing module named 'pkg_resources.extern.importlib_resources' - imported by pkg_resources._vendor.jaraco.text (optional)
|
||||
missing module named 'pkg_resources.extern.more_itertools' - imported by pkg_resources._vendor.jaraco.functools (top-level)
|
||||
missing module named 'win32com.shell' - imported by pkg_resources._vendor.appdirs (conditional, optional)
|
||||
missing module named 'com.sun' - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
|
||||
missing module named com - imported by pkg_resources._vendor.appdirs (delayed)
|
||||
missing module named win32api - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
|
||||
missing module named win32com - imported by pkg_resources._vendor.appdirs (delayed)
|
||||
missing module named _winreg - imported by platform (delayed, optional), pygments.formatters.img (optional), pkg_resources._vendor.appdirs (delayed, conditional)
|
||||
missing module named pkg_resources.extern.packaging - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
|
||||
missing module named pkg_resources.extern.appdirs - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
|
||||
missing module named 'pkg_resources.extern.jaraco' - imported by pkg_resources (top-level), pkg_resources._vendor.jaraco.text (top-level)
|
||||
missing module named vms_lib - imported by platform (delayed, optional)
|
||||
missing module named java - imported by platform (delayed)
|
||||
missing module named 'gunicorn.workers' - imported by uvicorn.workers (top-level)
|
||||
missing module named gunicorn - imported by uvicorn.workers (top-level)
|
||||
missing module named 'trio.testing' - imported by anyio._backends._trio (delayed)
|
||||
missing module named exceptiongroup - imported by anyio._core._exceptions (conditional), anyio._core._sockets (conditional), starlette._utils (conditional, optional), anyio._backends._asyncio (conditional), anyio._backends._trio (conditional)
|
||||
missing module named _typeshed - imported by anyio.abc._eventloop (conditional), anyio._core._sockets (conditional), anyio._core._fileio (conditional), anyio._core._tempfile (conditional), httpx._transports.wsgi (conditional), pydantic._internal._dataclasses (conditional), anyio._backends._asyncio (conditional), anyio._core._asyncio_selector_thread (conditional), anyio._backends._trio (conditional)
|
||||
missing module named 'trio.to_thread' - imported by anyio._backends._trio (top-level)
|
||||
missing module named 'trio.socket' - imported by anyio._backends._trio (top-level)
|
||||
missing module named outcome - imported by anyio._backends._trio (top-level)
|
||||
missing module named 'trio.lowlevel' - imported by anyio._backends._trio (top-level)
|
||||
missing module named 'trio.from_thread' - imported by anyio._backends._trio (top-level)
|
||||
missing module named _pytest - imported by anyio._backends._asyncio (delayed)
|
||||
missing module named uvloop - imported by anyio._backends._asyncio (delayed, conditional), uvicorn.loops.auto (delayed, optional), uvicorn.loops.uvloop (top-level)
|
||||
missing module named curio - imported by sniffio._impl (delayed, conditional)
|
||||
missing module named trio - imported by httpx._transports.asgi (delayed, conditional), httpcore._synchronization (optional), httpcore._backends.trio (top-level), watchfiles.main (conditional)
|
||||
missing module named 'wsproto.utilities' - imported by uvicorn.protocols.websockets.wsproto_impl (top-level)
|
||||
missing module named 'wsproto.extensions' - imported by uvicorn.protocols.websockets.wsproto_impl (top-level)
|
||||
missing module named 'wsproto.connection' - imported by uvicorn.protocols.websockets.wsproto_impl (top-level)
|
||||
missing module named wsproto - imported by uvicorn.protocols.websockets.wsproto_impl (top-level), uvicorn.protocols.websockets.auto (optional)
|
||||
missing module named 'werkzeug.routing' - imported by websockets.asyncio.router (top-level), websockets.sync.router (top-level)
|
||||
missing module named 'werkzeug.exceptions' - imported by websockets.sync.router (top-level)
|
||||
missing module named 'python_socks.sync' - imported by websockets.sync.client (optional)
|
||||
missing module named python_socks - imported by websockets.asyncio.client (optional), websockets.sync.client (optional)
|
||||
missing module named werkzeug - imported by websockets.asyncio.router (top-level)
|
||||
missing module named 'python_socks.async_' - imported by websockets.asyncio.client (optional)
|
||||
missing module named a2wsgi - imported by uvicorn.middleware.wsgi (optional)
|
||||
missing module named 'IPython.core' - imported by rich.pretty (delayed, optional), dotenv.ipython (top-level)
|
||||
missing module named win32evtlog - imported by logging.handlers (delayed, optional)
|
||||
missing module named win32evtlogutil - imported by logging.handlers (delayed, optional)
|
||||
missing module named 'multipart.multipart' - imported by starlette.formparsers (conditional, optional), starlette.requests (conditional, optional), fastapi.dependencies.utils (delayed, optional)
|
||||
missing module named 'python_multipart.multipart' - imported by starlette.formparsers (conditional, optional), starlette.requests (conditional, optional)
|
||||
missing module named multipart - imported by starlette.formparsers (conditional, optional), fastapi.dependencies.utils (delayed, optional)
|
||||
missing module named python_multipart - imported by starlette.formparsers (conditional, optional), fastapi.dependencies.utils (delayed, optional)
|
||||
missing module named orjson - imported by fastapi.responses (optional)
|
||||
missing module named ujson - imported by fastapi.responses (optional)
|
||||
missing module named email_validator - imported by pydantic.networks (delayed, conditional, optional), pydantic.v1.networks (delayed, conditional, optional), fastapi.openapi.models (optional)
|
||||
missing module named pydantic.BaseModel - imported by pydantic (conditional), pydantic._internal._typing_extra (conditional), pydantic._internal._import_utils (delayed, conditional), pydantic._internal._core_utils (delayed), pydantic.deprecated.copy_internals (delayed, conditional), fastapi.exceptions (top-level), fastapi.types (top-level), fastapi._compat (top-level), fastapi.openapi.models (top-level), fastapi.security.http (top-level), fastapi.utils (top-level), fastapi.dependencies.utils (top-level), fastapi.encoders (top-level), fastapi.routing (top-level), fastapi.openapi.utils (top-level)
|
||||
missing module named eval_type_backport - imported by pydantic._internal._typing_extra (delayed, optional)
|
||||
missing module named pygments.lexers.PrologLexer - imported by pygments.lexers (top-level), pygments.lexers.cplint (top-level)
|
||||
missing module named _dummy_thread - imported by numpy._core.arrayprint (optional)
|
||||
missing module named 'numpy_distutils.cpuinfo' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named 'numpy_distutils.fcompiler' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named 'numpy_distutils.command' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||
missing module named numpy_distutils - imported by numpy.f2py.diagnose (delayed, optional)
|
||||
missing module named psutil - imported by numpy.testing._private.utils (delayed, optional)
|
||||
missing module named win32pdh - imported by numpy.testing._private.utils (delayed, conditional)
|
||||
missing module named threadpoolctl - imported by numpy.lib._utils_impl (delayed, optional)
|
||||
missing module named numpy._core.zeros - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.vstack - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.void - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.vecmat - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.vecdot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.ushort - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.unsignedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ulonglong - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ulong - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uintp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uintc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.uint64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.uint - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ubyte - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.trunc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.true_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.transpose - imported by numpy._core (top-level), numpy.lib._function_base_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.trace - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.timedelta64 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.tensordot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.tanh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.tan - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.swapaxes - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sum - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.subtract - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.str_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.square - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.sqrt - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.spacing - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.sort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.sinh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.single - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.signedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.signbit - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.sign - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.short - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.rint - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.right_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.result_type - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.remainder - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.reciprocal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.radians - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.rad2deg - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.prod - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.power - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.positive - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.pi - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.outer - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.ones - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.object_ - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.number - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.not_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.newaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.negative - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ndarray - imported by numpy._core (top-level), numpy.lib._utils_impl (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.multiply - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.moveaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.modf - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.mod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.minimum - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.maximum - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.max - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.matrix_transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.matvec - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.matmul - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.longdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.long - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_or - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_not - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logical_and - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logaddexp2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.logaddexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log1p - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.log - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.linspace - imported by numpy._core (top-level), numpy.lib._index_tricks_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.less_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.less - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.left_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ldexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.lcm - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.isscalar - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isnat - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.isnan - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.isfinite - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.intp - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.integer - imported by numpy._core (conditional), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.intc - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.int8 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.int16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.inf - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.inexact - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.iinfo - imported by numpy._core (top-level), numpy.lib._twodim_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.hypot - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.hstack - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.heaviside - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.half - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.greater_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.greater - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.gcd - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.frompyfunc - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.frexp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmin - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.fmax - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floor_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.floating - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.float_power - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.float32 - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.float16 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.finfo - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.fabs - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.expm1 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.exp - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.euler_gamma - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.errstate - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.equal - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.empty_like - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.empty - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.e - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.double - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.dot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.divmod - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.divide - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.diagonal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.degrees - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.deg2rad - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.datetime64 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.csingle - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cross - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.count_nonzero - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cosh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cos - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.copysign - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.conjugate - imported by numpy._core (conditional), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||
missing module named numpy._core.conj - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.complexfloating - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.complex64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||
missing module named numpy._core.clongdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.character - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.ceil - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.cdouble - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.cbrt - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bytes_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.byte - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bool_ - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_or - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_count - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.bitwise_and - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.atleast_3d - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.atleast_2d - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.atleast_1d - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.asarray - imported by numpy._core (top-level), numpy.lib._array_utils_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.asanyarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.array_repr - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||
missing module named numpy._core.array2string - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.array - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||
missing module named numpy._core.argsort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.arctanh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctan2 - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arctan - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arcsinh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arcsin - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arccosh - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arccos - imported by numpy._core (conditional), numpy (conditional)
|
||||
missing module named numpy._core.arange - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||
missing module named numpy._core.amin - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.amax - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._core.all - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||
missing module named numpy._core.add - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||
missing module named numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional)
|
||||
missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
|
||||
missing module named PIL._avif - imported by PIL (optional), PIL.AvifImagePlugin (optional)
|
||||
missing module named defusedxml - imported by PIL.Image (optional)
|
||||
missing module named ctags - imported by pygments.formatters.html (optional)
|
||||
missing module named IPython - imported by rich.jupyter (delayed, optional)
|
||||
missing module named attr - imported by rich.pretty (optional)
|
||||
missing module named ipywidgets - imported by rich.live (delayed, conditional, optional)
|
||||
missing module named 'IPython.display' - imported by rich.live (delayed, conditional, optional)
|
||||
missing module named linkify_it - imported by markdown_it.main (optional)
|
||||
missing module named cython - imported by pydantic.v1.version (optional)
|
||||
missing module named pydantic.PydanticUserError - imported by pydantic (top-level), pydantic.root_model (top-level)
|
||||
missing module named pydantic.PydanticSchemaGenerationError - imported by pydantic (delayed), pydantic.functional_validators (delayed, conditional), fastapi._compat (conditional)
|
||||
missing module named jwt - imported by oauthlib.common (delayed), oauthlib.oauth2.rfc6749.clients.service_application (delayed)
|
||||
missing module named blinker - imported by oauthlib.signals (optional)
|
||||
missing module named socksio - imported by httpcore._sync.socks_proxy (top-level), httpcore._async.socks_proxy (top-level), httpx._transports.default (delayed, conditional, optional)
|
||||
missing module named 'h2.settings' - imported by httpcore._sync.http2 (top-level), httpcore._async.http2 (top-level)
|
||||
missing module named 'h2.exceptions' - imported by httpcore._sync.http2 (top-level), httpcore._async.http2 (top-level)
|
||||
missing module named 'h2.events' - imported by httpcore._sync.http2 (top-level), httpcore._async.http2 (top-level)
|
||||
missing module named 'h2.connection' - imported by httpcore._sync.http2 (top-level), httpcore._async.http2 (top-level)
|
||||
missing module named h2 - imported by httpcore._sync.http2 (top-level), httpx._client (delayed, conditional, optional)
|
||||
missing module named 'h2.config' - imported by httpcore._async.http2 (top-level)
|
||||
missing module named '_typeshed.wsgi' - imported by httpx._transports.wsgi (conditional)
|
||||
missing module named zstandard.backend_rust - imported by zstandard (conditional)
|
||||
missing module named brotlicffi - imported by httpx._decoders (optional)
|
||||
missing module named brotli - imported by httpx._decoders (optional)
|
||||
missing module named six.moves.urllib.parse - imported by six.moves.urllib (top-level), repath (top-level)
|
||||
runtime module named six.moves - imported by six.moves.urllib (top-level)
|
||||
missing module named StringIO - imported by six (conditional)
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,81 @@
|
|||
# 고장코드 검색기 안드로이드 앱 대체 빌드 가이드
|
||||
|
||||
Flet 0.21.2 버전에서 안드로이드 APK 빌드 방법이 변경되었습니다. 이 문서는 현재 버전에서 안드로이드 앱을 빌드하는 대체 방법을 안내합니다.
|
||||
|
||||
## 1. 수동 빌드 방법
|
||||
|
||||
최신 Flet 버전은 안드로이드 APK를 직접 빌드하는 대신, 먼저 Flutter 프로젝트를 생성한 후 Flutter 도구를 사용해 빌드하는 방식을 사용합니다.
|
||||
|
||||
### 1단계: Flet 앱 패키징
|
||||
|
||||
```bash
|
||||
# 앱을 먼저 패키징합니다
|
||||
flet pack main.py --name 고장코드검색기 --product-name 고장코드검색기
|
||||
```
|
||||
|
||||
### 2단계: Flutter 프로젝트 생성
|
||||
|
||||
```bash
|
||||
# 패키징된 앱을 기반으로 Flutter 프로젝트 생성
|
||||
flet create flutter --path dist/codeSearch
|
||||
```
|
||||
|
||||
### 3단계: Flutter 프로젝트에서 안드로이드 빌드
|
||||
|
||||
```bash
|
||||
# Flutter 프로젝트 디렉토리로 이동
|
||||
cd dist/codeSearch/flutter
|
||||
|
||||
# APK 빌드
|
||||
flutter build apk --release
|
||||
```
|
||||
|
||||
빌드된 APK는 `dist/codeSearch/flutter/build/app/outputs/flutter-apk/app-release.apk`에 생성됩니다.
|
||||
|
||||
## 2. 대체 도구: Briefcase
|
||||
|
||||
Flet 대신 BeeWare의 Briefcase를 사용하여 안드로이드 앱을 빌드할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
# Briefcase 설치
|
||||
pip install briefcase
|
||||
|
||||
# 프로젝트 초기화
|
||||
briefcase new
|
||||
|
||||
# 앱 이름, 번들 ID 등을 입력
|
||||
|
||||
# 안드로이드 앱 빌드
|
||||
briefcase create android
|
||||
briefcase build android
|
||||
|
||||
# APK 패키징
|
||||
briefcase package android
|
||||
```
|
||||
|
||||
## 3. 현 상황에서의 안드로이드 앱 공유 방법
|
||||
|
||||
### 1. 웹 앱으로 배포하여 모바일에서 웹 브라우저로 접근
|
||||
|
||||
```bash
|
||||
# 웹 앱으로 배포
|
||||
flet publish main.py
|
||||
```
|
||||
|
||||
### 2. 진행 중인 Flet 모바일 지원
|
||||
|
||||
Flet 팀은 모바일 빌드 도구를 개선 중입니다. 최신 문서와 릴리스를 확인하세요:
|
||||
- [Flet GitHub](https://github.com/flet-dev/flet)
|
||||
- [Flet 문서](https://flet.dev/docs)
|
||||
|
||||
## 4. 권장 접근 방식
|
||||
|
||||
현재 상황에서는 다음과 같은 접근 방식을 권장합니다:
|
||||
|
||||
1. **웹 앱 배포**: Flet 앱을 웹 앱으로 배포하고 모바일 브라우저에서 접근
|
||||
2. **Flet 버전 호환성 검토**: 과거 버전의 Flet으로 다운그레이드하거나 최신 베타 버전 시도
|
||||
3. **커뮤니티 지원 활용**: Flet 이슈 트래커나 디스커션 포럼에서 도움 구하기
|
||||
|
||||
## 추가 정보
|
||||
|
||||
Flet의 안드로이드 빌드 지원은 아직 완전하지 않으며 활발히 개발 중입니다. 최신 정보는 공식 문서를 참조하세요.
|
||||
25
main.py
25
main.py
|
|
@ -12,10 +12,27 @@ def main(page: ft.Page):
|
|||
# 페이지 설정
|
||||
page.title = "고장코드 검색기"
|
||||
page.theme_mode = ft.ThemeMode.LIGHT
|
||||
page.padding = 20
|
||||
page.window_width = 1000 # 가로 모드에 맞게 너비 증가
|
||||
page.window_height = 800 # 적절한 높이 유지
|
||||
page.window_resizable = True # 창 크기 조절 가능하도록 변경
|
||||
page.padding = 10 # 모바일 화면에 맞게 패딩 감소
|
||||
|
||||
# 모바일 환경 최적화
|
||||
page.window_width = 1000 # 기본 너비
|
||||
page.window_height = 800 # 기본 높이
|
||||
page.window_resizable = True
|
||||
|
||||
# 모바일 설정
|
||||
page.scroll = ft.ScrollMode.AUTO # 필요시 스크롤 허용
|
||||
page.on_resize = lambda _: page.update() # 화면 크기 변경 시 업데이트
|
||||
|
||||
# 안드로이드 뒤로가기 버튼 처리
|
||||
def on_back_button(e):
|
||||
# 다이얼로그가 열려있으면 닫기
|
||||
if page.dialog and page.dialog.open:
|
||||
page.dialog.open = False
|
||||
page.update()
|
||||
return True # 이벤트 처리 완료
|
||||
return False # 기본 뒤로가기 동작 허용
|
||||
|
||||
page.on_pop_route = on_back_button
|
||||
|
||||
# 데이터베이스 매니저 초기화
|
||||
db_manager = DatabaseManager()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['main.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='main',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
version='C:\\Users\\khchoi\\AppData\\Local\\Temp\\12709c2b-eaae-463b-9a22-11c90e4de1ea',
|
||||
)
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
"""
|
||||
고장코드 검색기 앱을 PWA(Progressive Web App)로 변환하여
|
||||
안드로이드에서 설치 가능한 앱을 만드는 스크립트
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
import json
|
||||
import time
|
||||
|
||||
def build_pwa_app():
|
||||
"""
|
||||
Flet 앱을 웹으로 게시하고 PWA 설정을 추가합니다.
|
||||
"""
|
||||
print("고장코드 검색기 PWA 빌드를 시작합니다...")
|
||||
|
||||
# 1. 게시 경로 정리
|
||||
dist_dir = Path("dist")
|
||||
if dist_dir.exists():
|
||||
try:
|
||||
print(f"dist 디렉토리 정리 중...")
|
||||
# 파일 삭제 시도
|
||||
for item in dist_dir.glob('*'):
|
||||
if item.is_file():
|
||||
try:
|
||||
item.unlink()
|
||||
print(f" 삭제됨: {item}")
|
||||
except Exception as e:
|
||||
print(f" 삭제 실패 (무시됨): {item} - {e}")
|
||||
elif item.is_dir():
|
||||
try:
|
||||
shutil.rmtree(item)
|
||||
print(f" 삭제됨: {item}")
|
||||
except Exception as e:
|
||||
print(f" 삭제 실패 (무시됨): {item} - {e}")
|
||||
|
||||
# 디렉토리 자체도 삭제 시도
|
||||
try:
|
||||
if list(dist_dir.glob('*')):
|
||||
print(f"일부 파일이 삭제되지 않아 dist 디렉토리 유지")
|
||||
else:
|
||||
dist_dir.rmdir()
|
||||
print(f"dist 디렉토리를 삭제했습니다.")
|
||||
except Exception as e:
|
||||
print(f"dist 디렉토리 삭제 실패 (무시됨): {e}")
|
||||
except Exception as e:
|
||||
print(f"dist 정리 중 예외 발생 (무시됨): {e}")
|
||||
|
||||
# 필요한 경우 dist 디렉토리 생성
|
||||
if not dist_dir.exists():
|
||||
dist_dir.mkdir()
|
||||
print("dist 디렉토리를 생성했습니다.")
|
||||
|
||||
# 2. 필요한 파일 준비
|
||||
icon_path = "assets/app_icon.png"
|
||||
if not os.path.exists(icon_path):
|
||||
print(f"경고: 아이콘 파일이 없습니다. 기본 아이콘이 필요합니다.")
|
||||
# assets 폴더 생성
|
||||
assets_dir = Path("assets")
|
||||
if not assets_dir.exists():
|
||||
assets_dir.mkdir()
|
||||
print("assets 디렉토리를 생성했습니다.")
|
||||
|
||||
# 기본 아이콘 생성 (텍스트 파일로 대체)
|
||||
with open(icon_path, "w") as f:
|
||||
f.write("This is a placeholder for the app icon.")
|
||||
print(f"임시 아이콘 파일을 생성했습니다.")
|
||||
|
||||
# 3. Flet 앱을 웹으로 게시
|
||||
app_name = "고장코드검색기"
|
||||
app_desc = "공기압 차량 고장코드 검색 애플리케이션"
|
||||
|
||||
cmd = [
|
||||
"flet", "publish", "main.py",
|
||||
"--app-name", app_name,
|
||||
"--app-short-name", app_name,
|
||||
"--app-description", app_desc,
|
||||
"--assets", "assets"
|
||||
]
|
||||
|
||||
print("명령어 실행:", " ".join(cmd))
|
||||
try:
|
||||
subprocess.run(cmd, check=True)
|
||||
print("웹 앱 게시 완료!")
|
||||
|
||||
# 4. manifest.json 파일 수정하여 PWA 기능 강화
|
||||
manifest_path = Path("dist/manifest.json")
|
||||
if manifest_path.exists():
|
||||
try:
|
||||
with open(manifest_path, "r", encoding="utf-8") as f:
|
||||
manifest = json.load(f)
|
||||
|
||||
# PWA 설정 추가
|
||||
manifest.update({
|
||||
"background_color": "#ffffff",
|
||||
"theme_color": "#2196f3",
|
||||
"display": "standalone",
|
||||
"orientation": "any",
|
||||
"prefer_related_applications": False,
|
||||
"icons": [
|
||||
{
|
||||
"src": "assets/app_icon.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any maskable"
|
||||
}
|
||||
],
|
||||
"shortcuts": [
|
||||
{
|
||||
"name": "고장코드 검색",
|
||||
"url": "/",
|
||||
"description": "고장코드 검색하기"
|
||||
}
|
||||
],
|
||||
"screenshots": [
|
||||
{
|
||||
"src": "assets/app_icon.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
with open(manifest_path, "w", encoding="utf-8") as f:
|
||||
json.dump(manifest, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print("PWA 설정이 업데이트되었습니다.")
|
||||
except Exception as e:
|
||||
print(f"manifest.json 파일 수정 중 오류 발생: {e}")
|
||||
else:
|
||||
print("manifest.json 파일을 찾을 수 없습니다.")
|
||||
|
||||
print("\n안드로이드에서 설치 가능한 PWA가 생성되었습니다!")
|
||||
print("-----------------------------------------------------")
|
||||
print("안드로이드 설치 방법:")
|
||||
print("1. 웹 서버에 dist 폴더 내용을 업로드합니다.")
|
||||
print("2. 안드로이드 크롬에서 웹사이트에 접속합니다.")
|
||||
print("3. 메뉴에서 '홈 화면에 추가' 옵션을 선택합니다.")
|
||||
print("4. 앱이 홈 화면에 설치됩니다.")
|
||||
print("-----------------------------------------------------")
|
||||
|
||||
# 로컬 테스트를 위한 명령어 표시
|
||||
print("\n로컬에서 테스트하려면:")
|
||||
print("python -m http.server 8000 --directory dist")
|
||||
print("브라우저에서 http://localhost:8000 접속")
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"빌드 중 오류 발생: {e}")
|
||||
except Exception as e:
|
||||
print(f"예상치 못한 오류 발생: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
build_pwa_app()
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
name = "fault-code-finder"
|
||||
version = "0.1.0"
|
||||
description = "고장 코드 검색 애플리케이션"
|
||||
authors = ["Your Name <your.email@example.com>"]
|
||||
authors = ["신평-Choi KyungHwan"]
|
||||
package-mode = false
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
|
|
@ -10,6 +10,13 @@ python = "^3.9"
|
|||
flet = "^0.21.0"
|
||||
pandas = "^2.2.0"
|
||||
openpyxl = "^3.1.2"
|
||||
flet-core = "^0.21.0"
|
||||
flet-runtime = "^0.21.0"
|
||||
pillow = "^10.2.0"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
black = "^24.1.0"
|
||||
isort = "^5.12.0"
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['main.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[('database', 'database'), ('ui', 'ui'), ('fault_codes.db', '.')],
|
||||
hiddenimports=[],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='고장코드검색기',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
icon=['assets\\app_icon.png'],
|
||||
)
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
# 고장코드 검색기 안드로이드 앱 빌드 안내서
|
||||
|
||||
이 문서는 고장코드 검색기 앱을 안드로이드 APK로 빌드하는 과정을 설명합니다.
|
||||
|
||||
## 빌드 준비 사항
|
||||
|
||||
### 필수 설치 프로그램
|
||||
|
||||
1. **Java JDK 11 이상**
|
||||
- 다운로드: [Oracle JDK](https://www.oracle.com/java/technologies/downloads/) 또는 [OpenJDK](https://adoptium.net/)
|
||||
- 환경 변수 설정: `JAVA_HOME`을 JDK 설치 경로로 설정
|
||||
|
||||
2. **Android SDK**
|
||||
- [Android Studio](https://developer.android.com/studio)를 설치하면 Android SDK가 함께 설치됩니다.
|
||||
- 또는 [Android SDK 단독 설치](https://developer.android.com/studio#command-tools)
|
||||
- 환경 변수 설정: `ANDROID_SDK_ROOT`를 Android SDK 설치 경로로 설정
|
||||
|
||||
3. **Flutter SDK**
|
||||
- 다운로드: [Flutter 설치](https://docs.flutter.dev/get-started/install/windows)
|
||||
- 환경 변수 설정: Flutter SDK 경로를 PATH에 추가
|
||||
|
||||
4. **Flet CLI**
|
||||
- 설치: `pip install flet`
|
||||
|
||||
### 프로젝트 설정
|
||||
|
||||
1. **앱 설정 확인**
|
||||
- `flet_app_config.py` 파일에서 앱 이름, 패키지명, 버전 등을 확인/수정
|
||||
|
||||
2. **앱 아이콘 준비**
|
||||
- 512x512 픽셀 PNG 이미지를 `assets/app_icon.png`로 저장
|
||||
- 이미 간단한 파란색 아이콘이 생성되어 있습니다.
|
||||
|
||||
## 빌드 과정
|
||||
|
||||
### 1. 환경 변수 설정
|
||||
|
||||
Windows에서:
|
||||
```
|
||||
set ANDROID_SDK_ROOT=C:\Users\사용자명\AppData\Local\Android\Sdk
|
||||
set ANDROID_SDK_ROOT=C:\Users\khchoi\AppData\Local\Android\Sdk
|
||||
```
|
||||
|
||||
Linux/macOS에서:
|
||||
```
|
||||
export ANDROID_SDK_ROOT=/Users/사용자명/Library/Android/sdk
|
||||
|
||||
```
|
||||
|
||||
### 2. 빌드 스크립트 실행
|
||||
|
||||
```
|
||||
python android_build.py
|
||||
```
|
||||
|
||||
빌드가 성공하면 프로젝트 루트 디렉토리에 `고장코드검색기_1.0.0.apk` 파일이 생성됩니다.
|
||||
|
||||
## 설치 방법
|
||||
|
||||
### 안드로이드 기기에 APK 설치
|
||||
|
||||
1. APK 파일을 안드로이드 기기로 전송
|
||||
2. 기기에서 '알 수 없는 출처' 앱 설치 허용
|
||||
- 설정 > 보안 > 알 수 없는 출처 (기기에 따라 경로가 다를 수 있음)
|
||||
3. 파일 관리자에서 APK 파일 선택하여 설치
|
||||
|
||||
## 문제 해결
|
||||
|
||||
### 빌드 오류
|
||||
|
||||
1. **Java 버전 호환성 문제**
|
||||
- Java 11 이상이 설치되어 있는지 확인: `java -version`
|
||||
|
||||
2. **Android SDK 경로 문제**
|
||||
- Android SDK 경로가 올바르게 설정되었는지 확인
|
||||
- `android_build.py` 스크립트에서 SDK 경로를 직접 지정 가능
|
||||
|
||||
3. **Flutter 설치 문제**
|
||||
- Flutter 설치 확인: `flutter doctor`
|
||||
- 모든 항목이 체크표시로 표시될 때까지 필요한 구성 요소 설치
|
||||
|
||||
## 추가 리소스
|
||||
|
||||
- [Flet 문서](https://flet.dev/docs/)
|
||||
- [Flutter 안드로이드 앱 빌드](https://docs.flutter.dev/deployment/android)
|
||||
- [Android 개발자 문서](https://developer.android.com/)
|
||||
Loading…
Reference in New Issue