refactor: unify douban module contracts

This commit is contained in:
jxxghp
2026-08-24 01:42:34 +08:00
parent 8f6456be6c
commit ce27732064
3 changed files with 164 additions and 78 deletions
+124 -78
View File
@@ -2735,95 +2735,114 @@
"version": 1
},
"async_douban_discover": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanDiscoverRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"count",
"mtype",
"page",
"sort",
"tags"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"async_douban_info": {
"aggregation": "legacy",
"aggregation": "first_non_empty",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanInfoRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid",
"mtype",
"raise_exception"
],
"result_contract": "dict | None",
"result_shape": "mapping",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"async_douban_movie_credits": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaPerson]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"async_douban_movie_recommend": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"async_douban_person_credits": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanPersonCreditsRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"page",
"person_id"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"async_douban_person_detail": {
"aggregation": "legacy",
"aggregation": "first_non_empty",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanPersonRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"required_parameters": [
"person_id"
],
"result_contract": "MediaPerson | None",
"result_shape": "any",
"supports_async": true,
"supports_sync": true,
@@ -2831,32 +2850,36 @@
"version": 1
},
"async_douban_tv_credits": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaPerson]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"async_douban_tv_recommend": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
@@ -3668,95 +3691,114 @@
"version": 1
},
"douban_discover": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanDiscoverRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"count",
"mtype",
"page",
"sort",
"tags"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"douban_info": {
"aggregation": "legacy",
"aggregation": "first_non_empty",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanInfoRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid",
"mtype",
"raise_exception"
],
"result_contract": "dict | None",
"result_shape": "mapping",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"douban_movie_credits": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaPerson]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"douban_movie_recommend": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"douban_person_credits": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanPersonCreditsRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"page",
"person_id"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"douban_person_detail": {
"aggregation": "legacy",
"aggregation": "first_non_empty",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanPersonRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"required_parameters": [
"person_id"
],
"result_contract": "MediaPerson | None",
"result_shape": "any",
"supports_async": true,
"supports_sync": true,
@@ -3764,32 +3806,36 @@
"version": 1
},
"douban_tv_credits": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaPerson]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
"version": 1
},
"douban_tv_recommend": {
"aggregation": "legacy",
"aggregation": "ordered_list_merge",
"error_policy": "isolate_provider",
"execution": "sync_or_async",
"family": "douban",
"input_contract": "DoubanKeywordArguments",
"input_contract": "DoubanMediaRequest",
"plugin_short_circuit": true,
"public_to_plugins": true,
"required_parameters": [],
"result_contract": "DoubanProviderResult",
"result_shape": "any",
"required_parameters": [
"doubanid"
],
"result_contract": "list[MediaInfo]",
"result_shape": "list",
"supports_async": true,
"supports_sync": true,
"timeout_policy": "caller_budget",
+24
View File
@@ -328,6 +328,30 @@ def test_sync_and_async_discovery_lists_share_contracts() -> None:
assert contract.required_parameters
def test_sync_and_async_douban_capabilities_share_contracts() -> None:
"""Douban 同步与异步 provider 应共享参数和结果聚合契约。"""
list_methods = {
"douban_discover",
"douban_movie_credits",
"douban_movie_recommend",
"douban_person_credits",
"douban_tv_credits",
"douban_tv_recommend",
}
value_methods = {"douban_info", "douban_person_detail"}
for sync_method in list_methods | value_methods:
contract = get_module_method_contract(sync_method)
assert contract is get_module_method_contract(f"async_{sync_method}")
assert contract.required_parameters
expected = (
ModuleResultAggregation.ORDERED_LIST_MERGE
if sync_method in list_methods
else ModuleResultAggregation.FIRST_NON_EMPTY
)
assert contract.aggregation is expected
def test_attachment_result_diagnostics_distinguish_bytes_and_strings() -> None:
"""附件契约应区分二进制内容和可展示字符串,偏差仍仅供诊断。"""
assert diagnose_module_result("download_qq_file_bytes", b"content") == ()