vgi-python 0.11.1__tar.gz → 0.12.0__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.
- {vgi_python-0.11.1 → vgi_python-0.12.0}/PKG-INFO +1 -1
- {vgi_python-0.11.1 → vgi_python-0.12.0}/pyproject.toml +1 -1
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/landing/describe.expected.json +62 -7
- {vgi_python-0.11.1 → vgi_python-0.12.0}/uv.lock +1 -1
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/http/describe_json.py +73 -1
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/http/landing.html +70 -10
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.gitattributes +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.gitignore +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.python-version +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/.vale.ini +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/CLAUDE.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/LICENSE +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/README.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/SECURITY.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/ci/README.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/auth.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/client.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/filters.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/functions.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/http.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/index.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/observability.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/storage.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/api/worker.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/authentication.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/cli.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/generator-api.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/index.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/metadata.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/robots.txt +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/mkdocs.yml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/test-data/generate.sh +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_required_field_filter_paths.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/conftest.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/landing/_checker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/landing/describe.schema.json +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_auth.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_landing_conformance.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_otel.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_serve.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/arguments.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/auth.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/client/client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/invocation.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/metadata.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/otel.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/protocol.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/py.typed +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/serve.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/table_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/vgi/worker.py +0 -0
- {vgi_python-0.11.1 → vgi_python-0.12.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0
|
|
4
4
|
Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
|
|
5
5
|
Project-URL: Homepage, https://query.farm
|
|
6
6
|
Project-URL: Repository, https://github.com/Query-farm/vgi-python
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{
|
|
4
4
|
"attach_options": [],
|
|
5
5
|
"counts": {
|
|
6
|
-
"functions":
|
|
6
|
+
"functions": 165,
|
|
7
7
|
"schemas": 2,
|
|
8
8
|
"tables": 44,
|
|
9
9
|
"views": 3
|
|
@@ -1114,6 +1114,49 @@
|
|
|
1114
1114
|
"returns": "string",
|
|
1115
1115
|
"type": "scalar"
|
|
1116
1116
|
},
|
|
1117
|
+
{
|
|
1118
|
+
"args": [
|
|
1119
|
+
{
|
|
1120
|
+
"desc": "Value to clamp",
|
|
1121
|
+
"name": "val",
|
|
1122
|
+
"type": "ANY"
|
|
1123
|
+
},
|
|
1124
|
+
{
|
|
1125
|
+
"default": "0",
|
|
1126
|
+
"desc": "Lower bound (inclusive)",
|
|
1127
|
+
"name": "lo",
|
|
1128
|
+
"named": true,
|
|
1129
|
+
"type": "int64"
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
"default": "100",
|
|
1133
|
+
"desc": "Upper bound (inclusive)",
|
|
1134
|
+
"name": "hi",
|
|
1135
|
+
"named": true,
|
|
1136
|
+
"type": "int64"
|
|
1137
|
+
}
|
|
1138
|
+
],
|
|
1139
|
+
"doc": "Clamp a value between lo and hi (defaults: 0..100)",
|
|
1140
|
+
"name": "vgi_clamp",
|
|
1141
|
+
"type": "scalar"
|
|
1142
|
+
},
|
|
1143
|
+
{
|
|
1144
|
+
"args": [
|
|
1145
|
+
{
|
|
1146
|
+
"desc": "First factor",
|
|
1147
|
+
"name": "x",
|
|
1148
|
+
"type": "ANY"
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
"desc": "Second factor",
|
|
1152
|
+
"name": "y",
|
|
1153
|
+
"type": "ANY"
|
|
1154
|
+
}
|
|
1155
|
+
],
|
|
1156
|
+
"doc": "Multiply two values",
|
|
1157
|
+
"name": "vgi_multiply",
|
|
1158
|
+
"type": "scalar"
|
|
1159
|
+
},
|
|
1117
1160
|
{
|
|
1118
1161
|
"args": [
|
|
1119
1162
|
{
|
|
@@ -2206,12 +2249,6 @@
|
|
|
2206
2249
|
"name": "struct_settings",
|
|
2207
2250
|
"type": "table"
|
|
2208
2251
|
},
|
|
2209
|
-
{
|
|
2210
|
-
"args": [],
|
|
2211
|
-
"doc": "Distributed sum using simple callback API",
|
|
2212
|
-
"name": "sum_all_columns_simple_distributed",
|
|
2213
|
-
"type": "table_in_out"
|
|
2214
|
-
},
|
|
2215
2252
|
{
|
|
2216
2253
|
"args": [],
|
|
2217
2254
|
"doc": "Generates 10000 integers from 0 to 9999",
|
|
@@ -2361,6 +2398,18 @@
|
|
|
2361
2398
|
"name": "versioned_data_scan",
|
|
2362
2399
|
"type": "table"
|
|
2363
2400
|
},
|
|
2401
|
+
{
|
|
2402
|
+
"args": [
|
|
2403
|
+
{
|
|
2404
|
+
"desc": "Number of rows to generate",
|
|
2405
|
+
"name": "n",
|
|
2406
|
+
"type": "ANY"
|
|
2407
|
+
}
|
|
2408
|
+
],
|
|
2409
|
+
"doc": "Table macro returning range of values",
|
|
2410
|
+
"name": "vgi_range_table",
|
|
2411
|
+
"type": "table"
|
|
2412
|
+
},
|
|
2364
2413
|
{
|
|
2365
2414
|
"args": [],
|
|
2366
2415
|
"doc": "buffer_input variant using batch_index to reconstruct order",
|
|
@@ -2610,6 +2659,12 @@
|
|
|
2610
2659
|
"doc": "Computes column-wise sums across all batches",
|
|
2611
2660
|
"name": "sum_all_columns",
|
|
2612
2661
|
"type": "table_in_out"
|
|
2662
|
+
},
|
|
2663
|
+
{
|
|
2664
|
+
"args": [],
|
|
2665
|
+
"doc": "Distributed sum using simple callback API",
|
|
2666
|
+
"name": "sum_all_columns_simple_distributed",
|
|
2667
|
+
"type": "table_in_out"
|
|
2613
2668
|
}
|
|
2614
2669
|
],
|
|
2615
2670
|
"name": "main",
|
|
@@ -17,6 +17,7 @@ See ``~/Development/vgi/docs/http-landing-contract.md`` for the normative spec.
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
+
import contextlib
|
|
20
21
|
import json
|
|
21
22
|
import logging
|
|
22
23
|
from importlib.metadata import version as _pkg_version
|
|
@@ -37,6 +38,8 @@ from vgi.catalog.catalog_interface import (
|
|
|
37
38
|
CatalogInterface,
|
|
38
39
|
FunctionInfo,
|
|
39
40
|
FunctionType,
|
|
41
|
+
MacroInfo,
|
|
42
|
+
MacroType,
|
|
40
43
|
SchemaObjectType,
|
|
41
44
|
TableInfo,
|
|
42
45
|
ViewInfo,
|
|
@@ -190,6 +193,68 @@ def _function_args(fn: FunctionInfo) -> list[dict[str, Any]]:
|
|
|
190
193
|
return args
|
|
191
194
|
|
|
192
195
|
|
|
196
|
+
def _macro_display_type(m: MacroInfo) -> str:
|
|
197
|
+
# A scalar macro is invoked exactly like a scalar function in SQL, and a
|
|
198
|
+
# table macro like a table function; surface them in the same buckets so the
|
|
199
|
+
# landing page lists a catalog's full callable surface (VGI workers commonly
|
|
200
|
+
# expose their "functions" as declarative macros — see vgi-volcanos).
|
|
201
|
+
return "scalar" if m.macro_type == MacroType.SCALAR else "table"
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _macro_args(m: MacroInfo) -> list[dict[str, Any]]:
|
|
205
|
+
# Defaulted parameters are optional and callable by name in DuckDB, so we
|
|
206
|
+
# present them as named args (with their default); the rest are positional.
|
|
207
|
+
defaults: dict[str, Any] = {}
|
|
208
|
+
if m.parameter_default_values is not None:
|
|
209
|
+
batch = m.parameter_default_values
|
|
210
|
+
for col_name in batch.schema.names:
|
|
211
|
+
with contextlib.suppress(Exception):
|
|
212
|
+
defaults[col_name] = batch.column(col_name)[0].as_py()
|
|
213
|
+
|
|
214
|
+
raw = m.arguments_schema
|
|
215
|
+
if raw is None:
|
|
216
|
+
schema = None
|
|
217
|
+
elif isinstance(raw, pa.Schema):
|
|
218
|
+
# In-process catalog interfaces hand back a live schema; only the
|
|
219
|
+
# serialized wire form is IPC bytes.
|
|
220
|
+
schema = raw
|
|
221
|
+
else:
|
|
222
|
+
schema = _read_schema(bytes(raw))
|
|
223
|
+
fields = list(schema) if schema is not None else None
|
|
224
|
+
|
|
225
|
+
args: list[dict[str, Any]] = []
|
|
226
|
+
names = [f.name for f in fields] if fields is not None else list(m.parameters)
|
|
227
|
+
field_by_name = {f.name: f for f in fields} if fields is not None else {}
|
|
228
|
+
for name in names:
|
|
229
|
+
field = field_by_name.get(name)
|
|
230
|
+
# Macro parameters are untyped unless a typed default pins them; show
|
|
231
|
+
# ANY rather than the Arrow null placeholder.
|
|
232
|
+
if field is not None and not pa.types.is_null(field.type):
|
|
233
|
+
arg: dict[str, Any] = {"name": name, "type": str(field.type)}
|
|
234
|
+
else:
|
|
235
|
+
arg = {"name": name, "type": "ANY"}
|
|
236
|
+
doc = _meta(field, VGI_DOC_KEY) if field is not None else None
|
|
237
|
+
if doc:
|
|
238
|
+
arg["desc"] = doc
|
|
239
|
+
if name in defaults:
|
|
240
|
+
arg["named"] = True
|
|
241
|
+
try:
|
|
242
|
+
arg["default"] = json.dumps(defaults[name])
|
|
243
|
+
except Exception: # noqa: BLE001
|
|
244
|
+
arg["default"] = str(defaults[name])
|
|
245
|
+
args.append(arg)
|
|
246
|
+
return args
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def _macro_to_dict(m: MacroInfo) -> dict[str, Any]:
|
|
250
|
+
return {
|
|
251
|
+
"name": m.name,
|
|
252
|
+
"type": _macro_display_type(m),
|
|
253
|
+
"doc": m.comment or "",
|
|
254
|
+
"args": _macro_args(m),
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
|
|
193
258
|
# ---------------------------------------------------------------------------
|
|
194
259
|
# Catalog contents
|
|
195
260
|
# ---------------------------------------------------------------------------
|
|
@@ -230,6 +295,9 @@ def _build_schemas(
|
|
|
230
295
|
SchemaObjectType.AGGREGATE_FUNCTION,
|
|
231
296
|
):
|
|
232
297
|
funcs_raw.extend(_schema_contents(iface, attach_opaque_data, si.name, kind))
|
|
298
|
+
macros_raw: list[MacroInfo] = []
|
|
299
|
+
for kind in (SchemaObjectType.SCALAR_MACRO, SchemaObjectType.TABLE_MACRO):
|
|
300
|
+
macros_raw.extend(_schema_contents(iface, attach_opaque_data, si.name, kind))
|
|
233
301
|
|
|
234
302
|
tables = []
|
|
235
303
|
for t in sorted(tables_raw, key=lambda x: x.name):
|
|
@@ -257,8 +325,12 @@ def _build_schemas(
|
|
|
257
325
|
"args": _function_args(fn),
|
|
258
326
|
**({"returns": r} if (r := _function_returns(fn)) else {}),
|
|
259
327
|
}
|
|
260
|
-
for fn in
|
|
328
|
+
for fn in funcs_raw
|
|
261
329
|
]
|
|
330
|
+
functions.extend(_macro_to_dict(m) for m in macros_raw)
|
|
331
|
+
# Deterministic ordering across functions + macros (both fold into the
|
|
332
|
+
# same scalar/table/aggregate/table_in_out buckets on the landing page).
|
|
333
|
+
functions.sort(key=lambda d: (d["type"], d["name"]))
|
|
262
334
|
|
|
263
335
|
schemas.append({"name": si.name, "tables": tables, "views": views, "functions": functions})
|
|
264
336
|
totals["schemas"] += 1
|
|
@@ -73,6 +73,12 @@
|
|
|
73
73
|
.cat-card .cc-title { display: flex; align-items: center; gap: 9px; font-size: 18px; font-weight: 650; letter-spacing: -0.01em; }
|
|
74
74
|
.cat-card .cc-title .ic { width: 19px; height: 19px; color: var(--accent); }
|
|
75
75
|
.cat-card .cc-doc { color: var(--muted); font-size: 13.5px; margin-top: 5px; }
|
|
76
|
+
.cat-card .cc-doc .md-h { font-size: 14px; font-weight: 650; color: var(--ink); margin: 8px 0 4px; }
|
|
77
|
+
.cat-card .cc-doc .md-p { margin: 4px 0; }
|
|
78
|
+
.cat-card .cc-doc .md-p:first-child { margin-top: 0; }
|
|
79
|
+
.cat-card .cc-doc .md-ul { margin: 4px 0; padding-left: 18px; }
|
|
80
|
+
.cat-card .cc-doc code { font-family: var(--mono); background: var(--chip); padding: 1px 5px; border-radius: 4px; font-size: .92em; }
|
|
81
|
+
.cat-card .cc-doc a { color: var(--accent); }
|
|
76
82
|
.badges { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 13px; }
|
|
77
83
|
.badge { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; padding: 5px 11px; border: 1px solid var(--line-strong); border-radius: 8px; text-decoration: none; color: var(--ink); background: var(--panel); }
|
|
78
84
|
.badge:hover { border-color: var(--accent); color: var(--accent); }
|
|
@@ -190,10 +196,17 @@
|
|
|
190
196
|
.t-name, .fn-name { font-family: var(--mono); font-size: 12.5px; font-weight: 550; }
|
|
191
197
|
.t-meta { color: var(--muted); font-size: 11.5px; font-family: var(--mono); font-variant-numeric: tabular-nums; flex: none; }
|
|
192
198
|
.fn-sig { color: var(--muted); font-size: 12px; font-family: var(--mono); flex: none; }
|
|
193
|
-
.
|
|
199
|
+
.fn-doc { color: var(--muted); font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; margin-left: auto; text-align: right; }
|
|
194
200
|
|
|
195
201
|
/* level 4: body inset */
|
|
196
202
|
.t-body, .fn-body { padding: 9px 13px 12px; background: color-mix(in srgb, var(--kc) 4%, var(--bg)); border-radius: 0 0 var(--row-radius) var(--row-radius); }
|
|
203
|
+
.t-desc { color: var(--ink); font-size: 12.5px; line-height: 1.5; margin: 0 0 11px; }
|
|
204
|
+
.t-desc .md-h { font-size: 13px; font-weight: 650; margin: 8px 0 4px; }
|
|
205
|
+
.t-desc .md-p { margin: 4px 0; }
|
|
206
|
+
.t-desc .md-p:first-child { margin-top: 0; }
|
|
207
|
+
.t-desc .md-ul { margin: 4px 0; padding-left: 18px; }
|
|
208
|
+
.t-desc code { font-family: var(--mono); background: var(--chip); padding: 1px 5px; border-radius: 4px; font-size: .92em; }
|
|
209
|
+
.t-desc a { color: var(--accent); }
|
|
197
210
|
.args-label { font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); font-weight: 700; margin: 0 0 6px; }
|
|
198
211
|
.cols { display: flex; flex-direction: column; gap: 6px; }
|
|
199
212
|
.col-item { border: 1px solid color-mix(in srgb, var(--kc) 22%, var(--line)); border-radius: 7px; padding: 7px 10px; background: color-mix(in srgb, var(--kc) 4%, var(--panel)); }
|
|
@@ -225,7 +238,7 @@
|
|
|
225
238
|
</style>
|
|
226
239
|
</head>
|
|
227
240
|
<body>
|
|
228
|
-
<!-- vgi-landing-asset
|
|
241
|
+
<!-- vgi-landing-asset v2 -->
|
|
229
242
|
|
|
230
243
|
<a class="skip" href="#contents">Skip to contents</a>
|
|
231
244
|
|
|
@@ -312,6 +325,55 @@ const serviceUrl = origin + basePath;
|
|
|
312
325
|
const esc = s => String(s).replace(/[&<>"]/g, c=>({'&':'&','<':'<','>':'>','"':'"'}[c]));
|
|
313
326
|
const sqlHi = s => esc(s).replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|INTERVAL|AND|OR|AS|JOIN|ON|YEAR)\b/g, m=>'<span class="kw">'+m+'</span>');
|
|
314
327
|
|
|
328
|
+
function mdToHtml(src){
|
|
329
|
+
if(!src) return '';
|
|
330
|
+
var lines = String(src).replace(/\r\n?/g,'\n').split('\n'), out=[], i=0;
|
|
331
|
+
function inl(t){
|
|
332
|
+
t = esc(t);
|
|
333
|
+
t = t.replace(/`([^`]+)`/g,'<code>$1</code>');
|
|
334
|
+
t = t.replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>');
|
|
335
|
+
t = t.replace(/(^|[^*])\*([^*]+)\*/g,'$1<em>$2</em>');
|
|
336
|
+
t = t.replace(/\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)/g,'<a href="$2" target="_blank" rel="noopener">$1</a>');
|
|
337
|
+
return t;
|
|
338
|
+
}
|
|
339
|
+
while(i<lines.length){
|
|
340
|
+
var ln=lines[i];
|
|
341
|
+
if(/^\s*$/.test(ln)){ i++; continue; }
|
|
342
|
+
var h=ln.match(/^(#{1,6})\s+(.*)$/);
|
|
343
|
+
if(h){ var lv=Math.min(h[1].length,6); out.push('<h'+lv+' class="md-h">'+inl(h[2])+'</h'+lv+'>'); i++; continue; }
|
|
344
|
+
if(/^\s*[-*+]\s+/.test(ln)){
|
|
345
|
+
var items=[];
|
|
346
|
+
while(i<lines.length && /^\s*[-*+]\s+/.test(lines[i])){ items.push('<li>'+inl(lines[i].replace(/^\s*[-*+]\s+/,''))+'</li>'); i++; }
|
|
347
|
+
out.push('<ul class="md-ul">'+items.join('')+'</ul>'); continue;
|
|
348
|
+
}
|
|
349
|
+
var para=[ln]; i++;
|
|
350
|
+
while(i<lines.length && !/^\s*$/.test(lines[i]) && !/^(#{1,6}\s|\s*[-*+]\s)/.test(lines[i])){ para.push(lines[i]); i++; }
|
|
351
|
+
out.push('<p class="md-p">'+inl(para.join(' '))+'</p>');
|
|
352
|
+
}
|
|
353
|
+
return out.join('');
|
|
354
|
+
}
|
|
355
|
+
var _DDB_TYPES = {int8:'TINYINT',int16:'SMALLINT',int32:'INTEGER',int64:'BIGINT',
|
|
356
|
+
uint8:'UTINYINT',uint16:'USMALLINT',uint32:'UINTEGER',uint64:'UBIGINT',
|
|
357
|
+
halffloat:'FLOAT',float:'FLOAT',float32:'FLOAT',double:'DOUBLE',float64:'DOUBLE',
|
|
358
|
+
bool:'BOOLEAN',boolean:'BOOLEAN',string:'VARCHAR',large_string:'VARCHAR',utf8:'VARCHAR',large_utf8:'VARCHAR',
|
|
359
|
+
binary:'BLOB',large_binary:'BLOB',date32:'DATE','date32[day]':'DATE',date64:'DATE',null:'NULL',
|
|
360
|
+
month_day_nano_interval:'INTERVAL'};
|
|
361
|
+
function duckdbType(t){
|
|
362
|
+
if(!t) return t; t=String(t); var lt=t.toLowerCase();
|
|
363
|
+
if(_DDB_TYPES[lt]) return _DDB_TYPES[lt];
|
|
364
|
+
var d=t.match(/^dictionary<values=([^,>]+)/i); if(d) return duckdbType(d[1].trim());
|
|
365
|
+
var l=t.match(/^(?:large_)?list<(?:item:\s*)?(.+)>$/i); if(l) return duckdbType(l[1].trim())+'[]';
|
|
366
|
+
if(/^fixed_size_binary/i.test(t)) return 'BLOB';
|
|
367
|
+
var ts=t.match(/^timestamp\[([^,\]]+)(?:,\s*tz=([^\]]+))?\]$/i); if(ts) return ts[2]?'TIMESTAMPTZ':'TIMESTAMP';
|
|
368
|
+
if(/^time(32|64)\[/i.test(t)) return 'TIME';
|
|
369
|
+
if(/^duration\[/i.test(t)) return 'INTERVAL';
|
|
370
|
+
var dec=t.match(/^decimal(?:128|256)\((\d+),\s*(\d+)\)$/i); if(dec) return 'DECIMAL('+dec[1]+','+dec[2]+')';
|
|
371
|
+
if(/^struct</i.test(t)) return 'STRUCT';
|
|
372
|
+
if(/^map</i.test(t)) return 'MAP';
|
|
373
|
+
return t;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
|
|
315
377
|
// ── identity pill ────────────────────────────────────────────────────────────────
|
|
316
378
|
function renderIdentity(){
|
|
317
379
|
if (!describe.oauth) return;
|
|
@@ -377,7 +439,7 @@ function renderCatCard(){
|
|
|
377
439
|
? '<div class="cc-by">'+[t.author?'by '+esc(t.author):'', t.copyright?esc(t.copyright):''].filter(Boolean).join(' · ')+'</div>' : '';
|
|
378
440
|
document.getElementById('cat-card').innerHTML =
|
|
379
441
|
'<div class="cc-title">'+icon('catalog')+esc(t.title || c.name)+'</div>' +
|
|
380
|
-
(t.doc_md ? '<div class="cc-doc">'+
|
|
442
|
+
(t.doc_md ? '<div class="cc-doc">'+mdToHtml(t.doc_md)+'</div>' : '') +
|
|
381
443
|
(badges ? '<div class="badges">'+badges+'</div>' : '') + kw + by;
|
|
382
444
|
}
|
|
383
445
|
|
|
@@ -482,9 +544,9 @@ function tableRow(catName, s, t, kind){ // kind: 'table' | 'view'
|
|
|
482
544
|
const kcls = kind==='view' ? ' view k-view' : '';
|
|
483
545
|
return '<details class="tbl'+kcls+'" data-name="'+esc(t.name.toLowerCase())+'" data-kind="'+kind+'" data-catalog="'+esc(catName)+'" data-schema="'+esc(s.name)+'" data-table="'+esc(t.name)+'">'+
|
|
484
546
|
'<summary>'+icon('caret','tri')+icon(iconName,'row-icon')+
|
|
485
|
-
'<span class="t-name">'+esc(t.name)+'</span><span class="t-meta">'+t.cols+' cols</span>'+
|
|
486
|
-
(t.comment? '<span class="t-comment">'+esc(t.comment)+'</span>':'')+'</summary>'+
|
|
547
|
+
'<span class="t-name">'+esc(t.name)+'</span><span class="t-meta">'+t.cols+' cols</span></summary>'+
|
|
487
548
|
'<div class="t-body">'+
|
|
549
|
+
(t.comment ? '<div class="t-desc">'+mdToHtml(t.comment)+'</div>' : '')+
|
|
488
550
|
(kind==='view' && t.def ? '<div class="args-label">Definition</div><pre class="view-sql">'+sqlHi(t.def)+'</pre>' : '')+
|
|
489
551
|
'<div class="args-label">Columns</div><div class="cols"><div class="skeleton">Loading columns…</div></div></div></details>';
|
|
490
552
|
}
|
|
@@ -497,7 +559,7 @@ function argCard(a){
|
|
|
497
559
|
const def = (a.default!==undefined && a.default!==null) ? '<span class="arg-def">default '+esc(a.default)+'</span>' : '';
|
|
498
560
|
const desc = a.desc ? esc(a.desc) : '';
|
|
499
561
|
const meta = (desc||def) ? '<div class="col-comment">'+desc+(desc&&def?' · ':'')+def+'</div>' : '';
|
|
500
|
-
return '<div class="col-item"><div class="col"><span class="col-name">'+esc(a.name)+(a.named?'<span class="arg-kind"> :=</span>':'')+'</span><span class="col-type">'+esc(a.type)+'</span></div>'+meta+'</div>';
|
|
562
|
+
return '<div class="col-item"><div class="col"><span class="col-name">'+esc(a.name)+(a.named?'<span class="arg-kind"> :=</span>':'')+'</span><span class="col-type">'+esc(duckdbType(a.type))+'</span></div>'+meta+'</div>';
|
|
501
563
|
}
|
|
502
564
|
function fnRow(f, iconName){
|
|
503
565
|
const pos = f.args.filter(a=>!a.named), named = f.args.filter(a=>a.named);
|
|
@@ -563,7 +625,7 @@ document.getElementById('catalogs').addEventListener('toggle', e=>{
|
|
|
563
625
|
const body = d.querySelector('.cols');
|
|
564
626
|
fetchColumns(d.dataset.catalog, d.dataset.schema, d.dataset.table).then(info=>{
|
|
565
627
|
body.innerHTML = info.columns.map(col=>
|
|
566
|
-
'<div class="col-item"><div class="col"><span class="col-name">'+esc(col.name)+'</span><span class="col-type">'+esc(col.type)+'</span></div>'+
|
|
628
|
+
'<div class="col-item"><div class="col"><span class="col-name">'+esc(col.name)+'</span><span class="col-type">'+esc(duckdbType(col.type))+'</span></div>'+
|
|
567
629
|
(col.comment? '<div class="col-comment">'+esc(col.comment)+'</div>':'')+'</div>').join('');
|
|
568
630
|
});
|
|
569
631
|
}, true);
|
|
@@ -604,9 +666,7 @@ document.getElementById('footer').innerHTML =
|
|
|
604
666
|
'<a href="'+prefix+'/describe">RPC API</a><span class="dot">·</span>'+
|
|
605
667
|
'<a href="https://github.com/query-farm">Source</a><span class="dot">·</span>'+
|
|
606
668
|
'<a href="https://query.farm">Query.Farm</a>'+
|
|
607
|
-
'<div class="foot-meta">vgi-rpc (<code>'+esc(describe.worker.lang)+'</code>) · v'+esc(describe.worker.version)+' · <code>'+esc(describe.server_id)+'</code></div>'
|
|
608
|
-
'<div class="foot-meta">landing_schema_version '+describe.landing_schema_version+
|
|
609
|
-
' · shared page, identical across Python / Go / Rust / TypeScript / Java</div>';
|
|
669
|
+
'<div class="foot-meta">vgi-rpc (<code>'+esc(describe.worker.lang)+'</code>) · v'+esc(describe.worker.version)+' · <code>'+esc(describe.server_id)+'</code></div>';
|
|
610
670
|
}
|
|
611
671
|
|
|
612
672
|
function renderAll(){ renderCatBar(); renderCatCard(); renderConnect(); updateCupola(); renderContents(); }
|
|
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
|
|
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
|
|
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
|