tinybird 0.0.1.dev273__tar.gz → 0.0.1.dev274__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.
Potentially problematic release.
This version of tinybird might be problematic. Click here for more details.
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/PKG-INFO +1 -1
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/__cli__.py +2 -2
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/agent.py +2 -2
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/prompts.py +1 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/testing_agent.py +7 -4
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/test.py +109 -1
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/test_common.py +47 -14
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird.egg-info/PKG-INFO +1 -1
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/setup.cfg +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/__cli__.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/ch_utils/constants.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/ch_utils/engine.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/check_pypi.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/client.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/config.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/connectors.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/context.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/datafile/common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/datafile/exceptions.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/datafile/parse_connection.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/datafile/parse_datasource.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/datafile/parse_pipe.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/datatypes.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/feedback_manager.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/git_settings.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/prompts.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/sql.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/sql_template.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/sql_template_fmt.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/sql_toolset.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/syncasync.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/check_pypi.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/cli.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/client.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/config.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/__init__.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/animations.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/banner.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/command_agent.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/compactor.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/explore_agent.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/memory.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/models.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/__init__.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/analyze.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/append.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/build.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/datafile.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/deploy.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/deploy_check.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/diff_resource.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/execute_query.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/get_endpoint_stats.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/get_openapi_definition.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/mock.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/plan.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/request_endpoint.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/run_command.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/secret.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/utils.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/build.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/build_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/cicd.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/cli.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/config.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/connection.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/copy.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/create.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/build.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/build_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/build_datasource.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/build_pipe.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/diff.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/fixture.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/format_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/format_datasource.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/format_pipe.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/pipe_checker.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/playground.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/pull.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datasource.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/deployment.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/deployment_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/deprecations.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/dev_server.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/endpoint.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/exceptions.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/feedback_manager.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/info.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/infra.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/job.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/llm.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/llm_utils.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/local.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/local_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/login.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/login_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/logout.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/materialization.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/mock.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/mock_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/open.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/pipe.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/project.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/regions.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/secret.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/secret_common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/shell.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/sink.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/table.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/telemetry.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/test.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/tinyunit/tinyunit.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/tinyunit/tinyunit_lib.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/token.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/watch.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/workspace.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/workspace_members.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/auth.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/branch.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/cicd.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/cli.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/common.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/config.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/connection.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/datasource.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/exceptions.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/fmt.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/job.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/pipe.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/regions.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/tag.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/telemetry.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/test.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/tinyunit/tinyunit.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/workspace.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/workspace_members.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tornado_template.py +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird.egg-info/SOURCES.txt +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird.egg-info/dependency_links.txt +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird.egg-info/entry_points.txt +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird.egg-info/requires.txt +0 -0
- {tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird.egg-info/top_level.txt +0 -0
|
@@ -4,5 +4,5 @@ __description__ = 'Tinybird Command Line Tool'
|
|
|
4
4
|
__url__ = 'https://www.tinybird.co/docs/forward/commands'
|
|
5
5
|
__author__ = 'Tinybird'
|
|
6
6
|
__author_email__ = 'support@tinybird.co'
|
|
7
|
-
__version__ = '0.0.1.
|
|
8
|
-
__revision__ = '
|
|
7
|
+
__version__ = '0.0.1.dev274'
|
|
8
|
+
__revision__ = 'c3d62b9'
|
|
@@ -704,9 +704,9 @@ def get_connection_datafile_local(config: dict[str, Any], connection_name: str)
|
|
|
704
704
|
return "Connection not found"
|
|
705
705
|
|
|
706
706
|
|
|
707
|
-
def run_tests(client: TinyB, project: Project, pipe_name: Optional[str] = None) ->
|
|
707
|
+
def run_tests(client: TinyB, project: Project, pipe_name: Optional[str] = None) -> Optional[str]:
|
|
708
708
|
try:
|
|
709
|
-
run_tests_common(name=(pipe_name,) if pipe_name else (), project=project, client=client)
|
|
709
|
+
return run_tests_common(name=(pipe_name,) if pipe_name else (), project=project, client=client)
|
|
710
710
|
except SystemExit as e:
|
|
711
711
|
raise Exception(e.args[0])
|
|
712
712
|
|
|
@@ -612,6 +612,7 @@ test_instructions = """
|
|
|
612
612
|
- MANDATORY: Before creating the test, analyze the fixture files that the tables of the endpoint are using so you can create relevant tests.
|
|
613
613
|
- IMPORTANT: expected_result field should always be an empty string, because it will be filled by the `create_test` tool.
|
|
614
614
|
- If the endpoint does not have parameters, you can omit parameters and generate a single test.
|
|
615
|
+
- If some tests are skipped, it is because some test names do not match any pipe name. Rename the test file to match the pipe name.
|
|
615
616
|
- The format of the test file is the following:
|
|
616
617
|
<test_file_format>
|
|
617
618
|
- name: kpis_single_day
|
|
@@ -5,8 +5,7 @@ from pydantic_ai.usage import Usage
|
|
|
5
5
|
from tinybird.tb.modules.agent.animations import ThinkingAnimation
|
|
6
6
|
from tinybird.tb.modules.agent.models import create_model
|
|
7
7
|
from tinybird.tb.modules.agent.prompts import test_instructions, tests_files_prompt, tone_and_style_instructions
|
|
8
|
-
from tinybird.tb.modules.agent.tools.test import create_tests
|
|
9
|
-
from tinybird.tb.modules.agent.tools.test import run_tests as run_tests_tool
|
|
8
|
+
from tinybird.tb.modules.agent.tools.test import create_tests, remove_test, rename_test, run_tests
|
|
10
9
|
from tinybird.tb.modules.agent.utils import TinybirdAgentContext
|
|
11
10
|
from tinybird.tb.modules.project import Project
|
|
12
11
|
|
|
@@ -42,13 +41,17 @@ You can do the following:
|
|
|
42
41
|
- Create new test files.
|
|
43
42
|
- Update existing test files.
|
|
44
43
|
- Run tests.
|
|
44
|
+
- Rename test files.
|
|
45
|
+
- Remove test files.
|
|
45
46
|
""",
|
|
46
47
|
tone_and_style_instructions,
|
|
47
48
|
test_instructions,
|
|
48
49
|
],
|
|
49
50
|
tools=[
|
|
50
|
-
Tool(
|
|
51
|
-
Tool(
|
|
51
|
+
Tool(create_tests, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
|
|
52
|
+
Tool(run_tests, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
|
|
53
|
+
Tool(rename_test, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
|
|
54
|
+
Tool(remove_test, docstring_format="google", require_parameter_descriptions=True, takes_ctx=True),
|
|
52
55
|
],
|
|
53
56
|
)
|
|
54
57
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
from pathlib import Path
|
|
2
3
|
from typing import Optional
|
|
3
4
|
|
|
@@ -122,7 +123,6 @@ def run_tests(ctx: RunContext[TinybirdAgentContext], pipe_name: Optional[str] =
|
|
|
122
123
|
return f"User did not confirm the proposed changes and gave the following feedback: {feedback}"
|
|
123
124
|
|
|
124
125
|
test_output = ctx.deps.run_tests(pipe_name=pipe_name)
|
|
125
|
-
click.echo(test_output)
|
|
126
126
|
ctx.deps.thinking_animation.start()
|
|
127
127
|
if pipe_name:
|
|
128
128
|
return f"Tests for '{pipe_name}' endpoint in {path} and ran successfully\n{test_output}"
|
|
@@ -146,3 +146,111 @@ def run_tests(ctx: RunContext[TinybirdAgentContext], pipe_name: Optional[str] =
|
|
|
146
146
|
error_message = error_message.replace(test_exit_code, "")
|
|
147
147
|
ctx.deps.thinking_animation.start()
|
|
148
148
|
return f"Error running tests: {error_message}"
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def rename_test(ctx: RunContext[TinybirdAgentContext], path: str, new_path: str) -> str:
|
|
152
|
+
"""Renames a test file.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
path (str): The path to the test file to rename. Required.
|
|
156
|
+
new_path (str): The new path to the test file. Required.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
str: Result of the rename operation.
|
|
160
|
+
"""
|
|
161
|
+
try:
|
|
162
|
+
ctx.deps.thinking_animation.stop()
|
|
163
|
+
confirmation = show_confirmation(
|
|
164
|
+
title=f"Rename '{path}' to '{new_path}'?",
|
|
165
|
+
skip_confirmation=ctx.deps.dangerously_skip_permissions,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
if confirmation == "review":
|
|
169
|
+
feedback = show_input(ctx.deps.workspace_name)
|
|
170
|
+
ctx.deps.thinking_animation.start()
|
|
171
|
+
return f"User did not confirm the proposed changes and gave the following feedback: {feedback}"
|
|
172
|
+
|
|
173
|
+
click.echo(FeedbackManager.highlight(message=f"» Renaming test file {path} to {new_path}..."))
|
|
174
|
+
old_path_full = Path(ctx.deps.folder) / path.removeprefix("/")
|
|
175
|
+
new_path_full = Path(ctx.deps.folder) / new_path.removeprefix("/")
|
|
176
|
+
|
|
177
|
+
if not old_path_full.exists():
|
|
178
|
+
click.echo(FeedbackManager.error(message=f"Error: Test file {path} not found"))
|
|
179
|
+
ctx.deps.thinking_animation.start()
|
|
180
|
+
return f"Error: Test file {path} not found (double check the file path)"
|
|
181
|
+
|
|
182
|
+
if new_path_full.exists():
|
|
183
|
+
click.echo(FeedbackManager.error(message=f"Error: Test file {new_path} already exists"))
|
|
184
|
+
ctx.deps.thinking_animation.start()
|
|
185
|
+
return f"Error: Test file {new_path} already exists"
|
|
186
|
+
|
|
187
|
+
# Ensure new file has .yaml extension for test files
|
|
188
|
+
if new_path_full.suffix != ".yaml":
|
|
189
|
+
new_path_full = new_path_full.with_suffix(".yaml")
|
|
190
|
+
new_path = str(new_path_full.relative_to(ctx.deps.folder))
|
|
191
|
+
|
|
192
|
+
parent_path = new_path_full.parent
|
|
193
|
+
parent_path.mkdir(parents=True, exist_ok=True)
|
|
194
|
+
os.rename(old_path_full, new_path_full)
|
|
195
|
+
|
|
196
|
+
click.echo(FeedbackManager.success(message=f"✓ {new_path} created"))
|
|
197
|
+
ctx.deps.thinking_animation.start()
|
|
198
|
+
return f"Renamed test file from {path} to {new_path}"
|
|
199
|
+
except AgentRunCancelled as e:
|
|
200
|
+
raise e
|
|
201
|
+
except FileNotFoundError:
|
|
202
|
+
ctx.deps.thinking_animation.start()
|
|
203
|
+
click.echo(FeedbackManager.error(message=f"Error: Test file {path} not found"))
|
|
204
|
+
return f"Error: Test file {path} not found (double check the file path)"
|
|
205
|
+
except Exception as e:
|
|
206
|
+
ctx.deps.thinking_animation.stop()
|
|
207
|
+
click.echo(FeedbackManager.error(message=e))
|
|
208
|
+
ctx.deps.thinking_animation.start()
|
|
209
|
+
return f"Error renaming test file {path} to {new_path}: {e}"
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def remove_test(ctx: RunContext[TinybirdAgentContext], path: str) -> str:
|
|
213
|
+
"""Removes a test file from the project folder
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
path (str): The path to the test file to remove. Required.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
str: If the test file was removed successfully.
|
|
220
|
+
"""
|
|
221
|
+
try:
|
|
222
|
+
ctx.deps.thinking_animation.stop()
|
|
223
|
+
path = path.removeprefix("/")
|
|
224
|
+
full_path = Path(ctx.deps.folder) / path
|
|
225
|
+
|
|
226
|
+
if not full_path.exists():
|
|
227
|
+
click.echo(FeedbackManager.error(message=f"Error: Test file {path} not found"))
|
|
228
|
+
ctx.deps.thinking_animation.start()
|
|
229
|
+
return f"Error: Test file {path} not found (double check the file path)"
|
|
230
|
+
|
|
231
|
+
confirmation = show_confirmation(
|
|
232
|
+
title=f"Delete '{path}'?",
|
|
233
|
+
skip_confirmation=ctx.deps.dangerously_skip_permissions,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
if confirmation == "review":
|
|
237
|
+
feedback = show_input(ctx.deps.workspace_name)
|
|
238
|
+
ctx.deps.thinking_animation.start()
|
|
239
|
+
return f"User did not confirm the proposed changes and gave the following feedback: {feedback}"
|
|
240
|
+
|
|
241
|
+
click.echo(FeedbackManager.highlight(message=f"» Removing {path}..."))
|
|
242
|
+
|
|
243
|
+
# Remove the test file
|
|
244
|
+
full_path.unlink()
|
|
245
|
+
|
|
246
|
+
click.echo(FeedbackManager.success(message=f"✓ {path} removed"))
|
|
247
|
+
ctx.deps.thinking_animation.start()
|
|
248
|
+
|
|
249
|
+
return f"Removed test file {path}."
|
|
250
|
+
except AgentRunCancelled as e:
|
|
251
|
+
raise e
|
|
252
|
+
except Exception as e:
|
|
253
|
+
ctx.deps.thinking_animation.stop()
|
|
254
|
+
click.echo(FeedbackManager.error(message=e))
|
|
255
|
+
ctx.deps.thinking_animation.start()
|
|
256
|
+
return f"Error removing test file {path}: {e}"
|
|
@@ -188,7 +188,7 @@ def update_test(pipe: str, project: Project, client: TinyB) -> None:
|
|
|
188
188
|
cleanup_test_workspace(client, project.folder)
|
|
189
189
|
|
|
190
190
|
|
|
191
|
-
def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) ->
|
|
191
|
+
def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> Optional[str]:
|
|
192
192
|
full_error = ""
|
|
193
193
|
try:
|
|
194
194
|
load_secrets(project=project, client=client)
|
|
@@ -203,19 +203,30 @@ def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> None:
|
|
|
203
203
|
endpoints if len(endpoints) > 0 else glob.glob(f"{project.path}/tests/**/*.y*ml", recursive=True)
|
|
204
204
|
)
|
|
205
205
|
|
|
206
|
-
def run_test(test_file) -> Optional[str]:
|
|
206
|
+
def run_test(test_file) -> Tuple[Optional[str], int, int, bool]:
|
|
207
207
|
test_file_path = Path(test_file)
|
|
208
|
-
click.echo(FeedbackManager.info(message=f"* {test_file_path.stem}{test_file_path.suffix}"))
|
|
209
208
|
test_file_content = parse_tests(test_file_path.read_text())
|
|
209
|
+
total_tests = len(test_file_content)
|
|
210
|
+
|
|
211
|
+
# Check if pipe exists before processing any tests
|
|
212
|
+
try:
|
|
213
|
+
client._req(f"/v0/pipes/{test_file_path.stem}")
|
|
214
|
+
click.echo(FeedbackManager.info(message=f"* {test_file_path.stem}{test_file_path.suffix}"))
|
|
215
|
+
except Exception:
|
|
216
|
+
# Entire test file skipped because pipe doesn't exist
|
|
217
|
+
click.echo(FeedbackManager.info(message=f"* {test_file_path.stem}{test_file_path.suffix}"))
|
|
218
|
+
click.echo(
|
|
219
|
+
FeedbackManager.warning(message=f"✗ All tests skipped ({test_file_path.stem}.pipe not found)")
|
|
220
|
+
)
|
|
221
|
+
return None, total_tests, total_tests, True # True indicates file was skipped
|
|
222
|
+
|
|
210
223
|
test_file_errors = ""
|
|
224
|
+
skipped_count = 0
|
|
225
|
+
|
|
211
226
|
for test in test_file_content:
|
|
212
227
|
try:
|
|
213
228
|
test_params = test["parameters"].split("?")[1] if "?" in test["parameters"] else test["parameters"]
|
|
214
|
-
response =
|
|
215
|
-
try:
|
|
216
|
-
response = get_pipe_data(client, pipe_name=test_file_path.stem, test_params=test_params)
|
|
217
|
-
except Exception:
|
|
218
|
-
continue
|
|
229
|
+
response = get_pipe_data(client, pipe_name=test_file_path.stem, test_params=test_params)
|
|
219
230
|
|
|
220
231
|
expected_result = response.text
|
|
221
232
|
if response.status_code >= 400:
|
|
@@ -237,23 +248,45 @@ def run_tests(name: Tuple[str, ...], project: Project, client: TinyB) -> None:
|
|
|
237
248
|
except Exception as e:
|
|
238
249
|
test_file_errors += f"✗ {test['name']} failed\n** Output and expected output are different: \n{e}"
|
|
239
250
|
click.echo(FeedbackManager.error(message=test_file_errors))
|
|
240
|
-
return test_file_errors
|
|
241
|
-
return None
|
|
251
|
+
return test_file_errors, skipped_count, total_tests, False
|
|
252
|
+
return None, skipped_count, total_tests, False # False indicates file was not skipped
|
|
242
253
|
|
|
243
254
|
failed_tests_count = 0
|
|
255
|
+
skipped_files_count = 0
|
|
256
|
+
total_tests_count = 0
|
|
244
257
|
test_count = len(test_files)
|
|
245
|
-
|
|
258
|
+
output = ""
|
|
246
259
|
for test_file in test_files:
|
|
247
|
-
|
|
260
|
+
run_test_error, skipped_count, individual_tests_count, file_skipped = run_test(test_file)
|
|
261
|
+
total_tests_count += individual_tests_count
|
|
262
|
+
|
|
263
|
+
if file_skipped:
|
|
264
|
+
skipped_files_count += 1
|
|
265
|
+
elif run_test_error:
|
|
248
266
|
full_error += f"\n{run_test_error}"
|
|
249
267
|
failed_tests_count += 1
|
|
250
268
|
|
|
269
|
+
runnable_files_count = test_count - skipped_files_count
|
|
270
|
+
passed_files_count = runnable_files_count - failed_tests_count
|
|
271
|
+
|
|
251
272
|
if failed_tests_count:
|
|
252
|
-
error = f"\n✗ {
|
|
273
|
+
error = f"\n✗ {passed_files_count}/{runnable_files_count} passed"
|
|
274
|
+
if skipped_files_count > 0:
|
|
275
|
+
error += f" ({skipped_files_count} skipped)"
|
|
276
|
+
output += f"{error}\n"
|
|
253
277
|
click.echo(FeedbackManager.error(message=error))
|
|
254
278
|
sys_exit("test_error", full_error)
|
|
255
279
|
else:
|
|
256
|
-
|
|
280
|
+
if runnable_files_count == 0:
|
|
281
|
+
success_message = "\n✓ No tests to run"
|
|
282
|
+
else:
|
|
283
|
+
success_message = f"\n✓ {runnable_files_count}/{runnable_files_count} passed"
|
|
284
|
+
if skipped_files_count > 0:
|
|
285
|
+
success_message += f" ({skipped_files_count} skipped)"
|
|
286
|
+
message_color = FeedbackManager.success if runnable_files_count > 0 else FeedbackManager.warning
|
|
287
|
+
click.echo(message_color(message=success_message))
|
|
288
|
+
output += f"{success_message}\n"
|
|
289
|
+
return output
|
|
257
290
|
except Exception as e:
|
|
258
291
|
raise CLITestException(FeedbackManager.error(message=str(e)))
|
|
259
292
|
finally:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/deploy_check.py
RENAMED
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/diff_resource.py
RENAMED
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/execute_query.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/request_endpoint.py
RENAMED
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/agent/tools/run_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/build_common.py
RENAMED
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/build_datasource.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/format_common.py
RENAMED
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/format_datasource.py
RENAMED
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/datafile/pipe_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb/modules/tinyunit/tinyunit_lib.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/tinyunit/tinyunit.py
RENAMED
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/tinyunit/tinyunit_lib.py
RENAMED
|
File without changes
|
|
File without changes
|
{tinybird-0.0.1.dev273 → tinybird-0.0.1.dev274}/tinybird/tb_cli_modules/workspace_members.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|