Add fields support, tests
This commit is contained in:
pare
465981ea9a
commit
85ca599935
S'han modificat 6 arxius amb 1985 adicions i 1928 eliminacions
|
@ -228,6 +228,7 @@ User dicts
|
|||
'moved_to_account': # If set, an account dict of the account this user has
|
||||
# set up as their moved-to address.
|
||||
'bot': # Boolean indicating whether this account is automated.
|
||||
'fields': # List of up to four dicts with free-form 'name' and 'value' profile info.
|
||||
}
|
||||
|
||||
mastodon.account_verify_credentials()["source"]
|
||||
|
|
|
@ -7,6 +7,7 @@ import time
|
|||
import random
|
||||
import string
|
||||
import datetime
|
||||
import collections
|
||||
from contextlib import closing
|
||||
import pytz
|
||||
import requests
|
||||
|
@ -104,13 +105,13 @@ class Mastodon:
|
|||
__DEFAULT_TIMEOUT = 300
|
||||
__DEFAULT_STREAM_TIMEOUT = 300
|
||||
__DEFAULT_STREAM_RECONNECT_WAIT_SEC = 5
|
||||
__SUPPORTED_MASTODON_VERSION = "2.3.0"
|
||||
__SUPPORTED_MASTODON_VERSION = "2.4.0"
|
||||
|
||||
# Dict versions
|
||||
__DICT_VERSION_APPLICATION = "1.0.0"
|
||||
__DICT_VERSION_MENTION = "1.0.0"
|
||||
__DICT_VERSION_MEDIA = "2.3.0"
|
||||
__DICT_VERSION_ACCOUNT = "2.3.0"
|
||||
__DICT_VERSION_ACCOUNT = "2.4.0"
|
||||
__DICT_VERSION_STATUS = bigger_version(bigger_version(bigger_version(bigger_version("2.1.0",
|
||||
__DICT_VERSION_MEDIA), __DICT_VERSION_ACCOUNT), __DICT_VERSION_APPLICATION), __DICT_VERSION_MENTION)
|
||||
__DICT_VERSION_INSTANCE = bigger_version("2.3.0", __DICT_VERSION_ACCOUNT)
|
||||
|
@ -1239,10 +1240,11 @@ class Mastodon:
|
|||
url = '/api/v1/accounts/{0}/unmute'.format(str(id))
|
||||
return self.__api_request('POST', url)
|
||||
|
||||
@api_version("1.1.1", "2.3.0", __DICT_VERSION_ACCOUNT)
|
||||
@api_version("1.1.1", "2.4.0", __DICT_VERSION_ACCOUNT)
|
||||
def account_update_credentials(self, display_name=None, note=None,
|
||||
avatar=None, avatar_mime_type=None,
|
||||
header=None, header_mime_type=None, locked=None):
|
||||
header=None, header_mime_type=None,
|
||||
locked=None, fields=None):
|
||||
"""
|
||||
Update the profile for the currently logged-in user.
|
||||
|
||||
|
@ -1253,9 +1255,12 @@ class Mastodon:
|
|||
|
||||
'locked' specifies whether the user needs to manually approve follow requests.
|
||||
|
||||
'fields' can be a list of up to four name-value pairs (specified as tuples) to
|
||||
appear as semi-structured information in the users profile.
|
||||
|
||||
Returns the updated `user dict` of the logged-in user.
|
||||
"""
|
||||
params_initial = locals()
|
||||
params_initial = collections.OrderedDict(locals())
|
||||
|
||||
# Load avatar, if specified
|
||||
if not avatar is None:
|
||||
|
@ -1275,8 +1280,18 @@ class Mastodon:
|
|||
if header_mime_type is None:
|
||||
raise MastodonIllegalArgumentError('Could not determine mime type or data passed directly without mime type.')
|
||||
|
||||
# Convert fields
|
||||
if fields != None:
|
||||
if len(fields) > 4:
|
||||
raise MastodonIllegalArgumentError('A maximum of four fields are allowed.')
|
||||
|
||||
fields_attributes = []
|
||||
for idx, (field_name, field_value) in enumerate(fields):
|
||||
params_initial['fields_attributes[' + str(idx) + '][name]'] = field_name
|
||||
params_initial['fields_attributes[' + str(idx) + '][value]'] = field_value
|
||||
|
||||
# Clean up params
|
||||
for param in ["avatar", "avatar_mime_type", "header", "header_mime_type"]:
|
||||
for param in ["avatar", "avatar_mime_type", "header", "header_mime_type", "fields"]:
|
||||
if param in params_initial:
|
||||
del params_initial[param]
|
||||
|
||||
|
|
La diferencia del archivo ha sido suprimido porque es demasiado grande
Cargar Diff
|
@ -1,11 +1,11 @@
|
|||
interactions:
|
||||
- request:
|
||||
body: !!binary |
|
||||
LS00MzhiODc4NzMyNmI0YTJmYjc1YzZmNjE1ZmJhOWY2Yw0KQ29udGVudC1EaXNwb3NpdGlvbjog
|
||||
Zm9ybS1kYXRhOyBuYW1lPSJub3RlIg0KDQpJIHdhbGsgZnVubnkNCi0tNDM4Yjg3ODczMjZiNGEy
|
||||
ZmI3NWM2ZjYxNWZiYTlmNmMNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0i
|
||||
ZGlzcGxheV9uYW1lIg0KDQpKb2huIExlbm5vbg0KLS00MzhiODc4NzMyNmI0YTJmYjc1YzZmNjE1
|
||||
ZmJhOWY2Yw0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJoZWFkZXIiOyBm
|
||||
LS0wMzE1MDYzZmI0OWE0Yzg1YWVmZmRlN2RmZTExNmFlMA0KQ29udGVudC1EaXNwb3NpdGlvbjog
|
||||
Zm9ybS1kYXRhOyBuYW1lPSJkaXNwbGF5X25hbWUiDQoNCkpvaG4gTGVubm9uDQotLTAzMTUwNjNm
|
||||
YjQ5YTRjODVhZWZmZGU3ZGZlMTE2YWUwDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7
|
||||
IG5hbWU9Im5vdGUiDQoNCkkgd2FsayBmdW5ueQ0KLS0wMzE1MDYzZmI0OWE0Yzg1YWVmZmRlN2Rm
|
||||
ZTExNmFlMA0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJoZWFkZXIiOyBm
|
||||
aWxlbmFtZT0ibWFzdG9kb25weXVwbG9hZF8uanBlIg0KQ29udGVudC1UeXBlOiBpbWFnZS9qcGVn
|
||||
DQoNCv/Y/+AAEEpGSUYAAQEBAEgASAAA/+ICHElDQ19QUk9GSUxFAAEBAAACDGxjbXMCEAAAbW50
|
||||
clJHQiBYWVogB9wAAQAZAAMAKQA5YWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbW
|
||||
|
@ -942,7 +942,7 @@ interactions:
|
|||
elShfkRBtkgMCmGlSoojqYg3CP1hg5XagwuSZZej1N96VKgeHKRZSii9BM7fep2iK8u6Y69PxSpU
|
||||
VZtsdoSiQO3N/mozLhcIxMSN89s+KVKgU4XMHLHOFF7LVZRJrFV22pUqBoKKIKucrmmTAxMZfilS
|
||||
oFO2xicuMnjFStYMZkHV3XP4pUqC5Zbdy3MwJvu7U0AjASTLfOy9aVKgjPC5Yj9imCTIjyrGTjBn
|
||||
9aVKgY09xujjo55uzvSpUqD/2Q0KLS00MzhiODc4NzMyNmI0YTJmYjc1YzZmNjE1ZmJhOWY2Yy0t
|
||||
9aVKgY09xujjo55uzvSpUqD/2Q0KLS0wMzE1MDYzZmI0OWE0Yzg1YWVmZmRlN2RmZTExNmFlMC0t
|
||||
DQo=
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
|
@ -950,26 +950,29 @@ interactions:
|
|||
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
|
||||
Connection: [keep-alive]
|
||||
Content-Length: ['53696']
|
||||
Content-Type: [multipart/form-data; boundary=438b8787326b4a2fb75c6f615fba9f6c]
|
||||
Content-Type: [multipart/form-data; boundary=0315063fb49a4c85aeffde7dfe116ae0]
|
||||
User-Agent: [python-requests/2.9.1]
|
||||
method: PATCH
|
||||
uri: http://localhost:3000/api/v1/accounts/update_credentials
|
||||
response:
|
||||
body: {string: '{"id":"1234567890123456","username":"mastodonpy_test","acct":"mastodonpy_test","display_name":"John
|
||||
Lennon","locked":true,"created_at":"2018-05-07T00:38:05.405Z","note":"\u003cp\u003eI
|
||||
Lennon","locked":true,"bot":false,"created_at":"2018-05-07T00:38:05.405Z","note":"\u003cp\u003eI
|
||||
walk funny\u003c/p\u003e","url":"http://localhost:3000/@mastodonpy_test","avatar":"http://localhost:3000/system/accounts/avatars/123/456/789/012/345/original/mastodonpyupload_.jpe","avatar_static":"http://localhost:3000/system/accounts/avatars/123/456/789/012/345/original/mastodonpyupload_.jpe","header":"http://localhost:3000/system/accounts/headers/123/456/789/012/345/original/mastodonpyupload_.jpe","header_static":"http://localhost:3000/system/accounts/headers/123/456/789/012/345/original/mastodonpyupload_.jpe","followers_count":0,"following_count":0,"statuses_count":4,"source":{"privacy":"public","sensitive":false,"note":"I
|
||||
walk funny"}}'}
|
||||
walk funny","fields":[{"name":"bread","value":"toasty."},{"name":"lasagna","value":"no!!!"}]},"emojis":[],"fields":[{"name":"bread","value":"toasty."},{"name":"lasagna","value":"no!!!"}]}'}
|
||||
headers:
|
||||
Cache-Control: ['max-age=0, private, must-revalidate']
|
||||
Content-Type: [application/json; charset=utf-8]
|
||||
ETag: [W/"b91f99fdd4767acf9e1ecc62828207ef"]
|
||||
ETag: [W/"e4a5fa3ea7d32b002975509cbf12d30e"]
|
||||
Referrer-Policy: [strict-origin-when-cross-origin]
|
||||
Transfer-Encoding: [chunked]
|
||||
Vary: ['Accept-Encoding, Origin']
|
||||
X-Content-Type-Options: [nosniff]
|
||||
X-Download-Options: [noopen]
|
||||
X-Frame-Options: [SAMEORIGIN]
|
||||
X-Request-Id: [4da4d35e-15ea-4a32-8b3c-015be1a73c24]
|
||||
X-Runtime: ['0.148153']
|
||||
X-Permitted-Cross-Domain-Policies: [none]
|
||||
X-Request-Id: [e74cf7c0-def0-4007-931e-bf08d48a92d5]
|
||||
X-Runtime: ['0.209705']
|
||||
X-XSS-Protection: [1; mode=block]
|
||||
content-length: ['833']
|
||||
content-length: ['1019']
|
||||
status: {code: 200, message: OK}
|
||||
version: 1
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
interactions:
|
||||
- request:
|
||||
body: !!binary |
|
||||
LS03N2FmNjQyODkxODU0NTU4YmI4NjdiN2I5MmVmYjVkZg0KQ29udGVudC1EaXNwb3NpdGlvbjog
|
||||
Zm9ybS1kYXRhOyBuYW1lPSJub3RlIg0KDQpJIHdhbGsgZnVubnkNCi0tNzdhZjY0Mjg5MTg1NDU1
|
||||
OGJiODY3YjdiOTJlZmI1ZGYNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0i
|
||||
ZGlzcGxheV9uYW1lIg0KDQpKb2huIExlbm5vbg0KLS03N2FmNjQyODkxODU0NTU4YmI4NjdiN2I5
|
||||
MmVmYjVkZg0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJhdmF0YXIiOyBm
|
||||
LS00NTk4Yjg5MzQ1Njg0ZWEyYmNlZjFlNDg0YmU5MzBlMw0KQ29udGVudC1EaXNwb3NpdGlvbjog
|
||||
Zm9ybS1kYXRhOyBuYW1lPSJkaXNwbGF5X25hbWUiDQoNCkpvaG4gTGVubm9uDQotLTQ1OThiODkz
|
||||
NDU2ODRlYTJiY2VmMWU0ODRiZTkzMGUzDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7
|
||||
IG5hbWU9Im5vdGUiDQoNCkkgd2FsayBmdW5ueQ0KLS00NTk4Yjg5MzQ1Njg0ZWEyYmNlZjFlNDg0
|
||||
YmU5MzBlMw0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJhdmF0YXIiOyBm
|
||||
aWxlbmFtZT0ibWFzdG9kb25weXVwbG9hZF8uanBlIg0KQ29udGVudC1UeXBlOiBpbWFnZS9qcGVn
|
||||
DQoNCv/Y/+AAEEpGSUYAAQEBAEgASAAA/+ICHElDQ19QUk9GSUxFAAEBAAACDGxjbXMCEAAAbW50
|
||||
clJHQiBYWVogB9wAAQAZAAMAKQA5YWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbW
|
||||
|
@ -942,7 +942,7 @@ interactions:
|
|||
elShfkRBtkgMCmGlSoojqYg3CP1hg5XagwuSZZej1N96VKgeHKRZSii9BM7fep2iK8u6Y69PxSpU
|
||||
VZtsdoSiQO3N/mozLhcIxMSN89s+KVKgU4XMHLHOFF7LVZRJrFV22pUqBoKKIKucrmmTAxMZfilS
|
||||
oFO2xicuMnjFStYMZkHV3XP4pUqC5Zbdy3MwJvu7U0AjASTLfOy9aVKgjPC5Yj9imCTIjyrGTjBn
|
||||
9aVKgY09xujjo55uzvSpUqD/2Q0KLS03N2FmNjQyODkxODU0NTU4YmI4NjdiN2I5MmVmYjVkZi0t
|
||||
9aVKgY09xujjo55uzvSpUqD/2Q0KLS00NTk4Yjg5MzQ1Njg0ZWEyYmNlZjFlNDg0YmU5MzBlMy0t
|
||||
DQo=
|
||||
headers:
|
||||
Accept: ['*/*']
|
||||
|
@ -950,26 +950,29 @@ interactions:
|
|||
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
|
||||
Connection: [keep-alive]
|
||||
Content-Length: ['53696']
|
||||
Content-Type: [multipart/form-data; boundary=77af642891854558bb867b7b92efb5df]
|
||||
Content-Type: [multipart/form-data; boundary=4598b89345684ea2bcef1e484be930e3]
|
||||
User-Agent: [python-requests/2.9.1]
|
||||
method: PATCH
|
||||
uri: http://localhost:3000/api/v1/accounts/update_credentials
|
||||
response:
|
||||
body: {string: '{"id":"1234567890123456","username":"mastodonpy_test","acct":"mastodonpy_test","display_name":"John
|
||||
Lennon","locked":true,"created_at":"2018-05-07T00:38:05.405Z","note":"\u003cp\u003eI
|
||||
walk funny\u003c/p\u003e","url":"http://localhost:3000/@mastodonpy_test","avatar":"http://localhost:3000/system/accounts/avatars/123/456/789/012/345/original/mastodonpyupload_.jpe","avatar_static":"http://localhost:3000/system/accounts/avatars/123/456/789/012/345/original/mastodonpyupload_.jpe","header":"http://localhost:3000/system/accounts/headers/123/456/789/012/345/original/mastodonpyupload_.jpeg","header_static":"http://localhost:3000/system/accounts/headers/123/456/789/012/345/original/mastodonpyupload_.jpeg","followers_count":0,"following_count":0,"statuses_count":4,"source":{"privacy":"public","sensitive":false,"note":"I
|
||||
walk funny"}}'}
|
||||
Lennon","locked":true,"bot":false,"created_at":"2018-05-07T00:38:05.405Z","note":"\u003cp\u003eI
|
||||
walk funny\u003c/p\u003e","url":"http://localhost:3000/@mastodonpy_test","avatar":"http://localhost:3000/system/accounts/avatars/123/456/789/012/345/original/mastodonpyupload_.jpe","avatar_static":"http://localhost:3000/system/accounts/avatars/123/456/789/012/345/original/mastodonpyupload_.jpe","header":"http://localhost:3000/system/accounts/headers/123/456/789/012/345/original/mastodonpyupload_.jpe","header_static":"http://localhost:3000/system/accounts/headers/123/456/789/012/345/original/mastodonpyupload_.jpe","followers_count":0,"following_count":0,"statuses_count":4,"source":{"privacy":"public","sensitive":false,"note":"I
|
||||
walk funny","fields":[{"name":"bread","value":"toasty."},{"name":"lasagna","value":"no!!!"}]},"emojis":[],"fields":[{"name":"bread","value":"toasty."},{"name":"lasagna","value":"no!!!"}]}'}
|
||||
headers:
|
||||
Cache-Control: ['max-age=0, private, must-revalidate']
|
||||
Content-Type: [application/json; charset=utf-8]
|
||||
ETag: [W/"aba70f93d265f72d820cc0d3bd01c834"]
|
||||
ETag: [W/"88fa68354142994962076b3df86272b7"]
|
||||
Referrer-Policy: [strict-origin-when-cross-origin]
|
||||
Transfer-Encoding: [chunked]
|
||||
Vary: ['Accept-Encoding, Origin']
|
||||
X-Content-Type-Options: [nosniff]
|
||||
X-Download-Options: [noopen]
|
||||
X-Frame-Options: [SAMEORIGIN]
|
||||
X-Request-Id: [a7b608c7-ddfe-4447-b571-4310985822e3]
|
||||
X-Runtime: ['0.583569']
|
||||
X-Permitted-Cross-Domain-Policies: [none]
|
||||
X-Request-Id: [97881214-41a9-4e53-ac2d-0bd3dff79e7b]
|
||||
X-Runtime: ['0.209024']
|
||||
X-XSS-Protection: [1; mode=block]
|
||||
content-length: ['835']
|
||||
content-length: ['1019']
|
||||
status: {code: 200, message: OK}
|
||||
version: 1
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import pytest
|
||||
from mastodon.Mastodon import MastodonAPIError
|
||||
from mastodon.Mastodon import MastodonAPIError, MastodonIllegalArgumentError
|
||||
import re
|
||||
|
||||
@pytest.mark.vcr()
|
||||
def test_account(api):
|
||||
|
@ -86,12 +87,35 @@ def test_account_update_credentials(api):
|
|||
image = f.read()
|
||||
|
||||
account = api.account_update_credentials(
|
||||
display_name='John Lennon',
|
||||
note='I walk funny',
|
||||
avatar = "tests/image.jpg",
|
||||
header = image,
|
||||
header_mime_type = "image/jpeg")
|
||||
display_name='John Lennon',
|
||||
note='I walk funny',
|
||||
avatar = "tests/image.jpg",
|
||||
header = image,
|
||||
header_mime_type = "image/jpeg",
|
||||
fields = [
|
||||
("bread", "toasty."),
|
||||
("lasagna", "no!!!"),
|
||||
]
|
||||
)
|
||||
|
||||
assert account
|
||||
assert account["display_name"] == 'John Lennon'
|
||||
assert re.sub("<.*?>", " ", account["note"]).strip() == 'I walk funny'
|
||||
assert account["fields"][0].name == "bread"
|
||||
assert account["fields"][0].value == "toasty."
|
||||
assert account["fields"][1].name == "lasagna"
|
||||
assert account["fields"][1].value == "no!!!"
|
||||
|
||||
@pytest.mark.vcr()
|
||||
def test_account_update_credentials_too_many_fields(api):
|
||||
with pytest.raises(MastodonIllegalArgumentError):
|
||||
api.account_update_credentials(fields = [
|
||||
('a', 'b'),
|
||||
('c', 'd'),
|
||||
('e', 'f'),
|
||||
('g', 'h'),
|
||||
('i', 'j'),
|
||||
])
|
||||
|
||||
@pytest.mark.vcr(match_on=['path'])
|
||||
def test_account_update_credentials_no_header(api):
|
||||
|
|
Loading…
Referencia en una nova incidència