|
141 | 141 | {"id":"vgi-python-lzc","title":"Extract duplicated sort_key function in argument_spec","description":"The sort_key function is duplicated at lines 139-142 and 309-312 in argument_spec.py. Extract it to a module-level function to follow DRY principles.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-05T11:51:19.141041-05:00","created_by":"rusty","updated_at":"2026-01-05T11:55:22.535816-05:00","closed_at":"2026-01-05T11:55:22.535816-05:00","close_reason":"Closed"} |
142 | 142 | {"id":"vgi-python-m3z","title":"Add tags to _VALID_META_ATTRIBUTES in metadata.py","description":"Add 'tags' to the _VALID_META_ATTRIBUTES frozenset so that using tags in a Meta class doesn't trigger the 'unknown attributes' warning.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:45:22.364181-05:00","created_by":"rusty","updated_at":"2026-01-06T10:49:13.581283-05:00","closed_at":"2026-01-06T10:49:13.581283-05:00","close_reason":"Already completed as part of vgi-python-twb"} |
143 | 143 | {"id":"vgi-python-m45","title":"Create tests/test_argument_spec.py","description":"## Overview\n\nCreate comprehensive tests for the argument specification serialization module.\n\n## File Location\n\n`tests/test_argument_spec.py`\n\n## Test Classes and Cases\n\n### TestArgumentSpecToSchema\n\nTest converting ArgumentSpec objects to Arrow schema.\n\n#### test_positional_arguments_preserve_order\n- Create specs with positions 0, 1, 2\n- Convert to schema\n- Verify field order matches position order\n- Verify field types are preserved\n\n#### test_named_arguments_have_metadata\n- Create spec with position='key' (named)\n- Convert to schema\n- Verify field has `vgi_arg=named` metadata\n\n#### test_mixed_positional_and_named\n- Create mix of positional (0, 1) and named ('format', 'verbose') specs\n- Convert to schema\n- Verify positional come first, then named\n- Verify named have correct metadata\n\n#### test_table_input_uses_null_type\n- Create spec with is_table_input=True\n- Convert to schema\n- Verify field type is pa.null()\n- Verify field has `vgi_type=table` metadata\n\n#### test_any_type_uses_null_type\n- Create spec with is_any_type=True\n- Convert to schema\n- Verify field type is pa.null()\n- Verify field has `vgi_type=any` metadata\n\n#### test_varargs_has_metadata\n- Create spec with is_varargs=True and arrow_type=pa.int64()\n- Convert to schema\n- Verify field type is pa.int64() (element type preserved)\n- Verify field has `vgi_varargs=true` metadata\n\n### TestSchemaToArgumentSpecs\n\nTest converting Arrow schema back to ArgumentSpec objects.\n\n#### test_positional_arguments_from_schema\n- Create schema with 3 fields (no metadata)\n- Convert to specs\n- Verify positions are 0, 1, 2\n\n#### test_named_arguments_from_metadata\n- Create schema with `vgi_arg=named` metadata on fields\n- Convert to specs\n- Verify position is field name string\n\n#### test_table_input_detected\n- Create schema with `vgi_type=table` metadata\n- Convert to specs\n- Verify is_table_input=True\n\n#### test_any_type_detected\n- Create schema with `vgi_type=any` metadata\n- Convert to specs\n- Verify is_any_type=True\n\n#### test_varargs_detected\n- Create schema with `vgi_varargs=true` metadata\n- Convert to specs\n- Verify is_varargs=True\n\n### TestRoundTrip\n\nTest that specs survive serialization round-trip.\n\n#### test_complex_arrow_types_preserved\nTest each of these types round-trips correctly:\n- pa.int64(), pa.float32(), pa.utf8()\n- pa.list_(pa.float64())\n- pa.struct([pa.field('a', pa.int32()), pa.field('b', pa.string())])\n- pa.map_(pa.string(), pa.int64())\n- pa.decimal128(10, 2)\n- pa.timestamp('us', tz='UTC')\n\n#### test_full_function_signature_roundtrip\n- Create specs matching a realistic function:\n - count: int, position 0\n - data: TableInput, position 1\n - extra: float varargs, position 2\n - format: str, named 'format'\n- Convert to schema, serialize to bytes, deserialize, convert back to specs\n- Verify all specs match original\n\n### TestExtractArgumentSpecs\n\nTest extracting specs from function classes.\n\n#### test_extract_from_simple_function\n- Define function class with Arg descriptors\n- Call extract_argument_specs with arg_types dict\n- Verify specs match descriptors\n\n#### test_extract_table_input\n- Define function with Arg[TableInput]\n- Extract specs\n- Verify is_table_input=True\n\n#### test_extract_any_arrow\n- Define function with Arg[AnyArrow]\n- Extract specs\n- Verify is_any_type=True\n\n#### test_extract_varargs\n- Define function with Arg[int](2, varargs=True)\n- Extract specs\n- Verify is_varargs=True\n\n### TestEdgeCases\n\n#### test_empty_schema\n- Convert empty list of specs to schema\n- Verify empty schema works\n- Convert back, verify empty list\n\n#### test_only_named_arguments\n- Create specs with only named arguments (no positional)\n- Round-trip and verify\n\n#### test_only_positional_arguments\n- Create specs with only positional arguments (no named)\n- Round-trip and verify\n\n## Test Utilities\n\nConsider creating fixtures for common patterns:\n- `make_spec()` helper for creating ArgumentSpec\n- Sample function classes for extraction tests","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T11:18:53.312911-05:00","created_by":"rusty","updated_at":"2026-01-05T11:32:35.580879-05:00","closed_at":"2026-01-05T11:32:35.580879-05:00","close_reason":"Created comprehensive tests with 43 passing test cases","dependencies":[{"issue_id":"vgi-python-m45","depends_on_id":"vgi-python-cd0","type":"blocks","created_at":"2026-01-05T11:19:30.779207-05:00","created_by":"rusty"}]} |
144 | | -{"id":"vgi-python-m9ow","title":"Run lint, format, type check, and tests for Polars integration","description":"Run the full validation suite: (1) uv run ruff check --fix . \u0026\u0026 uv run ruff format . (2) uv run mypy vgi/ (3) uv run pytest tests/test_polars_integration.py -v. Fix any issues that arise from linting, formatting, or type checking.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-07T13:45:24.259246-05:00","created_by":"rusty","updated_at":"2026-01-07T13:45:48.575246-05:00","dependencies":[{"issue_id":"vgi-python-m9ow","depends_on_id":"vgi-python-xbd9","type":"blocks","created_at":"2026-01-07T13:45:33.057796-05:00","created_by":"rusty"}]} |
| 144 | +{"id":"vgi-python-m9ow","title":"Run lint, format, type check, and tests for Polars integration","description":"Run the full validation suite: (1) uv run ruff check --fix . \u0026\u0026 uv run ruff format . (2) uv run mypy vgi/ (3) uv run pytest tests/test_polars_integration.py -v. Fix any issues that arise from linting, formatting, or type checking.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T13:45:24.259246-05:00","created_by":"rusty","updated_at":"2026-01-08T02:45:28.954763-05:00","closed_at":"2026-01-08T02:45:28.954763-05:00","close_reason":"Already completed as part of development","dependencies":[{"issue_id":"vgi-python-m9ow","depends_on_id":"vgi-python-xbd9","type":"blocks","created_at":"2026-01-07T13:45:33.057796-05:00","created_by":"rusty"}]} |
145 | 145 | {"id":"vgi-python-n2b","title":"Update example functions with explicit arrow_type","description":"Update a subset of example functions to demonstrate explicit arrow_type:\n\n- vgi/examples/table.py: RangeFunction.step → arrow_type=pa.int32()\n- vgi/examples/scalar.py: One function → explicit arrow_type\n\nMost examples keep Arg[int](0) to test auto-inference.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T15:44:57.188629-05:00","created_by":"rusty","updated_at":"2026-01-05T15:58:26.384255-05:00","closed_at":"2026-01-05T15:58:26.384255-05:00","close_reason":"PR #21 created","dependencies":[{"issue_id":"vgi-python-n2b","depends_on_id":"vgi-python-dv0","type":"blocks","created_at":"2026-01-05T15:45:14.330881-05:00","created_by":"rusty"}]} |
146 | 146 | {"id":"vgi-python-nju","title":"Create vgi/examples/catalog.py - InMemoryCatalog example","description":"Create an in-memory catalog implementation for testing and as an example.\n\nFiles to create:\n- vgi/examples/catalog.py\n\nInMemoryCatalog(CatalogInterface):\n- In-memory storage using dicts for catalogs, schemas, tables, views\n- Implements all required abstract methods\n- Implements common optional methods (schema_create, table_create, etc.)\n- Generates attach_id as random UUID bytes\n- Does NOT support transactions (returns None from transaction_begin)\n\nData structures:\n- _catalogs: dict[str, dict] # catalog_name -\u003e catalog_data\n- _attachments: dict[AttachId, str] # attach_id -\u003e catalog_name\n- Per-catalog: schemas dict with tables, views, functions\n\nExample usage in docstring showing how to:\n1. Create InMemoryCatalog subclass\n2. Register with Worker\n3. Use from CatalogClient\n\nCreate example worker:\nclass InMemoryCatalogWorker(Worker):\n catalog_interface = InMemoryCatalog\n\nEntry point: vgi-example-catalog-worker","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T19:18:24.005743-05:00","created_by":"rusty","updated_at":"2026-01-05T19:21:50.072853-05:00","closed_at":"2026-01-05T19:21:50.072853-05:00","close_reason":"User requested closure","dependencies":[{"issue_id":"vgi-python-nju","depends_on_id":"vgi-python-ik9","type":"blocks","created_at":"2026-01-05T19:18:44.688346-05:00","created_by":"rusty"}]} |
147 | 147 | {"id":"vgi-python-nmu","title":"Update CLI utils for attach_id_required field","description":"Update `vgi/client/cli_utils.py`:\n\n1. Update `catalog_attach_result_to_dict()` to include `attach_id_required` field in output\n\n2. Add helper function for auto-attach workflow:\n```python\ndef get_attach_id_from_options(\n client: Client,\n attach_id: str | None,\n catalog: str | None,\n attach_options: dict | None,\n) -\u003e tuple[AttachId, bool]:\n '''Get attach_id from either explicit --attach-id or auto-attach via --catalog.\n \n Returns:\n Tuple of (attach_id, is_stateful) where is_stateful indicates if\n a warning should be shown for stateful catalogs.\n '''\n```\n\nThis helper will be used by all CLI commands that need an attach_id.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-05T22:35:44.062055-05:00","created_by":"rusty","updated_at":"2026-01-05T22:44:18.170822-05:00","closed_at":"2026-01-05T22:44:18.170822-05:00","close_reason":"Closed","dependencies":[{"issue_id":"vgi-python-nmu","depends_on_id":"vgi-python-vz9","type":"blocks","created_at":"2026-01-05T22:35:48.204572-05:00","created_by":"rusty"}]} |
|
188 | 188 | {"id":"vgi-python-wfei","title":"Create vgi/examples/scalar_polars.py with example Polars scalar functions","description":"Create vgi/examples/scalar_polars.py with 2-3 example ScalarFunction implementations that use Polars for data processing. Examples should include: (1) PolarsUpperCaseFunction - string uppercase using pl.col().str.to_uppercase(), (2) PolarsStringLengthFunction - compute string lengths, (3) PolarsNormalizeFunction - z-score normalization. Each function demonstrates the zero-copy pattern: pl.from_arrow(batch) -\u003e Polars ops -\u003e result.to_arrow().column(0).combine_chunks()","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T13:45:23.997919-05:00","created_by":"rusty","updated_at":"2026-01-08T02:42:48.256662-05:00","closed_at":"2026-01-08T02:42:48.256662-05:00","close_reason":"Closed","dependencies":[{"issue_id":"vgi-python-wfei","depends_on_id":"vgi-python-viqf","type":"blocks","created_at":"2026-01-07T13:45:32.810965-05:00","created_by":"rusty"}]} |
189 | 189 | {"id":"vgi-python-wsm8","title":"Update catalog_output_schema() to use helper","description":"Modify catalog_output_schema() classmethod in ScalarFunction to call _get_meta_output_type() instead of catalog_output_type().","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T22:13:34.52036-05:00","created_by":"rusty","updated_at":"2026-01-06T22:16:15.04782-05:00","closed_at":"2026-01-06T22:16:15.04782-05:00","close_reason":"Closed","dependencies":[{"issue_id":"vgi-python-wsm8","depends_on_id":"vgi-python-17es","type":"blocks","created_at":"2026-01-06T22:13:52.242973-05:00","created_by":"rusty"}]} |
190 | 190 | {"id":"vgi-python-x1z","title":"Update CLI catalog version command for --attach-id and --catalog options","description":"Update `vgi/client/cli_catalog.py` `catalog version` command:\n\n1. Replace positional `ATTACH_ID` argument with `--attach-id` option\n2. Add `--catalog` option as alternative\n3. Add `--attach-options` option\n4. Use helper from cli_utils to resolve attach_id\n5. Show warning for stateful catalogs\n\n**Example new usage:**\n```bash\nvgi-client catalog version --catalog example --server ...\nvgi-client catalog version --attach-id abc123 --server ...\n```","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T22:36:40.599814-05:00","created_by":"rusty","updated_at":"2026-01-05T22:45:47.633977-05:00","closed_at":"2026-01-05T22:45:47.633977-05:00","close_reason":"Closed","dependencies":[{"issue_id":"vgi-python-x1z","depends_on_id":"vgi-python-nmu","type":"blocks","created_at":"2026-01-05T22:36:46.765389-05:00","created_by":"rusty"}]} |
191 | | -{"id":"vgi-python-xbd9","title":"Create tests/test_polars_integration.py with integration tests","description":"Create tests/test_polars_integration.py with tests for all Polars example functions. Use pytest.importorskip('polars') at module level so tests are skipped if polars is not installed. Test each function using ScalarFunctionTestClient, verify correct output values and row count preservation. Follow existing test patterns in tests/test_testing.py.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-07T13:45:24.128476-05:00","created_by":"rusty","updated_at":"2026-01-07T13:45:48.455574-05:00","dependencies":[{"issue_id":"vgi-python-xbd9","depends_on_id":"vgi-python-wfei","type":"blocks","created_at":"2026-01-07T13:45:32.940231-05:00","created_by":"rusty"}]} |
| 191 | +{"id":"vgi-python-xbd9","title":"Create tests/test_polars_integration.py with integration tests","description":"Create tests/test_polars_integration.py with tests for all Polars example functions. Use pytest.importorskip('polars') at module level so tests are skipped if polars is not installed. Test each function using ScalarFunctionTestClient, verify correct output values and row count preservation. Follow existing test patterns in tests/test_testing.py.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T13:45:24.128476-05:00","created_by":"rusty","updated_at":"2026-01-08T02:45:20.298918-05:00","closed_at":"2026-01-08T02:45:20.298918-05:00","close_reason":"Closed","dependencies":[{"issue_id":"vgi-python-xbd9","depends_on_id":"vgi-python-wfei","type":"blocks","created_at":"2026-01-07T13:45:32.940231-05:00","created_by":"rusty"}]} |
192 | 192 | {"id":"vgi-python-xj7","title":"Export metadata constants in argument_spec __all__","description":"The metadata constants (VGI_ARG_KEY, VGI_ARG_NAMED, VGI_TYPE_KEY, VGI_TYPE_TABLE, VGI_TYPE_ANY, VGI_VARARGS_KEY, VGI_VARARGS_TRUE) are not exported in __all__. If external code needs to parse schemas, they'd need to hardcode these values. Add them to __all__ and re-export from vgi/__init__.py.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-05T11:51:18.760011-05:00","created_by":"rusty","updated_at":"2026-01-05T11:54:28.416008-05:00","closed_at":"2026-01-05T11:54:28.416008-05:00","close_reason":"Closed"} |
193 | 193 | {"id":"vgi-python-y1ep","title":"Update output_type property to use helper","description":"Modify output_type property in ScalarFunction to call _get_meta_output_type(). Raise NotImplementedError if AnyArrow and not overridden.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T22:13:34.645682-05:00","created_by":"rusty","updated_at":"2026-01-06T22:16:30.342667-05:00","closed_at":"2026-01-06T22:16:30.342667-05:00","close_reason":"Closed","dependencies":[{"issue_id":"vgi-python-y1ep","depends_on_id":"vgi-python-17es","type":"blocks","created_at":"2026-01-06T22:13:52.363381-05:00","created_by":"rusty"}]} |
194 | 194 | {"id":"vgi-python-y49n","title":"Add quiet parameter to Worker.__init__()","description":"File: vgi/worker.py (~line 401)\n\nModify Worker.__init__() to accept a 'quiet' parameter:\n- Add 'quiet: bool = False' as keyword-only argument\n- Store as self._quiet, checking both parameter and VGI_QUIET env var\n- Update docstring to document the parameter\n\nCode:\ndef __init__(self, *, quiet: bool = False) -\u003e None:\n self._quiet = quiet or os.environ.get('VGI_QUIET') == '1'\n # ... existing structlog config","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T13:51:11.886442-05:00","created_by":"rusty","updated_at":"2026-01-08T02:39:25.478725-05:00","closed_at":"2026-01-08T02:39:25.478725-05:00","close_reason":"Closed"} |
|
0 commit comments