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,