Skip to content

Commit 2e95cce

Browse files
committed
Enum&dict継承で型安全にしてみた
1 parent ff6a85e commit 2e95cce

4 files changed

Lines changed: 90 additions & 75 deletions

File tree

library/omikuji.py

Lines changed: 12 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
おみくじを返す
55
"""
66

7-
from typing import Hashable, Tuple
7+
from typing import Tuple, TypeVar
88
from dataclasses import dataclass
99
from random import choices
1010

@@ -26,66 +26,18 @@ def __post_init__(self):
2626
assert self.message != ''
2727

2828

29-
@dataclass
30-
class Omikuji:
31-
"""
32-
おみくじのコアロジック
33-
ガチャではないので排出率を公開するメソッドはあえて実装されていない
34-
"""
35-
entries: dict[Hashable, OmikujiResult]
36-
37-
def draw(self) -> Tuple[Hashable, OmikujiResult]:
38-
"""
39-
おみくじを引く
40-
"""
41-
return choices(
42-
population=list(self.entries.items()),
43-
weights=list(
44-
map(lambda entry: entry.appearance, self.entries.values())),
45-
k=1
46-
)[0]
47-
29+
TOmikujiEnum = TypeVar('TOmikujiEnum')
30+
OmikujiResults = dict[TOmikujiEnum, OmikujiResult]
4831

49-
# 以下おみくじの設定
5032

51-
omikuji = Omikuji({
52-
'DAI_KICHI': OmikujiResult(
53-
200,
54-
":tada: 大吉 何でもうまくいく!!気がする!!"
55-
),
56-
'CHU_KICHI': OmikujiResult(
57-
2000,
58-
":smile: 中吉 そこそこうまくいくかも!?"
59-
),
60-
'SHO_KICHI': OmikujiResult(
61-
3800,
62-
":smily: 小吉 なんとなくうまくいくかも!?"
63-
),
64-
65-
'KICHI': OmikujiResult(
66-
3000,
67-
":smirk: 吉 まあうまくいくかも!?"
68-
),
69-
'HATO_KICHI': OmikujiResult(
70-
900,
71-
":dove_of_peace: 鳩吉 お前が鳩になる番だ!!羽ばたけ!!!飛べ!!!!唐揚げになれ!!!!!"
72-
),
73-
74-
'KYO': OmikujiResult(
75-
75,
76-
":cry: 凶 ちょっと慎重にいったほうがいいかも……"
77-
),
78-
79-
'DAI_KYO': OmikujiResult(
80-
25,
81-
":crying_cat_face: 大凶 そういう時もあります……猫になって耐えましょう"
82-
),
83-
84-
})
85-
86-
87-
def draw() -> str:
33+
def draw(entries: OmikujiResults) -> Tuple[TOmikujiEnum, OmikujiResult]:
8834
"""
89-
おみくじ抽選
35+
おみくじを引く
9036
"""
91-
return omikuji.draw()[1].message
37+
38+
return choices(
39+
population=list(entries.items()),
40+
weights=list(
41+
map(lambda entry: entry.appearance, entries.values())),
42+
k=1
43+
)[0]

plugins/hato.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import os
88
import re
9+
from enum import Enum, auto
910
from logging import getLogger
1011
from tempfile import NamedTemporaryFile
1112
from typing import List
@@ -22,7 +23,7 @@
2223
from library.hatokaraage import hato_ha_karaage
2324
from library.clientclass import BaseClient
2425
from library.jma_amesh import jma_amesh
25-
from library.omikuji import draw as omikuji_draw
26+
from library.omikuji import OmikujiResult, OmikujiResults, draw as omikuji_draw
2627
logger = getLogger(__name__)
2728

2829

@@ -277,8 +278,63 @@ def yoshiyoshi(client: BaseClient):
277278
client.post('よしよし')
278279

279280

281+
# 以下おみくじの設定
282+
# Refer: dev-hato/hato-bot#876
283+
class OmikujiEnum(Enum):
284+
"""
285+
おみくじの結果一覧
286+
"""
287+
DAI_KICHI = auto()
288+
CHU_KICHI = auto()
289+
SHO_KICHI = auto()
290+
KICHI = auto()
291+
SUE_KICHI = auto()
292+
AGE_KICHI = auto()
293+
KYO = auto()
294+
DAI_KYO = auto()
295+
296+
297+
omikuji_results = OmikujiResults({
298+
OmikujiEnum.DAI_KICHI: OmikujiResult(
299+
12,
300+
":tada: 大吉 何でもうまくいく!!気がする!!"
301+
),
302+
OmikujiEnum.KICHI: OmikujiResult(
303+
100,
304+
":smirk: 吉 まあうまくいくかも!?"
305+
),
306+
OmikujiEnum.CHU_KICHI: OmikujiResult(
307+
100,
308+
":smile: 中吉 そこそこうまくいくかも!?"
309+
),
310+
OmikujiEnum.SHO_KICHI: OmikujiResult(
311+
100,
312+
":smily: 小吉 なんとなくうまくいくかも!?"
313+
),
314+
OmikujiEnum.SUE_KICHI: OmikujiResult(
315+
37,
316+
":expressionless: 末吉 まあ多分うまくいくかもね……!?"
317+
),
318+
OmikujiEnum.AGE_KICHI: OmikujiResult(
319+
2,
320+
":poultry_leg: 揚げ吉 鳩を揚げると良いことあるよ!!"
321+
),
322+
OmikujiEnum.KYO: OmikujiResult(
323+
12,
324+
":cry: 凶 ちょっと慎重にいったほうがいいかも……"
325+
),
326+
OmikujiEnum.DAI_KYO: OmikujiResult(
327+
2,
328+
":crying_cat_face: 大凶 そういう時もあります……猫になって耐えましょう"
329+
),
330+
})
331+
332+
280333
def omikuji(client: BaseClient):
281334
"""
282335
おみくじ結果を返す
283336
"""
284-
client.post(message=omikuji_draw())
337+
338+
logger.debug("%s called 'hato yoshiyoshi'", client.get_send_user())
339+
logger.debug("%s app called 'hato yoshiyoshi'", client.get_type())
340+
client.post(omikuji_draw(omikuji_results)[1].message)

tests/library/test_omikuji.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
import unittest
66

7-
from library.omikuji import OmikujiResult, Omikuji
7+
from enum import Enum, auto
8+
from library.omikuji import OmikujiResult, OmikujiResults, draw
89

910

1011
class TestOmikuji(unittest.TestCase):
@@ -16,9 +17,19 @@ def test_omikuji_minimum(self):
1617
"""
1718
おみくじの実装が正常か
1819
"""
19-
dummy_omikuji = Omikuji(entries={
20-
'KICHI': OmikujiResult(1, "吉"),
21-
'SUE_KICHI': OmikujiResult(1, "末吉"),
20+
class DummyOmikujiEnum(Enum):
21+
"""
22+
おみくじ設定(ダミー)
23+
"""
24+
KICHI = auto()
25+
SUE_KICHI = auto()
26+
27+
dummy_omikuji_results = OmikujiResults({
28+
DummyOmikujiEnum.KICHI: OmikujiResult(1, "吉"),
29+
DummyOmikujiEnum.SUE_KICHI: OmikujiResult(1, "末吉"),
2230
})
2331

24-
self.assertIn(dummy_omikuji.draw()[0], dummy_omikuji.entries.keys())
32+
self.assertIn(
33+
draw(dummy_omikuji_results)[0],
34+
dummy_omikuji_results.keys()
35+
)

tests/plugins/test_hato.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@
1010
import requests_mock
1111

1212
import slackbot_settings as conf
13-
from plugins.hato import split_command, amesh, altitude, yoshiyoshi, omikuji
13+
from plugins.hato import split_command, amesh, altitude, yoshiyoshi, omikuji, omikuji_results
1414
from tests.library.test_geo import set_mock
1515
from tests.plugins import TestClient
1616

17-
from library.omikuji import omikuji as omikuji_instance
18-
1917

2018
class TestSplitCommand(unittest.TestCase):
2119
"""
@@ -241,16 +239,14 @@ class TestOmikuji(unittest.TestCase):
241239

242240
def test_omikuji(self):
243241
"""
244-
登録されたメッセージのいずれかが返ってくることのみ確認
242+
設定したおみくじ結果のうち1つが返ってくる
245243
"""
244+
246245
client1 = TestClient()
247246
omikuji(client1)
248247
self.assertIn(
249248
client1.get_post_message(),
250-
list(map(
251-
lambda e: e.message,
252-
omikuji_instance.entries.values()
253-
))
249+
map(lambda e: e.message, omikuji_results.values())
254250
)
255251

256252

0 commit comments

Comments
 (0)