Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_check_yields_docs.py 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. # Copyright (c) 2016-2017 Claudiu Popa <pcmanticore@gmail.com>
  2. # Copyright (c) 2016 Derek Gustafson <degustaf@gmail.com>
  3. # Copyright (c) 2016 Glenn Matthews <glenn@e-dad.net>
  4. # Copyright (c) 2016 Ashley Whetter <ashley@awhetter.co.uk>
  5. # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  6. # For details: https://github.com/PyCQA/pylint/blob/master/COPYING
  7. """Unit tests for the yield documentation checking in the
  8. `DocstringChecker` in :mod:`pylint.extensions.check_docs`
  9. """
  10. from __future__ import division, print_function, absolute_import
  11. import astroid
  12. from pylint.testutils import CheckerTestCase, Message, set_config
  13. from pylint.extensions.docparams import DocstringParameterChecker
  14. class TestDocstringCheckerYield(CheckerTestCase):
  15. """Tests for pylint_plugin.RaiseDocChecker"""
  16. CHECKER_CLASS = DocstringParameterChecker
  17. def test_ignores_no_docstring(self):
  18. yield_node = astroid.extract_node('''
  19. def my_func(self):
  20. yield False #@
  21. ''')
  22. with self.assertNoMessages():
  23. self.checker.visit_yield(yield_node)
  24. @set_config(accept_no_yields_doc=False)
  25. def test_warns_no_docstring(self):
  26. node = astroid.extract_node('''
  27. def my_func(self):
  28. yield False
  29. ''')
  30. yield_node = node.body[0]
  31. with self.assertAddsMessages(
  32. Message(msg_id='missing-yield-doc', node=node),
  33. Message(msg_id='missing-yield-type-doc', node=node)):
  34. self.checker.visit_yield(yield_node)
  35. def test_ignores_unknown_style(self):
  36. yield_node = astroid.extract_node('''
  37. def my_func(self):
  38. """This is a docstring."""
  39. yield False #@
  40. ''')
  41. with self.assertNoMessages():
  42. self.checker.visit_yield(yield_node)
  43. def test_warn_partial_sphinx_yields(self):
  44. node = astroid.extract_node('''
  45. def my_func(self):
  46. """This is a docstring.
  47. :returns: Always False
  48. """
  49. yield False
  50. ''')
  51. yield_node = node.body[0]
  52. with self.assertAddsMessages(
  53. Message(msg_id='missing-yield-type-doc', node=node)):
  54. self.checker.visit_yield(yield_node)
  55. def test_warn_partial_sphinx_yields_type(self):
  56. node = astroid.extract_node('''
  57. def my_func(self):
  58. """This is a docstring.
  59. :rtype: bool
  60. """
  61. yield False
  62. ''')
  63. yield_node = node.body[0]
  64. with self.assertAddsMessages(
  65. Message(msg_id='missing-yield-doc', node=node)):
  66. self.checker.visit_yield(yield_node)
  67. def test_warn_missing_sphinx_yields(self):
  68. node = astroid.extract_node('''
  69. def my_func(self, doc_type):
  70. """This is a docstring.
  71. :param doc_type: Sphinx
  72. :type doc_type: str
  73. """
  74. yield False
  75. ''')
  76. yield_node = node.body[0]
  77. with self.assertAddsMessages(
  78. Message(msg_id='missing-yield-doc', node=node),
  79. Message(msg_id='missing-yield-type-doc', node=node)):
  80. self.checker.visit_yield(yield_node)
  81. def test_warn_partial_google_yields(self):
  82. node = astroid.extract_node('''
  83. def my_func(self):
  84. """This is a docstring.
  85. Yields:
  86. Always False
  87. """
  88. yield False
  89. ''')
  90. yield_node = node.body[0]
  91. with self.assertAddsMessages(
  92. Message(msg_id='missing-yield-type-doc', node=node)):
  93. self.checker.visit_yield(yield_node)
  94. def test_warn_partial_google_yields_type(self):
  95. node = astroid.extract_node('''
  96. def my_func(self):
  97. """This is a docstring.
  98. Yields:
  99. bool:
  100. """
  101. yield False
  102. ''')
  103. yield_node = node.body[0]
  104. with self.assertAddsMessages(
  105. Message(msg_id='missing-yield-doc', node=node)):
  106. self.checker.visit_yield(yield_node)
  107. def test_warn_missing_google_yields(self):
  108. node = astroid.extract_node('''
  109. def my_func(self, doc_type):
  110. """This is a docstring.
  111. Parameters:
  112. doc_type (str): Google
  113. """
  114. yield False
  115. ''')
  116. yield_node = node.body[0]
  117. with self.assertAddsMessages(
  118. Message(msg_id='missing-yield-doc', node=node),
  119. Message(msg_id='missing-yield-type-doc', node=node)):
  120. self.checker.visit_yield(yield_node)
  121. def test_warn_missing_numpy_yields(self):
  122. node = astroid.extract_node('''
  123. def my_func(self, doc_type):
  124. """This is a docstring.
  125. Arguments
  126. ---------
  127. doc_type : str
  128. Numpy
  129. """
  130. yield False
  131. ''')
  132. yield_node = node.body[0]
  133. with self.assertAddsMessages(
  134. Message(msg_id='missing-yield-doc', node=node),
  135. Message(msg_id='missing-yield-type-doc', node=node)):
  136. self.checker.visit_yield(yield_node)
  137. def test_find_sphinx_yields(self):
  138. yield_node = astroid.extract_node('''
  139. def my_func(self):
  140. """This is a docstring.
  141. :return: Always False
  142. :rtype: bool
  143. """
  144. yield False #@
  145. ''')
  146. with self.assertNoMessages():
  147. self.checker.visit_yield(yield_node)
  148. def test_find_google_yields(self):
  149. yield_node = astroid.extract_node('''
  150. def my_func(self):
  151. """This is a docstring.
  152. Yields:
  153. bool: Always False
  154. """
  155. yield False #@
  156. ''')
  157. with self.assertNoMessages():
  158. self.checker.visit_yield(yield_node)
  159. def test_find_numpy_yields(self):
  160. yield_node = astroid.extract_node('''
  161. def my_func(self):
  162. """This is a docstring.
  163. Yields
  164. -------
  165. bool
  166. Always False
  167. """
  168. yield False #@
  169. ''')
  170. with self.assertNoMessages():
  171. self.checker.visit_yield(yield_node)
  172. def test_finds_sphinx_yield_custom_class(self):
  173. yield_node = astroid.extract_node('''
  174. def my_func(self):
  175. """This is a docstring.
  176. :returns: An object
  177. :rtype: :class:`mymodule.Class`
  178. """
  179. yield mymodule.Class() #@
  180. ''')
  181. with self.assertNoMessages():
  182. self.checker.visit_yield(yield_node)
  183. def test_finds_google_yield_custom_class(self):
  184. yield_node = astroid.extract_node('''
  185. def my_func(self):
  186. """This is a docstring.
  187. Yields:
  188. mymodule.Class: An object
  189. """
  190. yield mymodule.Class() #@
  191. ''')
  192. with self.assertNoMessages():
  193. self.checker.visit_yield(yield_node)
  194. def test_finds_numpy_yield_custom_class(self):
  195. yield_node = astroid.extract_node('''
  196. def my_func(self):
  197. """This is a docstring.
  198. Yields
  199. -------
  200. mymodule.Class
  201. An object
  202. """
  203. yield mymodule.Class() #@
  204. ''')
  205. with self.assertNoMessages():
  206. self.checker.visit_yield(yield_node)
  207. def test_finds_sphinx_yield_list_of_custom_class(self):
  208. yield_node = astroid.extract_node('''
  209. def my_func(self):
  210. """This is a docstring.
  211. :returns: An object
  212. :rtype: list(:class:`mymodule.Class`)
  213. """
  214. yield [mymodule.Class()] #@
  215. ''')
  216. with self.assertNoMessages():
  217. self.checker.visit_yield(yield_node)
  218. def test_finds_google_yield_list_of_custom_class(self):
  219. yield_node = astroid.extract_node('''
  220. def my_func(self):
  221. """This is a docstring.
  222. Yields:
  223. list(:class:`mymodule.Class`): An object
  224. """
  225. yield [mymodule.Class()] #@
  226. ''')
  227. with self.assertNoMessages():
  228. self.checker.visit_yield(yield_node)
  229. def test_finds_numpy_yield_list_of_custom_class(self):
  230. yield_node = astroid.extract_node('''
  231. def my_func(self):
  232. """This is a docstring.
  233. Yields
  234. -------
  235. list(:class:`mymodule.Class`)
  236. An object
  237. """
  238. yield [mymodule.Class()] #@
  239. ''')
  240. with self.assertNoMessages():
  241. self.checker.visit_yield(yield_node)
  242. def test_warns_sphinx_yield_list_of_custom_class_without_description(self):
  243. node = astroid.extract_node('''
  244. def my_func(self):
  245. """This is a docstring.
  246. :rtype: list(:class:`mymodule.Class`)
  247. """
  248. yield [mymodule.Class()]
  249. ''')
  250. yield_node = node.body[0]
  251. with self.assertAddsMessages(
  252. Message(msg_id='missing-yield-doc', node=node)):
  253. self.checker.visit_yield(yield_node)
  254. def test_warns_google_yield_list_of_custom_class_without_description(self):
  255. node = astroid.extract_node('''
  256. def my_func(self):
  257. """This is a docstring.
  258. Yields:
  259. list(:class:`mymodule.Class`):
  260. """
  261. yield [mymodule.Class()]
  262. ''')
  263. yield_node = node.body[0]
  264. with self.assertAddsMessages(
  265. Message(msg_id='missing-yield-doc', node=node)):
  266. self.checker.visit_yield(yield_node)
  267. def test_warns_numpy_yield_list_of_custom_class_without_description(self):
  268. node = astroid.extract_node('''
  269. def my_func(self):
  270. """This is a docstring.
  271. Yields
  272. -------
  273. list(:class:`mymodule.Class`)
  274. """
  275. yield [mymodule.Class()]
  276. ''')
  277. yield_node = node.body[0]
  278. with self.assertAddsMessages(
  279. Message(msg_id='missing-yield-doc', node=node)):
  280. self.checker.visit_yield(yield_node)
  281. # No such thing as redundant yield documentation for sphinx because it
  282. # doesn't support yield documentation
  283. def test_ignores_google_redundant_yield_doc_multiple_yields(self):
  284. node = astroid.extract_node('''
  285. def my_func(self):
  286. """This is a docstring.
  287. Yields:
  288. int or None: One, or sometimes None.
  289. """
  290. if a_func():
  291. yield None
  292. yield 1
  293. ''')
  294. with self.assertNoMessages():
  295. self.checker.visit_functiondef(node)
  296. def test_ignores_numpy_redundant_yield_doc_multiple_yields(self):
  297. node = astroid.extract_node('''
  298. def my_func(self):
  299. """This is a docstring.
  300. Yields
  301. -------
  302. int
  303. One
  304. None
  305. Sometimes
  306. """
  307. if a_func():
  308. yield None
  309. yield 1
  310. ''')
  311. with self.assertNoMessages():
  312. self.checker.visit_functiondef(node)
  313. # No such thing as redundant yield documentation for sphinx because it
  314. # doesn't support yield documentation
  315. def test_warns_google_redundant_yield_doc_return(self):
  316. node = astroid.extract_node('''
  317. def my_func(self):
  318. """This is a docstring.
  319. Yields:
  320. int: One
  321. """
  322. return 1
  323. ''')
  324. with self.assertAddsMessages(
  325. Message(msg_id='redundant-yields-doc', node=node)):
  326. self.checker.visit_functiondef(node)
  327. def test_warns_numpy_redundant_yield_doc_return(self):
  328. node = astroid.extract_node('''
  329. def my_func(self):
  330. """This is a docstring.
  331. Yields
  332. -------
  333. int
  334. One
  335. """
  336. return 1
  337. ''')
  338. with self.assertAddsMessages(
  339. Message(msg_id='redundant-yields-doc', node=node)):
  340. self.checker.visit_functiondef(node)