gopher-mcp-python 0.1.39__tar.gz → 0.1.40__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 (82) hide show
  1. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/PKG-INFO +1 -1
  2. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/__init__.py +1 -1
  3. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/library.py +2 -1
  4. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python.egg-info/PKG-INFO +1 -1
  5. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/pyproject.toml +1 -1
  6. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_ffi_runtime_options.py +29 -0
  7. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/LICENSE +0 -0
  8. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/README.md +0 -0
  9. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/agent.py +0 -0
  10. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/auth/__init__.py +0 -0
  11. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/auth/errors.py +0 -0
  12. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/auth/gopher_auth.py +0 -0
  13. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/auth/scope_helpers.py +0 -0
  14. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/config.py +0 -0
  15. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/elicitation.py +0 -0
  16. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/elicitation_runtime.py +0 -0
  17. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/errors.py +0 -0
  18. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/__init__.py +0 -0
  19. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/__init__.py +0 -0
  20. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/auth_client.py +0 -0
  21. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/auto_refresh.py +0 -0
  22. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/config_loader.py +0 -0
  23. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/loader.py +0 -0
  24. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/oauth_client.py +0 -0
  25. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/session_manager.py +0 -0
  26. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/types.py +0 -0
  27. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/ffi/auth/validation_options.py +0 -0
  28. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/gateway_elicitation_preflight.py +0 -0
  29. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_authorization_url.py +0 -0
  30. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_browser.py +0 -0
  31. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_discovery.py +0 -0
  32. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_loopback.py +0 -0
  33. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_pkce.py +0 -0
  34. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_registration.py +0 -0
  35. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_resolver.py +0 -0
  36. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_runtime_options.py +0 -0
  37. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_server_targets.py +0 -0
  38. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_token_exchange.py +0 -0
  39. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/oauth_token_store.py +0 -0
  40. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/result.py +0 -0
  41. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/runtime_options.py +0 -0
  42. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python/server_config.py +0 -0
  43. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python.egg-info/SOURCES.txt +0 -0
  44. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python.egg-info/dependency_links.txt +0 -0
  45. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python.egg-info/requires.txt +0 -0
  46. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/gopher_mcp_python.egg-info/top_level.txt +0 -0
  47. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/setup.cfg +0 -0
  48. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/setup.py +0 -0
  49. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_agent_create_by.py +0 -0
  50. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_agent_create_with_oauth.py +0 -0
  51. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_agent_error_message.py +0 -0
  52. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_agent_lifecycle.py +0 -0
  53. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_agent_runtime_options.py +0 -0
  54. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_auth_exports.py +0 -0
  55. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_config.py +0 -0
  56. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_custom_oauth_test_idp.py +0 -0
  57. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_custom_protected_mcp_endpoints.py +0 -0
  58. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_dump_version.py +0 -0
  59. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_elicitation_runtime.py +0 -0
  60. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_ffi.py +0 -0
  61. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_gateway_elicitation_preflight.py +0 -0
  62. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_gopher_auth.py +0 -0
  63. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_header_create_by_url_example.py +0 -0
  64. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_library_search_paths.py +0 -0
  65. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_linux_native_packaging.py +0 -0
  66. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_authorization_url.py +0 -0
  67. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_auto_custom_idp.py +0 -0
  68. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_auto_custom_idp_failures.py +0 -0
  69. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_browser.py +0 -0
  70. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_create_with_url_integration.py +0 -0
  71. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_discovery.py +0 -0
  72. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_loopback.py +0 -0
  73. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_pkce.py +0 -0
  74. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_registration.py +0 -0
  75. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_resolver.py +0 -0
  76. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_runtime_options.py +0 -0
  77. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_server_targets.py +0 -0
  78. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_test_token_helper.py +0 -0
  79. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_token_exchange.py +0 -0
  80. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_oauth_token_store.py +0 -0
  81. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_result.py +0 -0
  82. {gopher_mcp_python-0.1.39 → gopher_mcp_python-0.1.40}/tests/test_server_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gopher-mcp-python
3
- Version: 0.1.39
3
+ Version: 0.1.40
4
4
  Summary: Python SDK for Gopher MCP - AI Agent orchestration framework with native performance
5
5
  Author-email: Gopher Security <dev@gophersecurity.com>
6
6
  License: Apache-2.0
@@ -53,7 +53,7 @@ from gopher_mcp_python.errors import (
53
53
  from gopher_mcp_python.server_config import ServerConfig, ServerConfigRoute
54
54
  from gopher_mcp_python.ffi import GopherOrchLibrary, GopherOrchHandle
55
55
 
56
- __version__ = "0.1.39"
56
+ __version__ = "0.1.40"
57
57
 
58
58
  _AUTH_EXPORTS = {
59
59
  "GopherAuth",
@@ -1135,9 +1135,10 @@ def _handle_key(handle: Any) -> Optional[int]:
1135
1135
 
1136
1136
 
1137
1137
  def _native_version_from_path(path: Optional[str]) -> Optional[str]:
1138
+ """Read the concrete library's version through any unversioned symlink."""
1138
1139
  if not path:
1139
1140
  return None
1140
- name = os.path.basename(path)
1141
+ name = os.path.basename(os.path.realpath(path))
1141
1142
  parts = _parse_library_version(name)
1142
1143
  return ".".join(str(part) for part in parts) if parts != (0,) else None
1143
1144
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gopher-mcp-python
3
- Version: 0.1.39
3
+ Version: 0.1.40
4
4
  Summary: Python SDK for Gopher MCP - AI Agent orchestration framework with native performance
5
5
  Author-email: Gopher Security <dev@gophersecurity.com>
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gopher-mcp-python"
7
- version = "0.1.39"
7
+ version = "0.1.40"
8
8
  description = "Python SDK for Gopher MCP - AI Agent orchestration framework with native performance"
9
9
  readme = "README.md"
10
10
  license = {text = "Apache-2.0"}
@@ -161,6 +161,35 @@ def test_build_agent_options_requires_elicitation_support() -> None:
161
161
  lib._build_agent_options({"elicitation": {}})
162
162
 
163
163
 
164
+ @pytest.mark.parametrize(
165
+ "library_name,versioned_name",
166
+ [
167
+ ("libgopher-orch.dylib", "libgopher-orch.0.1.39.dylib"),
168
+ ("libgopher-orch.so", "libgopher-orch.so.0.1.39"),
169
+ ],
170
+ )
171
+ def test_symlinked_library_keeps_elicitation_support(
172
+ monkeypatch, tmp_path, library_name, versioned_name
173
+ ) -> None:
174
+ """Libraries without a capability symbol need the symlink target's version."""
175
+ versioned = tmp_path / versioned_name
176
+ versioned.write_bytes(b"")
177
+ alias = tmp_path / library_name
178
+ alias.symlink_to(versioned.name)
179
+ monkeypatch.setenv("GOPHER_MCP_PYTHON_LIBRARY_PATH", str(alias))
180
+ monkeypatch.setattr(ctypes, "CDLL", lambda path: object())
181
+ monkeypatch.setattr(GopherOrchLibrary, "_setup_functions", lambda self: None)
182
+
183
+ library = GopherOrchLibrary()
184
+ storage = library._build_agent_options(
185
+ {"elicitation": {"handler": lambda request: "cancel"}}
186
+ )
187
+
188
+ assert library._loaded_native_package_version == "0.1.39"
189
+ assert storage is not None
190
+ assert storage.elicitation_callback is not None
191
+
192
+
164
193
  def test_build_agent_options_maps_elicitation_callback(monkeypatch) -> None:
165
194
  lib = object.__new__(GopherOrchLibrary)
166
195
  lib._lib = None