Add, document and test nodeinfo api (fixes #199)

This commit is contained in:
Lorenz Diener 2019-10-12 20:51:29 +02:00
pare e60a3f1892
commit 2e5095f301
S'han modificat 4 arxius amb 118 adicions i 1 eliminacions

Veure arxiu

@ -844,6 +844,7 @@ current instance.
.. automethod:: Mastodon.instance_activity
.. automethod:: Mastodon.instance_peers
.. automethod:: Mastodon.instance_health
.. automethod:: Mastodon.instance_nodeinfo
Reading data: Timelines
-----------------------

Veure arxiu

@ -660,7 +660,35 @@ class Mastodon:
Basic health check. Returns True if healthy, False if not.
"""
return self.__api_request('GET', '/health', parse=False).decode("utf-8") == "success"
@api_version("3.0.0", "3.0.0", "3.0.0")
def instance_nodeinfo(self, schema = "http://nodeinfo.diaspora.software/ns/schema/2.0"):
"""
Retrieves the instances nodeinfo information.
For information on what the nodeinfo can contain, see the nodeinfo
specification: https://github.com/jhass/nodeinfo . By default,
Mastodon.py will try to retrieve the version 2.0 schema nodeinfo.
To override the schema, specify the desired schema with the `schema`
parameter.
"""
links = self.__api_request('GET', '/.well-known/nodeinfo')["links"]
schema_url = None
for available_schema in links:
if available_schema.rel == schema:
schema_url = available_schema.href
if schema_url is None:
raise MastodonIllegalArgumentError("Requested nodeinfo schema is not available.")
try:
return self.__api_request('GET', schema_url, base_url_override="")
except MastodonNotFoundError:
parse = urlparse(schema_url)
return self.__api_request('GET', parse.path + parse.params + parse.query + parse.fragment)
###
# Reading data: Timelines
##

Veure arxiu

@ -0,0 +1,81 @@
interactions:
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
User-Agent: [python-requests/2.18.4]
method: GET
uri: http://localhost:3000/.well-known/nodeinfo
response:
body: {string: '{"links":[{"rel":"http://nodeinfo.diaspora.software/ns/schema/2.0","href":"http://localhost/nodeinfo/2.0"}]}'}
headers:
Cache-Control: ['max-age=259200, public']
Content-Type: [application/json; charset=utf-8]
Date: ['Sat, 12 Oct 2019 18:50:31 GMT']
ETag: [W/"e1fd8a5cbe12d2ef42c3146d5319c8af"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept, Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [38a2a5fc-0a7e-44f1-bf4d-85c90c39b2bb]
X-Runtime: ['0.026451']
X-XSS-Protection: [1; mode=block]
content-length: ['108']
status: {code: 200, message: OK}
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
User-Agent: [python-requests/2.18.4]
method: GET
uri: http://localhost/nodeinfo/2.0
response:
body: {string: "<html>\r\n<head><title>404 Not Found</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>404
Not Found</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"}
headers:
Connection: [keep-alive]
Content-Type: [text/html]
Date: ['Sat, 12 Oct 2019 18:50:31 GMT']
Server: [nginx/1.14.0 (Ubuntu)]
Transfer-Encoding: [chunked]
content-length: ['178']
status: {code: 404, message: Not Found}
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
User-Agent: [python-requests/2.18.4]
method: GET
uri: http://localhost:3000/nodeinfo/2.0
response:
body: {string: '{"version":"2.0","software":{"name":"mastodon","version":"3.0.1"},"protocols":["activitypub"],"usage":{"users":{"total":3,"activeMonth":3,"activeHalfyear":3},"localPosts":32},"openRegistrations":true}'}
headers:
Cache-Control: ['max-age=1800, public']
Content-Type: [application/json; charset=utf-8]
Date: ['Sat, 12 Oct 2019 18:50:31 GMT']
ETag: [W/"a09a04c6f9dc121c4b70f446e88a2686"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept,Accept-Encoding']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [5d4c66c1-efad-4b9f-85b0-d67755adb967]
X-Runtime: ['0.020737']
X-XSS-Protection: [1; mode=block]
content-length: ['200']
status: {code: 200, message: OK}
version: 1

Veure arxiu

@ -36,3 +36,10 @@ def test_emoji(api):
@pytest.mark.vcr()
def test_health(api):
assert api.instance_health() == True
@pytest.mark.vcr()
def test_nodeinfo(api):
nodeinfo = api.instance_nodeinfo()
assert nodeinfo
assert nodeinfo.version == '2.0'