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