Skip to content

Instantly share code, notes, and snippets.

@drillbits
Created May 11, 2013 06:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drillbits/5559109 to your computer and use it in GitHub Desktop.
Save drillbits/5559109 to your computer and use it in GitHub Desktop.
venusian 使って、デコレータを定義、スキャン、呼び出しした例
# -*- coding: utf-8 -*-
import sys
import unittest
class WorkTest(unittest.TestCase):
def _makeOne(self):
from working import work
return work
def _callFUT(self, num):
"""Function Under Test."""
func = self._makeOne()
return func(num)
def setUp(self):
"""Patch stdout."""
import io
self.default_out = sys.stdout
self.dummy_out = io.StringIO()
sys.stdout = self.dummy_out
def tearDown(self):
"""Revert stdout."""
sys.stdout = self.default_out
def test_one(self):
self._callFUT(3)
self.dummy_out.seek(0)
self.assertEqual(
self.dummy_out.getvalue(),
'ワイワイ!\nワイワイ!\nワイワイ!\n'
)
if __name__ == '__main__':
unittest.main()
# -*- coding: utf-8 -*-
from datetime import datetime
import venusian
def teiji(hours, minutes):
"""定時出社チェック"""
def _teiji(func):
def callback(scanner, name, ob):
def wrapper(*args, **kwargs):
now = datetime.now()
teiji_date = datetime(
now.year,
now.month,
now.day,
hours,
minutes
)
if now < teiji_date:
func(*args, **kwargs)
else:
print('定時出社大失敗!')
scanner.registry[name] = wrapper
venusian.attach(func, callback)
return func
return _teiji
@teiji(9, 0)
def work(num):
for i in range(num):
print('ワイワイ!')
if __name__ == '__main__':
import sys
registry = {}
scanner = venusian.Scanner(registry=registry)
# 自分自身をモジュールとして渡す方法
scanner.scan(sys.modules[__name__])
# 関数を呼び出す
# pyramid はフレームワークの内部でこういう呼び出しをしている
registry['work'](3)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment