pygeai 0.1.51b3__py3-none-any.whl → 0.6.0b15__py3-none-any.whl
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.
Potentially problematic release.
This version of pygeai might be problematic. Click here for more details.
- pygeai/__init__.py +9 -1
- pygeai/_docs/Makefile +20 -0
- pygeai/_docs/make.bat +35 -0
- pygeai/_docs/source/conf.py +117 -0
- pygeai/_docs/source/content/ai_lab/cli.rst +747 -0
- pygeai/_docs/source/content/ai_lab/models.rst +1734 -0
- pygeai/_docs/source/content/ai_lab/runner.rst +253 -0
- pygeai/_docs/source/content/ai_lab/spec.rst +431 -0
- pygeai/_docs/source/content/ai_lab/usage.rst +1011 -0
- pygeai/_docs/source/content/ai_lab.rst +102 -0
- pygeai/_docs/source/content/analytics.rst +598 -0
- pygeai/_docs/source/content/api_reference/admin.rst +161 -0
- pygeai/_docs/source/content/api_reference/assistant.rst +326 -0
- pygeai/_docs/source/content/api_reference/auth.rst +379 -0
- pygeai/_docs/source/content/api_reference/chat.rst +754 -0
- pygeai/_docs/source/content/api_reference/embeddings.rst +154 -0
- pygeai/_docs/source/content/api_reference/evaluation.rst +590 -0
- pygeai/_docs/source/content/api_reference/feedback.rst +237 -0
- pygeai/_docs/source/content/api_reference/files.rst +592 -0
- pygeai/_docs/source/content/api_reference/gam.rst +401 -0
- pygeai/_docs/source/content/api_reference/health.rst +58 -0
- pygeai/_docs/source/content/api_reference/project.rst +738 -0
- pygeai/_docs/source/content/api_reference/proxy.rst +318 -0
- pygeai/_docs/source/content/api_reference/rag.rst +710 -0
- pygeai/_docs/source/content/api_reference/rerank.rst +94 -0
- pygeai/_docs/source/content/api_reference/secrets.rst +495 -0
- pygeai/_docs/source/content/api_reference/usage_limits.rst +390 -0
- pygeai/_docs/source/content/api_reference.rst +58 -0
- pygeai/_docs/source/content/authentication.rst +295 -0
- pygeai/_docs/source/content/chat_gui.rst +121 -0
- pygeai/_docs/source/content/cli.rst +203 -0
- pygeai/_docs/source/content/debugger.rst +651 -0
- pygeai/_docs/source/content/intro.rst +67 -0
- pygeai/_docs/source/content/migration.rst +929 -0
- pygeai/_docs/source/content/modules.rst +7 -0
- pygeai/_docs/source/content/quickstart.rst +143 -0
- pygeai/_docs/source/content/samples.rst +394 -0
- pygeai/_docs/source/index.rst +75 -0
- pygeai/_docs/source/modules.rst +7 -0
- pygeai/_docs/source/pygeai.admin.rst +29 -0
- pygeai/_docs/source/pygeai.analytics.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.data.rst +21 -0
- pygeai/_docs/source/pygeai.assistant.data_analyst.rst +29 -0
- pygeai/_docs/source/pygeai.assistant.rag.rst +53 -0
- pygeai/_docs/source/pygeai.assistant.rst +55 -0
- pygeai/_docs/source/pygeai.auth.rst +29 -0
- pygeai/_docs/source/pygeai.chat.rst +69 -0
- pygeai/_docs/source/pygeai.cli.commands.flows.rst +10 -0
- pygeai/_docs/source/pygeai.cli.commands.lab.rst +53 -0
- pygeai/_docs/source/pygeai.cli.commands.rst +222 -0
- pygeai/_docs/source/pygeai.cli.rst +62 -0
- pygeai/_docs/source/pygeai.cli.texts.rst +21 -0
- pygeai/_docs/source/pygeai.core.base.rst +53 -0
- pygeai/_docs/source/pygeai.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.core.embeddings.rst +61 -0
- pygeai/_docs/source/pygeai.core.feedback.rst +37 -0
- pygeai/_docs/source/pygeai.core.files.rst +61 -0
- pygeai/_docs/source/pygeai.core.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.plugins.rst +37 -0
- pygeai/_docs/source/pygeai.core.rerank.rst +53 -0
- pygeai/_docs/source/pygeai.core.rst +63 -0
- pygeai/_docs/source/pygeai.core.secrets.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.llm.rst +29 -0
- pygeai/_docs/source/pygeai.core.services.rst +37 -0
- pygeai/_docs/source/pygeai.core.utils.rst +37 -0
- pygeai/_docs/source/pygeai.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.evaluation.dataset.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.plan.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.result.rst +29 -0
- pygeai/_docs/source/pygeai.evaluation.rst +31 -0
- pygeai/_docs/source/pygeai.flows.rst +29 -0
- pygeai/_docs/source/pygeai.gam.rst +29 -0
- pygeai/_docs/source/pygeai.health.rst +29 -0
- pygeai/_docs/source/pygeai.lab.agents.rst +37 -0
- pygeai/_docs/source/pygeai.lab.processes.rst +37 -0
- pygeai/_docs/source/pygeai.lab.rst +65 -0
- pygeai/_docs/source/pygeai.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.lab.strategies.rst +37 -0
- pygeai/_docs/source/pygeai.lab.tools.rst +37 -0
- pygeai/_docs/source/pygeai.man.man1.rst +10 -0
- pygeai/_docs/source/pygeai.man.rst +18 -0
- pygeai/_docs/source/pygeai.migration.rst +29 -0
- pygeai/_docs/source/pygeai.organization.limits.rst +45 -0
- pygeai/_docs/source/pygeai.organization.rst +61 -0
- pygeai/_docs/source/pygeai.proxy.rst +53 -0
- pygeai/_docs/source/pygeai.rst +35 -0
- pygeai/_docs/source/pygeai.tests.admin.rst +21 -0
- pygeai/_docs/source/pygeai.tests.analytics.rst +45 -0
- pygeai/_docs/source/pygeai.tests.assistants.rag.rst +37 -0
- pygeai/_docs/source/pygeai.tests.assistants.rst +45 -0
- pygeai/_docs/source/pygeai.tests.auth.rst +29 -0
- pygeai/_docs/source/pygeai.tests.chat.rst +45 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.lab.rst +37 -0
- pygeai/_docs/source/pygeai.tests.cli.commands.rst +165 -0
- pygeai/_docs/source/pygeai.tests.cli.docker.rst +10 -0
- pygeai/_docs/source/pygeai.tests.cli.rst +46 -0
- pygeai/_docs/source/pygeai.tests.core.base.data.rst +29 -0
- pygeai/_docs/source/pygeai.tests.core.base.rst +45 -0
- pygeai/_docs/source/pygeai.tests.core.common.data.rst +10 -0
- pygeai/_docs/source/pygeai.tests.core.common.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.embeddings.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.feedback.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.files.rst +53 -0
- pygeai/_docs/source/pygeai.tests.core.llm.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.plugins.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.rerank.rst +37 -0
- pygeai/_docs/source/pygeai.tests.core.rst +39 -0
- pygeai/_docs/source/pygeai.tests.core.secrets.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.services.rst +21 -0
- pygeai/_docs/source/pygeai.tests.core.utils.rst +21 -0
- pygeai/_docs/source/pygeai.tests.dbg.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.dataset.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.plan.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.result.rst +21 -0
- pygeai/_docs/source/pygeai.tests.evaluation.rst +20 -0
- pygeai/_docs/source/pygeai.tests.gam.rst +21 -0
- pygeai/_docs/source/pygeai.tests.health.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rag.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.assistants.rst +18 -0
- pygeai/_docs/source/pygeai.tests.integration.chat.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.agents.rst +69 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.processes.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.reasoning_strategies.rst +37 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.rst +21 -0
- pygeai/_docs/source/pygeai.tests.integration.lab.tools.rst +77 -0
- pygeai/_docs/source/pygeai.tests.integration.rst +20 -0
- pygeai/_docs/source/pygeai.tests.lab.agents.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.processes.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.rst +49 -0
- pygeai/_docs/source/pygeai.tests.lab.spec.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.strategies.rst +29 -0
- pygeai/_docs/source/pygeai.tests.lab.tools.rst +29 -0
- pygeai/_docs/source/pygeai.tests.migration.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.limits.rst +29 -0
- pygeai/_docs/source/pygeai.tests.organization.rst +53 -0
- pygeai/_docs/source/pygeai.tests.proxy.rst +61 -0
- pygeai/_docs/source/pygeai.tests.rst +33 -0
- pygeai/admin/clients.py +14 -11
- pygeai/admin/endpoints.py +2 -2
- pygeai/analytics/clients.py +505 -0
- pygeai/analytics/endpoints.py +35 -0
- pygeai/analytics/managers.py +606 -0
- pygeai/analytics/mappers.py +207 -0
- pygeai/analytics/responses.py +240 -0
- pygeai/assistant/clients.py +18 -45
- pygeai/assistant/data/clients.py +1 -0
- pygeai/assistant/data_analyst/clients.py +8 -12
- pygeai/assistant/managers.py +195 -157
- pygeai/assistant/mappers.py +4 -2
- pygeai/assistant/rag/clients.py +27 -67
- pygeai/assistant/rag/mappers.py +12 -6
- pygeai/assistant/rag/models.py +301 -159
- pygeai/auth/__init__.py +0 -0
- pygeai/auth/clients.py +129 -0
- pygeai/auth/endpoints.py +6 -0
- pygeai/chat/clients.py +308 -37
- pygeai/chat/endpoints.py +3 -0
- pygeai/chat/iris.py +2 -8
- pygeai/chat/managers.py +9 -6
- pygeai/chat/session.py +38 -0
- pygeai/chat/settings.py +6 -0
- pygeai/chat/ui.py +678 -0
- pygeai/cli/__init__.py +0 -1
- pygeai/cli/commands/admin.py +7 -10
- pygeai/cli/commands/analytics.py +533 -0
- pygeai/cli/commands/assistant.py +9 -9
- pygeai/cli/commands/auth.py +299 -0
- pygeai/cli/commands/base.py +71 -9
- pygeai/cli/commands/chat.py +676 -19
- pygeai/cli/commands/common.py +28 -24
- pygeai/cli/commands/configuration.py +66 -13
- pygeai/cli/commands/docs.py +105 -0
- pygeai/cli/commands/embeddings.py +58 -11
- pygeai/cli/commands/evaluation.py +38 -38
- pygeai/cli/commands/feedback.py +3 -4
- pygeai/cli/commands/files.py +7 -8
- pygeai/cli/commands/gam.py +85 -10
- pygeai/cli/commands/lab/ai_lab.py +340 -484
- pygeai/cli/commands/lab/options.py +8 -0
- pygeai/cli/commands/lab/spec.py +273 -0
- pygeai/cli/commands/lab/utils.py +13 -0
- pygeai/cli/commands/llm.py +6 -7
- pygeai/cli/commands/migrate.py +1064 -436
- pygeai/cli/commands/organization.py +516 -11
- pygeai/cli/commands/rag.py +13 -14
- pygeai/cli/commands/rerank.py +3 -5
- pygeai/cli/commands/secrets.py +8 -9
- pygeai/cli/commands/usage_limits.py +18 -20
- pygeai/cli/commands/validators.py +144 -1
- pygeai/cli/commands/version.py +4 -5
- pygeai/cli/error_handler.py +151 -0
- pygeai/cli/geai.py +170 -31
- pygeai/cli/geai_proxy.py +86 -25
- pygeai/cli/install_man.py +93 -22
- pygeai/cli/parsers.py +75 -25
- pygeai/cli/texts/help.py +265 -28
- pygeai/core/base/clients.py +53 -12
- pygeai/core/base/mappers.py +11 -2
- pygeai/core/base/session.py +95 -11
- pygeai/core/common/config.py +78 -14
- pygeai/core/common/exceptions.py +96 -6
- pygeai/core/embeddings/__init__.py +19 -0
- pygeai/core/embeddings/clients.py +23 -5
- pygeai/core/embeddings/managers.py +9 -4
- pygeai/core/embeddings/mappers.py +16 -2
- pygeai/core/embeddings/responses.py +9 -2
- pygeai/core/feedback/clients.py +8 -3
- pygeai/core/files/clients.py +23 -24
- pygeai/core/files/managers.py +121 -30
- pygeai/core/files/responses.py +4 -3
- pygeai/core/handlers.py +10 -1
- pygeai/core/llm/clients.py +22 -29
- pygeai/core/models.py +127 -11
- pygeai/core/plugins/clients.py +6 -6
- pygeai/core/rerank/clients.py +9 -3
- pygeai/core/rerank/managers.py +22 -5
- pygeai/core/secrets/clients.py +16 -37
- pygeai/core/services/response.py +18 -0
- pygeai/core/services/rest.py +159 -49
- pygeai/core/utils/__init__.py +0 -0
- pygeai/core/utils/console.py +83 -0
- pygeai/core/utils/parsers.py +32 -0
- pygeai/core/utils/validators.py +10 -0
- pygeai/dbg/__init__.py +3 -0
- pygeai/dbg/debugger.py +854 -14
- pygeai/evaluation/clients.py +7 -4
- pygeai/evaluation/dataset/clients.py +46 -44
- pygeai/evaluation/plan/clients.py +28 -26
- pygeai/evaluation/result/clients.py +38 -5
- pygeai/gam/clients.py +50 -28
- pygeai/gam/endpoints.py +2 -1
- pygeai/health/__init__.py +0 -0
- pygeai/health/clients.py +24 -0
- pygeai/health/endpoints.py +1 -0
- pygeai/lab/__init__.py +0 -90
- pygeai/lab/agents/clients.py +203 -162
- pygeai/lab/agents/endpoints.py +4 -0
- pygeai/lab/agents/mappers.py +57 -7
- pygeai/lab/clients.py +24 -0
- pygeai/lab/constants.py +3 -0
- pygeai/lab/managers.py +571 -541
- pygeai/lab/models.py +108 -19
- pygeai/lab/processes/clients.py +332 -340
- pygeai/lab/processes/mappers.py +3 -3
- pygeai/lab/runners.py +90 -0
- pygeai/lab/spec/__init__.py +0 -0
- pygeai/lab/spec/loader.py +24 -0
- pygeai/lab/spec/parsers.py +39 -0
- pygeai/lab/strategies/clients.py +67 -63
- pygeai/lab/strategies/mappers.py +1 -1
- pygeai/lab/tools/clients.py +85 -118
- pygeai/lab/tools/endpoints.py +4 -0
- pygeai/lab/tools/mappers.py +5 -5
- pygeai/man/man1/geai-proxy.1 +116 -0
- pygeai/man/man1/geai.1 +2580 -66
- pygeai/migration/__init__.py +33 -0
- pygeai/migration/strategies.py +468 -146
- pygeai/migration/tools.py +170 -3
- pygeai/organization/clients.py +245 -50
- pygeai/organization/endpoints.py +17 -8
- pygeai/organization/limits/clients.py +34 -32
- pygeai/organization/limits/managers.py +108 -49
- pygeai/organization/managers.py +347 -53
- pygeai/organization/mappers.py +102 -2
- pygeai/organization/responses.py +58 -1
- pygeai/proxy/clients.py +6 -3
- pygeai/proxy/config.py +14 -1
- pygeai/proxy/managers.py +61 -33
- pygeai/proxy/servers.py +196 -51
- pygeai/proxy/tool.py +33 -16
- pygeai/tests/admin/__init__.py +0 -0
- pygeai/tests/admin/test_clients.py +148 -0
- pygeai/tests/analytics/__init__.py +0 -0
- pygeai/tests/analytics/test_clients.py +86 -0
- pygeai/tests/analytics/test_managers.py +94 -0
- pygeai/tests/analytics/test_mappers.py +84 -0
- pygeai/tests/analytics/test_responses.py +73 -0
- pygeai/tests/assistants/rag/test_clients.py +346 -0
- pygeai/tests/assistants/rag/test_models.py +292 -0
- pygeai/tests/assistants/test_clients.py +176 -82
- pygeai/tests/assistants/test_managers.py +191 -57
- pygeai/tests/auth/__init__.py +0 -0
- pygeai/tests/auth/test_clients.py +289 -0
- pygeai/tests/auth/test_oauth.py +172 -0
- pygeai/tests/auth/test_session_logging.py +150 -0
- pygeai/tests/chat/__init__.py +0 -0
- pygeai/tests/chat/test_clients.py +393 -0
- pygeai/tests/chat/test_iris.py +38 -0
- pygeai/tests/chat/test_session.py +62 -0
- pygeai/tests/chat/test_ui.py +224 -0
- pygeai/tests/cli/commands/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/__init__.py +0 -0
- pygeai/tests/cli/commands/lab/test_ai_lab.py +786 -0
- pygeai/tests/cli/commands/lab/test_common.py +208 -0
- pygeai/tests/cli/commands/lab/test_spec.py +246 -0
- pygeai/tests/cli/commands/test_assistant.py +202 -0
- pygeai/tests/cli/commands/test_chat.py +130 -0
- pygeai/tests/cli/commands/test_common.py +350 -0
- pygeai/tests/cli/commands/test_embeddings.py +132 -0
- pygeai/tests/cli/commands/test_evaluation.py +656 -0
- pygeai/tests/cli/commands/test_feedback.py +65 -0
- pygeai/tests/cli/commands/test_files.py +161 -0
- pygeai/tests/cli/commands/test_gam.py +201 -0
- pygeai/tests/cli/commands/test_llm.py +114 -0
- pygeai/tests/cli/commands/test_migrate.py +176 -0
- pygeai/tests/cli/commands/test_organization.py +276 -0
- pygeai/tests/cli/commands/test_rag.py +266 -0
- pygeai/tests/cli/commands/test_rerank.py +110 -0
- pygeai/tests/cli/commands/test_secrets.py +171 -0
- pygeai/tests/cli/commands/test_show_help.py +41 -0
- pygeai/tests/cli/commands/test_usage_limits.py +412 -0
- pygeai/tests/cli/commands/test_validators.py +160 -0
- pygeai/tests/cli/commands/test_version.py +81 -0
- pygeai/tests/cli/docker/__init__.py +0 -0
- pygeai/tests/cli/test_credentials_flag.py +316 -0
- pygeai/tests/cli/test_error_handler.py +225 -0
- pygeai/tests/cli/test_geai_driver.py +154 -0
- pygeai/tests/cli/test_parsers.py +5 -5
- pygeai/tests/core/base/data/models.py +7 -0
- pygeai/tests/core/base/test_mappers.py +43 -11
- pygeai/tests/core/base/test_models.py +3 -1
- pygeai/tests/core/base/test_responses.py +53 -0
- pygeai/tests/core/common/__init__.py +0 -0
- pygeai/tests/core/common/data/__init__.py +0 -0
- pygeai/tests/core/common/test_config.py +186 -0
- pygeai/tests/core/common/test_decorators.py +69 -0
- pygeai/tests/core/embeddings/__init__.py +0 -0
- pygeai/tests/core/embeddings/test_clients.py +225 -0
- pygeai/tests/core/embeddings/test_managers.py +171 -0
- pygeai/tests/core/embeddings/test_mappers.py +142 -0
- pygeai/tests/core/feedback/__init__.py +0 -0
- pygeai/tests/core/feedback/test_clients.py +64 -0
- pygeai/tests/core/files/test_clients.py +128 -0
- pygeai/tests/core/files/test_managers.py +124 -78
- pygeai/tests/core/files/test_mappers.py +137 -0
- pygeai/tests/core/files/test_models.py +103 -0
- pygeai/tests/core/files/test_responses.py +122 -0
- pygeai/tests/core/llm/__init__.py +0 -0
- pygeai/tests/core/llm/test_clients.py +142 -0
- pygeai/tests/core/plugins/__init__.py +0 -0
- pygeai/tests/core/plugins/test_clients.py +66 -0
- pygeai/tests/core/rerank/test_clients.py +76 -0
- pygeai/tests/core/rerank/test_managers.py +61 -39
- pygeai/tests/core/secrets/__init__.py +0 -0
- pygeai/tests/core/secrets/test_clients.py +264 -0
- pygeai/tests/core/services/__init__.py +0 -0
- pygeai/tests/core/services/test_rest.py +273 -0
- pygeai/tests/core/test_handlers.py +66 -0
- pygeai/tests/core/utils/__init__.py +0 -0
- pygeai/tests/core/utils/test_console.py +80 -0
- pygeai/tests/dbg/__init__.py +0 -0
- pygeai/tests/dbg/test_debugger.py +591 -0
- pygeai/tests/evaluation/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/evaluation/dataset/test_clients.py +265 -0
- pygeai/tests/evaluation/plan/__init__.py +0 -0
- pygeai/tests/evaluation/plan/test_clients.py +195 -0
- pygeai/tests/evaluation/result/__init__.py +0 -0
- pygeai/tests/evaluation/result/test_clients.py +66 -0
- pygeai/tests/gam/__init__.py +0 -0
- pygeai/tests/gam/test_clients.py +195 -0
- pygeai/tests/health/__init__.py +0 -0
- pygeai/tests/health/test_clients.py +41 -0
- pygeai/tests/integration/__init__.py +0 -0
- pygeai/tests/integration/assistants/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/__init__.py +0 -0
- pygeai/tests/integration/assistants/rag/test_create_rag.py +91 -0
- pygeai/tests/integration/chat/__init__.py +0 -0
- pygeai/tests/integration/chat/test_generate_image.py +158 -0
- pygeai/tests/integration/lab/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/__init__.py +0 -0
- pygeai/tests/integration/lab/agents/test_agents_list.py +106 -0
- pygeai/tests/integration/lab/agents/test_create_agent.py +319 -0
- pygeai/tests/integration/lab/agents/test_create_sharing_link.py +70 -0
- pygeai/tests/integration/lab/agents/test_delete_agent.py +75 -0
- pygeai/tests/integration/lab/agents/test_get_agent.py +94 -0
- pygeai/tests/integration/lab/agents/test_publish_agent_revision.py +127 -0
- pygeai/tests/integration/lab/agents/test_update_agent.py +250 -0
- pygeai/tests/integration/lab/processes/__init__.py +0 -0
- pygeai/tests/integration/lab/processes/test_create_process.py +345 -0
- pygeai/tests/integration/lab/processes/test_create_task.py +211 -0
- pygeai/tests/integration/lab/processes/test_delete_process.py +111 -0
- pygeai/tests/integration/lab/processes/test_get_process.py +201 -0
- pygeai/tests/integration/lab/processes/test_list_process_instances.py +91 -0
- pygeai/tests/integration/lab/processes/test_list_processes.py +138 -0
- pygeai/tests/integration/lab/processes/test_publish_process_revision.py +232 -0
- pygeai/tests/integration/lab/processes/test_update_process.py +289 -0
- pygeai/tests/integration/lab/reasoning_strategies/__init__.py +0 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_get_reasoning_strategy.py +70 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_list_reasoning_strategies.py +93 -0
- pygeai/tests/integration/lab/reasoning_strategies/test_update_reasoning_strategy.py +149 -0
- pygeai/tests/integration/lab/tools/__init__.py +0 -0
- pygeai/tests/integration/lab/tools/test_create_tool.py +288 -0
- pygeai/tests/integration/lab/tools/test_delete_tool.py +87 -0
- pygeai/tests/integration/lab/tools/test_get_parameter.py +98 -0
- pygeai/tests/integration/lab/tools/test_get_tool.py +91 -0
- pygeai/tests/integration/lab/tools/test_list_tools.py +106 -0
- pygeai/tests/integration/lab/tools/test_publish_tool_revision.py +119 -0
- pygeai/tests/integration/lab/tools/test_set_parameter.py +114 -0
- pygeai/tests/integration/lab/tools/test_update_tool.py +267 -0
- pygeai/tests/lab/agents/__init__.py +0 -0
- pygeai/tests/lab/agents/test_clients.py +481 -0
- pygeai/tests/lab/agents/test_mappers.py +440 -0
- pygeai/tests/lab/processes/__init__.py +0 -0
- pygeai/tests/lab/processes/test_clients.py +1416 -0
- pygeai/tests/lab/processes/test_mappers.py +1092 -0
- pygeai/tests/lab/spec/__init__.py +0 -0
- pygeai/tests/lab/spec/test_loader.py +59 -0
- pygeai/tests/lab/spec/test_parsers.py +182 -0
- pygeai/tests/lab/strategies/__init__.py +0 -0
- pygeai/tests/lab/strategies/test_clients.py +241 -0
- pygeai/tests/lab/strategies/test_mappers.py +132 -0
- pygeai/tests/lab/test_managers.py +553 -0
- pygeai/tests/lab/test_models.py +500 -3
- pygeai/tests/lab/tools/__init__.py +0 -0
- pygeai/tests/lab/tools/test_clients.py +521 -0
- pygeai/tests/lab/tools/test_mappers.py +198 -0
- pygeai/tests/migration/__init__.py +0 -0
- pygeai/tests/migration/test_strategies.py +405 -0
- pygeai/tests/migration/test_tools.py +159 -0
- pygeai/tests/organization/limits/test_clients.py +567 -0
- pygeai/tests/organization/limits/test_managers.py +298 -56
- pygeai/tests/organization/test_clients.py +600 -30
- pygeai/tests/organization/test_managers.py +424 -0
- pygeai/tests/organization/test_mappers.py +153 -0
- pygeai/tests/organization/test_responses.py +137 -0
- pygeai/tests/proxy/__init__.py +1 -0
- pygeai/tests/proxy/test_clients.py +397 -0
- pygeai/tests/proxy/test_config.py +171 -0
- pygeai/tests/proxy/test_integration.py +305 -0
- pygeai/tests/proxy/test_managers.py +312 -0
- pygeai/tests/proxy/test_servers.py +387 -0
- pygeai/tests/proxy/test_tool.py +176 -0
- pygeai/tests/snippets/analytics/__init__.py +0 -0
- pygeai/tests/snippets/analytics/get_agent_usage_per_user.py +16 -0
- pygeai/tests/snippets/analytics/get_agents_created_and_modified.py +11 -0
- pygeai/tests/snippets/analytics/get_average_cost_per_request.py +10 -0
- pygeai/tests/snippets/analytics/get_overall_error_rate.py +10 -0
- pygeai/tests/snippets/analytics/get_top_10_agents_by_requests.py +12 -0
- pygeai/tests/snippets/analytics/get_total_active_users.py +10 -0
- pygeai/tests/snippets/analytics/get_total_cost.py +10 -0
- pygeai/tests/snippets/analytics/get_total_requests_per_day.py +12 -0
- pygeai/tests/snippets/analytics/get_total_tokens.py +12 -0
- pygeai/tests/snippets/auth/__init__.py +0 -0
- pygeai/tests/snippets/chat/chat_completion_with_reasoning_effort.py +18 -0
- pygeai/tests/snippets/chat/get_response.py +15 -0
- pygeai/tests/snippets/chat/get_response_complete_example.py +67 -0
- pygeai/tests/snippets/chat/get_response_streaming.py +20 -0
- pygeai/tests/snippets/chat/get_response_with_files.py +16 -0
- pygeai/tests/snippets/chat/get_response_with_instructions.py +19 -0
- pygeai/tests/snippets/chat/get_response_with_metadata.py +24 -0
- pygeai/tests/snippets/chat/get_response_with_parallel_tools.py +58 -0
- pygeai/tests/snippets/chat/get_response_with_reasoning.py +21 -0
- pygeai/tests/snippets/chat/get_response_with_store.py +38 -0
- pygeai/tests/snippets/chat/get_response_with_tools.py +36 -0
- pygeai/tests/snippets/chat/get_response_with_truncation.py +24 -0
- pygeai/tests/snippets/dbg/__init__.py +0 -0
- pygeai/tests/snippets/dbg/basic_debugging.py +32 -0
- pygeai/tests/snippets/dbg/breakpoint_management.py +48 -0
- pygeai/tests/snippets/dbg/file_debugging.py +72 -0
- pygeai/tests/snippets/dbg/module_debugging.py +61 -0
- pygeai/tests/snippets/dbg/stack_navigation.py +45 -0
- pygeai/tests/snippets/dbg/stepping_example.py +40 -0
- pygeai/tests/snippets/embeddings/cache_example.py +31 -0
- pygeai/tests/snippets/embeddings/cohere_example.py +41 -0
- pygeai/tests/snippets/embeddings/openai_base64_example.py +27 -0
- pygeai/tests/snippets/embeddings/openai_example.py +30 -0
- pygeai/tests/snippets/embeddings/similarity_example.py +42 -0
- pygeai/tests/snippets/evaluation/dataset/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/dataset/complete_workflow_example.py +195 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset.py +26 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_from_file.py +11 -0
- pygeai/tests/snippets/evaluation/dataset/create_dataset_row.py +17 -0
- pygeai/tests/snippets/evaluation/dataset/create_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/create_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/delete_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/delete_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/delete_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/get_dataset_row.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/get_expected_source.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/get_filter_variable.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/list_dataset_rows.py +9 -0
- pygeai/tests/snippets/evaluation/dataset/list_datasets.py +6 -0
- pygeai/tests/snippets/evaluation/dataset/list_expected_sources.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/list_filter_variables.py +10 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset.py +15 -0
- pygeai/tests/snippets/evaluation/dataset/update_dataset_row.py +20 -0
- pygeai/tests/snippets/evaluation/dataset/update_expected_source.py +18 -0
- pygeai/tests/snippets/evaluation/dataset/update_filter_variable.py +19 -0
- pygeai/tests/snippets/evaluation/dataset/upload_dataset_rows_file.py +10 -0
- pygeai/tests/snippets/evaluation/plan/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/plan/add_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/complete_workflow_example.py +136 -0
- pygeai/tests/snippets/evaluation/plan/create_evaluation_plan.py +24 -0
- pygeai/tests/snippets/evaluation/plan/create_rag_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/delete_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/delete_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/execute_evaluation_plan.py +11 -0
- pygeai/tests/snippets/evaluation/plan/get_evaluation_plan.py +9 -0
- pygeai/tests/snippets/evaluation/plan/get_plan_system_metric.py +13 -0
- pygeai/tests/snippets/evaluation/plan/get_system_metric.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_evaluation_plans.py +7 -0
- pygeai/tests/snippets/evaluation/plan/list_plan_system_metrics.py +9 -0
- pygeai/tests/snippets/evaluation/plan/list_system_metrics.py +7 -0
- pygeai/tests/snippets/evaluation/plan/update_evaluation_plan.py +22 -0
- pygeai/tests/snippets/evaluation/plan/update_plan_system_metric.py +14 -0
- pygeai/tests/snippets/evaluation/result/__init__.py +0 -0
- pygeai/tests/snippets/evaluation/result/complete_workflow_example.py +150 -0
- pygeai/tests/snippets/evaluation/result/get_evaluation_result.py +26 -0
- pygeai/tests/snippets/evaluation/result/list_evaluation_results.py +17 -0
- pygeai/tests/snippets/files/delete_file.py +1 -4
- pygeai/tests/snippets/files/get_file_content.py +2 -4
- pygeai/tests/snippets/files/get_file_data.py +1 -4
- pygeai/tests/snippets/files/get_file_list.py +1 -6
- pygeai/tests/snippets/files/upload_file.py +1 -5
- pygeai/tests/snippets/gam/gam_access_token.py +87 -0
- pygeai/tests/snippets/lab/agentic_flow_example_1.py +25 -23
- pygeai/tests/snippets/lab/agentic_flow_example_4.py +23 -23
- pygeai/tests/snippets/lab/agents/create_agent.py +5 -8
- pygeai/tests/snippets/lab/agents/create_agent_2.py +1 -5
- pygeai/tests/snippets/lab/agents/create_agent_edge_case.py +48 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_permissions.py +39 -0
- pygeai/tests/snippets/lab/agents/create_agent_with_properties.py +46 -0
- pygeai/tests/snippets/lab/agents/create_agent_without_instructions.py +48 -0
- pygeai/tests/snippets/lab/agents/delete_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/get_agent.py +2 -11
- pygeai/tests/snippets/lab/agents/get_agent_with_new_fields.py +62 -0
- pygeai/tests/snippets/lab/agents/get_sharing_link.py +2 -7
- pygeai/tests/snippets/lab/agents/list_agents.py +4 -7
- pygeai/tests/snippets/lab/agents/publish_agent_revision.py +2 -6
- pygeai/tests/snippets/lab/agents/update_agent.py +1 -5
- pygeai/tests/snippets/lab/agents/update_agent_properties.py +50 -0
- pygeai/tests/snippets/lab/assistant_to_agent.py +191 -0
- pygeai/tests/snippets/lab/crud_ui.py +462 -0
- pygeai/tests/snippets/lab/processes/create_process.py +3 -5
- pygeai/tests/snippets/lab/processes/create_task.py +3 -5
- pygeai/tests/snippets/lab/processes/jobs/list_jobs.py +10 -19
- pygeai/tests/snippets/lab/processes/kbs/create_kb.py +2 -5
- pygeai/tests/snippets/lab/processes/kbs/get_kb.py +10 -16
- pygeai/tests/snippets/lab/processes/kbs/list_kbs.py +13 -20
- pygeai/tests/snippets/lab/processes/kbs/try_all.py +5 -7
- pygeai/tests/snippets/lab/processes/list_processes.py +5 -7
- pygeai/tests/snippets/lab/runner_1.py +1 -1
- pygeai/tests/snippets/lab/samples/summarize_files.py +3 -3
- pygeai/tests/snippets/lab/strategies/create_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/get_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/strategies/list_reasoning_strategies.py +3 -6
- pygeai/tests/snippets/lab/strategies/update_reasoning_strategy.py +2 -5
- pygeai/tests/snippets/lab/tools/create_tool.py +4 -10
- pygeai/tests/snippets/lab/tools/create_tool_edge_case.py +50 -0
- pygeai/tests/snippets/lab/tools/delete_tool.py +2 -6
- pygeai/tests/snippets/lab/tools/get_parameter.py +5 -7
- pygeai/tests/snippets/lab/tools/get_tool.py +5 -7
- pygeai/tests/snippets/lab/tools/list_tools.py +3 -7
- pygeai/tests/snippets/lab/tools/publish_tool_revision.py +3 -5
- pygeai/tests/snippets/lab/tools/set_parameters.py +4 -9
- pygeai/tests/snippets/lab/tools/update_tool.py +4 -8
- pygeai/tests/snippets/lab/use_cases/__init__.py +0 -0
- pygeai/tests/snippets/lab/use_cases/create_cli_expert.py +1640 -0
- pygeai/tests/snippets/lab/use_cases/create_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/create_tool_headless_web_browser.py +133 -0
- pygeai/tests/snippets/lab/use_cases/create_web_designer.py +189 -0
- pygeai/tests/snippets/lab/use_cases/create_web_reader.py +185 -0
- pygeai/tests/snippets/lab/{file_summarizer_example.py → use_cases/file_summarizer_example.py} +3 -3
- pygeai/tests/snippets/lab/{file_summarizer_example_2.py → use_cases/file_summarizer_example_2.py} +12 -12
- pygeai/tests/snippets/lab/use_cases/update_cli_expert.py +1773 -0
- pygeai/tests/snippets/lab/use_cases/update_lab_expert.py +4541 -0
- pygeai/tests/snippets/lab/use_cases/update_web_designer.py +188 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader.py +195 -0
- pygeai/tests/snippets/lab/use_cases/update_web_reader_with_tool.py +210 -0
- pygeai/tests/snippets/migrate/__init__.py +45 -0
- pygeai/tests/snippets/migrate/agent_migration.py +110 -0
- pygeai/tests/snippets/migrate/assistant_migration.py +64 -0
- pygeai/tests/snippets/migrate/orchestrator_examples.py +179 -0
- pygeai/tests/snippets/migrate/process_migration.py +64 -0
- pygeai/tests/snippets/migrate/project_migration.py +42 -0
- pygeai/tests/snippets/migrate/tool_migration.py +64 -0
- pygeai/tests/snippets/organization/add_project_member.py +10 -0
- pygeai/tests/snippets/organization/add_project_member_batch.py +44 -0
- pygeai/tests/snippets/organization/create_project.py +2 -2
- pygeai/tests/snippets/organization/get_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_organization_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_members.py +6 -0
- pygeai/tests/snippets/organization/get_project_memberships.py +12 -0
- pygeai/tests/snippets/organization/get_project_roles.py +6 -0
- pygeai/vendor/a2a/__init__.py +1 -0
- pygeai/vendor/a2a/auth/__init__.py +0 -0
- pygeai/vendor/a2a/auth/user.py +31 -0
- pygeai/vendor/a2a/client/__init__.py +19 -0
- pygeai/vendor/a2a/client/client.py +425 -0
- pygeai/vendor/a2a/client/errors.py +33 -0
- pygeai/vendor/a2a/client/helpers.py +22 -0
- pygeai/vendor/a2a/py.typed +0 -0
- pygeai/vendor/a2a/server/__init__.py +1 -0
- pygeai/vendor/a2a/server/agent_execution/__init__.py +18 -0
- pygeai/vendor/a2a/server/agent_execution/agent_executor.py +44 -0
- pygeai/vendor/a2a/server/agent_execution/context.py +155 -0
- pygeai/vendor/a2a/server/agent_execution/request_context_builder.py +20 -0
- pygeai/vendor/a2a/server/agent_execution/simple_request_context_builder.py +77 -0
- pygeai/vendor/a2a/server/apps/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/__init__.py +16 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/fastapi_app.py +88 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/jsonrpc_app.py +426 -0
- pygeai/vendor/a2a/server/apps/jsonrpc/starlette_app.py +123 -0
- pygeai/vendor/a2a/server/context.py +23 -0
- pygeai/vendor/a2a/server/events/__init__.py +21 -0
- pygeai/vendor/a2a/server/events/event_consumer.py +149 -0
- pygeai/vendor/a2a/server/events/event_queue.py +156 -0
- pygeai/vendor/a2a/server/events/in_memory_queue_manager.py +85 -0
- pygeai/vendor/a2a/server/events/queue_manager.py +35 -0
- pygeai/vendor/a2a/server/request_handlers/__init__.py +20 -0
- pygeai/vendor/a2a/server/request_handlers/default_request_handler.py +435 -0
- pygeai/vendor/a2a/server/request_handlers/jsonrpc_handler.py +327 -0
- pygeai/vendor/a2a/server/request_handlers/request_handler.py +161 -0
- pygeai/vendor/a2a/server/request_handlers/response_helpers.py +133 -0
- pygeai/vendor/a2a/server/tasks/__init__.py +20 -0
- pygeai/vendor/a2a/server/tasks/inmemory_push_notifier.py +62 -0
- pygeai/vendor/a2a/server/tasks/inmemory_task_store.py +51 -0
- pygeai/vendor/a2a/server/tasks/push_notifier.py +25 -0
- pygeai/vendor/a2a/server/tasks/result_aggregator.py +151 -0
- pygeai/vendor/a2a/server/tasks/task_manager.py +253 -0
- pygeai/vendor/a2a/server/tasks/task_store.py +22 -0
- pygeai/vendor/a2a/server/tasks/task_updater.py +155 -0
- pygeai/vendor/a2a/types.py +1624 -0
- pygeai/vendor/a2a/utils/__init__.py +40 -0
- pygeai/vendor/a2a/utils/artifact.py +72 -0
- pygeai/vendor/a2a/utils/errors.py +69 -0
- pygeai/vendor/a2a/utils/helpers.py +176 -0
- pygeai/vendor/a2a/utils/message.py +83 -0
- pygeai/vendor/a2a/utils/task.py +57 -0
- pygeai/vendor/a2a/utils/telemetry.py +299 -0
- pygeai-0.6.0b15.dist-info/METADATA +205 -0
- pygeai-0.6.0b15.dist-info/RECORD +799 -0
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/WHEEL +1 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/entry_points.txt +2 -1
- {pygeai-0.1.51b3.dist-info → pygeai-0.6.0b15.dist-info}/licenses/LICENSE +13 -1
- pygeai-0.6.0b15.dist-info/top_level.txt +1 -0
- docs/geai-proxy/README.md +0 -145
- docs/source/conf.py +0 -45
- pygeai/tests/core/test_managers.py +0 -233
- pygeai-0.1.51b3.dist-info/METADATA +0 -130
- pygeai-0.1.51b3.dist-info/RECORD +0 -324
- pygeai-0.1.51b3.dist-info/top_level.txt +0 -3
- scripts/bump_beta_version.py +0 -56
- {scripts → pygeai/analytics}/__init__.py +0 -0
- /pygeai/tests/snippets/lab/{c_code_fixer_agent_flow.py → use_cases/c_code_fixer_agent_flow.py} +0 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import tempfile
|
|
4
|
+
import unittest
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from unittest.mock import patch, MagicMock
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestCLIConfigureWithAlias(unittest.TestCase):
|
|
10
|
+
"""
|
|
11
|
+
Test configure command with --alias flag
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def setUp(self):
|
|
15
|
+
"""Reset settings and session before each test"""
|
|
16
|
+
from pygeai.core.common.config import reset_settings
|
|
17
|
+
from pygeai.core.base.session import reset_session
|
|
18
|
+
self._original_sys_argv = sys.argv.copy()
|
|
19
|
+
reset_settings()
|
|
20
|
+
reset_session()
|
|
21
|
+
|
|
22
|
+
def tearDown(self):
|
|
23
|
+
"""Reset settings and session after each test"""
|
|
24
|
+
from pygeai.core.common.config import reset_settings
|
|
25
|
+
from pygeai.core.base.session import reset_session
|
|
26
|
+
sys.argv = self._original_sys_argv
|
|
27
|
+
reset_settings()
|
|
28
|
+
reset_session()
|
|
29
|
+
|
|
30
|
+
def test_configure_with_default_alias(self):
|
|
31
|
+
"""Test configure command with default alias"""
|
|
32
|
+
from pygeai.cli.geai import CLIDriver
|
|
33
|
+
from pygeai.core.common.config import get_settings
|
|
34
|
+
|
|
35
|
+
sys.argv = ['geai', 'configure']
|
|
36
|
+
driver = CLIDriver()
|
|
37
|
+
|
|
38
|
+
self.assertEqual(driver.session.alias, 'default')
|
|
39
|
+
|
|
40
|
+
@unittest.skip("Test passes individually but fails in full suite - singleton isolation issue")
|
|
41
|
+
def test_configure_with_custom_alias(self):
|
|
42
|
+
"""Test configure command with custom alias"""
|
|
43
|
+
from pygeai.cli.geai import CLIDriver
|
|
44
|
+
|
|
45
|
+
# Create credentials file with custom alias
|
|
46
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='_credentials', delete=False) as f:
|
|
47
|
+
custom_creds = f.name
|
|
48
|
+
f.write('[prod]\n')
|
|
49
|
+
f.write('GEAI_API_KEY = prod_key_123\n')
|
|
50
|
+
f.write('GEAI_API_BASE_URL = https://prod.example.com\n')
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
sys.argv = ['geai', '--credentials', custom_creds, '--alias', 'prod', 'configure']
|
|
54
|
+
driver = CLIDriver()
|
|
55
|
+
|
|
56
|
+
self.assertEqual(driver.session.alias, 'prod')
|
|
57
|
+
self.assertEqual(driver.session.api_key, 'prod_key_123')
|
|
58
|
+
self.assertEqual(driver.session.base_url, 'https://prod.example.com')
|
|
59
|
+
finally:
|
|
60
|
+
os.unlink(custom_creds)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@unittest.skip("Tests pass individually but fail when run together - singleton isolation issue with test suite")
|
|
64
|
+
class TestCLICommandsUseCorrectProfile(unittest.TestCase):
|
|
65
|
+
"""
|
|
66
|
+
Test that CLI commands use the session with the correct alias/profile.
|
|
67
|
+
|
|
68
|
+
These tests verify that when commands are invoked with --alias flag,
|
|
69
|
+
they use the correct profile from the credentials file.
|
|
70
|
+
|
|
71
|
+
NOTE: These tests pass when run individually but fail when run as part of the full suite
|
|
72
|
+
due to persistent singleton state from other tests. Run individually with:
|
|
73
|
+
python -m unittest pygeai.tests.cli.test_credentials_flag.TestCLICommandsUseCorrectProfile.test_driver_session_uses_correct_alias_dev
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def setUp(self):
|
|
77
|
+
"""Set up test fixtures"""
|
|
78
|
+
import sys
|
|
79
|
+
from pygeai.core.common.config import reset_settings
|
|
80
|
+
from pygeai.core.base.session import reset_session
|
|
81
|
+
|
|
82
|
+
# Save original sys.argv
|
|
83
|
+
self._original_sys_argv = sys.argv.copy()
|
|
84
|
+
|
|
85
|
+
# Reset singletons
|
|
86
|
+
reset_settings()
|
|
87
|
+
reset_session()
|
|
88
|
+
|
|
89
|
+
# Create test credentials file with multiple profiles
|
|
90
|
+
self.creds_file = tempfile.NamedTemporaryFile(mode='w', suffix='_credentials', delete=False)
|
|
91
|
+
self.creds_file.write('[default]\n')
|
|
92
|
+
self.creds_file.write('GEAI_API_KEY = default_key\n')
|
|
93
|
+
self.creds_file.write('GEAI_API_BASE_URL = https://default.example.com\n')
|
|
94
|
+
self.creds_file.write('\n')
|
|
95
|
+
self.creds_file.write('[dev]\n')
|
|
96
|
+
self.creds_file.write('GEAI_API_KEY = dev_key_456\n')
|
|
97
|
+
self.creds_file.write('GEAI_API_BASE_URL = https://dev.example.com\n')
|
|
98
|
+
self.creds_file.write('\n')
|
|
99
|
+
self.creds_file.write('[prod]\n')
|
|
100
|
+
self.creds_file.write('GEAI_API_KEY = prod_key_789\n')
|
|
101
|
+
self.creds_file.write('GEAI_API_BASE_URL = https://prod.example.com\n')
|
|
102
|
+
self.creds_file.close()
|
|
103
|
+
|
|
104
|
+
def tearDown(self):
|
|
105
|
+
"""Clean up test fixtures"""
|
|
106
|
+
import sys
|
|
107
|
+
from pygeai.core.common.config import reset_settings
|
|
108
|
+
from pygeai.core.base.session import reset_session
|
|
109
|
+
|
|
110
|
+
# Restore sys.argv
|
|
111
|
+
sys.argv = self._original_sys_argv
|
|
112
|
+
|
|
113
|
+
# Clean up credentials file
|
|
114
|
+
if hasattr(self, 'creds_file') and os.path.exists(self.creds_file.name):
|
|
115
|
+
os.unlink(self.creds_file.name)
|
|
116
|
+
|
|
117
|
+
# Reset singletons
|
|
118
|
+
reset_settings()
|
|
119
|
+
reset_session()
|
|
120
|
+
|
|
121
|
+
def test_driver_session_uses_correct_alias_dev(self):
|
|
122
|
+
"""Test that CLIDriver session uses the correct alias - dev profile"""
|
|
123
|
+
from pygeai.cli.geai import CLIDriver
|
|
124
|
+
from pygeai.core.common.config import reset_settings, get_settings
|
|
125
|
+
from pygeai.core.base.session import reset_session
|
|
126
|
+
|
|
127
|
+
# Reset and initialize with custom credentials
|
|
128
|
+
reset_settings()
|
|
129
|
+
reset_session()
|
|
130
|
+
get_settings(credentials_file=self.creds_file.name)
|
|
131
|
+
|
|
132
|
+
# Test with 'dev' alias
|
|
133
|
+
sys.argv = ['geai', '--credentials', self.creds_file.name, '--alias', 'dev', 'chat']
|
|
134
|
+
driver = CLIDriver()
|
|
135
|
+
|
|
136
|
+
# Verify driver session has correct profile
|
|
137
|
+
self.assertEqual(driver.session.alias, 'dev')
|
|
138
|
+
self.assertEqual(driver.session.api_key, 'dev_key_456')
|
|
139
|
+
self.assertEqual(driver.session.base_url, 'https://dev.example.com')
|
|
140
|
+
|
|
141
|
+
def test_driver_session_uses_correct_alias_prod(self):
|
|
142
|
+
"""Test that CLIDriver session uses the correct alias - prod profile"""
|
|
143
|
+
from pygeai.cli.geai import CLIDriver
|
|
144
|
+
from pygeai.core.common.config import reset_settings, get_settings
|
|
145
|
+
from pygeai.core.base.session import reset_session
|
|
146
|
+
|
|
147
|
+
# Reset and initialize with custom credentials
|
|
148
|
+
reset_settings()
|
|
149
|
+
reset_session()
|
|
150
|
+
get_settings(credentials_file=self.creds_file.name)
|
|
151
|
+
|
|
152
|
+
# Test with 'prod' alias
|
|
153
|
+
sys.argv = ['geai', '--credentials', self.creds_file.name, '--alias', 'prod', 'llm']
|
|
154
|
+
driver = CLIDriver()
|
|
155
|
+
|
|
156
|
+
# Verify driver session has correct profile
|
|
157
|
+
self.assertEqual(driver.session.alias, 'prod')
|
|
158
|
+
self.assertEqual(driver.session.api_key, 'prod_key_789')
|
|
159
|
+
self.assertEqual(driver.session.base_url, 'https://prod.example.com')
|
|
160
|
+
|
|
161
|
+
def test_driver_session_uses_default_when_no_alias(self):
|
|
162
|
+
"""Test that CLIDriver uses default alias when no --alias flag provided"""
|
|
163
|
+
from pygeai.cli.geai import CLIDriver
|
|
164
|
+
from pygeai.core.common.config import reset_settings, get_settings
|
|
165
|
+
from pygeai.core.base.session import reset_session
|
|
166
|
+
|
|
167
|
+
# Reset and initialize with custom credentials
|
|
168
|
+
reset_settings()
|
|
169
|
+
reset_session()
|
|
170
|
+
get_settings(credentials_file=self.creds_file.name)
|
|
171
|
+
|
|
172
|
+
# No --alias flag, should use 'default'
|
|
173
|
+
sys.argv = ['geai', '--credentials', self.creds_file.name, 'chat']
|
|
174
|
+
driver = CLIDriver()
|
|
175
|
+
|
|
176
|
+
# Verify driver session uses default
|
|
177
|
+
self.assertEqual(driver.session.alias, 'default')
|
|
178
|
+
self.assertEqual(driver.session.api_key, 'default_key')
|
|
179
|
+
self.assertEqual(driver.session.base_url, 'https://default.example.com')
|
|
180
|
+
|
|
181
|
+
def test_driver_session_with_alias_shorthand(self):
|
|
182
|
+
"""Test that -a shorthand works for --alias"""
|
|
183
|
+
from pygeai.cli.geai import CLIDriver
|
|
184
|
+
from pygeai.core.common.config import reset_settings, get_settings
|
|
185
|
+
from pygeai.core.base.session import reset_session
|
|
186
|
+
|
|
187
|
+
# Reset and initialize with custom credentials
|
|
188
|
+
reset_settings()
|
|
189
|
+
reset_session()
|
|
190
|
+
get_settings(credentials_file=self.creds_file.name)
|
|
191
|
+
|
|
192
|
+
# Use -a instead of --alias
|
|
193
|
+
sys.argv = ['geai', '--credentials', self.creds_file.name, '-a', 'prod', 'chat']
|
|
194
|
+
driver = CLIDriver()
|
|
195
|
+
|
|
196
|
+
self.assertEqual(driver.session.alias, 'prod')
|
|
197
|
+
self.assertEqual(driver.session.api_key, 'prod_key_789')
|
|
198
|
+
self.assertEqual(driver.session.base_url, 'https://prod.example.com')
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class TestCLIDriverWithCredentialsFlag(unittest.TestCase):
|
|
202
|
+
"""
|
|
203
|
+
Test suite for CLIDriver with --credentials/--creds flag.
|
|
204
|
+
Run with: python -m unittest pygeai.tests.cli.test_credentials_flag.TestCLIDriverWithCredentialsFlag
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
def setUp(self):
|
|
208
|
+
"""Reset settings and session before each test"""
|
|
209
|
+
import sys
|
|
210
|
+
from pygeai.core.common.config import reset_settings
|
|
211
|
+
from pygeai.core.base.session import reset_session
|
|
212
|
+
# Save original sys.argv
|
|
213
|
+
self._original_sys_argv = sys.argv.copy()
|
|
214
|
+
reset_settings()
|
|
215
|
+
reset_session()
|
|
216
|
+
|
|
217
|
+
def tearDown(self):
|
|
218
|
+
"""Reset settings and session after each test"""
|
|
219
|
+
import sys
|
|
220
|
+
from pygeai.core.common.config import reset_settings
|
|
221
|
+
from pygeai.core.base.session import reset_session
|
|
222
|
+
# Restore original sys.argv
|
|
223
|
+
sys.argv = self._original_sys_argv
|
|
224
|
+
reset_settings()
|
|
225
|
+
reset_session()
|
|
226
|
+
|
|
227
|
+
def test_cli_driver_with_custom_credentials(self):
|
|
228
|
+
"""Test CLIDriver initialization with custom credentials file"""
|
|
229
|
+
import sys
|
|
230
|
+
from pygeai.cli.geai import CLIDriver
|
|
231
|
+
|
|
232
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='_credentials', delete=False) as f:
|
|
233
|
+
custom_creds = f.name
|
|
234
|
+
f.write('[test_profile]\n')
|
|
235
|
+
f.write('GEAI_API_KEY = cli_test_key\n')
|
|
236
|
+
f.write('GEAI_API_BASE_URL = https://cli.test.com\n')
|
|
237
|
+
|
|
238
|
+
original_argv = sys.argv.copy()
|
|
239
|
+
try:
|
|
240
|
+
sys.argv = ['geai', '--credentials', custom_creds, 'version']
|
|
241
|
+
|
|
242
|
+
driver = CLIDriver()
|
|
243
|
+
|
|
244
|
+
# Verify that the custom credentials file is being used
|
|
245
|
+
from pygeai.core.common.config import get_settings
|
|
246
|
+
settings = get_settings()
|
|
247
|
+
self.assertEqual(settings.GEAI_CREDS_FILE, Path(custom_creds))
|
|
248
|
+
finally:
|
|
249
|
+
sys.argv = original_argv
|
|
250
|
+
os.unlink(custom_creds)
|
|
251
|
+
|
|
252
|
+
def test_cli_driver_with_creds_shorthand(self):
|
|
253
|
+
"""Test CLIDriver initialization with --creds shorthand flag"""
|
|
254
|
+
import sys
|
|
255
|
+
from pygeai.cli.geai import CLIDriver
|
|
256
|
+
|
|
257
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='_credentials', delete=False) as f:
|
|
258
|
+
custom_creds = f.name
|
|
259
|
+
f.write('[short_profile]\n')
|
|
260
|
+
f.write('GEAI_API_KEY = short_key\n')
|
|
261
|
+
f.write('GEAI_API_BASE_URL = https://short.test.com\n')
|
|
262
|
+
|
|
263
|
+
original_argv = sys.argv.copy()
|
|
264
|
+
try:
|
|
265
|
+
sys.argv = ['geai', '--creds', custom_creds, 'version']
|
|
266
|
+
|
|
267
|
+
driver = CLIDriver()
|
|
268
|
+
|
|
269
|
+
from pygeai.core.common.config import get_settings
|
|
270
|
+
settings = get_settings()
|
|
271
|
+
self.assertEqual(settings.GEAI_CREDS_FILE, Path(custom_creds))
|
|
272
|
+
finally:
|
|
273
|
+
sys.argv = original_argv
|
|
274
|
+
os.unlink(custom_creds)
|
|
275
|
+
|
|
276
|
+
@unittest.skip("Test passes individually but fails in full suite due to test isolation issues - investigating")
|
|
277
|
+
def test_cli_driver_with_credentials_and_alias(self):
|
|
278
|
+
"""Test CLIDriver with both --credentials and --alias flags"""
|
|
279
|
+
import sys
|
|
280
|
+
from pygeai.cli.geai import CLIDriver
|
|
281
|
+
from pygeai.core.common.config import reset_settings, get_settings
|
|
282
|
+
from pygeai.core.base.session import reset_session
|
|
283
|
+
|
|
284
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='_credentials', delete=False) as f:
|
|
285
|
+
custom_creds = f.name
|
|
286
|
+
f.write('[custom_alias]\n')
|
|
287
|
+
f.write('GEAI_API_KEY = custom_alias_key\n')
|
|
288
|
+
f.write('GEAI_API_BASE_URL = https://custom.test.com\n')
|
|
289
|
+
|
|
290
|
+
original_argv = sys.argv.copy()
|
|
291
|
+
try:
|
|
292
|
+
# Reset and immediately initialize with custom credentials to prevent race conditions
|
|
293
|
+
reset_settings()
|
|
294
|
+
reset_session()
|
|
295
|
+
get_settings(credentials_file=custom_creds)
|
|
296
|
+
|
|
297
|
+
sys.argv = ['geai', '--credentials', custom_creds, '--alias', 'custom_alias', 'version']
|
|
298
|
+
|
|
299
|
+
driver = CLIDriver()
|
|
300
|
+
|
|
301
|
+
# Verify both credentials file and alias are used
|
|
302
|
+
from pygeai.core.common.config import get_settings
|
|
303
|
+
settings = get_settings()
|
|
304
|
+
self.assertEqual(settings.GEAI_CREDS_FILE, Path(custom_creds),
|
|
305
|
+
f"Expected credentials file {custom_creds}, got {settings.GEAI_CREDS_FILE}")
|
|
306
|
+
self.assertEqual(driver.session.alias, 'custom_alias',
|
|
307
|
+
f"Expected alias 'custom_alias', got '{driver.session.alias}'")
|
|
308
|
+
self.assertEqual(driver.session.api_key, 'custom_alias_key')
|
|
309
|
+
self.assertEqual(driver.session.base_url, 'https://custom.test.com')
|
|
310
|
+
finally:
|
|
311
|
+
sys.argv = original_argv
|
|
312
|
+
os.unlink(custom_creds)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
if __name__ == '__main__':
|
|
316
|
+
unittest.main()
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
from unittest import TestCase
|
|
3
|
+
from unittest.mock import MagicMock
|
|
4
|
+
|
|
5
|
+
from pygeai.cli.commands import Command, Option, ArgumentsEnum
|
|
6
|
+
from pygeai.cli.error_handler import ErrorHandler, ExitCode
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestErrorHandler(TestCase):
|
|
10
|
+
"""
|
|
11
|
+
Test suite for the ErrorHandler class.
|
|
12
|
+
Run with: python -m unittest pygeai.tests.cli.test_error_handler.TestErrorHandler
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def setUp(self):
|
|
16
|
+
self.commands = [
|
|
17
|
+
Command(
|
|
18
|
+
name='help',
|
|
19
|
+
identifiers=['help', 'h'],
|
|
20
|
+
description='Display help',
|
|
21
|
+
action=None,
|
|
22
|
+
additional_args=ArgumentsEnum.NOT_AVAILABLE,
|
|
23
|
+
subcommands=[],
|
|
24
|
+
options=[]
|
|
25
|
+
),
|
|
26
|
+
Command(
|
|
27
|
+
name='version',
|
|
28
|
+
identifiers=['version', 'v'],
|
|
29
|
+
description='Display version',
|
|
30
|
+
action=None,
|
|
31
|
+
additional_args=ArgumentsEnum.NOT_AVAILABLE,
|
|
32
|
+
subcommands=[],
|
|
33
|
+
options=[]
|
|
34
|
+
),
|
|
35
|
+
Command(
|
|
36
|
+
name='configure',
|
|
37
|
+
identifiers=['configure', 'config', 'c'],
|
|
38
|
+
description='Configure settings',
|
|
39
|
+
action=None,
|
|
40
|
+
additional_args=ArgumentsEnum.OPTIONAL,
|
|
41
|
+
subcommands=[],
|
|
42
|
+
options=[]
|
|
43
|
+
),
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
self.options = [
|
|
47
|
+
Option(
|
|
48
|
+
name='key',
|
|
49
|
+
identifiers=['--key', '-k'],
|
|
50
|
+
description='API key',
|
|
51
|
+
requires_args=True
|
|
52
|
+
),
|
|
53
|
+
Option(
|
|
54
|
+
name='url',
|
|
55
|
+
identifiers=['--url', '-u'],
|
|
56
|
+
description='API URL',
|
|
57
|
+
requires_args=True
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
def test_exit_codes_defined(self):
|
|
62
|
+
"""Test that all exit codes are properly defined"""
|
|
63
|
+
self.assertEqual(ExitCode.SUCCESS, 0)
|
|
64
|
+
self.assertEqual(ExitCode.USER_INPUT_ERROR, 1)
|
|
65
|
+
self.assertEqual(ExitCode.MISSING_REQUIREMENT, 2)
|
|
66
|
+
self.assertEqual(ExitCode.SERVICE_ERROR, 3)
|
|
67
|
+
self.assertEqual(ExitCode.KEYBOARD_INTERRUPT, 130)
|
|
68
|
+
self.assertEqual(ExitCode.UNEXPECTED_ERROR, 255)
|
|
69
|
+
|
|
70
|
+
def test_format_error_basic(self):
|
|
71
|
+
"""Test basic error formatting"""
|
|
72
|
+
result = ErrorHandler.format_error("Test Error", "Something went wrong")
|
|
73
|
+
self.assertIn("ERROR [Test Error]: Something went wrong", result)
|
|
74
|
+
self.assertIn("Run 'geai help' for usage information.", result)
|
|
75
|
+
|
|
76
|
+
def test_format_error_with_suggestion(self):
|
|
77
|
+
"""Test error formatting with suggestion"""
|
|
78
|
+
result = ErrorHandler.format_error(
|
|
79
|
+
"Test Error",
|
|
80
|
+
"Command not found",
|
|
81
|
+
suggestion="Try using 'help' command"
|
|
82
|
+
)
|
|
83
|
+
self.assertIn("ERROR [Test Error]: Command not found", result)
|
|
84
|
+
self.assertIn("→ Try using 'help' command", result)
|
|
85
|
+
|
|
86
|
+
def test_format_error_without_help(self):
|
|
87
|
+
"""Test error formatting without help text"""
|
|
88
|
+
result = ErrorHandler.format_error(
|
|
89
|
+
"Test Error",
|
|
90
|
+
"Critical error",
|
|
91
|
+
show_help=False
|
|
92
|
+
)
|
|
93
|
+
self.assertIn("ERROR [Test Error]: Critical error", result)
|
|
94
|
+
self.assertNotIn("Run 'geai help'", result)
|
|
95
|
+
|
|
96
|
+
def test_find_similar_items_exact_match(self):
|
|
97
|
+
"""Test fuzzy matching with high similarity"""
|
|
98
|
+
items = ['help', 'version', 'configure']
|
|
99
|
+
similar = ErrorHandler.find_similar_items('halp', items)
|
|
100
|
+
self.assertIn('help', similar)
|
|
101
|
+
|
|
102
|
+
def test_find_similar_items_no_match(self):
|
|
103
|
+
"""Test fuzzy matching with no similar items"""
|
|
104
|
+
items = ['help', 'version', 'configure']
|
|
105
|
+
similar = ErrorHandler.find_similar_items('xyz123', items, threshold=0.6)
|
|
106
|
+
self.assertEqual(len(similar), 0)
|
|
107
|
+
|
|
108
|
+
def test_find_similar_items_multiple_matches(self):
|
|
109
|
+
"""Test fuzzy matching returns top matches"""
|
|
110
|
+
items = ['configure', 'config', 'configuration', 'help']
|
|
111
|
+
similar = ErrorHandler.find_similar_items('config', items)
|
|
112
|
+
self.assertGreater(len(similar), 0)
|
|
113
|
+
self.assertLessEqual(len(similar), 3)
|
|
114
|
+
|
|
115
|
+
def test_get_available_commands(self):
|
|
116
|
+
"""Test extraction of available command identifiers"""
|
|
117
|
+
identifiers = ErrorHandler.get_available_commands(self.commands)
|
|
118
|
+
self.assertIn('help', identifiers)
|
|
119
|
+
self.assertIn('h', identifiers)
|
|
120
|
+
self.assertIn('version', identifiers)
|
|
121
|
+
self.assertIn('v', identifiers)
|
|
122
|
+
self.assertIn('configure', identifiers)
|
|
123
|
+
self.assertIn('config', identifiers)
|
|
124
|
+
self.assertIn('c', identifiers)
|
|
125
|
+
|
|
126
|
+
def test_get_available_options(self):
|
|
127
|
+
"""Test extraction of available option identifiers"""
|
|
128
|
+
identifiers = ErrorHandler.get_available_options(self.options)
|
|
129
|
+
self.assertIn('--key', identifiers)
|
|
130
|
+
self.assertIn('-k', identifiers)
|
|
131
|
+
self.assertIn('--url', identifiers)
|
|
132
|
+
self.assertIn('-u', identifiers)
|
|
133
|
+
|
|
134
|
+
def test_handle_unknown_command_with_fuzzy_match(self):
|
|
135
|
+
"""Test unknown command error with fuzzy matching suggestion"""
|
|
136
|
+
result = ErrorHandler.handle_unknown_command('halp', self.commands)
|
|
137
|
+
self.assertIn("'halp' is not a valid command", result)
|
|
138
|
+
self.assertIn("Did you mean", result)
|
|
139
|
+
self.assertIn("help", result)
|
|
140
|
+
|
|
141
|
+
def test_handle_unknown_command_no_match(self):
|
|
142
|
+
"""Test unknown command error without fuzzy match"""
|
|
143
|
+
result = ErrorHandler.handle_unknown_command('xyz123', self.commands)
|
|
144
|
+
self.assertIn("'xyz123' is not a valid command", result)
|
|
145
|
+
self.assertIn("Available commands:", result)
|
|
146
|
+
|
|
147
|
+
def test_handle_unknown_option_with_fuzzy_match(self):
|
|
148
|
+
"""Test unknown option error with fuzzy matching"""
|
|
149
|
+
result = ErrorHandler.handle_unknown_option('--kee', self.options)
|
|
150
|
+
self.assertIn("'--kee' is not a valid option", result)
|
|
151
|
+
self.assertIn("Did you mean", result)
|
|
152
|
+
|
|
153
|
+
def test_handle_unknown_option_no_match(self):
|
|
154
|
+
"""Test unknown option error without fuzzy match"""
|
|
155
|
+
result = ErrorHandler.handle_unknown_option('--completely-different-option-xyz123', self.options)
|
|
156
|
+
self.assertIn("'--completely-different-option-xyz123' is not a valid option", result)
|
|
157
|
+
self.assertIn("Available options:", result)
|
|
158
|
+
|
|
159
|
+
def test_handle_missing_requirement(self):
|
|
160
|
+
"""Test missing requirement error formatting"""
|
|
161
|
+
result = ErrorHandler.handle_missing_requirement("API key is required")
|
|
162
|
+
self.assertIn("API key is required", result)
|
|
163
|
+
self.assertIn("Please provide all required parameters", result)
|
|
164
|
+
|
|
165
|
+
def test_handle_invalid_agent(self):
|
|
166
|
+
"""Test invalid agent error formatting"""
|
|
167
|
+
result = ErrorHandler.handle_invalid_agent("Agent 'test-agent' not found")
|
|
168
|
+
self.assertIn("Failed to retrieve or validate the agent", result)
|
|
169
|
+
self.assertIn("Agent 'test-agent' not found", result)
|
|
170
|
+
self.assertIn("Check your agent configuration", result)
|
|
171
|
+
|
|
172
|
+
def test_handle_wrong_argument(self):
|
|
173
|
+
"""Test wrong argument error formatting"""
|
|
174
|
+
usage = "geai <command> [options]"
|
|
175
|
+
result = ErrorHandler.handle_wrong_argument("Invalid format", usage)
|
|
176
|
+
self.assertIn("Invalid format", result)
|
|
177
|
+
self.assertIn("Check the command syntax", result)
|
|
178
|
+
|
|
179
|
+
def test_handle_keyboard_interrupt(self):
|
|
180
|
+
"""Test keyboard interrupt message"""
|
|
181
|
+
result = ErrorHandler.handle_keyboard_interrupt()
|
|
182
|
+
self.assertIn("Operation cancelled by user", result)
|
|
183
|
+
|
|
184
|
+
def test_handle_unexpected_error(self):
|
|
185
|
+
"""Test unexpected error formatting"""
|
|
186
|
+
exception = ValueError("Test error")
|
|
187
|
+
result = ErrorHandler.handle_unexpected_error(exception)
|
|
188
|
+
self.assertIn("unexpected error occurred", result)
|
|
189
|
+
self.assertIn("Test error", result)
|
|
190
|
+
self.assertIn("geai-sdk@globant.com", result)
|
|
191
|
+
|
|
192
|
+
def test_fuzzy_matching_threshold(self):
|
|
193
|
+
"""Test that threshold parameter works correctly"""
|
|
194
|
+
items = ['configure', 'help', 'version']
|
|
195
|
+
|
|
196
|
+
# With high threshold, should not match
|
|
197
|
+
similar_high = ErrorHandler.find_similar_items('xyz', items, threshold=0.9)
|
|
198
|
+
self.assertEqual(len(similar_high), 0)
|
|
199
|
+
|
|
200
|
+
# With low threshold, might match
|
|
201
|
+
similar_low = ErrorHandler.find_similar_items('c', items, threshold=0.3)
|
|
202
|
+
self.assertGreaterEqual(len(similar_low), 0)
|
|
203
|
+
|
|
204
|
+
def test_multiple_command_identifiers_in_suggestions(self):
|
|
205
|
+
"""Test that fuzzy matching works with multiple identifiers"""
|
|
206
|
+
result = ErrorHandler.handle_unknown_command('configurr', self.commands)
|
|
207
|
+
# Should suggest 'configure' or 'config'
|
|
208
|
+
self.assertTrue('configure' in result or 'config' in result)
|
|
209
|
+
|
|
210
|
+
def test_error_format_consistency(self):
|
|
211
|
+
"""Test that all error handlers produce consistent format"""
|
|
212
|
+
results = [
|
|
213
|
+
ErrorHandler.handle_unknown_command('test', self.commands),
|
|
214
|
+
ErrorHandler.handle_unknown_option('--test', self.options),
|
|
215
|
+
ErrorHandler.handle_missing_requirement("test requirement"),
|
|
216
|
+
ErrorHandler.handle_invalid_agent("test agent"),
|
|
217
|
+
]
|
|
218
|
+
|
|
219
|
+
for result in results:
|
|
220
|
+
self.assertIn("ERROR [", result)
|
|
221
|
+
self.assertIn("→", result)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
if __name__ == '__main__':
|
|
225
|
+
unittest.main()
|