diff --git a/ictye-live-dm/src/ictye_live_dm/GUI/StyleSheets/CommonStyle.qss b/ictye-live-dm/src/ictye_live_dm/GUI/StyleSheets/CommonStyle.qss
index 1ba2bff..42cd638 100644
--- a/ictye-live-dm/src/ictye_live_dm/GUI/StyleSheets/CommonStyle.qss
+++ b/ictye-live-dm/src/ictye_live_dm/GUI/StyleSheets/CommonStyle.qss
@@ -1,18 +1,8 @@
-/* ================================================ *
-author:lei
-lastedited:2020.2
-* ================================================ */
-/*hover*/
-/*actived*/
-/*gradient start*/
-/*gradient end*/
-
QWidget
{
color: #222;
background-color: #FDFDFD;
}
-
QFrame{
color: #222;
background-color: #FDFDFD;/*不能设置为transparent*/
@@ -23,9 +13,6 @@ QMainWindow::separator{
width: 4px;
height: 4px;
}
-QMainWindow::separator:hover{
- background: #8BF;
-}
QSplitter::handle{
border: 1px solid #999999;
border-style: outset;
@@ -51,7 +38,6 @@ QLabel {
padding: 1px;
}
-
/* A QLabel is a QFrame ... */
/* A QToolTip is a QLabel ... */
QToolTip {
@@ -65,7 +51,7 @@ QToolTip {
/* TextBox */
/* =============================================== */
QLineEdit {
- background: #FDFDFD;/*不建议设为透明,否则table编辑时会字显示*/
+ background: #FDFDFD;
selection-background-color: #8BF;
border: 1px solid #999999;
border-radius: 2px;
@@ -104,6 +90,7 @@ QTextEdit:hover{
QTextEdit:focus{
border-color: #EA2;
}
+
/* =============================================== */
/* Button */
/* =============================================== */
@@ -135,8 +122,6 @@ QPushButton:pressed
QPushButton:focus, QPushButton:default {
border-color: #EA2; /* make the default button prominent */
}
-
-
QToolButton,QToolButton:unchecked { /* ToolBar里的按钮和带下拉菜单的按钮 */
border: 1px solid transparent;
border-radius: 3px;
@@ -148,6 +133,7 @@ QToolButton:checked{
background-color: #8BF;
border-color: #59F;
}
+
QToolButton:hover{
background-color: #8BF;
border-color: #59F;
@@ -167,10 +153,11 @@ QToolButton[popupMode="1"]{
padding-right: 15px; /* make way for the popup button */
border: 1px solid #999999;
min-height: 15px;
- /*background: qlineargradient(x1:0, y1:0 ,x2:0, y2:1
+ background: qlineargradient(x1:0, y1:0 ,x2:0, y2:1
stop: 0 #EEEEEF, stop: 0.05 #DADADF, stop: 0.5 #DADADF
- stop: 0.95 #EEEEEF stop: 1#EEEEEF)*/
+ stop: 0.95 #EEEEEF stop: 1#EEEEEF)
}
+
QToolButton[popupMode="1"]:hover{
background-color: #8BF;
border-color: #59F;
@@ -187,7 +174,6 @@ QToolButton::menu-button {
width: 16px;
}
-
/* =============================================== */
/* Slider ProgressBar */
/* =============================================== */
@@ -269,9 +255,10 @@ QScrollBar::add-page, QScrollBar::sub-page {
QScrollArea{
border: none;
}
-/*QScrollArea QAbstractSlider{
+QScrollArea QAbstractSlider{
border-radius: 0px;
-}*/
+}
+
/* =============================================== */
/* DockWidget */
/* =============================================== */
@@ -303,6 +290,7 @@ QGroupBox::title {
top: 0.1em;
background-color: #FDFDFD;
}
+
/* =============================================== */
/* ToolBox */
/* =============================================== */
@@ -340,11 +328,13 @@ QTabWidget::tab-bar {
left: 0px;
}
QTabBar::tab {
+ border-radius: 3px;
background: #FDFDFD;
border: 1px solid #999999;
padding: 3px 5px;
}
QTabBar::tab:hover {
+
background: #8BF;
border-color: transparent;
}
@@ -406,7 +396,7 @@ QHeaderView::section:checked {
/* =============================================== */
/* QTableWidget */
/* =============================================== */
-QTableWidget, QTableView
+QTableWidget
{
gridline-color: #999999; /*表格中的网格线条颜色*/
background: #FDFDFD;
@@ -416,30 +406,9 @@ QTableWidget, QTableView
selection-background-color:#8BF; /*鼠标选中时背景色*/
border:1px solid #999999; /*边框线的宽度、颜色*/
/*border:none; 去除边界线*/
- /*border-radius:5px;*/
+ border-radius:5px;
/*padding:10px 10px;*/ /*表格与边框的间距*/
}
-QTableView::item, QTabWidget::item{
- background: transparent;
- outline-style: none;
- border: none;
-}
-
-QTableView::item:hover {
- background: #8BF;
- border: 1px solid #EA2;
-}
-
-QTableView::item:selected {
- background: #8BF;
- color: #EEEEEF;
-}
-
-QTableView::item:selected:active {
- background: #59F;
- color: #EEEEEF;
-}
-
QTableWidget QComboBox{
margin: 2px;
border: none;
@@ -455,4 +424,4 @@ QCheckBox::indicator{
border: 1px solid #999999;
border-radius:3px;
background-color:#fff;
-}
\ No newline at end of file
+}
diff --git a/ictye-live-dm/src/ictye_live_dm/GUI/Ui_MainWindow.py b/ictye-live-dm/src/ictye_live_dm/GUI/Ui_MainWindow.py
index 6c6a1d6..675e429 100644
--- a/ictye-live-dm/src/ictye_live_dm/GUI/Ui_MainWindow.py
+++ b/ictye-live-dm/src/ictye_live_dm/GUI/Ui_MainWindow.py
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file '.\main.ui'
+# Form implementation generated from reading ui file './main.ui'
#
-# Created by: PyQt5 UI code generator 5.15.10
+# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
@@ -15,7 +15,7 @@ class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.setWindowModality(QtCore.Qt.NonModal)
- Form.resize(863, 740)
+ Form.resize(865, 720)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(".\\../ictye_live_dm/icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
Form.setWindowIcon(icon)
@@ -41,7 +41,7 @@ def setupUi(self, Form):
self.tabWidget = QtWidgets.QTabWidget(Form)
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.West)
self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded)
- self.tabWidget.setElideMode(QtCore.Qt.ElideNone)
+ self.tabWidget.setElideMode(QtCore.Qt.ElideLeft)
self.tabWidget.setMovable(False)
self.tabWidget.setTabBarAutoHide(False)
self.tabWidget.setObjectName("tabWidget")
@@ -54,7 +54,7 @@ def setupUi(self, Form):
self.label_2 = QtWidgets.QLabel(self.tab_2)
self.label_2.setObjectName("label_2")
self.horizontalLayout_6.addWidget(self.label_2)
- spacerItem = QtWidgets.QSpacerItem(228, 28, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_6.addItem(spacerItem)
self.StatusLable = QtWidgets.QLabel(self.tab_2)
self.StatusLable.setObjectName("StatusLable")
@@ -168,7 +168,7 @@ def setupUi(self, Form):
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
- self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 789, 651))
+ self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 794, 619))
self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
self.formLayout = QtWidgets.QFormLayout(self.scrollAreaWidgetContents_2)
self.formLayout.setObjectName("formLayout")
@@ -240,13 +240,12 @@ def setupUi(self, Form):
self.settingScrollArea = QtWidgets.QScrollArea(self.setting_Tab)
self.settingScrollArea.setLineWidth(3)
self.settingScrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
- self.settingScrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- self.settingScrollArea.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
+ self.settingScrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
+ self.settingScrollArea.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
self.settingScrollArea.setWidgetResizable(True)
- self.settingScrollArea.setAlignment(QtCore.Qt.AlignCenter)
self.settingScrollArea.setObjectName("settingScrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
- self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 789, 651))
+ self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 790, 629))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
self.verticalLayout_5.setObjectName("verticalLayout_5")
@@ -263,7 +262,7 @@ def setupUi(self, Form):
self.verticalLayout_5.addLayout(self.horizontalLayout_5)
self.settingTreeWidget = QtWidgets.QTreeWidget(self.scrollAreaWidgetContents)
self.settingTreeWidget.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ArrowCursor))
- self.settingTreeWidget.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked)
+ self.settingTreeWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.settingTreeWidget.setObjectName("settingTreeWidget")
font = QtGui.QFont()
font.setBold(True)
@@ -279,13 +278,11 @@ def setupUi(self, Form):
self.horizontalLayout_3.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.horizontalLayout_3.setSpacing(6)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
- spacerItem6 = QtWidgets.QSpacerItem(90, 20, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum)
+ spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_3.addItem(spacerItem6)
self.applyButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents)
self.applyButton.setObjectName("applyButton")
self.horizontalLayout_3.addWidget(self.applyButton)
- spacerItem7 = QtWidgets.QSpacerItem(90, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
- self.horizontalLayout_3.addItem(spacerItem7)
self.verticalLayout_5.addLayout(self.horizontalLayout_3)
self.settingScrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout_3.addWidget(self.settingScrollArea)
@@ -293,7 +290,7 @@ def setupUi(self, Form):
self.verticalLayout.addWidget(self.tabWidget)
self.retranslateUi(Form)
- self.tabWidget.setCurrentIndex(0)
+ self.tabWidget.setCurrentIndex(2)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
diff --git a/ictye-live-dm/src/ictye_live_dm/QT-GUI/main.ui b/ictye-live-dm/src/ictye_live_dm/QT-GUI/main.ui
index 50c9ffd..0a17863 100644
--- a/ictye-live-dm/src/ictye_live_dm/QT-GUI/main.ui
+++ b/ictye-live-dm/src/ictye_live_dm/QT-GUI/main.ui
@@ -9,8 +9,8 @@
0
0
- 863
- 740
+ 865
+ 720
@@ -79,10 +79,10 @@
QTabWidget::Rounded
- 0
+ 2
- Qt::ElideNone
+ Qt::ElideLeft
false
@@ -105,14 +105,14 @@
-
-
+
Qt::Horizontal
- 228
- 28
+ 40
+ 20
@@ -143,7 +143,7 @@
-
-
+
Qt::Horizontal
@@ -176,7 +176,7 @@
-
-
+
Qt::Horizontal
@@ -372,8 +372,8 @@
0
0
- 789
- 651
+ 794
+ 619
@@ -416,7 +416,7 @@
-
-
-
+
Qt::Horizontal
@@ -511,31 +511,28 @@
Qt::ScrollBarAsNeeded
- Qt::ScrollBarAlwaysOff
+ Qt::ScrollBarAsNeeded
- QAbstractScrollArea::AdjustToContents
+ QAbstractScrollArea::AdjustIgnored
true
-
- Qt::AlignCenter
-
0
0
- 789
- 651
+ 790
+ 629
-
-
-
+
Qt::Horizontal
@@ -569,7 +566,7 @@
ArrowCursor
- QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked
+ QAbstractItemView::NoEditTriggers
@@ -611,16 +608,13 @@
QLayout::SetDefaultConstraint
-
-
+
Qt::Horizontal
-
- QSizePolicy::MinimumExpanding
-
- 90
+ 40
20
@@ -633,22 +627,6 @@
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Fixed
-
-
-
- 90
- 20
-
-
-
-
diff --git a/ictye-live-dm/src/ictye_live_dm/config/plugin/bilibili_dm_plugin/config.yaml b/ictye-live-dm/src/ictye_live_dm/config/plugin/bilibili_dm_plugin/config.yaml
new file mode 100644
index 0000000..187ca61
--- /dev/null
+++ b/ictye-live-dm/src/ictye_live_dm/config/plugin/bilibili_dm_plugin/config.yaml
@@ -0,0 +1 @@
+session: ''
diff --git a/ictye-live-dm/src/ictye_live_dm/depends/config_registrar.py b/ictye-live-dm/src/ictye_live_dm/depends/config_registrar.py
index 34b0a06..ea3868e 100644
--- a/ictye-live-dm/src/ictye_live_dm/depends/config_registrar.py
+++ b/ictye-live-dm/src/ictye_live_dm/depends/config_registrar.py
@@ -196,7 +196,14 @@ def __init__(self,
self.__is_list: bool = is_list
self.__list_content: list[Union[ConfigKey, ConfigTree]] = []
- if is_list:
+ if build_dict is None and build_list is not None:
+ self.__is_list = True
+ elif build_dict is not None and build_list is None:
+ self.__is_list = False
+ elif build_dict is not None and build_list is not None:
+ raise ValueError("Cannot build a tree with both dict and list")
+
+ if self.__is_list:
self.__build_list(args, default=build_with_default)
else:
self.__build_dict(kwargs, default=build_with_default)
@@ -211,26 +218,17 @@ def __build_list(self, value, default=False):
if not self.__is_list:
raise TypeError("This is not a list")
for i in value:
- if default:
- if isinstance(i, ConfigKey):
- self.__list_content.append(i)
- elif isinstance(i, dict):
- self.__list_content.append(ConfigTree(build_dict=i, build_with_default=True))
- elif isinstance(i, list):
- self.__list_content.append(ConfigTree(is_list=True, build_list=i, build_with_default=True))
- elif isinstance(i, ConfigTree):
- self.__list_content.append(i)
- else:
- self.__list_content.append(ConfigKey(default=i))
+ if isinstance(i, ConfigKey):
+ self.__list_content.append(i)
+ elif isinstance(i, dict):
+ self.__list_content.append(ConfigTree(build_dict=i, build_with_default=default))
+ elif isinstance(i, list):
+ self.__list_content.append(ConfigTree(is_list=True, build_list=i, build_with_default=default))
+ elif isinstance(i, ConfigTree):
+ self.__list_content.append(i)
else:
- if isinstance(i, ConfigKey):
- self.__list_content.append(i)
- elif isinstance(i, dict):
- self.__list_content.append(ConfigTree(build_dict=i))
- elif isinstance(i, list):
- self.__list_content.append(ConfigTree(is_list=True, build_list=i))
- elif isinstance(i, ConfigTree):
- self.__list_content.append(i)
+ if default:
+ self.__list_content.append(ConfigKey(default=i))
else:
self.__list_content.append(ConfigKey(value=i))
@@ -244,30 +242,21 @@ def __build_dict(self, value, default=False):
if self.__is_list:
raise TypeError("This is not a dict")
for key, value in value.items():
- if default:
- if isinstance(value, ConfigKey):
- self.__content[key] = value
- elif isinstance(value, dict):
- self.__content[key] = ConfigTree(build_dict=value, build_with_default=True)
- elif isinstance(value, list):
- self.__content[key] = ConfigTree()
- elif isinstance(value, ConfigTree):
- self.__content[key] = value
- else:
- self.__content[key] = ConfigKey(default=value)
+ if isinstance(value, ConfigKey):
+ self.__content[key] = value
+ elif isinstance(value, dict):
+ self.__content[key] = ConfigTree(build_dict=value, build_with_default=default)
+ elif isinstance(value, list):
+ self.__content[key] = ConfigTree(build_list=value, build_with_default=default)
+ elif isinstance(value, ConfigTree):
+ self.__content[key] = value
else:
- if isinstance(value, ConfigKey):
- self.__content[key] = value
- elif isinstance(value, dict):
- self.__content[key] = ConfigTree(build_dict=value)
- elif isinstance(value, list):
- self.__content[key] = ConfigTree(is_list=True, build_list=value)
- elif isinstance(value, ConfigTree):
- self.__content[key] = value
+ if default:
+ self.__content[key] = ConfigKey(default=value)
else:
- self.__content[key] = ConfigKey(value)
+ self.__content[key] = ConfigKey(value=value)
- def get(self, key: str) -> Union[ConfigKey]:
+ def get(self, key: str|int) -> Union[ConfigKey,"ConfigTree",None]:
# 检查存储内容是否为列表
if self.__is_list:
# 将键转换为整数并返回对应索引处的值
@@ -330,7 +319,10 @@ def items(self) -> list:
@return: 一个列表,包含所有的项目,如果是字典的话返回的可能为一个包含元组的字典
"""
if self.__is_list:
- return self.__list_content
+ ret = []
+ for i in range(len(self.__list_content)):
+ ret.append((i, self.__list_content[i]))
+ return ret
else:
return list(self.__content.items())
diff --git a/ictye-live-dm/src/ictye_live_dm/pluginsystem.py b/ictye-live-dm/src/ictye_live_dm/pluginsystem.py
index 3369cfa..be48e4e 100644
--- a/ictye-live-dm/src/ictye_live_dm/pluginsystem.py
+++ b/ictye-live-dm/src/ictye_live_dm/pluginsystem.py
@@ -4,6 +4,7 @@
import logging
import os
+
import aiohttp.web as web
from .depends import pluginmain, plugin_errors, configs, config_registrar
@@ -160,36 +161,36 @@ async def plugin_main_runner(self):
"""
运行插件主方法
"""
- message_plugin = []
- anaylazer_tasks = []
+ message_tasks = []
+ analyzer_tasks = []
for plugin in self.analyzer_plugin_list:
tsk = asyncio.get_event_loop().create_task(plugin.plugin_main())
tsk.add_done_callback(lambda l: asyncio.ensure_future(self.analyzer_plugin_callback(plugin)))
- anaylazer_tasks.append(tsk)
+ analyzer_tasks.append(tsk)
for plugin in self.message_plugin_list:
tsk = asyncio.get_event_loop().create_task(plugin.plugin_main())
tsk.add_done_callback(lambda l: asyncio.ensure_future(self.message_plugin_call_back(plugin)))
- message_plugin.append(tsk)
+ message_tasks.append(tsk)
while True:
- for tsk in message_plugin:
+ for tsk in message_tasks:
if tsk.done():
- message_plugin.remove(tsk)
- for tsk in anaylazer_tasks:
+ message_tasks.remove(tsk)
+ for tsk in analyzer_tasks:
if tsk.done():
- anaylazer_tasks.remove(tsk)
+ analyzer_tasks.remove(tsk)
await asyncio.sleep(1)
async def message_plugin_call_back(self, obj):
try:
obj.plugin_callback()
except Exception as e:
- self.logger.error(f"a error is happened:{str(e)}")
+ self.logger.error(f"a error is happened in message plugin callback:{str(e)}")
self.message_plugin_list.remove(obj)
async def analyzer_plugin_callback(self, obj):
try:
obj.plugin_callback()
except Exception as e:
- self.logger.error(f"a error is happened:{str(e)}")
+ self.logger.error(f"a error is happened in analyzer plugin callback:{str(e)}")
self.analyzer_plugin_list.remove(obj)
diff --git a/ictye-live-dm/tests/Config_element_test.py b/ictye-live-dm/tests/Config_element_test.py
index e9cc8a1..db6ffc0 100644
--- a/ictye-live-dm/tests/Config_element_test.py
+++ b/ictye-live-dm/tests/Config_element_test.py
@@ -124,6 +124,82 @@ def test_init_list(self):
assert isinstance(config._ConfigTree__list_content[0], ConfigKey)
assert isinstance(config._ConfigTree__list_content[1], ConfigTree)
+ def test_init_dict_with_default_value(self):
+ # 测试以字典作爲默认值初始化
+ test_dict = {'key1': 'value1', 'key2': {'subkey': 'subvalue'}}
+ config = ConfigTree(build_dict=test_dict, build_with_default=True)
+ assert config.get('key1').get() == 'value1'
+ assert config.get('key2').get('subkey').get() =='subvalue'
+
+ def test_dict_contains(self):
+ # 测试是否包含某个键
+ config = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ assert 'key1' in config
+ assert 'key2' in config
+ assert 'key3' not in config
+
+ def test_list_contains(self):
+ # 测试是否包含某个索引
+ config = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ assert "value1" in config
+ assert "value2" in config
+ assert "value3" not in config
+
+ def test_list_eq(self):
+ # 测试列表是否相等
+ config1 = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ config2 = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ assert config1 == config2
+ config3 = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value3')])
+ assert config1!= config3
+ config4 = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2'), ConfigKey('value3')])
+ assert config1!= config4
+ config5 = ConfigKey('value1')
+ assert config1!= config5
+
+ def test_dict_eq(self):
+ # 测试字典是否相等
+ config1 = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ config2 = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ assert config1 == config2
+ config3 = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key3': ConfigKey('value3')})
+ assert config1!= config3
+ config4 = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2'), 'key3': ConfigKey('value3')})
+ assert config1!= config4
+ config5 = ConfigKey('value1')
+ assert config1!= config5
+
+ def test_list_append(self):
+ # 测试列表添加元素
+ config = ConfigTree(is_list=True)
+ config.append(ConfigKey('value1'))
+ assert len(config._ConfigTree__list_content) == 1
+ assert config._ConfigTree__list_content[0].get() == 'value1'
+
+ def test_dict_set(self):
+ # 测试字典添加元素
+ config = ConfigTree()
+ config.set('key', ConfigKey('value'))
+ assert 'key' in config._ConfigTree__content
+ assert config._ConfigTree__content['key'].get() == 'value'
+
+ def test_init_list_with_default_value(self):
+ # 测试以列表作爲默认值初始化
+ test_list = [ConfigKey('value1'), {'subkey': 'subvalue'}]
+ config = ConfigTree(is_list=True, build_list=test_list, build_with_default=True)
+ assert config.get(0).get() == 'value1'
+ assert config.get(1).get('subkey').get() =='subvalue'
+
+ def test_dict_len(self):
+ # 测试字典长度
+ config = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ assert len(config) == 2
+
+ def test_list_len(self):
+ # 测试列表长度
+ config = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ assert len(config) == 2
+
def test_get(self):
# 测试获取值
config = ConfigTree(build_dict={'key': ConfigKey('value')})
@@ -146,20 +222,31 @@ def test_to_dict(self):
config = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
result_dict = config.to_dict()
assert result_dict == {'key1': 'value1', 'key2': 'value2'}
+ config2 = ConfigTree(build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ with pytest.raises(TypeError):
+ config2.to_dict()
+ config3 = ConfigTree(build_dict={'key1': ConfigTree(build_dict={'subkey': ConfigKey('value1')})})
+ assert config3.to_dict() == {'key1': {'subkey': 'value1'}}
def test_to_list(self):
# 测试转换为列表
config = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
result_list = config.to_list()
assert result_list == ['value1', 'value2']
+ config2 = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ with pytest.raises(TypeError):
+ config2.to_list()
+ config3 = ConfigTree(build_list=[ConfigTree(build_dict={'subkey': ConfigKey('value1')})])
+ assert config3.to_list() == [{'subkey': 'value1'}]
def test_merge_dict_with_dict(self):
# 测试合并两个字典
- config1 = ConfigTree(build_dict={'key1': ConfigKey('value1')})
- config2 = ConfigTree(build_dict={'key2': ConfigKey('value2')})
+ config1 = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ config2 = ConfigTree(build_dict={'key2': ConfigKey('value2'), 'key3': ConfigKey('value3')})
config1.merge(config2)
- assert 'key1' in config1._ConfigTree__content
- assert 'key2' in config1._ConfigTree__content
+ assert config1.get('key1').get() == 'value1'
+ assert config1.get('key2').get() == 'value2'
+ assert config1.get('key3').get() == 'value3'
def test_merge_list_with_list(self):
# 测试合并两个列表
@@ -175,6 +262,27 @@ def test_merge_incompatible_types(self):
with pytest.raises(TypeError):
config1.merge(config2)
+ def test_keys(self):
+ # 测试获取键列表
+ config = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ assert config.keys() == ['key1', 'key2']
+
+ def test_values(self):
+ # 测试获取值列表
+ config = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ assert config.values() == {'key1':ConfigKey('value1'), 'key2':ConfigKey('value2')}
+
+ config2 = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ assert config2.values() == [ConfigKey('value1'), ConfigKey('value2')]
+
+ def test_items(self):
+ # 测试获取键值对列表
+ config = ConfigTree(build_dict={'key1': ConfigKey('value1'), 'key2': ConfigKey('value2')})
+ assert config.items() == [('key1', 'value1'), ('key2', 'value2')]
+
+ config2 = ConfigTree(is_list=True, build_list=[ConfigKey('value1'), ConfigKey('value2')])
+ assert config2.items() == [(0, 'value1'), (1, 'value2')]
+
# 使用pytest运行测试
if __name__ == "__main__":
diff --git a/ictye-live-dm/tests/Config_schema_test.py b/ictye-live-dm/tests/Config_schema_test.py
index 5a3ed0f..cfe00d0 100644
--- a/ictye-live-dm/tests/Config_schema_test.py
+++ b/ictye-live-dm/tests/Config_schema_test.py
@@ -84,6 +84,7 @@ def test_dict_schema(config_tree_dict):
assert schema.verify(config_tree_dict) == False
+
# Tests for ListSchema
def test_list_schema(config_tree_list):
schema = ListSchema(items=[StringSchema()])
diff --git a/ictye-live-dm/tests/conftest.py b/ictye-live-dm/tests/conftest.py
index 9eb7fcb..c184357 100644
--- a/ictye-live-dm/tests/conftest.py
+++ b/ictye-live-dm/tests/conftest.py
@@ -1,4 +1,7 @@
import os
import pytest
-os.system("pip install "+os.path.dirname(os.path.dirname(__file__)))
+import pip
+
+#os.system("pip install "+os.path.dirname(os.path.dirname(__file__)))
+pip.main(['install', os.path.dirname(os.path.dirname(__file__))])
\ No newline at end of file