home / github

Menu
  • Search all tables
  • GraphQL API

issue_comments

Table actions
  • GraphQL API for issue_comments

11 rows where issue = 963528457 sorted by updated_at descending

✖
✖

✎ View and edit SQL

This data as json, CSV (advanced)

Suggested facets: created_at (date), updated_at (date)

user 2

  • simonw 10
  • abdusco 1

author_association 2

  • OWNER 10
  • CONTRIBUTOR 1

issue 1

  • render_cell() hook should support returning an awaitable · 11 ✖
id html_url issue_url node_id user created_at updated_at ▲ author_association body reactions issue performed_via_github_app
895003796 https://github.com/simonw/datasette/issues/1425#issuecomment-895003796 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41WKyU abdusco 3243482 2021-08-09T07:14:35Z 2021-08-09T07:14:35Z CONTRIBUTOR

I believe this also provides a workaround for the problem I face in https://github.com/simonw/datasette/issues/1300.

Now I should be able to get table PKs and generate a row URL. I'll test this out and report my findings.

```py from datasette.utils import path_from_row_pks

pks = await db.primary_keys(table) url = self.ds.urls.row_blob( database, table, path_from_row_pks(row, pks, not pks), column, ) ```

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894900267 https://github.com/simonw/datasette/issues/1425#issuecomment-894900267 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41Vxgr simonw 9599 2021-08-09T01:31:22Z 2021-08-09T01:31:22Z OWNER

I used this to build a new plugin: https://github.com/simonw/datasette-query-links

Demo here: https://latest-with-plugins.datasette.io/fixtures?sql=select%0D%0A++%27select+*+from+[facetable]%27+as+query%0D%0Aunion%0D%0Aselect%0D%0A++%27select+sqlite_version()%27%0D%0Aunion%0D%0Aselect%0D%0A++%27select+this+is+invalid+SQL+so+will+not+be+linked%27

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894893319 https://github.com/simonw/datasette/issues/1425#issuecomment-894893319 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41Vv0H simonw 9599 2021-08-09T01:08:56Z 2021-08-09T01:09:12Z OWNER

Demo: https://latest.datasette.io/fixtures/simple_primary_key shows RENDER_CELL_ASYNC_RESULT where the CSV version shows RENDER_CELL_ASYNC: https://latest.datasette.io/fixtures/simple_primary_key.csv - because of this test plugin code: https://github.com/simonw/datasette/blob/a390bdf9cef01d8723d025fc3348e81345ff4856/tests/plugins/my_plugin.py#L98-L122

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894884874 https://github.com/simonw/datasette/issues/1425#issuecomment-894884874 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41VtwK simonw 9599 2021-08-09T00:38:20Z 2021-08-09T00:38:20Z OWNER

I'm trying the version where I remove firstresult=True.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894883664 https://github.com/simonw/datasette/issues/1425#issuecomment-894883664 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41VtdQ simonw 9599 2021-08-09T00:33:56Z 2021-08-09T00:33:56Z OWNER

I could extract that code out and write my own function which implements the equivalent of calling pm.hook.render_cell(...) but runs await_me_maybe() before checking if res is not None.

That's pretty nasty.

Could I instead call the plugin hook normally, but then have additional logic which says "if I await it and it returns None then try calling the hook again but skip this one" - not sure if there's a way to do that either.

I could remove the firstresult=True from the hookspec - which would cause it to call and return ALL hooks - but then in my own code use only the first one. This is slightly less efficient (since it calls all the hooks and then discards all-but-one value) but it's the least unpleasant in terms of the code I would have to write - plus I don't think it's going to be THAT common for someone to have multiple expensive render_cell() hooks installed at once (they are usually pretty cheap).

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894882642 https://github.com/simonw/datasette/issues/1425#issuecomment-894882642 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41VtNS simonw 9599 2021-08-09T00:29:57Z 2021-08-09T00:29:57Z OWNER

Here's the code in pluggy that implements this: https://github.com/pytest-dev/pluggy/blob/0a064fe275060dbdb1fe6e10c888e72bc400fb33/src/pluggy/callers.py#L31-L43

python if hook_impl.hookwrapper: try: gen = hook_impl.function(*args) next(gen) # first yield teardowns.append(gen) except StopIteration: _raise_wrapfail(gen, "did not yield") else: res = hook_impl.function(*args) if res is not None: results.append(res) if firstresult: # halt further impl calls break

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894882123 https://github.com/simonw/datasette/issues/1425#issuecomment-894882123 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41VtFL simonw 9599 2021-08-09T00:27:43Z 2021-08-09T00:27:43Z OWNER

Good news: render_cell() is the only hook to use firstresult=True:

https://github.com/simonw/datasette/blob/f3c9edb376a13c09b5ecf97c7390f4e49efaadf2/datasette/hookspecs.py#L62-L64

https://pluggy.readthedocs.io/en/latest/#first-result-only

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894881448 https://github.com/simonw/datasette/issues/1425#issuecomment-894881448 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41Vs6o simonw 9599 2021-08-09T00:24:25Z 2021-08-09T00:24:39Z OWNER

My hunch is that the "skip this render_cell() result if it returns None" logic isn't working correctly, ever since I added the await_me_maybe line.

Could that be because Pluggy handles the "do the next if None is returned" logic itself, but I'm no-longer returning None, I'm returning an awaitable which when awaited returns None.

This would suggest that all of the await_me_maybe() plugin hooks have the same bug. That's definitely possible - it may well be that no-one has yet stumbled across a bug caused by a plugin returning an awaitable and hence not being skipped, because plugin hooks that return awaitable are rare enough that no-one has tried two plugins which both use that trick.

Still don't see why it would pass on my laptop but fail in CI though.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894881016 https://github.com/simonw/datasette/issues/1425#issuecomment-894881016 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41Vsz4 simonw 9599 2021-08-09T00:21:53Z 2021-08-09T00:21:53Z OWNER

Still one test failure: ``` def test_hook_render_cell_link_from_json(app_client): sql = """ select '{"href": "http://example.com/", "label":"Example"}' """.strip() path = "/fixtures?" + urllib.parse.urlencode({"sql": sql}) response = app_client.get(path) td = Soup(response.body, "html.parser").find("table").find("tbody").find("td") a = td.find("a")

  assert a is not None, str(a)

E AssertionError: None E assert None is not None ``` The weird thing about this one is that I can't replicate it on my laptop - but it happens in CI every time, including when I shell in and try to run that single test.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894869692 https://github.com/simonw/datasette/issues/1425#issuecomment-894869692 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41VqC8 simonw 9599 2021-08-08T23:08:29Z 2021-08-08T23:08:29Z OWNER

Updated documentation: https://docs.datasette.io/en/latest/plugin_hooks.html#render-cell-value-column-table-database-datasette

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  
894865323 https://github.com/simonw/datasette/issues/1425#issuecomment-894865323 https://api.github.com/repos/simonw/datasette/issues/1425 IC_kwDOBm6k_c41Vo-r simonw 9599 2021-08-08T22:33:19Z 2021-08-08T22:33:19Z OWNER

I can do this with the await_me_maybe() function, as seen here: https://github.com/simonw/datasette/blob/a21853c9dade240734abc6b4f750fae09a3e840a/datasette/app.py#L864-L873

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
render_cell() hook should support returning an awaitable 963528457  

Advanced export

JSON shape: default, array, newline-delimited, object

CSV options:

CREATE TABLE [issue_comments] (
   [html_url] TEXT,
   [issue_url] TEXT,
   [id] INTEGER PRIMARY KEY,
   [node_id] TEXT,
   [user] INTEGER REFERENCES [users]([id]),
   [created_at] TEXT,
   [updated_at] TEXT,
   [author_association] TEXT,
   [body] TEXT,
   [reactions] TEXT,
   [issue] INTEGER REFERENCES [issues]([id])
, [performed_via_github_app] TEXT);
CREATE INDEX [idx_issue_comments_issue]
                ON [issue_comments] ([issue]);
CREATE INDEX [idx_issue_comments_user]
                ON [issue_comments] ([user]);
Powered by Datasette · Queries took 24.237ms · About: github-to-sqlite
  • Sort ascending
  • Sort descending
  • Facet by this
  • Hide this column
  • Show all columns
  • Show not-blank rows