Oauthlib: populate_token_attributes() float expires_at ๊ฐ’์— ๋Œ€ํ•œ ValueError

์— ๋งŒ๋“  2020๋…„ 12์›” 10์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: oauthlib/oauthlib

https://github.com/oauthlib/oauthlib/blob/d54965b86ce4ede956db70baff0b3d5e9182a007/oauthlib/oauth2/rfc6749/clients/base.py#L516

์ผ๋ถ€ ํ† ํฐ์—๋Š” expires_at ๊ฐ’์ด float(์˜ˆ: 1612807300.1613762 )๋กœ ๋˜์–ด ์žˆ์–ด ์ด ํ–‰์—์„œ ValueError: invalid literal for int() with base 10 ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ int(float(response.get('expires_at'))) (๋˜๋Š” ์ž๋ฅด์ง€ ์•Š๋„๋ก ๋ฐ˜์˜ฌ๋ฆผ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bug Contributor Friendly OAuth2-Client

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

expires_at ์˜ ์‚ฌ์šฉ๋ฒ•์€ RFC์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ์—๋„ ํ˜ผ๋™์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. expires_in ์™€ ์œ ์‚ฌํ•˜๊ฒŒ int ๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฒ•์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  7 ๋Œ“๊ธ€

self._expires_at ๋ฐ”๋กœ ์œ„์—๋Š” float๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

self._expires_at = time.time() + int(self.expires_in)

expires_at ์˜ ์‚ฌ์šฉ๋ฒ•์€ RFC์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ์—๋„ ํ˜ผ๋™์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. expires_in ์™€ ์œ ์‚ฌํ•˜๊ฒŒ int ๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฒ•์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ์ด์ œ ๋ง‰ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์‹œ์ž‘์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ์ด์ œ ๋ง‰ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์‹œ์ž‘์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@default-303 ํ•ด๋ด!

@ggiill ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค

- self._expires_at = int(response.get('expires_at')) 
+ self._expires_at = round(float(response.get('expires_at')))

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด pytest ์‹คํ–‰ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ typecheck ํ…Œ์ŠคํŠธ์™€ ๊ฐ™์ด -
```
๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
๊ฐ€์ ธ์˜ค๊ธฐ ์ˆ˜์ • ## ์ด ๋ฐ๋ชจ๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ์ƒ˜ํ”Œ ์Šคํฌ๋ฆฝํŠธ
๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ๊ฐ„

ํด๋ž˜์Šค TestFix(unittest.TestCase):

def test_float(self) : 
    string_time = str(time.time())
    self.assertIsInstance(fix.get_time("123345.1222"), int)

def test_int(self) : 
    string_time = str(round(time.time()))
    self.assertIsInstance(fix.get_time("12333"), int)

```

๋˜๋Š” ์ „์ฒด mock test ?

@ggiill ์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
lmao ๊ทธ๊ฒƒ์€ ์‹ฌ์ง€์–ด ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์žŠ์–ด ๋ฒ„๋ฆฐ ํ•œ ๋‹ฌ์ž…๋‹ˆ๋‹ค.

@ggiill ์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
lmao ๊ทธ๊ฒƒ์€ ์‹ฌ์ง€์–ด ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์žŠ์–ด ๋ฒ„๋ฆฐ ํ•œ ๋‹ฌ์ž…๋‹ˆ๋‹ค.

@default-303 ์ €๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. @JonathanHuot์—๊ฒŒ ํ•‘์„ ๋Œ‘๋‹ˆ๋‹ค. ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด PR๋„ ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰