solax-py-library 1.0.0.21__tar.gz → 1.0.0.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/PKG-INFO +1 -1
  2. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/pyproject.toml +1 -1
  3. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/core/__init__.py +2 -0
  4. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/upload_service/ftp.py +16 -11
  5. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/test/test_ftp.py +35 -3
  6. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/README.md +0 -0
  7. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/__init__.py +0 -0
  8. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/__init__.py +0 -0
  9. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/constant/__init__.py +0 -0
  10. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/constant/inverter_model_info.py +0 -0
  11. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/core/__init__.py +0 -0
  12. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/core/interver/__init__.py +0 -0
  13. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/core/interver/base.py +0 -0
  14. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/types/__init__.py +0 -0
  15. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/types/inverter_config.py +0 -0
  16. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/device/types/modbus_point.py +0 -0
  17. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/exception.py +0 -0
  18. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/__init__.py +0 -0
  19. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/constant/__init__.py +0 -0
  20. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/constant/crc_table.py +0 -0
  21. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/core/base_modbus.py +0 -0
  22. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/core/parser.py +0 -0
  23. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/core/snap_shot.py +0 -0
  24. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/exceptions/__init__.py +0 -0
  25. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/exceptions/snap_shot.py +0 -0
  26. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/test/__init__.py +0 -0
  27. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/types/__init__.py +0 -0
  28. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/snap_shot/types/address.py +0 -0
  29. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/__init__.py +0 -0
  30. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/api/__init__.py +0 -0
  31. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/api/service.py +0 -0
  32. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/__init__.py +0 -0
  33. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/data_adapter/__init__.py +0 -0
  34. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/data_adapter/base.py +0 -0
  35. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/data_adapter/csv.py +0 -0
  36. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/upload_service/__init__.py +0 -0
  37. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/core/upload_service/base.py +0 -0
  38. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/exceptions/__init__.py +0 -0
  39. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/exceptions/upload_error.py +0 -0
  40. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/test/__init__.py +0 -0
  41. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/types/__init__.py +0 -0
  42. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/types/client.py +0 -0
  43. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/upload/types/ftp.py +0 -0
  44. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/utils/__init__.py +0 -0
  45. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/utils/common.py +0 -0
  46. {solax_py_library-1.0.0.21 → solax_py_library-1.0.0.23}/solax_py_library/utils/struct_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: solax-py-library
3
- Version: 1.0.0.21
3
+ Version: 1.0.0.23
4
4
  Summary: some common tool
5
5
  Author: shenlvyu
6
6
  Author-email: 13296718439@163.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "solax-py-library"
3
- version = "1.0.0.21"
3
+ version = "1.0.0.23"
4
4
  description = "some common tool"
5
5
  authors = ["shenlvyu <13296718439@163.com>", "x5m8944pjl <371630856@qq.com>"]
6
6
  readme = "README.md"
@@ -1,7 +1,9 @@
1
+ from .base_modbus import ModbusClientBase
1
2
  from .snap_shot import SnapshotCore
2
3
  from .parser import Parser
3
4
 
4
5
  __all__ = [
6
+ "ModbusClientBase",
5
7
  "SnapshotCore",
6
8
  "Parser",
7
9
  ]
@@ -34,8 +34,7 @@ class FTPUploadService(BaseUploadService):
34
34
  try:
35
35
  return FTPServiceConfig(**kwargs)
36
36
  except Exception as e:
37
- print(e)
38
- raise ConfigurationError
37
+ raise ConfigurationError(message=str(e))
39
38
 
40
39
  def connect(self):
41
40
  if self._client is not None:
@@ -47,17 +46,16 @@ class FTPUploadService(BaseUploadService):
47
46
  def _connect(self):
48
47
  try:
49
48
  self._client = ftplib.FTP()
49
+ self._client.encoding = "utf8" # 默认需要配置为utf8
50
50
  self._client.connect(self.host, self.port, timeout=self.timeout)
51
51
  except Exception as e:
52
- print(e)
53
- raise ConnectError
52
+ raise ConnectError(message=str(e))
54
53
 
55
54
  def _login(self):
56
55
  try:
57
56
  self._client.login(self.user, self.password)
58
57
  except Exception as e:
59
- print(e)
60
- raise LoginError
58
+ raise LoginError(message=str(e))
61
59
 
62
60
  def close(self):
63
61
  if self._client:
@@ -81,17 +79,24 @@ class FTPUploadService(BaseUploadService):
81
79
  try:
82
80
  if not self._is_connect:
83
81
  raise ConnectError(message="not connect yet")
82
+ self._cwd_folder()
84
83
  with open(data.file_path, "rb") as f:
85
- self._client.storbinary(
86
- f"STOR {self._build_remote_file(data.file_name)}", f
87
- )
84
+ self._client.storbinary(f"STOR {data.file_name}", f)
88
85
  print(f"Successfully uploaded to {data.file_name}")
89
86
  except Exception as e:
90
- print(e)
91
- raise SendDataError
87
+ raise SendDataError(message=str(e))
92
88
  finally:
93
89
  if os.path.exists(data.file_path):
94
90
  os.remove(data.file_path)
95
91
 
92
+ def _cwd_folder(self):
93
+ try:
94
+ self._client.cwd(self.remote_path)
95
+ except Exception as e:
96
+ print(f"CWD error: {e}")
97
+ self._client.mkd(self.remote_path)
98
+ self._client.cwd(self.remote_path)
99
+ print(f"mkdir {self.remote_path}, remove successfully")
100
+
96
101
  def _build_remote_file(self, file_name):
97
102
  return os.path.join(self.remote_path, file_name)
@@ -48,13 +48,45 @@ class FTPTest(unittest.TestCase):
48
48
  except LoginError:
49
49
  ...
50
50
 
51
- def test_ftp_upload(self):
51
+ def test_ftp_upload_to_windows(self):
52
52
  ftp_config = {
53
53
  "host": "10.1.31.181", # 测试host
54
54
  "port": 21,
55
55
  "user": "solax",
56
56
  "password": "123456",
57
- "remote_path": "/xixi",
57
+ "remote_path": "嘻嘻",
58
+ }
59
+ asyncio.run(
60
+ upload(
61
+ upload_type=UploadType.FTP,
62
+ configuration=ftp_config,
63
+ upload_data=UploadData(
64
+ upload_type=UploadType.FTP,
65
+ data=dict(
66
+ file_type=FTPFileType.CSV,
67
+ file_name="中文",
68
+ data=[
69
+ {
70
+ "EMS1000序列号": "XMG11A011L",
71
+ "EMS1000本地时间": "2025-02-11 15:39:10",
72
+ "EMS1000版本号": "V007.11.1",
73
+ "电站所在国家和地区": None,
74
+ "电站所在当前时区": None,
75
+ "电站系统类型": None,
76
+ }
77
+ ],
78
+ ),
79
+ ),
80
+ )
81
+ )
82
+
83
+ def test_ftp_upload_to_linux(self):
84
+ ftp_config = {
85
+ "host": "920729yofx76.vicp.fun", # 测试host
86
+ "port": 59477,
87
+ "user": "test",
88
+ "password": "test123456",
89
+ "remote_path": "test",
58
90
  }
59
91
  asyncio.run(
60
92
  upload(
@@ -64,7 +96,7 @@ class FTPTest(unittest.TestCase):
64
96
  upload_type=UploadType.FTP,
65
97
  data=dict(
66
98
  file_type=FTPFileType.CSV,
67
- file_name="new_file",
99
+ file_name="中文",
68
100
  data=[
69
101
  {
70
102
  "EMS1000序列号": "XMG11A011L",