调整版本并做测试
This commit is contained in:
109
pyenjoy/template/source/ClassPathSource.py
Normal file
109
pyenjoy/template/source/ClassPathSource.py
Normal file
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env python3.9
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
JFinal ClassPathSource - Class Path Source
|
||||
"""
|
||||
|
||||
import importlib.resources
|
||||
import os
|
||||
|
||||
class ClassPathSource:
|
||||
"""Class path source for template loading"""
|
||||
|
||||
def __init__(self, base_template_path: str, fileName: str, encoding: str):
|
||||
"""
|
||||
Initialize class path source
|
||||
|
||||
Args:
|
||||
base_template_path: Base template path
|
||||
fileName: File name
|
||||
encoding: Encoding
|
||||
"""
|
||||
self._fileName = fileName
|
||||
self._encoding = encoding
|
||||
self._baseTemplatePath = base_template_path
|
||||
|
||||
# Build resource path
|
||||
if base_template_path:
|
||||
self._resourcePath = os.path.join(base_template_path, fileName).replace('\\', '/')
|
||||
else:
|
||||
self._resourcePath = fileName.replace('\\', '/')
|
||||
|
||||
def get_content(self) -> str:
|
||||
"""
|
||||
Get class path resource content
|
||||
|
||||
Returns:
|
||||
Resource content as string
|
||||
"""
|
||||
try:
|
||||
# Try to load from classpath
|
||||
import importlib
|
||||
import sys
|
||||
|
||||
# Try different approaches to load resource
|
||||
try:
|
||||
# Try direct resource loading
|
||||
with open(self._resourcePath, 'r', encoding=self._encoding) as f:
|
||||
return f.read()
|
||||
except:
|
||||
# Try as package resource
|
||||
if '.' in self._resourcePath:
|
||||
parts = self._resourcePath.split('/')
|
||||
if len(parts) > 1:
|
||||
package_name = '.'.join(parts[:-1])
|
||||
resource_name = parts[-1]
|
||||
try:
|
||||
with importlib.resources.open_text(package_name, resource_name, encoding=self._encoding) as f:
|
||||
return f.read()
|
||||
except:
|
||||
pass
|
||||
|
||||
# Fall back to file system
|
||||
return self._try_file_system()
|
||||
|
||||
except Exception as e:
|
||||
raise RuntimeError(f"Error reading classpath resource {self._resourcePath}: {e}")
|
||||
|
||||
def _try_file_system(self) -> str:
|
||||
"""
|
||||
Try to load from file system as fallback
|
||||
|
||||
Returns:
|
||||
File content as string
|
||||
"""
|
||||
# Try current directory
|
||||
try:
|
||||
current_dir = os.getcwd()
|
||||
file_path = os.path.join(current_dir, self._resourcePath)
|
||||
if os.path.exists(file_path):
|
||||
with open(file_path, 'r', encoding=self._encoding) as f:
|
||||
return f.read()
|
||||
except:
|
||||
pass
|
||||
|
||||
# Try absolute path
|
||||
if os.path.isabs(self._resourcePath):
|
||||
try:
|
||||
with open(self._resourcePath, 'r', encoding=self._encoding) as f:
|
||||
return f.read()
|
||||
except:
|
||||
pass
|
||||
|
||||
raise RuntimeError(f"Resource not found: {self._resourcePath}")
|
||||
|
||||
def is_modified(self) -> bool:
|
||||
"""
|
||||
Check if resource has been modified
|
||||
|
||||
Returns:
|
||||
False for classpath resources (not supported)
|
||||
"""
|
||||
return False
|
||||
|
||||
def get_file_name(self) -> str:
|
||||
"""Get file name"""
|
||||
return self._fileName
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"ClassPathSource({self._fileName})"
|
||||
Reference in New Issue
Block a user