html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,issue,performed_via_github_app
https://github.com/simonw/sqlite-utils/issues/37#issuecomment-509681590,https://api.github.com/repos/simonw/sqlite-utils/issues/37,509681590,MDEyOklzc3VlQ29tbWVudDUwOTY4MTU5MA==,9599,2019-07-09T15:07:12Z,2021-06-22T18:17:53Z,OWNER,"Here's a magic incantation for generating types detected through running the tests with https://github.com/Instagram/MonkeyType
```
pip install pytest-monkeytype
pytest --monkeytype-output=./monkeytype.sqlite3
monkeytype list-modules
monkeytype apply sqlite_utils.utils
monkeytype apply sqlite_utils.cli
monkeytype apply sqlite_utils.db
```
Here's the result: https://github.com/simonw/sqlite-utils/commit/d18c694fc25b7dd3d76e250c77ddf56d10ddf935","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",465815372,
https://github.com/simonw/sqlite-utils/issues/37#issuecomment-509685610,https://api.github.com/repos/simonw/sqlite-utils/issues/37,509685610,MDEyOklzc3VlQ29tbWVudDUwOTY4NTYxMA==,9599,2019-07-09T15:16:52Z,2019-07-09T15:16:52Z,OWNER,"Also interesting:
```
pip install pytest-mypy
pytest --mypy
```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",465815372,
https://github.com/simonw/sqlite-utils/issues/37#issuecomment-509686432,https://api.github.com/repos/simonw/sqlite-utils/issues/37,509686432,MDEyOklzc3VlQ29tbWVudDUwOTY4NjQzMg==,9599,2019-07-09T15:18:49Z,2019-07-09T15:18:49Z,OWNER,"Interestingly if I run that against my `monkeytype` branch I get the following errors (subset):
```
_______________________________________________________________________________________ mypy db.py ________________________________________________________________________________________
sqlite_utils/db.py:15: error: No library stub file for module 'numpy'
sqlite_utils/db.py:15: note: (Stub files are from https://github.com/python/typeshed)
sqlite_utils/db.py:197: error: Incompatible types in assignment (expression has type ""Union[Dict[str, int], Dict[str, Union[int, str]], Dict[str, str], Dict[, ]]"", variable has type ""Union[Dict[str, int], Dict[str, Union[int, str]], Dict[str, str], None]"")
sqlite_utils/db.py:204: error: Item ""None"" of ""Union[Dict[str, int], Dict[str, Union[int, str]], Dict[str, str], None]"" has no attribute ""__iter__"" (not iterable)
sqlite_utils/db.py:206: error: Argument 1 to ""set"" has incompatible type ""Union[Dict[str, int], Dict[str, Union[int, str]], Dict[str, str], None]""; expected ""Iterable[str]""
sqlite_utils/db.py:211: error: Item ""None"" of ""Optional[Tuple[str, str, str]]"" has no attribute ""index""
sqlite_utils/db.py:211: error: Unsupported right operand type for in (""Optional[Tuple[str, str, str]]"")
sqlite_utils/db.py:232: error: Unsupported right operand type for in (""Union[Dict[str, int], Dict[str, Union[int, str]], Dict[str, str], None]"")
sqlite_utils/db.py:234: error: Value of type ""Union[Dict[str, int], Dict[str, Union[int, str]], Dict[str, str], None]"" is not indexable
sqlite_utils/db.py:307: error: Need type annotation for 'table_sql' (hint: ""table_sql: Dict[, ] = ..."")
sqlite_utils/db.py:427: error: Item ""int"" of ""Union[int, None, str]"" has no attribute ""startswith""
sqlite_utils/db.py:427: error: Item ""None"" of ""Union[int, None, str]"" has no attribute ""startswith""
sqlite_utils/db.py:434: error: Incompatible types in assignment (expression has type ""List[Any]"", target has type ""int"")
sqlite_utils/db.py:438: error: Incompatible types in assignment (expression has type ""object"", target has type ""int"")
sqlite_utils/db.py:670: error: Need type annotation for 'all_column_types' (hint: ""all_column_types: Dict[, ] = ..."")
sqlite_utils/db.py:757: error: Incompatible types in assignment (expression has type ""List[Any]"", variable has type ""chain[Any]"")
sqlite_utils/db.py:761: error: Argument 1 to ""create"" of ""Table"" has incompatible type ""Dict[str, Union[Type[str], Type[int], Type[bool], Type[time], Type[float]]]""; expected ""Dict[str, Union[Type[str], Type[int], Type[bool], Type[time]]]""
sqlite_utils/db.py:770: error: Need type annotation for 'all_columns' (hint: ""all_columns: Set[] = ..."")
sqlite_utils/db.py:773: error: Incompatible types in assignment (expression has type ""List[Any]"", variable has type ""Set[Any]"")
sqlite_utils/db.py:775: error: ""Set[Any]"" has no attribute ""insert""
sqlite_utils/db.py:797: error: Need type annotation for 'values' (hint: ""values: List[] = ..."")
sqlite_utils/db.py:811: error: Argument 1 to ""add_missing_columns"" of ""Table"" has incompatible type ""chain[Any]""; expected ""Union[List[Union[Dict[str, Union[int, str]], Dict[str, Union[int, str, List[str]]]]], List[Dict[str, Union[str, int, float]]], List[Dict[str, Union[int, str]]]]""
```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",465815372,
https://github.com/simonw/sqlite-utils/issues/37#issuecomment-868881033,https://api.github.com/repos/simonw/sqlite-utils/issues/37,868881033,MDEyOklzc3VlQ29tbWVudDg2ODg4MTAzMw==,9599,2021-06-25T23:23:49Z,2021-06-25T23:23:49Z,OWNER,"Twitter conversation about how to add types to the `.create_table(columns=)` parameter: https://twitter.com/simonw/status/1408532867592818693
> Anyone know how to write a mypy type definition for this?
>
> {""id"": int, ""name"": str, ""image"": bytes, ""weight"": float}
>
> It's a dict where keys are strings and values are one of int/str/bytes/float (weird API design I know, but I designed this long before I was thinking about mypy)
Looks like this could work:
```python
def create_table(
self,
name,
columns: Dict[str, Union[Type[int], Type[bytes], Type[str], Type[float]]],
pk=None,
foreign_keys=None,
column_order=None,
not_null=None,
defaults=None,
hash_id=None,
extracts=None,
):
```
Except... that method can optionally also accept `numpy` types if `numpy` is installed. I don't know if it's possible to dynamically change a signature based on an import, since `mypy` is a static type analyzer and doesn't ever execute the code.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",465815372,
https://github.com/simonw/sqlite-utils/issues/37#issuecomment-868881190,https://api.github.com/repos/simonw/sqlite-utils/issues/37,868881190,MDEyOklzc3VlQ29tbWVudDg2ODg4MTE5MA==,9599,2021-06-25T23:24:28Z,2021-06-25T23:24:28Z,OWNER,Maybe I could release a separate Python package `types-sqlite-utils-numpy` which adds an over-ridden type definition that includes the `numpy` types?,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",465815372,
https://github.com/simonw/sqlite-utils/issues/37#issuecomment-901452199,https://api.github.com/repos/simonw/sqlite-utils/issues/37,901452199,IC_kwDOCGYnMM41uxGn,9599,2021-08-18T21:48:57Z,2021-08-18T21:48:57Z,OWNER,"I did a bunch of work on this in #266. The library is now pretty thoroughly typed, and I even found a couple of bugs using `mypy` along the way: #313 and #315.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",465815372,