home / github

Menu
  • Search all tables
  • GraphQL API

issue_comments

Table actions
  • GraphQL API for issue_comments

12 rows where issue = 459587155 sorted by updated_at descending

✖
✖

✎ View and edit SQL

This data as json, CSV (advanced)

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

user 1

  • simonw 12

issue 1

  • Port Datasette from Sanic to ASGI + Uvicorn · 12 ✖

author_association 1

  • OWNER 12
id html_url issue_url node_id user created_at updated_at ▲ author_association body reactions issue performed_via_github_app
504791796 https://github.com/simonw/datasette/pull/518#issuecomment-504791796 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc5MTc5Ng== simonw 9599 2019-06-23T22:10:02Z 2019-06-24T13:42:50Z OWNER

The Sanic stuff I import at the moment is:

  • [x] from sanic.views import HTTPMethodView
  • [x] from sanic.request import Request https://github.com/huge-success/sanic/blob/0.7.0/sanic/request.py#L44
  • [x] from sanic.exceptions import NotFound
  • [x] from sanic import response - used for response.text(""), response.redirect(path), response.HTTPResponse and response.html() https://github.com/huge-success/sanic/blob/0.7.0/sanic/response.py
  • [x] from sanic.request import RequestParameters https://github.com/huge-success/sanic/blob/0.7.0/sanic/request.py#L30
{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504843916 https://github.com/simonw/datasette/pull/518#issuecomment-504843916 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDg0MzkxNg== simonw 9599 2019-06-24T03:30:37Z 2019-06-24T03:30:37Z OWNER

It's live! https://a559123.datasette.io/

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504798977 https://github.com/simonw/datasette/pull/518#issuecomment-504798977 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc5ODk3Nw== simonw 9599 2019-06-23T23:52:38Z 2019-06-23T23:52:38Z OWNER

Last thing is to replace sanic.response:

  • response.text("")
  • response.html()
  • response.redirect(path)
  • response.HTTPResponse

Implementations here: https://github.com/huge-success/sanic/blob/0.7.0/sanic/response.py#L175-L285

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504795648 https://github.com/simonw/datasette/pull/518#issuecomment-504795648 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc5NTY0OA== simonw 9599 2019-06-23T23:07:06Z 2019-06-23T23:07:06Z OWNER

For the request object.... what are the fields of it I actually use?

  • request.url
  • request.query_string
  • request.path
  • request.method
  • request.args
  • request.raw_args

ALL of those are things that can be derived from the scope - so I think my new Request class (in utils/asgi.py) is just going to be a wrapper around a scope.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504791053 https://github.com/simonw/datasette/pull/518#issuecomment-504791053 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc5MTA1Mw== simonw 9599 2019-06-23T22:00:56Z 2019-06-23T22:00:56Z OWNER

The InvalidUsage exception is thrown by Sanic when it gets an unhandled request - usually a HEAD. It was added in efbb4e83374a2c795e436c72fa79f70da72309b8

I'm going to replace it with specific handling for HEAD requests plus a unit test.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504790825 https://github.com/simonw/datasette/pull/518#issuecomment-504790825 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc5MDgyNQ== simonw 9599 2019-06-23T21:57:58Z 2019-06-23T21:57:58Z OWNER

The big one: Replace Sanic request and response objects with my own classes, so I can remove Sanic dependency

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504782618 https://github.com/simonw/datasette/pull/518#issuecomment-504782618 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc4MjYxOA== simonw 9599 2019-06-23T20:05:44Z 2019-06-23T20:05:59Z OWNER

Replacement for @app.listener("before_server_start") - this is what the ASGI lifespan protocol is for.

I know Uvicorn supports this because it keeps saying ASGI 'lifespan' protocol appears unsupported on the console.

I think the solution here will be to introduce another ASGI wrapper class similar to AsgiTracer. I'll model this on the example in the ASGI lifespan spec.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504765738 https://github.com/simonw/datasette/pull/518#issuecomment-504765738 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc2NTczOA== simonw 9599 2019-06-23T16:11:49Z 2019-06-23T16:20:44Z OWNER

OK, for Get ?_trace=1 working again. The old code lives in two places:

https://github.com/simonw/datasette/blob/35429f90894321eda7f2db31b9ea7976f31f73ac/datasette/app.py#L546-L560

And then:

https://github.com/simonw/datasette/blob/35429f90894321eda7f2db31b9ea7976f31f73ac/datasette/app.py#L653-L672

So it's stashing something on the request to tell the rest of the code it should be tracing, then using that collected data from the request to add information to the final body.

One possible shape for the replacement is a new ASGI middleware that wraps everything else. We don't have a mutable request object here though, so we will need to untangle this entirely from the request object.

Also tricky is that in ASGI land we handle streams - we don't usually wait around for the entire response body to be compiled for us. This means the code that modifies the response (adding to the JSON or appending inside the </body>) needs to be reconsidered.

As usual, Starlette seems to have figured this out: https://github.com/encode/starlette/blob/8c8cc2ec0a5cb834a9a15b871ae8b480503abb67/starlette/middleware/gzip.py

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504765145 https://github.com/simonw/datasette/pull/518#issuecomment-504765145 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc2NTE0NQ== simonw 9599 2019-06-23T16:04:37Z 2019-06-23T16:04:37Z OWNER

Another bug: JSON is being served without a content-type header: ``` ~ $ curl -i 'http://127.0.0.1:8001/fivethirtyeight/ahca-polls%2Fahca_polls.json' HTTP/1.1 200 OK date: Sun, 23 Jun 2019 16:04:01 GMT server: uvicorn referrer-policy: no-referrer transfer-encoding: chunked

{"database": "fivethirtyeight", "table": "ahca-polls/ahca_polls", ... ```

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504765018 https://github.com/simonw/datasette/pull/518#issuecomment-504765018 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc2NTAxOA== simonw 9599 2019-06-23T16:03:20Z 2019-06-23T16:03:20Z OWNER

Weird new bug: http://127.0.0.1:8001/fixtures/table%2Fwith%2Fslashes.csv?_format=json is downloading CSV for me now.

https://latest.datasette.io/fixtures/table%2Fwith%2Fslashes.csv?_format=json does the right thing.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504762887 https://github.com/simonw/datasette/pull/518#issuecomment-504762887 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc2Mjg4Nw== simonw 9599 2019-06-23T15:38:58Z 2019-06-23T15:38:58Z OWNER

Mystery solved: that's because I'm constructing my own scope object and testing via ApplicationCommunicator rather than exercising Uvicorn directly.

https://github.com/simonw/datasette/blob/d60fbfcae2658e71cab6d7b3b9f53f8d895064ef/tests/fixtures.py#L42-L57

I don't want to introduce the complexity of launching a real Uvicorn as part of the tests, so I guess I'll have to carefully update my ApplicationCommunicator test harness to more correctly emulate real life.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  
504762769 https://github.com/simonw/datasette/pull/518#issuecomment-504762769 https://api.github.com/repos/simonw/datasette/issues/518 MDEyOklzc3VlQ29tbWVudDUwNDc2Mjc2OQ== simonw 9599 2019-06-23T15:37:26Z 2019-06-23T15:37:26Z OWNER

This is strange: on my local machine http://127.0.0.1:8001/fixtures/table%2Fwith%2Fslashes.csv is returning a 404 BUT there's a test for that which is passing under pytest:

https://github.com/simonw/datasette/blob/d60fbfcae2658e71cab6d7b3b9f53f8d895064ef/tests/test_api.py#L721-L727

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Port Datasette from Sanic to ASGI + Uvicorn 459587155  

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 22.064ms · About: github-to-sqlite
  • Sort ascending
  • Sort descending
  • Facet by this
  • Hide this column
  • Show all columns
  • Show not-blank rows