Slide 1

Slide 1 text

Autodoc ʹ͍ͭͯ େࡕ Python Ϣʔβͷू·Γ 2014/03 2014.03.13 @heavenshell 14೥3݄14೔༵ۚ೔

Slide 2

Slide 2 text

͓·͑ɺ୭Α Software engineer, Programmer py-qiita, py-jokk, vim-pydocstring, vim-jsdoc, vim- connpass, etc — Python, Vim, Vimperator PHP, Perl, Java, JavaScript ޷͖ͳ Python ͷඪ४ؔ਺͸ print() ͱ dir() 14೥3݄14೔༵ۚ೔

Slide 3

Slide 3 text

My contribution 14೥3݄14೔༵ۚ೔

Slide 4

Slide 4 text

My contribution 14೥3݄14೔༵ۚ೔

Slide 5

Slide 5 text

My contribution 14೥3݄14೔༵ۚ೔

Slide 6

Slide 6 text

My contribution 14೥3݄14೔༵ۚ೔

Slide 7

Slide 7 text

My best pull request @2013 14೥3݄14೔༵ۚ೔

Slide 8

Slide 8 text

14೥3݄14೔༵ۚ೔

Slide 9

Slide 9 text

14೥3݄14೔༵ۚ೔

Slide 10

Slide 10 text

14೥3݄14೔༵ۚ೔

Slide 11

Slide 11 text

orz 14೥3݄14೔༵ۚ೔

Slide 12

Slide 12 text

Autodoc 14೥3݄14೔༵ۚ೔

Slide 13

Slide 13 text

14೥3݄14೔༵ۚ೔

Slide 14

Slide 14 text

ࠓճ͸ Sphinx ͷAutodoc ͞Μ Ͱ͸ͳ͘ผͷ Autodoc ͞Μ 14೥3݄14೔༵ۚ೔

Slide 15

Slide 15 text

14೥3݄14೔༵ۚ೔

Slide 16

Slide 16 text

14೥3݄14೔༵ۚ೔

Slide 17

Slide 17 text

3BDLBQQMJDBUJPOͰ࣮૷͞Εͨ"1*ʹରͯ͠ɺ 34QFDͰॻ͔ΕͨςετΛݩʹ"1*υΩϡϝϯτΛੜ ੒͢Δ΋ͷɻςετΛ࣮ߦ͢Δͱɺςετதʹൃߦ ͨ͠ϦΫΤετ΍Ϩεϙϯεɺͦͷςετʹ෇͚ΒΕ ͨϝοηʔδΛݩʹɺྑ͍ײ͡ʹ৘ใΛ·ͱΊɺ .BSLEPXOܗࣜͰ"1*υΩϡϝϯτΛهͨ͠ϑΝΠϧ Λੜ੒ͯ͘͠ΕΔɻྫ͑͹(JU)VCͰ͸.BSLEPXOϑ ΝΠϧΛద౰ʹඳըͯ͘͠ΕΔͷͰɺԼਤͷΑ͏ʹ (JU)VC্Ͱ؆୯ʹυΩϡϝϯτΛӾཡग़དྷΔΑ͏ʹ ͳΔɻ http://r7kamura.github.io/2013/12/01/autodoc.html 14೥3݄14೔༵ۚ೔

Slide 18

Slide 18 text

ࠓ๺࢈ۀ RSpec Ͱ API αʔόʹରͯ͠ςετΛॻ͘ ϦΫΤετͱϨεϙϯεͷ಺༰Λ Markdown Ͱग़ྗ ςετ͔ΒυΩϡϝϯτੜ੒ͯ͘͠Εͯศར 14೥3݄14೔༵ۚ೔

Slide 19

Slide 19 text

ࣗಈతʹυΩϡϝϯτΛੜ੒Ͱ͖Δͷ͸ૉ੖Β͍͠ ςετΛ࣮ߦ͢ΔͱυΩϡϝϯτ͕ੜ੒͞ΕΔͷ͸ϝϯ ςφϯείετ͕௿͍ ࣮ࡏ͢Δ API ʹର࣮ͯ͠ߦ͢ΔͷͰɺੜ͖ͨυΩϡϝ ϯτ υΩϡϝϯτΛࣗಈੜ੒͞ΕΔϝϦοτ͸ Python Ϣʔβ ʔ͸ྑ͘஌ͬͯΔ 14೥3݄14೔༵ۚ೔

Slide 20

Slide 20 text

ଞݴޠʹΑΔ࣮૷ 14೥3݄14೔༵ۚ೔

Slide 21

Slide 21 text

Test::JsonAPI::Autodoc http://moznion.hatenadiary.com/entry/ 2013/11/02/232144 14೥3݄14೔༵ۚ೔

Slide 22

Slide 22 text

ॻ͖ํ͸ͪΐͬͱҟͳΔ͚ Ͳςετ͔ΒυΩϡϝϯτ Λग़ྗ͢Δͷ͸ಉ͡ 14೥3݄14೔༵ۚ೔

Slide 23

Slide 23 text

Py-Autodoc http://github.com/heavenshell/py-autodoc 14೥3݄14೔༵ۚ೔

Slide 24

Slide 24 text

ରԠͯ͠ΔςετFW Unittest py.test nose ֬ೝͯ͠ͳ͍͚Ͳଟ෼ಈ͘ 14೥3݄14೔༵ۚ೔

Slide 25

Slide 25 text

from unittest import TestCase from webtest import TestApp from autodoc import autodoc from tests.app import create_app class TestUnittest(TestCase): def setUp(self): app = create_app self.client = TestApp(app) @classmethod @autodoc.generate('var/test_unittest.rst') def tearDownClass(cls): pass @autodoc.describe('POST /foo/bar') def test_foo_bar(self): """ POST /foo/bar """ param = {'id': 1, 'message': 'foo'} res = self.client.post_json('/foo/bar', params=param) self.assertEqual(res.status_code, 200) return res 14೥3݄14೔༵ۚ೔

Slide 26

Slide 26 text

from unittest import TestCase from webtest import TestApp from autodoc import autodoc from tests.app import create_app class TestUnittest(TestCase): def setUp(self): app = create_app self.client = TestApp(app) @classmethod @autodoc.generate('var/test_unittest.rst') def tearDownClass(cls): pass @autodoc.describe('POST /foo/bar') def test_foo_bar(self): """ POST /foo/bar """ param = {'id': 1, 'message': 'foo'} res = self.client.post_json('/foo/bar', params=param) self.assertEqual(res.status_code, 200) return res 14೥3݄14೔༵ۚ೔

Slide 27

Slide 27 text

from unittest import TestCase from webtest import TestApp from autodoc import autodoc from tests.app import create_app class TestUnittest(TestCase): def setUp(self): app = create_app self.client = TestApp(app) @classmethod @autodoc.generate('var/test_unittest.rst') def tearDownClass(cls): pass @autodoc.describe('POST /foo/bar') def test_foo_bar(self): """ POST /foo/bar """ param = {'id': 1, 'message': 'foo'} res = self.client.post_json('/foo/bar', params=param) self.assertEqual(res.status_code, 200) return res 14೥3݄14೔༵ۚ೔

Slide 28

Slide 28 text

from unittest import TestCase from webtest import TestApp from autodoc import autodoc from tests.app import create_app class TestUnittest(TestCase): def setUp(self): app = create_app self.client = TestApp(app) @classmethod @autodoc.generate('var/test_unittest.rst') def tearDownClass(cls): pass @autodoc.describe('POST /foo/bar') def test_foo_bar(self): """ POST /foo/bar """ param = {'id': 1, 'message': 'foo'} res = self.client.post_json('/foo/bar', params=param) self.assertEqual(res.status_code, 200) return res 14೥3݄14೔༵ۚ೔

Slide 29

Slide 29 text

14೥3݄14೔༵ۚ೔

Slide 30

Slide 30 text

import sys import pytest from webtest import TestApp from autodoc import autodoc @autodoc.generate('var/test_pytest.md', template='templates/markdown.md') def teardown_module(module): pass @autodoc.describe('GET /') def test_index(): app = TestApp(create_app) res = app.get('/') assert res.status_code == 200 return res 14೥3݄14೔༵ۚ೔

Slide 31

Slide 31 text

import sys import pytest from webtest import TestApp from autodoc import autodoc @autodoc.generate('var/test_pytest.md', template='templates/markdown.md') def teardown_module(module): pass @autodoc.describe('GET /') def test_index(): app = TestApp(create_app) res = app.get('/') assert res.status_code == 200 return res 14೥3݄14೔༵ۚ೔

Slide 32

Slide 32 text

import sys import pytest from webtest import TestApp from autodoc import autodoc @autodoc.generate('var/test_pytest.md', template='templates/markdown.md') def teardown_module(module): pass @autodoc.describe('GET /') def test_index(): app = TestApp(create_app) res = app.get('/') assert res.status_code == 200 return res 14೥3݄14೔༵ۚ೔

Slide 33

Slide 33 text

import sys import pytest from webtest import TestApp from autodoc import autodoc @autodoc.generate('var/test_pytest.md', template='templates/markdown.md') def teardown_module(module): pass @autodoc.describe('GET /') def test_index(): app = TestApp(create_app) res = app.get('/') assert res.status_code == 200 return res 14೥3݄14೔༵ۚ೔

Slide 34

Slide 34 text

14೥3݄14೔༵ۚ೔

Slide 35

Slide 35 text

ςετΫϥΠΞϯτʹ WebTest Λ࢖༻ͯ͠Δ @autodoc.describe ͰυΩϡϝϯτΛग़ྗ͢Δϝιο υ/ؔ਺Λఆٛ͢Δ @autodoc.generete ͰσίϨʔτͨ͠ϝιου/ؔ਺ ͕࣮ߦ͞ΕͨλΠϛϯάͰυΩϡϝϯτΛग़ྗ 14೥3݄14೔༵ۚ೔

Slide 36

Slide 36 text

υΩϡϝϯτΛੜ੒͢ΔλΠϛϯά͸ςετϝιο υ/ؔ਺͝ͱʹ͢Ε͹ɺϝιου/ؔ਺୯ҐͰυΩϡϝ ϯτΛग़ྗͰ͖Δ tearDownClass Έ͍ͨͷ৔߹ɺ࣮ߦͨ͠શͯͷϝιο υΛ 1 ϑΝΠϧʹग़ྗ͢Δ ໪࿦ reStracturedText ʹରԠ͍ͯ͠Δ 14೥3݄14೔༵ۚ೔

Slide 37

Slide 37 text

ςϯϓϨʔτ͸ࣗ෼Ͱ࡞੒Մೳ ͨͩ͠String.template Λ࢖ͬͯΔͨΊࣗ༝౓͕௿͍ Ruby ͸ඪ४Ͱ ERB Λ࣋ͬͯΔͷ͕ત·͍͠ Python ΋ϏϧτΠϯͰ΋͏গ͠ߴػೳͳςϯϓϨ ʔτΤϯδϯཉ͍͠ 14೥3݄14೔༵ۚ೔

Slide 38

Slide 38 text

࣮૷͸γϯϓϧ(ʹͨͭ͠΋Γ) @autodoc.describe Ͱ return ͨ͠ response ΦϒδΣ ΫτΛύʔεͯ͠Ϧετʹ֨ೲ @autodoc.generate ͕࣮ߦͨ͠ΒϦετͷதΛϑΝΠ ϧʹग़ྗ 14೥3݄14೔༵ۚ೔

Slide 39

Slide 39 text

੍໿ ඞͣςετϝιου/ؔ਺Ͱ WebTest ͷϨεϙϯεΛ Ԡ౴͢Δඞཁ͋Γ Ruby ͷ autodoc ͸ Rack-Test Λ࢖͏ͱ last_response ͔ΒϨεϙϯεΛऔಘͯ͠Δ͚ͲɺWebTest ʹͦΜͳ ͷ͸ແ͍ͷͰ return ͯ͠ड͚औΔ࢓༷ Flask(ͱ͍͏͔Werkzueg)ͷςετΫϥΠΞϯτ΋ର Ԡ͠Α͏͔ͱࢥ͚ͬͨͲɺResponse ʹ Request Φϒ δΣΫτ͕֨ೲ͞Εͯͳ͍ͷͰμϝͩͬͨ 14೥3݄14೔༵ۚ೔

Slide 40

Slide 40 text

·ͱΊ Autodoc ࡞ͬͨ ςετΛ࣮ߦ͢ΔͱυΩϡϝϯτΛੜ੒ͯ͘͠ΕΔͷ ͸ศར σίϨʔλͬͯศར Web API ΛԠ౴͢ΔϞοΫαʔόͱ૊Έ߹ΘͤΕ͹ υΩϡϝϯτΛઌʹ࡞Δࣄ΋Մೳ ͜Ε͸͍͔ͭ·ͨ࿩͍ͨ͠ 14೥3݄14೔༵ۚ೔

Slide 41

Slide 41 text

Thank you! Any Questions? 14೥3݄14೔༵ۚ೔