рд╡рд╛рдкрд╕реА
рдЖрдорддреМрд░ рдкрд░, рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВред рдпрд╣ рдЕрдзреНрдпрд╛рдп рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдХреНрд╕рд░ рдкреНрд░рднрд╛рд╡реА рдФрд░ рдХреБрд╢рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдХреЛрдИ рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдБ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд╕реНрд╡рд╛рдж рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рджреЗрдВрдЧреЗред

рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг Python 3.6 рдФрд░ pytest 3.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ 3.2 рдкрд╛рдпрдерди 2.6, 2.7, рдФрд░ рдкрд╛рдпрдерди 3.3+ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ pragprog.com рдкрд░ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ (рдЖрдкрдХреЗ рд╣рд╛рде рдЕрдирдЯреВрдЯ рд╣реЛ рдЧрдП рд╣реИрдВ!), рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣рд╛рдБ, рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░, рдЗрд░реЗрдЯрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рдПрдХ рдЪрд░реНрдЪрд╛ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИред
рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛ pdb: рдбрд┐рдмрдЧрд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛
pdb
рдореЙрдбреНрдпреВрд▓ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд╛рдпрдерди рдбрд┐рдмрдЧрд░ рд╣реИред рдЖрдк --pdb
рдЙрдкрдпреЛрдЧ --pdb
рддрд╛рдХрд┐ pytest рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░реЗред рдЖрдЗрдП рдЯрд╛рд╕реНрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ pdb
ред
64 рдкреГрд╖реНрда рдкрд░ "рдкреИрд░рд╛рдореАрдЯрд░ рдлрд┐рдХреНрд╕рд┐рдВрдЧ" рдореЗрдВ, рд╣рдордиреЗ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЯрд╛рд╕реНрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛:
$ cd /path/to/code/ch3/c/tasks_proj $ pytest --tb=no -q .........................................FF.FFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.FFF........... 42 failed, 54 passed in 4.74 seconds
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рджреЗрдЦреЗрдВ рдХрд┐ pdb
рд╣рдореЗрдВ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдбреАрдмрдЧрд┐рдВрдЧ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдкреГрд╖реНрда 9 рдкрд░ "рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬрд╛рдВрдЪ рдХреА рдереА:
--tb=[auto/long/short/line/native/no]
: рдЯреНрд░реЗрд╕ рд╕реНрдЯрд╛рдЗрд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред-v / --verbose
: рдЙрди рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдирд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рд╕ рдпрд╛ рдЕрд╕рдлрд▓ рд╣реБрдПред-l / --showlocals
: рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рдЖрдЧреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред-lf / --last-failed
: рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред-x / --exitfirst
: рдкрд╣рд▓реА рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдкрд░реАрдХреНрд╖рдг рд╕рддреНрд░ -x / --exitfirst
ред--pdb
: рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
MongoDB рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдзреНрдпрд╛рдп 3 рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреЗрдЬ 49 рдкрд░ тАЬрдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдлрд┐рдХреНрд╕реНрдЪрд░тАЭ, MongoDB
рдФрд░ pymongo
рд╕реНрдерд╛рдкрдирд╛ рдХреЛ MongoDB рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ https://www.mongodb.com/download-center рдкрд░ рдкрд╛рдП рдЧрдП рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде pymongo рд╕реНрдерд╛рдкрд┐рдд: pip install pymongo
ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ MongoDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред MongoDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдбрд┐рдмрдЧрд░ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк code/ch2/
рд╕реЗ pytest рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрдИ рд╡рд┐рдлрд▓ рдкрд░реАрдХреНрд╖рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╣рдордиреЗ code/ch3/c
рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдордиреЗ рдЯреНрд░реЗрд╕рдмреИрдХ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╛рдо рдирд╣реАрдВ рджреЗрдЦреЗ рдХреНрдпреЛрдВрдХрд┐ --tb=no
рдЕрдиреБрд░реЗрдЦрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ --verbose
рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рд╡рд┐рд╕реНрддреГрдд рдкрд╛рда рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ (рддреАрди рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ):
$ pytest --tb=no --verbose --lf --maxfail=3 ============================= test session starts ============================= collected 96 items / 52 deselected run-last-failure: rerun previous 44 failures tests/func/test_add.py::test_add_returns_valid_id[mongo] ERROR [ 2%] tests/func/test_add.py::test_added_task_has_id_set[mongo] ERROR [ 4%] tests/func/test_add.py::test_add_increases_count[mongo] ERROR [ 6%] =================== 52 deselected, 3 error in 0.72 seconds ====================
рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд░рд╣реЗред рдЪрд▓реЛ рдЙрдирдореЗрдВ рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, -x
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, --tb=no
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ -l
рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рдЪрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:
$ pytest -v --lf -l -x ===================== test session starts ====================== run-last-failure: rerun last 42 failures collected 96 items tests/func/test_add.py::test_add_returns_valid_id[mongo] FAILED =========================== FAILURES =========================== _______________ test_add_returns_valid_id[mongo] _______________ tasks_db = None def test_add_returns_valid_id(tasks_db): """tasks.add(<valid task>) should return an integer.""" # GIVEN an initialized tasks db # WHEN a new task is added # THEN returned task_id is of type int new_task = Task('do something') task_id = tasks.add(new_task) > assert isinstance(task_id, int) E AssertionError: assert False E + where False = isinstance(ObjectId('59783baf8204177f24cb1b68'), int) new_task = Task(summary='do something', owner=None, done=False, id=None) task_id = ObjectId('59783baf8204177f24cb1b68') tasks_db = None tests/func/test_add.py:16: AssertionError !!!!!!!!!!!! Interrupted: stopping after 1 failures !!!!!!!!!!!! ===================== 54 tests deselected ====================== =========== 1 failed, 54 deselected in 2.47 seconds ============
рдХрд╛рдлреА рдмрд╛рд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рдХреНрдпреЛрдВ рд╣реБрдЖред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ task_id
рдкреВрд░реНрдгрд╛рдВрдХ рдирд╣реАрдВ рд╣реИ - рдпрд╣ ObjectId рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред ObjectId рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП MongoDB рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред tasksdb_pymongo.py
рд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдмрд╛рдХреА рд╕рд┐рд╕реНрдЯрдо рд╕реЗ MongoDB рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдерд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ pdb рдХрд╛ рдЙрдкрдпреЛрдЧ pytest рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдЪрд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рдХреНрдпреЛрдВ рд╣реБрдЖред рд╣рдо pytest рдХреЛ рдПрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╕рд╣реА рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ --pdb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
$ pytest -v --lf -x --pdb ===================== test session starts ====================== run-last-failure: rerun last 42 failures collected 96 items tests/func/test_add.py::test_add_returns_valid_id[mongo] FAILED >>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>> tasks_db = None def test_add_returns_valid_id(tasks_db): """tasks.add(<valid task>) should return an integer.""" # GIVEN an initialized tasks db # WHEN a new task is added # THEN returned task_id is of type int new_task = Task('do something') task_id = tasks.add(new_task) > assert isinstance(task_id, int) E AssertionError: assert False E + where False = isinstance(ObjectId('59783bf48204177f2a786893'), int) tests/func/test_add.py:16: AssertionError >>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>> > /path/to/code/ch3/c/tasks_proj/tests/func/test_add.py(16) > test_add_returns_valid_id() -> assert isinstance(task_id, int) (Pdb)
рдЕрдм рд╣рдо рдкреНрд░рд╛рдВрдкреНрдЯ (Pdb) рдкрд░ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ pdb рдбреАрдмрдЧрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╣реИред рдХреНрд░реИрд╢ рджреЗрдЦрддреЗ рд╕рдордп, рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрди рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
p/print expr
: exp рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИредpp expr
: рд╕реБрдВрджрд░ pp expr
рдХреЗ рдореВрд▓реНрдп рдкреНрд░рд┐рдВрдЯредl/list
: рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд┐рдВрджреБ рдФрд░ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдХреЛрдб рдХреА рдкрд╛рдВрдЪ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИредl/list begin,end
: рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд╛рдЗрди рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИредa/args
: рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИредu/up
: рд╕реНрдЯреИрдХ рдкрде рдХреЛ рдПрдХ рд╕реНрддрд░ рдКрдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИредd/down
: рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдореЗрдВ рдПрдХ рд╕реНрддрд░ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИредq/quit
: рдПрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рддреНрд░ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдиреНрдп рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрдорд╛рдВрдб, рдЬреИрд╕реЗ рдХрд┐ рдЪрд░рдг рдФрд░ рдЕрдЧрд▓рд╛, рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореБрдЦрд░ рдХрдерди рдореЗрдВ рд╕рд╣реА рдмреИрдареЗ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рдЪрд░ рдирд╛рдо рднреА рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП p/print expr
-l/--showlocals
рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
(Pdb) p new_task Task(summary='do something', owner=None, done=False, id=None) (Pdb) p task_id ObjectId('59783bf48204177f2a786893') (Pdb)
рдЕрдм рдЖрдк рдбрд┐рдмрдЧрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
(Pdb) q !!!!!!!!!!!! Interrupted: stopping after 1 failures !!!!!!!!!!!! ===================== 54 tests deselected ====================== ========== 1 failed, 54 deselected in 123.40 seconds ===========
рдЕрдЧрд░ рд╣рдордиреЗ -
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ рдЕрдЧрд▓реЗ рдЯреЗрд╕реНрдЯ рдореЗрдВ pytb рдлрд┐рд░ рд╕реЗ Pdb рдЦреЛрд▓реЗрдЧрд╛ред Pdb рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рдпрдерди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред
Coverage.py: рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг
рдХреЛрдб рдХрд╡рд░реЗрдЬ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдХрд╛рд░реНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдХрд╛рд░реНрдп рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдХреЗ рд╕рд╛рде рдирд╣реАрдВред
рдХреЛрдб рдХрд╡рд░реЗрдЬ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдирджреЗрдЦреЗ рд╣реИрдВред
Coverage.py
рдПрдХ рдкрд╕рдВрджреАрджрд╛ рдкрд╛рдЗрдерди рдХрд╡рд░реЗрдЬ рдЯреВрд▓ рд╣реИ рдЬреЛ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред
рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рд░реНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдХреЛ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ pytest-cov
рдирд╛рдордХ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЛрдЯ рдирд╣реАрдВ pytest-cov
, рдЬреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд pytest рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде pytest рд╕реЗ coverage.py
рдУрд░реЗрдХрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ coverage
pytest-cov
рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдмрд╕ pytest-cov
рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдпрд╣ coverage.py
pytest-cov
рд▓реЗ рдЬрд╛рдПрдЧрд╛:
$ pip install pytest-cov Collecting pytest-cov Using cached pytest_cov-2.5.1-py2.py3-none-any.whl Collecting coverage>=3.7.1 (from pytest-cov) Using cached coverage-4.4.1-cp36-cp36m-macosx_10_10_x86 ... Installing collected packages: coverage, pytest-cov Successfully installed coverage-4.4.1 pytest-cov-2.5.1
рдЪрд▓реЛ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЯрд╛рд╕реНрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 2 рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
$ pip uninstall tasks Uninstalling tasks-0.1.0: /path/to/venv/bin/tasks /path/to/venv/lib/python3.6/site-packages/tasks.egg-link Proceed (y/n)? y Successfully uninstalled tasks-0.1.0 $ cd /path/to/code/ch7/tasks_proj_v2 $ pip install -e . Obtaining file:///path/to/code/ch7/tasks_proj_v2 ... Installing collected packages: tasks Running setup.py develop for tasks Successfully installed tasks $ pip list ... tasks (0.1.1, /path/to/code/ch7/tasks_proj_v2/src) ...
рдЕрдм рдЬрдм рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрдЧрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрдзрд╛рд░ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
$ cd /path/to/code/ch7/tasks_proj_v2 $ pytest --cov=src ===================== test session starts ====================== plugins: mock-1.6.2, cov-2.5.1 collected 62 items tests/func/test_add.py ... tests/func/test_add_variety.py ............................ tests/func/test_add_variety2.py ............ tests/func/test_api_exceptions.py ......... tests/func/test_unique_id.py . tests/unit/test_cli.py ..... tests/unit/test_task.py .... ---------- coverage: platform darwin, python 3.6.2-final-0 ----------- Name Stmts Miss Cover -------------------------------------------------- src\tasks\__init__.py 2 0 100% src\tasks\api.py 79 22 72% src\tasks\cli.py 45 14 69% src\tasks\config.py 18 12 33% src\tasks\tasksdb_pymongo.py 74 74 0% src\tasks\tasksdb_tinydb.py 32 4 88% -------------------------------------------------- TOTAL 250 126 50% ================== 62 passed in 0.47 seconds ===================
рдЪреВрдБрдХрд┐ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ tasks_proj_v2
, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рд╕реНрд░реЛрдд рдХреЛрдб src рдореЗрдВ рд╣реИ, --cov=src
рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЗрд╡рд▓ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд╛рдлреА рдХрдо рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 0% рдХрд╡рд░реЗрдЬ рд╣реИред рдпреЗ рдЙрдкрдпреЛрдЧреА рд░рд┐рдорд╛рдЗрдВрдбрд░ рд╣реИрдВ: tasksdb_pymongo.py
0% рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ MongoDB рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛рдлреА рдХрдо рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдЗрдо рдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд╡рд░реЗрдЬ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдЕрдзрд┐рдХ рд╣реИ: api.py
рдФрд░ tasksdb_tinydb.py
ред рдЖрдЗрдП tasksdb_tinydb.py
рдкрд░ рдПрдХ рдирдЬрд╝рд░ tasksdb_tinydb.py
рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ HTML рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдлрд┐рд░ рд╕реЗ - --cov-report=html
рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ --cov-report=html
рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА:
$ pytest --cov=src --cov-report=html ===================== test session starts ====================== plugins: mock-1.6.2, cov-2.5.1 collected 62 items tests/func/test_add.py ... tests/func/test_add_variety.py ............................ tests/func/test_add_variety2.py ............ tests/func/test_api_exceptions.py ......... tests/func/test_unique_id.py . tests/unit/test_cli.py ..... tests/unit/test_task.py .... ---------- coverage: platform darwin, python 3.6.2-final-0 ----------- Coverage HTML written to dir htmlcov ================== 62 passed in 0.45 seconds ===================
рдЖрдк рдирд┐рдореНрди рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ htmlcov/index.html
рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

tasksdb_tinydb.py
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреАред рдХрд╡рд░ рдХреА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХрд┐рддрдиреА рд▓рд╛рдЗрдиреЗрдВ рдХрд╡рд░ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдХрд┐рддрдиреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд▓рд╛рдкрддрд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░реАрди рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рднрд▓реЗ рд╣реА рдпрд╣ рд╕реНрдХреНрд░реАрди рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкреГрд╖реНрда рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
- рд╣рдо рд╕реНрд╡рд╛рдореА рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде
list_tasks()
рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред - рд╣рдо
update()
рдпрд╛ delete()
рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред - рд╢рд╛рдпрдж рд╣рдо
unique_id()
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣рдорд╛рд░реА TO-DO рдкрд░реАрдХреНрд╖рдг рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдЙрдкрдХрд░рдг рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, 100% рдХрд╡рд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рднреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреВрд▓реНрд╕ рдХреА рддрд░рд╣, рдХреЛрдб рдХрд╡рд░реЗрдЬ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЛрдЪ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ coverage.py
pytest-cov
рдФрд░ pytest-cov
coverage.py
рджреЗрдЦреЗрдВред
рдирдХрд▓реА: рд╕рд┐рд╕реНрдЯрдо рднрд╛рдЧреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
рдореЙрдХ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдХреА рдХреЛрдб рд╕реЗ рдЯреЗрд╕реНрдЯ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореЙрдХ - рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрднреА-рдХрднреА рдЯреЗрд╕реНрдЯ рдбрдмрд▓реНрд╕, рдЬрд╛рд╕реВрд╕, рдлреЗрдХ рдпрд╛ рд╕реНрдЯрдмреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдордВрдХреАрдкреИрдХ рд╕реНрдерд┐рд░рддрд╛ (рдкреГрд╖реНрда 85 рдкрд░ рдордВрдХреАрдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд) рдФрд░ рдирдХрд▓реА рдХреЗ рдмреАрдЪ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рджреЛрд╣рд░реА рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЪреЗрддрд╛рд╡рдиреА! рдирдХрд▓реА рдФрд░ рдмрд╣реБрдд рдЕрдЬреАрдм
рдпрджрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдкрд╣рд▓реА рдмрд╛рд░ рдореЙрдХ, рд╕реНрдЯрдмреНрд╕, рдФрд░ рдЬрд╛рд╕реВрд╕ рдЬреИрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЬреБрдбрд╝рд╡рд╛рдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдЗрдП! рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдмрд╣реБрдд рддреЗрдЬ, рдордЬрд╛рдХрд┐рдпрд╛, рдпрджреНрдпрдкрд┐ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реЛрдЧрд╛ред
mock
рдкреИрдХреЗрдЬ рдорд╛рдирдХ рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдпрдерди 3.3 рдХреЗ рдмрд╛рдж рд╕реЗ unittest.mock
ред рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ PyPI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдкрд╛рдпрдерди 2.6 рд╕реЗ рд▓реЗрдЯреЗрд╕реНрдЯ рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ mock
рдкрд╛рдпрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╡реАрдирддрдо mock
рдкрд╛рдпрдерди рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, pytest рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, pytest-mock
рдирд╛рдордХ рдПрдХ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдореЙрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддреА рд╣реИрдВред
рдЯрд╛рд╕реНрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП mock
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред Coverage.py рдореЗрдВ: рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ рдХрд┐ рдХреЛрдб рдХрд┐рддрдирд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдкреГрд╖реНрда 129 рдкрд░ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдорд╛рд░реА cli.py
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рдЗрд╕реЗ рдЕрдм рдареАрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд░рдгрдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рдЯрд╛рд╕реНрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди api.py
рдорд╛рдзреНрдпрдо рд╕реЗ api.py
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕реАрдПрд▓рдЖрдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЧреАрд▓рд╛ рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рд┐рд╕реНрдЯрдо рд╕реАрдПрд▓рдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рднреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдореЛрдХреА рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
CLI рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдХреНрд▓рд┐рдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╛рдпрдерди argparse
рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдореЙрдбреНрдпреВрд▓ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓рд┐рдХ рдХреЛ рдЪреБрдирдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЗрдВрдЬрди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдХреНрд▓рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, cli.py
рдореЗрдВ рдХреЛрдб, рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреНрд▓рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЦрд╛рд╕рд┐рдпрдд рд╣реИ, рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред
рдЪрд▓реЛ рдзреАрдорд╛ рдХрд░реЗрдВ рдФрд░ рдХрд╛рд░реНрдп рдХреЗ рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
$ cd /path/to/code/ $ pip install -e ch7/tasks_proj_v2 ... Successfully installed tasks
рдЗрд╕ рдЦрдВрдб рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдореЗрдВ, рдЖрдк "рд╕реВрдЪреА" рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЖрдЗрдП рдЗрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:
рдЕрдиреБрд╡рд╛рджрдХ рдиреЛрдЯ: рд╡рд┐рдВрдбреЛрдЬ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рддреНрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
- рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
tasks_db
рдирд╛рдо рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП c:\Users\User_1\tasks_db\
рдЕрдиреНрдпрдерд╛, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - >> FileNotFoundError: [Errno 2] рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВ: 'c: \ Users \ User_1 // рдХрд╛рд░реНрдп_db // рдХрд╛рд░реНрдп_db.json' - рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдХреЗ рдмрдЬрд╛рдп рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдиреНрдпрдерд╛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
'рдХреБрдЫ рдорд╣рд╛рди рдХрд░реЛ'
рдЙрдкрдпреЛрдЧ: рдХрд╛рд░реНрдп рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ [рд╡рд┐рдХрд▓реНрдк] рд╕рд╛рд░рд╛рдВрд╢
рдорджрдж рдХреЗ рд▓рд┐рдП "рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ -h" рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ (рдХреБрдЫ рдорд╣рд╛рди ')
$ tasks list ID owner done summary -- ----- ---- ------- $ tasks add 'do something great' $ tasks add "repeat" -o Brian $ tasks add "again and again" --owner Okken $ tasks list ID owner done summary -- ----- ---- ------- 1 False do something great 2 Brian False repeat 3 Okken False again and again $ tasks list -o Brian ID owner done summary -- ----- ---- ------- 2 Brian False repeat $ tasks list --owner Brian ID owner done summary -- ----- ---- ------- 2 Brian False repeat
рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИред tasks list
рдХрдорд╛рдВрдб рд╣реЗрдбрд┐рдВрдЧ рдХреЗ рддрд╣рдд рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдкрд░ рднреА рд╢реАрд░реНрд╖рдХ рдореБрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ рдПрдХ рдорд╛рд▓рд┐рдХ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ -o
рдпрд╛ --owner
ред рдФрд░ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ? рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдореЛрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдПрдордУрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрд╕реНрдЯ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╡реНрд╣рд╛рдЗрдЯ-рдмреЙрдХреНрд╕ рдЯреЗрд╕реНрдЯ рд╣реИрдВ , рдФрд░ рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдФрд░ рдХрд╣рд╛рдВ рдмрд▓реНрд▓реЗрдмрд╛рдЬреА рдХрд░реЗрдВрдЧреЗред рдореБрдЦреНрдп рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдпрд╣рд╛рдВ рд╣реИ:
ch7 / task_proj_v2 / src / рдХрд╛рд░реНрдпреЛрдВ / cli.py
if __name__ == '__main__': tasks_cli()
рдпрд╣ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдХреЙрд▓ tasks_cli()
:
ch7 / task_proj_v2 / src / рдХрд╛рд░реНрдпреЛрдВ / cli.py
@click.group(context_settings={'help_option_names': ['-h', '--help']}) @click.version_option(version='0.1.1') def tasks_cli(): """Run the tasks application.""" pass
рдЬрд╛рд╣рд┐рд░ рд╣реИ? рдирд╣реАрдВред рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рдпрд╣ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдЪреНрдЫрд╛ (рдпрд╛ рдмреБрд░рд╛) рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ list
рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
ch7 / task_proj_v2 / src / рдХрд╛рд░реНрдпреЛрдВ / cli.py
@tasks_cli.command(name="list", help="list tasks") @click.option('-o', '--owner', default=None, help='list tasks with this owner') def list_tasks(owner): """ . , . """ formatstr = "{: >4} {: >10} {: >5} {}" print(formatstr.format('ID', 'owner', 'done', 'summary')) print(formatstr.format('--', '-----', '----', '-------')) with _tasks_db(): for t in tasks.list_tasks(owner): done = 'True' if t.done else 'False' owner = '' if t.owner is None else t.owner print(formatstr.format( t.id, owner, done, t.summary))
рдЬрдм рдЖрдкрдХреЛ рдХреНрд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрджрдд рд╣реЛ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдХреЛрдб рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкреБрд╕реНрддрдХ рдХрд╛ рдлреЛрдХрд╕ рдирд╣реАрдВ рд╣реИ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рд╣реА рдХреЛрдб рд╣реИ, рд╡реИрд╕реЗ рднреА, рдорд╛рдирд╡ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдмрд╣реБрдд рдЬрдЧрд╣ рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реЗрдЯ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрд╣ list_tasks(owner)
рдХрд╛рд░реНрдп list_tasks(owner)
рдлрд╝рдВрдХреНрд╢рди рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: tasks_db()
, рдЬреЛ рдХрд┐ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рд╣реИ, рдФрд░ tasks.list_tasks(owner)
, рдЬреЛ API рдлрд╝рдВрдХреНрд╢рди рд╣реИред
рд╣рдо tasks_db()
рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдХрд▓реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП mock
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ list_tasks
рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди tasks.list_tasks()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рдЬреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред
tasks_db()
рдмрд╛рд╣рд░ tasks_db()
, рдЖрдЗрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВ:
рд╡рд╛рдкрд╕реА