exercism-analysis 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. checksums.yaml +7 -0
  2. data/exercism-analysis.gemspec +30 -0
  3. data/lib/exercism-analysis.rb +38 -0
  4. data/lib/exercism-analysis/adapters/adapter.rb +23 -0
  5. data/lib/exercism-analysis/adapters/clojure.rb +13 -0
  6. data/lib/exercism-analysis/adapters/go.rb +19 -0
  7. data/lib/exercism-analysis/adapters/javascript.rb +13 -0
  8. data/lib/exercism-analysis/adapters/python.rb +13 -0
  9. data/lib/exercism-analysis/adapters/ruby.rb +19 -0
  10. data/lib/exercism-analysis/analysis.rb +18 -0
  11. data/lib/exercism-analysis/analyzers/analyzer.rb +54 -0
  12. data/lib/exercism-analysis/analyzers/clojure/kibit.rb +25 -0
  13. data/lib/exercism-analysis/analyzers/go/golint.rb +23 -0
  14. data/lib/exercism-analysis/analyzers/javascript/jslint.rb +24 -0
  15. data/lib/exercism-analysis/analyzers/python/pylint.rb +24 -0
  16. data/lib/exercism-analysis/analyzers/ruby/control_flow.rb +21 -0
  17. data/lib/exercism-analysis/analyzers/ruby/enumerable_condition.rb +21 -0
  18. data/lib/exercism-analysis/analyzers/ruby/for_loop.rb +29 -0
  19. data/lib/exercism-analysis/analyzers/ruby/indentation.rb +21 -0
  20. data/lib/exercism-analysis/analyzers/ruby/iter_mutation.rb +37 -0
  21. data/lib/exercism-analysis/analyzers/ruby/output.rb +20 -0
  22. data/lib/exercism-analysis/analyzers/ruby/range.rb +28 -0
  23. data/lib/exercism-analysis/analyzers/ruby/roodi.rb +19 -0
  24. data/lib/exercism-analysis/analyzers/ruby/send.rb +25 -0
  25. data/lib/exercism-analysis/analyzers/ruby/shebang.rb +23 -0
  26. data/lib/exercism-analysis/analyzers/ruby/tab.rb +38 -0
  27. data/lib/exercism-analysis/processors/call_processor.rb +39 -0
  28. data/lib/exercism-analysis/processors/control_flow_processor.rb +27 -0
  29. data/lib/exercism-analysis/processors/enumerable_condition_processor.rb +31 -0
  30. data/lib/exercism-analysis/processors/for_loop_processor.rb +21 -0
  31. data/lib/exercism-analysis/processors/indentation_processor.rb +69 -0
  32. data/lib/exercism-analysis/processors/iter_mutation_processor.rb +50 -0
  33. data/lib/exercism-analysis/processors/processor.rb +34 -0
  34. data/lib/exercism-analysis/processors/range_processor.rb +23 -0
  35. data/lib/exercism-analysis/processors/send_processor.rb +23 -0
  36. data/lib/exercism-analysis/templates/each_to_map.rb +29 -0
  37. data/lib/exercism-analysis/templates/each_to_select.rb +31 -0
  38. data/lib/exercism-analysis/templates/range_exclusive.rb +19 -0
  39. data/lib/exercism-analysis/templates/template.rb +29 -0
  40. data/vendor/clojure/kibit-runner/LICENSE +214 -0
  41. data/vendor/clojure/kibit-runner/project.clj +10 -0
  42. data/vendor/clojure/kibit-runner/src/kibit_runner/core.clj +17 -0
  43. data/vendor/clojure/kibit-runner/target/kibit-runner-0.1.0-SNAPSHOT-standalone.jar +0 -0
  44. data/vendor/clojure/kibit-runner/target/kibit-runner-0.1.0-SNAPSHOT.jar +0 -0
  45. data/vendor/clojure/kibit-runner/target/stale/extract-native.dependencies +1 -0
  46. data/vendor/go/src/github.com/golang/lint/LICENSE +27 -0
  47. data/vendor/go/src/github.com/golang/lint/README +59 -0
  48. data/vendor/go/src/github.com/golang/lint/golint/golint.go +67 -0
  49. data/vendor/go/src/github.com/golang/lint/lint.go +1061 -0
  50. data/vendor/go/src/runner/golint_runner.go +23 -0
  51. data/vendor/javascript/jshint_runner.js +6 -0
  52. data/vendor/javascript/node_modules/jshint/README.md +47 -0
  53. data/vendor/javascript/node_modules/jshint/bin/apply +6 -0
  54. data/vendor/javascript/node_modules/jshint/bin/build +36 -0
  55. data/vendor/javascript/node_modules/jshint/bin/changelog +36 -0
  56. data/vendor/javascript/node_modules/jshint/bin/jshint +3 -0
  57. data/vendor/javascript/node_modules/jshint/bin/land +34 -0
  58. data/vendor/javascript/node_modules/jshint/data/ascii-identifier-data.js +22 -0
  59. data/vendor/javascript/node_modules/jshint/data/non-ascii-identifier-part-only.js +1570 -0
  60. data/vendor/javascript/node_modules/jshint/data/non-ascii-identifier-start.js +48477 -0
  61. data/vendor/javascript/node_modules/jshint/dist/jshint-rhino.js +60642 -0
  62. data/vendor/javascript/node_modules/jshint/dist/jshint.js +60525 -0
  63. data/vendor/javascript/node_modules/jshint/node_modules/cli/README.md +196 -0
  64. data/vendor/javascript/node_modules/jshint/node_modules/cli/cli.js +1139 -0
  65. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/cat.js +17 -0
  66. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/command.js +16 -0
  67. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/echo.js +54 -0
  68. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/glob.js +6 -0
  69. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/long_desc.js +20 -0
  70. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/progress.js +11 -0
  71. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/sort.js +18 -0
  72. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/spinner.js +9 -0
  73. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/static.coffee +27 -0
  74. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/static.js +25 -0
  75. data/vendor/javascript/node_modules/jshint/node_modules/cli/index.js +1 -0
  76. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE +27 -0
  77. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/README.md +250 -0
  78. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js +9 -0
  79. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js +9 -0
  80. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js +728 -0
  81. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  82. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md +42 -0
  83. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  84. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  85. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json +51 -0
  86. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js +25 -0
  87. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/package.json +58 -0
  88. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js +176 -0
  89. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js +63 -0
  90. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json +351 -0
  91. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js +55 -0
  92. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js +19 -0
  93. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js +118 -0
  94. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js +10 -0
  95. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js +113 -0
  96. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js +73 -0
  97. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js +36 -0
  98. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js +39 -0
  99. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js +46 -0
  100. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js +32 -0
  101. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js +11 -0
  102. data/vendor/javascript/node_modules/jshint/node_modules/cli/package.json +70 -0
  103. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/LICENCE +19 -0
  104. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/README.md +33 -0
  105. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/index.js +86 -0
  106. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/LICENCE +19 -0
  107. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/README.md +45 -0
  108. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/index.js +5 -0
  109. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/package.json +89 -0
  110. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/seed.js +16 -0
  111. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/test/index.js +28 -0
  112. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/test/static/index.html +10 -0
  113. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/package.json +88 -0
  114. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/index.js +67 -0
  115. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/static/index.html +12 -0
  116. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js +53 -0
  117. data/vendor/javascript/node_modules/jshint/node_modules/exit/Gruntfile.js +48 -0
  118. data/vendor/javascript/node_modules/jshint/node_modules/exit/LICENSE-MIT +22 -0
  119. data/vendor/javascript/node_modules/jshint/node_modules/exit/README.md +75 -0
  120. data/vendor/javascript/node_modules/jshint/node_modules/exit/lib/exit.js +41 -0
  121. data/vendor/javascript/node_modules/jshint/node_modules/exit/package.json +69 -0
  122. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/exit_test.js +121 -0
  123. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stderr.txt +10 -0
  124. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stdout-stderr.txt +20 -0
  125. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stdout.txt +10 -0
  126. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stderr.txt +100 -0
  127. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stdout-stderr.txt +200 -0
  128. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stdout.txt +100 -0
  129. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stderr.txt +1000 -0
  130. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stdout-stderr.txt +2000 -0
  131. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stdout.txt +1000 -0
  132. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/create-files.sh +8 -0
  133. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/log-broken.js +23 -0
  134. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/log.js +25 -0
  135. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/LICENSE +18 -0
  136. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/README.md +83 -0
  137. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/CollectingHandler.js +55 -0
  138. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/FeedHandler.js +95 -0
  139. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Parser.js +337 -0
  140. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/ProxyHandler.js +27 -0
  141. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Stream.js +35 -0
  142. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Tokenizer.js +891 -0
  143. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/WritableStream.js +21 -0
  144. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/index.js +68 -0
  145. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/LICENSE +11 -0
  146. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/index.js +14 -0
  147. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/package.json +40 -0
  148. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/readme.md +1 -0
  149. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/LICENSE +11 -0
  150. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/index.js +211 -0
  151. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/package.json +68 -0
  152. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/readme.md +102 -0
  153. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/01-basic.json +57 -0
  154. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/02-single_tag_1.json +21 -0
  155. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/03-single_tag_2.json +21 -0
  156. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/04-unescaped_in_script.json +27 -0
  157. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/05-tags_in_comment.json +18 -0
  158. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/06-comment_in_script.json +18 -0
  159. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/07-unescaped_in_style.json +20 -0
  160. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/08-extra_spaces_in_tag.json +20 -0
  161. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/09-unquoted_attrib.json +20 -0
  162. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/10-singular_attribute.json +15 -0
  163. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/11-text_outside_tags.json +40 -0
  164. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/12-text_only.json +11 -0
  165. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/13-comment_in_text.json +19 -0
  166. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/14-comment_in_text_in_script.json +18 -0
  167. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/15-non-verbose.json +22 -0
  168. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/16-normalize_whitespace.json +47 -0
  169. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/17-xml_namespace.json +18 -0
  170. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/18-enforce_empty_tags.json +16 -0
  171. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/19-ignore_empty_tags.json +20 -0
  172. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/20-template_script_tags.json +20 -0
  173. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/21-conditional_comments.json +15 -0
  174. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/22-lowercase_tags.json +41 -0
  175. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/23-dom-lvl1.json +121 -0
  176. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/tests.js +58 -0
  177. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/LICENSE +11 -0
  178. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/index.js +14 -0
  179. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/helpers.js +141 -0
  180. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/legacy.js +87 -0
  181. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/manipulation.js +77 -0
  182. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/querying.js +94 -0
  183. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/stringify.js +93 -0
  184. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/traversal.js +24 -0
  185. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/package.json +71 -0
  186. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/readme.md +1 -0
  187. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/fixture.js +6 -0
  188. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/tests/helpers.js +89 -0
  189. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/tests/legacy.js +119 -0
  190. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/utils.js +9 -0
  191. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/LICENSE +11 -0
  192. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/index.js +31 -0
  193. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/decode.js +72 -0
  194. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js +26 -0
  195. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/encode.js +48 -0
  196. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/decode.json +1 -0
  197. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/entities.json +1 -0
  198. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/legacy.json +1 -0
  199. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/xml.json +1 -0
  200. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/package.json +79 -0
  201. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/readme.md +31 -0
  202. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/test/mocha.opts +2 -0
  203. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/test/test.js +150 -0
  204. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/LICENSE +18 -0
  205. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/README.md +15 -0
  206. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/duplex.js +1 -0
  207. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/float.patch +923 -0
  208. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js +89 -0
  209. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js +46 -0
  210. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js +944 -0
  211. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js +209 -0
  212. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js +472 -0
  213. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/README.md +3 -0
  214. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/float.patch +604 -0
  215. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/lib/util.js +107 -0
  216. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/package.json +53 -0
  217. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/util.js +106 -0
  218. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/LICENSE +16 -0
  219. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/README.md +42 -0
  220. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/inherits.js +1 -0
  221. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/inherits_browser.js +23 -0
  222. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/package.json +51 -0
  223. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/test.js +25 -0
  224. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/README.md +54 -0
  225. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/build/build.js +209 -0
  226. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/component.json +19 -0
  227. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/index.js +3 -0
  228. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/package.json +54 -0
  229. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/LICENSE +20 -0
  230. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/README.md +7 -0
  231. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/index.js +200 -0
  232. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/package.json +53 -0
  233. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/package.json +68 -0
  234. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js +1 -0
  235. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/readable.js +7 -0
  236. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/transform.js +1 -0
  237. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/writable.js +1 -0
  238. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/package.json +90 -0
  239. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/01-events.js +9 -0
  240. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/02-stream.js +23 -0
  241. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/03-feed.js +19 -0
  242. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Atom_Example.xml +25 -0
  243. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Attributes.html +16 -0
  244. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Basic.html +1 -0
  245. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/RDF_Example.xml +63 -0
  246. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/RSS_Example.xml +48 -0
  247. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/01-simple.json +44 -0
  248. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/02-template.json +63 -0
  249. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/03-lowercase_tags.json +46 -0
  250. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/04-cdata.json +50 -0
  251. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/05-cdata-special.json +35 -0
  252. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/06-leading-lt.json +16 -0
  253. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/07-self-closing.json +67 -0
  254. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/08-implicit-close-tags.json +59 -0
  255. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/09-attributes.json +68 -0
  256. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/10-crazy-attrib.json +52 -0
  257. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/11-script_in_script.json +54 -0
  258. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/12-long-comment-end.json +20 -0
  259. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/13-long-cdata-end.json +22 -0
  260. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/14-implicit-open-tags.json +27 -0
  261. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/15-lt-whitespace.json +16 -0
  262. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/16-double_attribs.json +45 -0
  263. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/17-numeric_entities.json +16 -0
  264. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/18-legacy_entities.json +16 -0
  265. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/19-named_entities.json +16 -0
  266. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/20-xml_entities.json +16 -0
  267. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/21-entity_in_attribute.json +38 -0
  268. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/22-double_brackets.json +41 -0
  269. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/23-legacy_entity_fail.json +16 -0
  270. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/24-special_special.json +133 -0
  271. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/25-empty_tag_name.json +13 -0
  272. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/26-not-quite-closed.json +35 -0
  273. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/27-entities_in_attributes.json +62 -0
  274. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/28-cdata_in_html.json +9 -0
  275. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/29-comment_edge-cases.json +18 -0
  276. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/30-cdata_edge-cases.json +22 -0
  277. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/01-rss.js +34 -0
  278. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/02-atom.js +18 -0
  279. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/03-rdf.js +20 -0
  280. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/01-basic.json +83 -0
  281. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/02-RSS.json +1093 -0
  282. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/03-Atom.json +644 -0
  283. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/04-RDF.json +1399 -0
  284. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/05-Attributes.json +354 -0
  285. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/api.js +63 -0
  286. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/test-helper.js +83 -0
  287. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/LICENSE +23 -0
  288. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/README.md +218 -0
  289. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/minimatch.js +1061 -0
  290. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +14 -0
  291. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
  292. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
  293. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +252 -0
  294. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json +50 -0
  295. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js +369 -0
  296. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
  297. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
  298. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
  299. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
  300. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
  301. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json +58 -0
  302. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
  303. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
  304. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/package.json +57 -0
  305. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/basic.js +399 -0
  306. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/brace-expand.js +33 -0
  307. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/caching.js +14 -0
  308. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/defaults.js +274 -0
  309. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  310. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/LICENSE +26 -0
  311. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/README.md +569 -0
  312. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/bin/shjs +51 -0
  313. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/global.js +3 -0
  314. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/make.js +47 -0
  315. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/package.json +61 -0
  316. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/scripts/generate-docs.js +21 -0
  317. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js +50 -0
  318. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/shell.js +157 -0
  319. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cat.js +43 -0
  320. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cd.js +19 -0
  321. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/chmod.js +208 -0
  322. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/common.js +203 -0
  323. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cp.js +201 -0
  324. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/dirs.js +191 -0
  325. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/echo.js +20 -0
  326. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/error.js +10 -0
  327. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/exec.js +181 -0
  328. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/find.js +51 -0
  329. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/grep.js +52 -0
  330. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/ln.js +53 -0
  331. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/ls.js +126 -0
  332. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/mkdir.js +68 -0
  333. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/mv.js +80 -0
  334. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/popd.js +1 -0
  335. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/pushd.js +1 -0
  336. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/pwd.js +11 -0
  337. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/rm.js +145 -0
  338. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/sed.js +43 -0
  339. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/tempdir.js +56 -0
  340. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/test.js +85 -0
  341. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/to.js +29 -0
  342. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/toEnd.js +29 -0
  343. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/which.js +83 -0
  344. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/cli.js +41 -0
  345. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/package.json +76 -0
  346. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/readme.md +74 -0
  347. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/strip-json-comments.js +64 -0
  348. data/vendor/javascript/node_modules/jshint/node_modules/underscore/LICENSE +23 -0
  349. data/vendor/javascript/node_modules/jshint/node_modules/underscore/README.md +22 -0
  350. data/vendor/javascript/node_modules/jshint/node_modules/underscore/package.json +66 -0
  351. data/vendor/javascript/node_modules/jshint/node_modules/underscore/underscore-min.js +6 -0
  352. data/vendor/javascript/node_modules/jshint/node_modules/underscore/underscore.js +1343 -0
  353. data/vendor/javascript/node_modules/jshint/package.json +80 -0
  354. data/vendor/javascript/node_modules/jshint/src/cli.js +731 -0
  355. data/vendor/javascript/node_modules/jshint/src/jshint.js +5023 -0
  356. data/vendor/javascript/node_modules/jshint/src/lex.js +1650 -0
  357. data/vendor/javascript/node_modules/jshint/src/messages.js +223 -0
  358. data/vendor/javascript/node_modules/jshint/src/platforms/rhino.js +115 -0
  359. data/vendor/javascript/node_modules/jshint/src/reg.js +38 -0
  360. data/vendor/javascript/node_modules/jshint/src/reporters/checkstyle.js +81 -0
  361. data/vendor/javascript/node_modules/jshint/src/reporters/default.js +34 -0
  362. data/vendor/javascript/node_modules/jshint/src/reporters/jslint_xml.js +57 -0
  363. data/vendor/javascript/node_modules/jshint/src/reporters/non_error.js +52 -0
  364. data/vendor/javascript/node_modules/jshint/src/state.js +28 -0
  365. data/vendor/javascript/node_modules/jshint/src/style.js +143 -0
  366. data/vendor/javascript/node_modules/jshint/src/vars.js +658 -0
  367. data/vendor/python/astroid/COPYING +339 -0
  368. data/vendor/python/astroid/COPYING.LESSER +510 -0
  369. data/vendor/python/astroid/ChangeLog +574 -0
  370. data/vendor/python/astroid/MANIFEST.in +9 -0
  371. data/vendor/python/astroid/README +56 -0
  372. data/vendor/python/astroid/README.Python3 +26 -0
  373. data/vendor/python/astroid/__init__.py +118 -0
  374. data/vendor/python/astroid/__init__.pyc +0 -0
  375. data/vendor/python/astroid/__pkginfo__.py +48 -0
  376. data/vendor/python/astroid/__pkginfo__.pyc +0 -0
  377. data/vendor/python/astroid/announce.txt +23 -0
  378. data/vendor/python/astroid/as_string.py +496 -0
  379. data/vendor/python/astroid/as_string.pyc +0 -0
  380. data/vendor/python/astroid/bases.py +618 -0
  381. data/vendor/python/astroid/bases.pyc +0 -0
  382. data/vendor/python/astroid/brain/py2gi.py +159 -0
  383. data/vendor/python/astroid/brain/py2gi.pyc +0 -0
  384. data/vendor/python/astroid/brain/py2mechanize.py +20 -0
  385. data/vendor/python/astroid/brain/py2mechanize.pyc +0 -0
  386. data/vendor/python/astroid/brain/py2qt4.py +25 -0
  387. data/vendor/python/astroid/brain/py2qt4.pyc +0 -0
  388. data/vendor/python/astroid/brain/py2stdlib.py +252 -0
  389. data/vendor/python/astroid/brain/py2stdlib.pyc +0 -0
  390. data/vendor/python/astroid/builder.py +238 -0
  391. data/vendor/python/astroid/builder.pyc +0 -0
  392. data/vendor/python/astroid/exceptions.py +51 -0
  393. data/vendor/python/astroid/exceptions.pyc +0 -0
  394. data/vendor/python/astroid/inference.py +393 -0
  395. data/vendor/python/astroid/inference.pyc +0 -0
  396. data/vendor/python/astroid/inspector.py +275 -0
  397. data/vendor/python/astroid/manager.py +336 -0
  398. data/vendor/python/astroid/manager.pyc +0 -0
  399. data/vendor/python/astroid/mixins.py +122 -0
  400. data/vendor/python/astroid/mixins.pyc +0 -0
  401. data/vendor/python/astroid/node_classes.py +928 -0
  402. data/vendor/python/astroid/node_classes.pyc +0 -0
  403. data/vendor/python/astroid/nodes.py +73 -0
  404. data/vendor/python/astroid/nodes.pyc +0 -0
  405. data/vendor/python/astroid/protocols.py +322 -0
  406. data/vendor/python/astroid/protocols.pyc +0 -0
  407. data/vendor/python/astroid/raw_building.py +361 -0
  408. data/vendor/python/astroid/raw_building.pyc +0 -0
  409. data/vendor/python/astroid/rebuilder.py +954 -0
  410. data/vendor/python/astroid/rebuilder.pyc +0 -0
  411. data/vendor/python/astroid/scoped_nodes.py +1118 -0
  412. data/vendor/python/astroid/scoped_nodes.pyc +0 -0
  413. data/vendor/python/astroid/setup.py +184 -0
  414. data/vendor/python/astroid/tox.ini +10 -0
  415. data/vendor/python/astroid/utils.py +236 -0
  416. data/vendor/python/astroid/utils.pyc +0 -0
  417. data/vendor/python/logilab/__init__.py +0 -0
  418. data/vendor/python/logilab/__init__.pyc +0 -0
  419. data/vendor/python/logilab/common/COPYING +339 -0
  420. data/vendor/python/logilab/common/COPYING.LESSER +510 -0
  421. data/vendor/python/logilab/common/ChangeLog +1517 -0
  422. data/vendor/python/logilab/common/MANIFEST.in +13 -0
  423. data/vendor/python/logilab/common/README +185 -0
  424. data/vendor/python/logilab/common/README.Python3 +29 -0
  425. data/vendor/python/logilab/common/__init__.py +171 -0
  426. data/vendor/python/logilab/common/__init__.pyc +0 -0
  427. data/vendor/python/logilab/common/__pkginfo__.py +53 -0
  428. data/vendor/python/logilab/common/__pkginfo__.pyc +0 -0
  429. data/vendor/python/logilab/common/announce.txt +25 -0
  430. data/vendor/python/logilab/common/bin/pytest +7 -0
  431. data/vendor/python/logilab/common/bin/pytest.bat +17 -0
  432. data/vendor/python/logilab/common/cache.py +114 -0
  433. data/vendor/python/logilab/common/changelog.py +236 -0
  434. data/vendor/python/logilab/common/changelog.pyc +0 -0
  435. data/vendor/python/logilab/common/clcommands.py +332 -0
  436. data/vendor/python/logilab/common/cli.py +208 -0
  437. data/vendor/python/logilab/common/compat.py +243 -0
  438. data/vendor/python/logilab/common/compat.pyc +0 -0
  439. data/vendor/python/logilab/common/configuration.py +1094 -0
  440. data/vendor/python/logilab/common/configuration.pyc +0 -0
  441. data/vendor/python/logilab/common/contexts.py +5 -0
  442. data/vendor/python/logilab/common/corbautils.py +117 -0
  443. data/vendor/python/logilab/common/daemon.py +100 -0
  444. data/vendor/python/logilab/common/date.py +333 -0
  445. data/vendor/python/logilab/common/dbf.py +229 -0
  446. data/vendor/python/logilab/common/debugger.py +210 -0
  447. data/vendor/python/logilab/common/decorators.py +281 -0
  448. data/vendor/python/logilab/common/decorators.pyc +0 -0
  449. data/vendor/python/logilab/common/deprecation.py +188 -0
  450. data/vendor/python/logilab/common/deprecation.pyc +0 -0
  451. data/vendor/python/logilab/common/fileutils.py +402 -0
  452. data/vendor/python/logilab/common/graph.py +276 -0
  453. data/vendor/python/logilab/common/graph.pyc +0 -0
  454. data/vendor/python/logilab/common/hg.py +130 -0
  455. data/vendor/python/logilab/common/interface.py +71 -0
  456. data/vendor/python/logilab/common/interface.pyc +0 -0
  457. data/vendor/python/logilab/common/logging_ext.py +193 -0
  458. data/vendor/python/logilab/common/modutils.py +695 -0
  459. data/vendor/python/logilab/common/modutils.pyc +0 -0
  460. data/vendor/python/logilab/common/optik_ext.py +391 -0
  461. data/vendor/python/logilab/common/optik_ext.pyc +0 -0
  462. data/vendor/python/logilab/common/optparser.py +90 -0
  463. data/vendor/python/logilab/common/proc.py +277 -0
  464. data/vendor/python/logilab/common/pyro_ext.py +180 -0
  465. data/vendor/python/logilab/common/pytest.py +1177 -0
  466. data/vendor/python/logilab/common/python-logilab-common.spec +184 -0
  467. data/vendor/python/logilab/common/registry.py +1113 -0
  468. data/vendor/python/logilab/common/setup.cfg +3 -0
  469. data/vendor/python/logilab/common/setup.py +189 -0
  470. data/vendor/python/logilab/common/shellutils.py +455 -0
  471. data/vendor/python/logilab/common/sphinx_ext.py +87 -0
  472. data/vendor/python/logilab/common/sphinxutils.py +122 -0
  473. data/vendor/python/logilab/common/table.py +925 -0
  474. data/vendor/python/logilab/common/tasksqueue.py +100 -0
  475. data/vendor/python/logilab/common/textutils.py +534 -0
  476. data/vendor/python/logilab/common/textutils.pyc +0 -0
  477. data/vendor/python/logilab/common/tree.py +369 -0
  478. data/vendor/python/logilab/common/tree.pyc +0 -0
  479. data/vendor/python/logilab/common/umessage.py +190 -0
  480. data/vendor/python/logilab/common/ureports/__init__.py +174 -0
  481. data/vendor/python/logilab/common/ureports/__init__.pyc +0 -0
  482. data/vendor/python/logilab/common/ureports/docbook_writer.py +139 -0
  483. data/vendor/python/logilab/common/ureports/html_writer.py +131 -0
  484. data/vendor/python/logilab/common/ureports/html_writer.pyc +0 -0
  485. data/vendor/python/logilab/common/ureports/nodes.py +201 -0
  486. data/vendor/python/logilab/common/ureports/nodes.pyc +0 -0
  487. data/vendor/python/logilab/common/ureports/text_writer.py +140 -0
  488. data/vendor/python/logilab/common/ureports/text_writer.pyc +0 -0
  489. data/vendor/python/logilab/common/urllib2ext.py +87 -0
  490. data/vendor/python/logilab/common/vcgutils.py +216 -0
  491. data/vendor/python/logilab/common/visitor.py +107 -0
  492. data/vendor/python/logilab/common/visitor.pyc +0 -0
  493. data/vendor/python/logilab/common/xmlrpcutils.py +131 -0
  494. data/vendor/python/logilab/common/xmlutils.py +61 -0
  495. data/vendor/python/pylint/CONTRIBUTORS.txt +38 -0
  496. data/vendor/python/pylint/COPYING +340 -0
  497. data/vendor/python/pylint/ChangeLog +1437 -0
  498. data/vendor/python/pylint/DEPENDS +3 -0
  499. data/vendor/python/pylint/MANIFEST.in +14 -0
  500. data/vendor/python/pylint/README +50 -0
  501. data/vendor/python/pylint/README.Python3 +37 -0
  502. data/vendor/python/pylint/__init__.py +44 -0
  503. data/vendor/python/pylint/__init__.pyc +0 -0
  504. data/vendor/python/pylint/__main__.py +3 -0
  505. data/vendor/python/pylint/__pkginfo__.py +74 -0
  506. data/vendor/python/pylint/__pkginfo__.pyc +0 -0
  507. data/vendor/python/pylint/bin/epylint +3 -0
  508. data/vendor/python/pylint/bin/epylint.bat +5 -0
  509. data/vendor/python/pylint/bin/pylint +3 -0
  510. data/vendor/python/pylint/bin/pylint-gui +3 -0
  511. data/vendor/python/pylint/bin/pylint-gui.bat +5 -0
  512. data/vendor/python/pylint/bin/pylint.bat +5 -0
  513. data/vendor/python/pylint/bin/pyreverse +3 -0
  514. data/vendor/python/pylint/bin/pyreverse.bat +5 -0
  515. data/vendor/python/pylint/bin/symilar +3 -0
  516. data/vendor/python/pylint/bin/symilar.bat +5 -0
  517. data/vendor/python/pylint/checkers/__init__.py +145 -0
  518. data/vendor/python/pylint/checkers/__init__.pyc +0 -0
  519. data/vendor/python/pylint/checkers/base.py +1141 -0
  520. data/vendor/python/pylint/checkers/base.pyc +0 -0
  521. data/vendor/python/pylint/checkers/classes.py +792 -0
  522. data/vendor/python/pylint/checkers/classes.pyc +0 -0
  523. data/vendor/python/pylint/checkers/design_analysis.py +367 -0
  524. data/vendor/python/pylint/checkers/design_analysis.pyc +0 -0
  525. data/vendor/python/pylint/checkers/exceptions.py +306 -0
  526. data/vendor/python/pylint/checkers/exceptions.pyc +0 -0
  527. data/vendor/python/pylint/checkers/format.py +943 -0
  528. data/vendor/python/pylint/checkers/format.pyc +0 -0
  529. data/vendor/python/pylint/checkers/imports.py +394 -0
  530. data/vendor/python/pylint/checkers/imports.pyc +0 -0
  531. data/vendor/python/pylint/checkers/logging.py +213 -0
  532. data/vendor/python/pylint/checkers/logging.pyc +0 -0
  533. data/vendor/python/pylint/checkers/misc.py +90 -0
  534. data/vendor/python/pylint/checkers/misc.pyc +0 -0
  535. data/vendor/python/pylint/checkers/newstyle.py +151 -0
  536. data/vendor/python/pylint/checkers/newstyle.pyc +0 -0
  537. data/vendor/python/pylint/checkers/raw_metrics.py +129 -0
  538. data/vendor/python/pylint/checkers/raw_metrics.pyc +0 -0
  539. data/vendor/python/pylint/checkers/similar.py +365 -0
  540. data/vendor/python/pylint/checkers/similar.pyc +0 -0
  541. data/vendor/python/pylint/checkers/stdlib.py +69 -0
  542. data/vendor/python/pylint/checkers/stdlib.pyc +0 -0
  543. data/vendor/python/pylint/checkers/strings.py +304 -0
  544. data/vendor/python/pylint/checkers/strings.pyc +0 -0
  545. data/vendor/python/pylint/checkers/typecheck.py +451 -0
  546. data/vendor/python/pylint/checkers/typecheck.pyc +0 -0
  547. data/vendor/python/pylint/checkers/utils.py +416 -0
  548. data/vendor/python/pylint/checkers/utils.pyc +0 -0
  549. data/vendor/python/pylint/checkers/variables.py +741 -0
  550. data/vendor/python/pylint/checkers/variables.pyc +0 -0
  551. data/vendor/python/pylint/config.py +156 -0
  552. data/vendor/python/pylint/config.pyc +0 -0
  553. data/vendor/python/pylint/epylint.py +175 -0
  554. data/vendor/python/pylint/gui.py +508 -0
  555. data/vendor/python/pylint/interfaces.py +72 -0
  556. data/vendor/python/pylint/interfaces.pyc +0 -0
  557. data/vendor/python/pylint/lint.py +1106 -0
  558. data/vendor/python/pylint/lint.pyc +0 -0
  559. data/vendor/python/pylint/pyreverse/__init__.py +5 -0
  560. data/vendor/python/pylint/pyreverse/diadefslib.py +233 -0
  561. data/vendor/python/pylint/pyreverse/diagrams.py +247 -0
  562. data/vendor/python/pylint/pyreverse/main.py +124 -0
  563. data/vendor/python/pylint/pyreverse/utils.py +131 -0
  564. data/vendor/python/pylint/pyreverse/writer.py +199 -0
  565. data/vendor/python/pylint/reporters/__init__.py +138 -0
  566. data/vendor/python/pylint/reporters/__init__.pyc +0 -0
  567. data/vendor/python/pylint/reporters/guireporter.py +28 -0
  568. data/vendor/python/pylint/reporters/guireporter.pyc +0 -0
  569. data/vendor/python/pylint/reporters/html.py +70 -0
  570. data/vendor/python/pylint/reporters/html.pyc +0 -0
  571. data/vendor/python/pylint/reporters/text.py +143 -0
  572. data/vendor/python/pylint/reporters/text.pyc +0 -0
  573. data/vendor/python/pylint/setup.cfg +3 -0
  574. data/vendor/python/pylint/setup.py +203 -0
  575. data/vendor/python/pylint/tox.ini +10 -0
  576. data/vendor/python/pylint/utils.py +744 -0
  577. data/vendor/python/pylint/utils.pyc +0 -0
  578. data/vendor/python/pylint_runner.py +22 -0
  579. metadata +675 -0
@@ -0,0 +1,3 @@
1
+ python-logilab-common (>= 0.19.0)
2
+ python-astroid (>= 1.0.1)
3
+ python-tk
@@ -0,0 +1,14 @@
1
+ include ChangeLog
2
+ include COPYING
3
+ include DEPENDS
4
+ include README README.Python3
5
+ include bin/*
6
+ include examples/*.py examples/pylintrc examples/pylintrc_camelcase
7
+ include elisp/startup elisp/*.el
8
+ include man/*.1
9
+ recursive-include doc *.rst *.jpeg Makefile *.html *.py
10
+ recursive-include test *.py *.txt *.dot *.sh
11
+ include test/input/similar*
12
+ include test/input/noext
13
+ include test/data/ascript
14
+
@@ -0,0 +1,50 @@
1
+ README for Pylint - http://www.pylint.org/
2
+ ==========================================
3
+
4
+ Pylint is a Python source code analyzer which looks for programming errors,
5
+ helps enforcing a coding standard and sniffs for some code smells (as defined in
6
+ Martin Fowler's Refactoring book).
7
+
8
+ Pylint has many rules enabled by default, way too much to silence them all on a
9
+ minimally sized program. It's highly configurable and handle pragmas to control
10
+ it from within your code. Additionally, it is possible to write plugins to add
11
+ your own checks.
12
+
13
+ It's a free software distributed under the GNU Public Licence.
14
+
15
+ Development is hosted on bitbucket: https://bitbucket.org/logilab/pylint/
16
+
17
+ You can use the code-quality@python.org mailing list to discuss about
18
+ Pylint. Subscribe at https://mail.python.org/mailman/listinfo/code-quality/
19
+ or read the archives at https://mail.python.org/pipermail/code-quality/
20
+
21
+ Install
22
+ -------
23
+
24
+ Pylint requires the astroid (the later the better; formerly known as
25
+ logilab-astng) and logilab-common (version >= 0.53) packages.
26
+
27
+ * https://bitbucket.org/logilab/astroid
28
+ * http://www.logilab.org/projects/common
29
+
30
+ From the source distribution, extract the tarball and run ::
31
+
32
+ python setup.py install
33
+
34
+ You'll have to install dependencies in a similar way. For debian and
35
+ rpm packages, use your usual tools according to your Linux distribution.
36
+
37
+ More information about installation and available distribution format
38
+ may be found in the user manual in the *doc* subdirectory.
39
+
40
+ Documentation
41
+ -------------
42
+
43
+ Look in the doc/ subdirectory or at http://docs.pylint.org
44
+
45
+ Pylint is shipped with following additional commands:
46
+
47
+ * pyreverse: an UML diagram generator
48
+ * symilar: an independent similarities checker
49
+ * epylint: Emacs and Flymake compatible Pylint
50
+ * pylint-gui: a graphical interface
@@ -0,0 +1,37 @@
1
+ Python3
2
+ =======
3
+
4
+ Compatibility
5
+ -------------
6
+
7
+ Please, consider python3 >= 3.2 only.
8
+
9
+
10
+ Approach
11
+ --------
12
+
13
+ We maintain a Python 2 base and use 2to3 to generate Python 3 code.
14
+
15
+ 2to3 is integrated into the distutils installation process and will be run as a
16
+ build step when invoked by the python3 interpreter::
17
+
18
+ NO_SETUPTOOLS=1 python3 setup.py install --no-compile
19
+
20
+ In order to run pylint locally, you have to install the dependencies::
21
+
22
+ easy_install-3.2 logilab-common
23
+ easy_install-3.2 astroid
24
+
25
+
26
+ Debian
27
+ ------
28
+
29
+ For the Debian packaging, you can use the debian.py3k/ content against
30
+ the debian/ folder::
31
+
32
+ cp debian.py3k/* debian/
33
+
34
+
35
+ Resources
36
+ ---------
37
+ http://wiki.python.org/moin/PortingPythonToPy3k
@@ -0,0 +1,44 @@
1
+ # Copyright (c) 2003-2012 LOGILAB S.A. (Paris, FRANCE).
2
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify it under
5
+ # the terms of the GNU General Public License as published by the Free Software
6
+ # Foundation; either version 2 of the License, or (at your option) any later
7
+ # version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
12
+ #
13
+ # You should have received a copy of the GNU General Public License along with
14
+ # this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
+ import sys
17
+
18
+ def run_pylint():
19
+ """run pylint"""
20
+ from pylint.lint import Run
21
+ Run(sys.argv[1:])
22
+
23
+ def run_pylint_gui():
24
+ """run pylint-gui"""
25
+ try:
26
+ from pylint.gui import Run
27
+ Run(sys.argv[1:])
28
+ except ImportError:
29
+ sys.exit('tkinter is not available')
30
+
31
+ def run_epylint():
32
+ """run pylint"""
33
+ from pylint.epylint import Run
34
+ Run()
35
+
36
+ def run_pyreverse():
37
+ """run pyreverse"""
38
+ from pylint.pyreverse.main import Run
39
+ Run(sys.argv[1:])
40
+
41
+ def run_symilar():
42
+ """run symilar"""
43
+ from pylint.checkers.similar import Run
44
+ Run(sys.argv[1:])
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env python
2
+ import pylint
3
+ pylint.run_pylint()
@@ -0,0 +1,74 @@
1
+ # pylint: disable=W0622,C0103
2
+ # Copyright (c) 2003-2014 LOGILAB S.A. (Paris, FRANCE).
3
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it under
6
+ # the terms of the GNU General Public License as published by the Free Software
7
+ # Foundation; either version 2 of the License, or (at your option) any later
8
+ # version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
13
+ #
14
+ # You should have received a copy of the GNU General Public License along with
15
+ # this program; if not, write to the Free Software Foundation, Inc.,
16
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+ """pylint packaging information"""
18
+ import sys
19
+
20
+ modname = distname = 'pylint'
21
+
22
+ numversion = (1, 2, 1)
23
+ version = '.'.join([str(num) for num in numversion])
24
+
25
+ if sys.version_info < (2, 6):
26
+ install_requires = ['logilab-common >= 0.53.0', 'astroid >= 1.1',
27
+ 'StringFormat']
28
+ else:
29
+ install_requires = ['logilab-common >= 0.53.0', 'astroid >= 1.1']
30
+
31
+ license = 'GPL'
32
+ description = "python code static checker"
33
+ web = 'http://www.pylint.org'
34
+ mailinglist = "mailto://code-quality@python.org"
35
+ author = 'Logilab'
36
+ author_email = 'python-projects@lists.logilab.org'
37
+
38
+ classifiers = ['Development Status :: 4 - Beta',
39
+ 'Environment :: Console',
40
+ 'Intended Audience :: Developers',
41
+ 'License :: OSI Approved :: GNU General Public License (GPL)',
42
+ 'Operating System :: OS Independent',
43
+ 'Programming Language :: Python',
44
+ 'Programming Language :: Python :: 2',
45
+ 'Programming Language :: Python :: 3',
46
+ 'Topic :: Software Development :: Debuggers',
47
+ 'Topic :: Software Development :: Quality Assurance',
48
+ 'Topic :: Software Development :: Testing'
49
+ ]
50
+
51
+
52
+ long_desc = """\
53
+ Pylint is a Python source code analyzer which looks for programming
54
+ errors, helps enforcing a coding standard and sniffs for some code
55
+ smells (as defined in Martin Fowler's Refactoring book)
56
+ .
57
+ Pylint can be seen as another PyChecker since nearly all tests you
58
+ can do with PyChecker can also be done with Pylint. However, Pylint
59
+ offers some more features, like checking length of lines of code,
60
+ checking if variable names are well-formed according to your coding
61
+ standard, or checking if declared interfaces are truly implemented,
62
+ and much more.
63
+ .
64
+ Additionally, it is possible to write plugins to add your own checks.
65
+ .
66
+ Pylint is shipped with "pylint-gui", "pyreverse" (UML diagram generator)
67
+ and "symilar" (an independent similarities checker)."""
68
+
69
+ from os.path import join
70
+ scripts = [join('bin', filename)
71
+ for filename in ('pylint', 'pylint-gui', "symilar", "epylint",
72
+ "pyreverse")]
73
+
74
+ include_dirs = ['test']
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env python
2
+ from pylint import epylint
3
+ epylint.Run()
@@ -0,0 +1,5 @@
1
+ @echo off
2
+ rem Use python to execute the python script having the same name as this batch
3
+ rem file, but without any extension, located in the same directory as this
4
+ rem batch file
5
+ python "%~dpn0" %*
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env python
2
+ from pylint import run_pylint
3
+ run_pylint()
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env python
2
+ from pylint import run_pylint_gui
3
+ run_pylint_gui()
@@ -0,0 +1,5 @@
1
+ @echo off
2
+ rem Use python to execute the python script having the same name as this batch
3
+ rem file, but without any extension, located in the same directory as this
4
+ rem batch file
5
+ python "%~dpn0" %*
@@ -0,0 +1,5 @@
1
+ @echo off
2
+ rem Use python to execute the python script having the same name as this batch
3
+ rem file, but without any extension, located in the same directory as this
4
+ rem batch file
5
+ python "%~dpn0" %*
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env python
2
+ from pylint import run_pyreverse
3
+ run_pyreverse()
@@ -0,0 +1,5 @@
1
+ @echo off
2
+ rem Use python to execute the python script having the same name as this batch
3
+ rem file, but without any extension, located in the same directory as this
4
+ rem batch file
5
+ python "%~dpn0" %*
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env python
2
+ from pylint import run_symilar
3
+ run_symilar()
@@ -0,0 +1,5 @@
1
+ @echo off
2
+ rem Use python to execute the python script having the same name as this batch
3
+ rem file, but without any extension, located in the same directory as this
4
+ rem batch file
5
+ python "%~dpn0" %*
@@ -0,0 +1,145 @@
1
+ # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
2
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify it under
5
+ # the terms of the GNU General Public License as published by the Free Software
6
+ # Foundation; either version 2 of the License, or (at your option) any later
7
+ # version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along with
14
+ # this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
+ """utilities methods and classes for checkers
17
+
18
+ Base id of standard checkers (used in msg and report ids):
19
+ 01: base
20
+ 02: classes
21
+ 03: format
22
+ 04: import
23
+ 05: misc
24
+ 06: variables
25
+ 07: exceptions
26
+ 08: similar
27
+ 09: design_analysis
28
+ 10: newstyle
29
+ 11: typecheck
30
+ 12: logging
31
+ 13: string_format
32
+ 14: string_constant
33
+ 15-50: not yet used: reserved for future internal checkers.
34
+ 51-99: perhaps used: reserved for external checkers
35
+
36
+ The raw_metrics checker has no number associated since it doesn't emit any
37
+ messages nor reports. XXX not true, emit a 07 report !
38
+
39
+ """
40
+
41
+ import sys
42
+ import tokenize
43
+ import warnings
44
+
45
+ from astroid.utils import ASTWalker
46
+ from logilab.common.configuration import OptionsProviderMixIn
47
+
48
+ from pylint.reporters import diff_string
49
+ from pylint.utils import register_plugins
50
+
51
+ def table_lines_from_stats(stats, old_stats, columns):
52
+ """get values listed in <columns> from <stats> and <old_stats>,
53
+ and return a formated list of values, designed to be given to a
54
+ ureport.Table object
55
+ """
56
+ lines = []
57
+ for m_type in columns:
58
+ new = stats[m_type]
59
+ format = str
60
+ if isinstance(new, float):
61
+ format = lambda num: '%.3f' % num
62
+ old = old_stats.get(m_type)
63
+ if old is not None:
64
+ diff_str = diff_string(old, new)
65
+ old = format(old)
66
+ else:
67
+ old, diff_str = 'NC', 'NC'
68
+ lines += (m_type.replace('_', ' '), format(new), old, diff_str)
69
+ return lines
70
+
71
+
72
+ class BaseChecker(OptionsProviderMixIn, ASTWalker):
73
+ """base class for checkers"""
74
+ # checker name (you may reuse an existing one)
75
+ name = None
76
+ # options level (0 will be displaying in --help, 1 in --long-help)
77
+ level = 1
78
+ # ordered list of options to control the ckecker behaviour
79
+ options = ()
80
+ # messages issued by this checker
81
+ msgs = {}
82
+ # reports issued by this checker
83
+ reports = ()
84
+
85
+ def __init__(self, linter=None):
86
+ """checker instances should have the linter as argument
87
+
88
+ linter is an object implementing ILinter
89
+ """
90
+ ASTWalker.__init__(self, self)
91
+ self.name = self.name.lower()
92
+ OptionsProviderMixIn.__init__(self)
93
+ self.linter = linter
94
+
95
+ def add_message(self, msg_id, line=None, node=None, args=None):
96
+ """add a message of a given type"""
97
+ self.linter.add_message(msg_id, line, node, args)
98
+
99
+ # dummy methods implementing the IChecker interface
100
+
101
+ def open(self):
102
+ """called before visiting project (i.e set of modules)"""
103
+
104
+ def close(self):
105
+ """called after visiting project (i.e set of modules)"""
106
+
107
+
108
+ class BaseRawChecker(BaseChecker):
109
+ """base class for raw checkers"""
110
+
111
+ def process_module(self, node):
112
+ """process a module
113
+
114
+ the module's content is accessible via the stream object
115
+
116
+ stream must implement the readline method
117
+ """
118
+ warnings.warn("Modules that need access to the tokens should "
119
+ "use the ITokenChecker interface.",
120
+ DeprecationWarning)
121
+ stream = node.file_stream
122
+ stream.seek(0) # XXX may be removed with astroid > 0.23
123
+ if sys.version_info <= (3, 0):
124
+ self.process_tokens(tokenize.generate_tokens(stream.readline))
125
+ else:
126
+ self.process_tokens(tokenize.tokenize(stream.readline))
127
+
128
+ def process_tokens(self, tokens):
129
+ """should be overridden by subclasses"""
130
+ raise NotImplementedError()
131
+
132
+
133
+ class BaseTokenChecker(BaseChecker):
134
+ """Base class for checkers that want to have access to the token stream."""
135
+
136
+ def process_tokens(self, tokens):
137
+ """Should be overridden by subclasses."""
138
+ raise NotImplementedError()
139
+
140
+
141
+ def initialize(linter):
142
+ """initialize linter with checkers in this package """
143
+ register_plugins(linter, __path__[0])
144
+
145
+ __all__ = ('BaseChecker', 'initialize')
@@ -0,0 +1,1141 @@
1
+ # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
2
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ # Copyright (c) 2009-2010 Arista Networks, Inc.
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it under
6
+ # the terms of the GNU General Public License as published by the Free Software
7
+ # Foundation; either version 2 of the License, or (at your option) any later
8
+ # version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License along with
15
+ # this program; if not, write to the Free Software Foundation, Inc.,
16
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+ """basic checker for Python code"""
18
+
19
+ import sys
20
+ import astroid
21
+ from logilab.common.ureports import Table
22
+ from astroid import are_exclusive, InferenceError
23
+ import astroid.bases
24
+
25
+ from pylint.interfaces import IAstroidChecker
26
+ from pylint.utils import EmptyReport
27
+ from pylint.reporters import diff_string
28
+ from pylint.checkers import BaseChecker
29
+ from pylint.checkers.utils import (
30
+ check_messages,
31
+ clobber_in_except,
32
+ is_builtin_object,
33
+ is_inside_except,
34
+ overrides_a_method,
35
+ safe_infer,
36
+ get_argument_from_call,
37
+ NoSuchArgumentError,
38
+ )
39
+
40
+
41
+ import re
42
+
43
+ # regex for class/function/variable/constant name
44
+ CLASS_NAME_RGX = re.compile('[A-Z_][a-zA-Z0-9]+$')
45
+ MOD_NAME_RGX = re.compile('(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$')
46
+ CONST_NAME_RGX = re.compile('(([A-Z_][A-Z0-9_]*)|(__.*__))$')
47
+ COMP_VAR_RGX = re.compile('[A-Za-z_][A-Za-z0-9_]*$')
48
+ DEFAULT_NAME_RGX = re.compile('[a-z_][a-z0-9_]{2,30}$')
49
+ CLASS_ATTRIBUTE_RGX = re.compile(r'([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$')
50
+ # do not require a doc string on system methods
51
+ NO_REQUIRED_DOC_RGX = re.compile('__.*__')
52
+ REVERSED_METHODS = (('__getitem__', '__len__'),
53
+ ('__reversed__', ))
54
+
55
+ PY33 = sys.version_info >= (3, 3)
56
+ BAD_FUNCTIONS = ['map', 'filter', 'apply']
57
+ if sys.version_info < (3, 0):
58
+ BAD_FUNCTIONS.append('input')
59
+ BAD_FUNCTIONS.append('file')
60
+
61
+ # Name categories that are always consistent with all naming conventions.
62
+ EXEMPT_NAME_CATEGORIES = set(('exempt', 'ignore'))
63
+
64
+ del re
65
+
66
+ def in_loop(node):
67
+ """return True if the node is inside a kind of for loop"""
68
+ parent = node.parent
69
+ while parent is not None:
70
+ if isinstance(parent, (astroid.For, astroid.ListComp, astroid.SetComp,
71
+ astroid.DictComp, astroid.GenExpr)):
72
+ return True
73
+ parent = parent.parent
74
+ return False
75
+
76
+ def in_nested_list(nested_list, obj):
77
+ """return true if the object is an element of <nested_list> or of a nested
78
+ list
79
+ """
80
+ for elmt in nested_list:
81
+ if isinstance(elmt, (list, tuple)):
82
+ if in_nested_list(elmt, obj):
83
+ return True
84
+ elif elmt == obj:
85
+ return True
86
+ return False
87
+
88
+ def _loop_exits_early(loop):
89
+ """Returns true if a loop has a break statement in its body."""
90
+ loop_nodes = (astroid.For, astroid.While)
91
+ # Loop over body explicitly to avoid matching break statements
92
+ # in orelse.
93
+ for child in loop.body:
94
+ if isinstance(child, loop_nodes):
95
+ # break statement may be in orelse of child loop.
96
+ for orelse in (child.orelse or ()):
97
+ for _ in orelse.nodes_of_class(astroid.Break, skip_klass=loop_nodes):
98
+ return True
99
+ continue
100
+ for _ in child.nodes_of_class(astroid.Break, skip_klass=loop_nodes):
101
+ return True
102
+ return False
103
+
104
+ if sys.version_info < (3, 0):
105
+ PROPERTY_CLASSES = set(('__builtin__.property', 'abc.abstractproperty'))
106
+ else:
107
+ PROPERTY_CLASSES = set(('builtins.property', 'abc.abstractproperty'))
108
+ ABC_METHODS = set(('abc.abstractproperty', 'abc.abstractmethod',
109
+ 'abc.abstractclassmethod', 'abc.abstractstaticmethod'))
110
+
111
+ def _determine_function_name_type(node):
112
+ """Determine the name type whose regex the a function's name should match.
113
+
114
+ :param node: A function node.
115
+ :returns: One of ('function', 'method', 'attr')
116
+ """
117
+ if not node.is_method():
118
+ return 'function'
119
+ if node.decorators:
120
+ decorators = node.decorators.nodes
121
+ else:
122
+ decorators = []
123
+ for decorator in decorators:
124
+ # If the function is a property (decorated with @property
125
+ # or @abc.abstractproperty), the name type is 'attr'.
126
+ if (isinstance(decorator, astroid.Name) or
127
+ (isinstance(decorator, astroid.Getattr) and
128
+ decorator.attrname == 'abstractproperty')):
129
+ infered = safe_infer(decorator)
130
+ if infered and infered.qname() in PROPERTY_CLASSES:
131
+ return 'attr'
132
+ # If the function is decorated using the prop_method.{setter,getter}
133
+ # form, treat it like an attribute as well.
134
+ elif (isinstance(decorator, astroid.Getattr) and
135
+ decorator.attrname in ('setter', 'deleter')):
136
+ return 'attr'
137
+ return 'method'
138
+
139
+ def decorated_with_abc(func):
140
+ """ Determine if the `func` node is decorated
141
+ with `abc` decorators (abstractmethod et co.)
142
+ """
143
+ if func.decorators:
144
+ for node in func.decorators.nodes:
145
+ try:
146
+ infered = node.infer().next()
147
+ except InferenceError:
148
+ continue
149
+ if infered and infered.qname() in ABC_METHODS:
150
+ return True
151
+
152
+ def has_abstract_methods(node):
153
+ """ Determine if the given `node` has
154
+ abstract methods, defined with `abc` module.
155
+ """
156
+ return any(decorated_with_abc(meth)
157
+ for meth in node.mymethods())
158
+
159
+ def report_by_type_stats(sect, stats, old_stats):
160
+ """make a report of
161
+
162
+ * percentage of different types documented
163
+ * percentage of different types with a bad name
164
+ """
165
+ # percentage of different types documented and/or with a bad name
166
+ nice_stats = {}
167
+ for node_type in ('module', 'class', 'method', 'function'):
168
+ try:
169
+ total = stats[node_type]
170
+ except KeyError:
171
+ raise EmptyReport()
172
+ nice_stats[node_type] = {}
173
+ if total != 0:
174
+ try:
175
+ documented = total - stats['undocumented_'+node_type]
176
+ percent = (documented * 100.) / total
177
+ nice_stats[node_type]['percent_documented'] = '%.2f' % percent
178
+ except KeyError:
179
+ nice_stats[node_type]['percent_documented'] = 'NC'
180
+ try:
181
+ percent = (stats['badname_'+node_type] * 100.) / total
182
+ nice_stats[node_type]['percent_badname'] = '%.2f' % percent
183
+ except KeyError:
184
+ nice_stats[node_type]['percent_badname'] = 'NC'
185
+ lines = ('type', 'number', 'old number', 'difference',
186
+ '%documented', '%badname')
187
+ for node_type in ('module', 'class', 'method', 'function'):
188
+ new = stats[node_type]
189
+ old = old_stats.get(node_type, None)
190
+ if old is not None:
191
+ diff_str = diff_string(old, new)
192
+ else:
193
+ old, diff_str = 'NC', 'NC'
194
+ lines += (node_type, str(new), str(old), diff_str,
195
+ nice_stats[node_type].get('percent_documented', '0'),
196
+ nice_stats[node_type].get('percent_badname', '0'))
197
+ sect.append(Table(children=lines, cols=6, rheaders=1))
198
+
199
+ def redefined_by_decorator(node):
200
+ """return True if the object is a method redefined via decorator.
201
+
202
+ For example:
203
+ @property
204
+ def x(self): return self._x
205
+ @x.setter
206
+ def x(self, value): self._x = value
207
+ """
208
+ if node.decorators:
209
+ for decorator in node.decorators.nodes:
210
+ if (isinstance(decorator, astroid.Getattr) and
211
+ getattr(decorator.expr, 'name', None) == node.name):
212
+ return True
213
+ return False
214
+
215
+ class _BasicChecker(BaseChecker):
216
+ __implements__ = IAstroidChecker
217
+ name = 'basic'
218
+
219
+ class BasicErrorChecker(_BasicChecker):
220
+ msgs = {
221
+ 'E0100': ('__init__ method is a generator',
222
+ 'init-is-generator',
223
+ 'Used when the special class method __init__ is turned into a '
224
+ 'generator by a yield in its body.'),
225
+ 'E0101': ('Explicit return in __init__',
226
+ 'return-in-init',
227
+ 'Used when the special class method __init__ has an explicit \
228
+ return value.'),
229
+ 'E0102': ('%s already defined line %s',
230
+ 'function-redefined',
231
+ 'Used when a function / class / method is redefined.'),
232
+ 'E0103': ('%r not properly in loop',
233
+ 'not-in-loop',
234
+ 'Used when break or continue keywords are used outside a loop.'),
235
+
236
+ 'E0104': ('Return outside function',
237
+ 'return-outside-function',
238
+ 'Used when a "return" statement is found outside a function or '
239
+ 'method.'),
240
+ 'E0105': ('Yield outside function',
241
+ 'yield-outside-function',
242
+ 'Used when a "yield" statement is found outside a function or '
243
+ 'method.'),
244
+ 'E0106': ('Return with argument inside generator',
245
+ 'return-arg-in-generator',
246
+ 'Used when a "return" statement with an argument is found '
247
+ 'outside in a generator function or method (e.g. with some '
248
+ '"yield" statements).',
249
+ {'maxversion': (3, 3)}),
250
+ 'E0107': ("Use of the non-existent %s operator",
251
+ 'nonexistent-operator',
252
+ "Used when you attempt to use the C-style pre-increment or"
253
+ "pre-decrement operator -- and ++, which doesn't exist in Python."),
254
+ 'E0108': ('Duplicate argument name %s in function definition',
255
+ 'duplicate-argument-name',
256
+ 'Duplicate argument names in function definitions are syntax'
257
+ ' errors.'),
258
+ 'E0110': ('Abstract class with abstract methods instantiated',
259
+ 'abstract-class-instantiated',
260
+ 'Used when an abstract class with `abc.ABCMeta` as metaclass '
261
+ 'has abstract methods and is instantiated.',
262
+ {'minversion': (3, 0)}),
263
+ 'W0120': ('Else clause on loop without a break statement',
264
+ 'useless-else-on-loop',
265
+ 'Loops should only have an else clause if they can exit early '
266
+ 'with a break statement, otherwise the statements under else '
267
+ 'should be on the same scope as the loop itself.'),
268
+ }
269
+
270
+ def __init__(self, linter):
271
+ _BasicChecker.__init__(self, linter)
272
+
273
+ @check_messages('function-redefined')
274
+ def visit_class(self, node):
275
+ self._check_redefinition('class', node)
276
+
277
+ @check_messages('init-is-generator', 'return-in-init',
278
+ 'function-redefined', 'return-arg-in-generator',
279
+ 'duplicate-argument-name')
280
+ def visit_function(self, node):
281
+ if not redefined_by_decorator(node):
282
+ self._check_redefinition(node.is_method() and 'method' or 'function', node)
283
+ # checks for max returns, branch, return in __init__
284
+ returns = node.nodes_of_class(astroid.Return,
285
+ skip_klass=(astroid.Function, astroid.Class))
286
+ if node.is_method() and node.name == '__init__':
287
+ if node.is_generator():
288
+ self.add_message('init-is-generator', node=node)
289
+ else:
290
+ values = [r.value for r in returns]
291
+ # Are we returning anything but None from constructors
292
+ if [v for v in values if
293
+ not (v is None or
294
+ (isinstance(v, astroid.Const) and v.value is None) or
295
+ (isinstance(v, astroid.Name) and v.name == 'None')
296
+ )]:
297
+ self.add_message('return-in-init', node=node)
298
+ elif node.is_generator():
299
+ # make sure we don't mix non-None returns and yields
300
+ if not PY33:
301
+ for retnode in returns:
302
+ if isinstance(retnode.value, astroid.Const) and \
303
+ retnode.value.value is not None:
304
+ self.add_message('return-arg-in-generator', node=node,
305
+ line=retnode.fromlineno)
306
+ # Check for duplicate names
307
+ args = set()
308
+ for name in node.argnames():
309
+ if name in args:
310
+ self.add_message('duplicate-argument-name', node=node, args=(name,))
311
+ else:
312
+ args.add(name)
313
+
314
+
315
+ @check_messages('return-outside-function')
316
+ def visit_return(self, node):
317
+ if not isinstance(node.frame(), astroid.Function):
318
+ self.add_message('return-outside-function', node=node)
319
+
320
+ @check_messages('yield-outside-function')
321
+ def visit_yield(self, node):
322
+ if not isinstance(node.frame(), (astroid.Function, astroid.Lambda)):
323
+ self.add_message('yield-outside-function', node=node)
324
+
325
+ @check_messages('not-in-loop')
326
+ def visit_continue(self, node):
327
+ self._check_in_loop(node, 'continue')
328
+
329
+ @check_messages('not-in-loop')
330
+ def visit_break(self, node):
331
+ self._check_in_loop(node, 'break')
332
+
333
+ @check_messages('useless-else-on-loop')
334
+ def visit_for(self, node):
335
+ self._check_else_on_loop(node)
336
+
337
+ @check_messages('useless-else-on-loop')
338
+ def visit_while(self, node):
339
+ self._check_else_on_loop(node)
340
+
341
+ @check_messages('nonexistent-operator')
342
+ def visit_unaryop(self, node):
343
+ """check use of the non-existent ++ and -- operator operator"""
344
+ if ((node.op in '+-') and
345
+ isinstance(node.operand, astroid.UnaryOp) and
346
+ (node.operand.op == node.op)):
347
+ self.add_message('nonexistent-operator', node=node, args=node.op*2)
348
+
349
+ @check_messages('abstract-class-instantiated')
350
+ def visit_callfunc(self, node):
351
+ """ Check instantiating abstract class with
352
+ abc.ABCMeta as metaclass.
353
+ """
354
+ try:
355
+ infered = node.func.infer().next()
356
+ except astroid.InferenceError:
357
+ return
358
+ if not isinstance(infered, astroid.Class):
359
+ return
360
+ # __init__ was called
361
+ metaclass = infered.metaclass()
362
+ if metaclass is None:
363
+ # Python 3.4 has `abc.ABC`, which won't be detected
364
+ # by ClassNode.metaclass()
365
+ for ancestor in infered.ancestors():
366
+ if (ancestor.qname() == 'abc.ABC' and
367
+ has_abstract_methods(infered)):
368
+
369
+ self.add_message('abstract-class-instantiated', node=node)
370
+ break
371
+ return
372
+ if (metaclass.qname() == 'abc.ABCMeta' and
373
+ has_abstract_methods(infered)):
374
+
375
+ self.add_message('abstract-class-instantiated', node=node)
376
+
377
+ def _check_else_on_loop(self, node):
378
+ """Check that any loop with an else clause has a break statement."""
379
+ if node.orelse and not _loop_exits_early(node):
380
+ self.add_message('useless-else-on-loop', node=node,
381
+ # This is not optimal, but the line previous
382
+ # to the first statement in the else clause
383
+ # will usually be the one that contains the else:.
384
+ line=node.orelse[0].lineno - 1)
385
+
386
+ def _check_in_loop(self, node, node_name):
387
+ """check that a node is inside a for or while loop"""
388
+ _node = node.parent
389
+ while _node:
390
+ if isinstance(_node, (astroid.For, astroid.While)):
391
+ break
392
+ _node = _node.parent
393
+ else:
394
+ self.add_message('not-in-loop', node=node, args=node_name)
395
+
396
+ def _check_redefinition(self, redeftype, node):
397
+ """check for redefinition of a function / method / class name"""
398
+ defined_self = node.parent.frame()[node.name]
399
+ if defined_self is not node and not are_exclusive(node, defined_self):
400
+ self.add_message('function-redefined', node=node,
401
+ args=(redeftype, defined_self.fromlineno))
402
+
403
+
404
+
405
+ class BasicChecker(_BasicChecker):
406
+ """checks for :
407
+ * doc strings
408
+ * number of arguments, local variables, branches, returns and statements in
409
+ functions, methods
410
+ * required module attributes
411
+ * dangerous default values as arguments
412
+ * redefinition of function / method / class
413
+ * uses of the global statement
414
+ """
415
+
416
+ __implements__ = IAstroidChecker
417
+
418
+ name = 'basic'
419
+ msgs = {
420
+ 'W0101': ('Unreachable code',
421
+ 'unreachable',
422
+ 'Used when there is some code behind a "return" or "raise" \
423
+ statement, which will never be accessed.'),
424
+ 'W0102': ('Dangerous default value %s as argument',
425
+ 'dangerous-default-value',
426
+ 'Used when a mutable value as list or dictionary is detected in \
427
+ a default value for an argument.'),
428
+ 'W0104': ('Statement seems to have no effect',
429
+ 'pointless-statement',
430
+ 'Used when a statement doesn\'t have (or at least seems to) \
431
+ any effect.'),
432
+ 'W0105': ('String statement has no effect',
433
+ 'pointless-string-statement',
434
+ 'Used when a string is used as a statement (which of course \
435
+ has no effect). This is a particular case of W0104 with its \
436
+ own message so you can easily disable it if you\'re using \
437
+ those strings as documentation, instead of comments.'),
438
+ 'W0106': ('Expression "%s" is assigned to nothing',
439
+ 'expression-not-assigned',
440
+ 'Used when an expression that is not a function call is assigned\
441
+ to nothing. Probably something else was intended.'),
442
+ 'W0108': ('Lambda may not be necessary',
443
+ 'unnecessary-lambda',
444
+ 'Used when the body of a lambda expression is a function call \
445
+ on the same argument list as the lambda itself; such lambda \
446
+ expressions are in all but a few cases replaceable with the \
447
+ function being called in the body of the lambda.'),
448
+ 'W0109': ("Duplicate key %r in dictionary",
449
+ 'duplicate-key',
450
+ "Used when a dictionary expression binds the same key multiple \
451
+ times."),
452
+ 'W0122': ('Use of exec',
453
+ 'exec-used',
454
+ 'Used when you use the "exec" statement (function for Python 3), to discourage its \
455
+ usage. That doesn\'t mean you can not use it !'),
456
+ 'W0123': ('Use of eval',
457
+ 'eval-used',
458
+ 'Used when you use the "eval" function, to discourage its '
459
+ 'usage. Consider using `ast.literal_eval` for safely evaluating '
460
+ 'strings containing Python expressions '
461
+ 'from untrusted sources. '),
462
+ 'W0141': ('Used builtin function %r',
463
+ 'bad-builtin',
464
+ 'Used when a black listed builtin function is used (see the '
465
+ 'bad-function option). Usual black listed functions are the ones '
466
+ 'like map, or filter , where Python offers now some cleaner '
467
+ 'alternative like list comprehension.'),
468
+ 'W0142': ('Used * or ** magic',
469
+ 'star-args',
470
+ 'Used when a function or method is called using `*args` or '
471
+ '`**kwargs` to dispatch arguments. This doesn\'t improve '
472
+ 'readability and should be used with care.'),
473
+ 'W0150': ("%s statement in finally block may swallow exception",
474
+ 'lost-exception',
475
+ "Used when a break or a return statement is found inside the \
476
+ finally clause of a try...finally block: the exceptions raised \
477
+ in the try clause will be silently swallowed instead of being \
478
+ re-raised."),
479
+ 'W0199': ('Assert called on a 2-uple. Did you mean \'assert x,y\'?',
480
+ 'assert-on-tuple',
481
+ 'A call of assert on a tuple will always evaluate to true if '
482
+ 'the tuple is not empty, and will always evaluate to false if '
483
+ 'it is.'),
484
+ 'W0121': ('Use raise ErrorClass(args) instead of raise ErrorClass, args.',
485
+ 'old-raise-syntax',
486
+ "Used when the alternate raise syntax 'raise foo, bar' is used "
487
+ "instead of 'raise foo(bar)'.",
488
+ {'maxversion': (3, 0)}),
489
+
490
+ 'C0121': ('Missing required attribute "%s"', # W0103
491
+ 'missing-module-attribute',
492
+ 'Used when an attribute required for modules is missing.'),
493
+
494
+ 'E0109': ('Missing argument to reversed()',
495
+ 'missing-reversed-argument',
496
+ 'Used when reversed() builtin didn\'t receive an argument.'),
497
+ 'E0111': ('The first reversed() argument is not a sequence',
498
+ 'bad-reversed-sequence',
499
+ 'Used when the first argument to reversed() builtin '
500
+ 'isn\'t a sequence (does not implement __reversed__, '
501
+ 'nor __getitem__ and __len__'),
502
+
503
+ }
504
+
505
+ options = (('required-attributes',
506
+ {'default' : (), 'type' : 'csv',
507
+ 'metavar' : '<attributes>',
508
+ 'help' : 'Required attributes for module, separated by a '
509
+ 'comma'}
510
+ ),
511
+ ('bad-functions',
512
+ {'default' : BAD_FUNCTIONS,
513
+ 'type' :'csv', 'metavar' : '<builtin function names>',
514
+ 'help' : 'List of builtins function names that should not be '
515
+ 'used, separated by a comma'}
516
+ ),
517
+ )
518
+ reports = (('RP0101', 'Statistics by type', report_by_type_stats),)
519
+
520
+ def __init__(self, linter):
521
+ _BasicChecker.__init__(self, linter)
522
+ self.stats = None
523
+ self._tryfinallys = None
524
+
525
+ def open(self):
526
+ """initialize visit variables and statistics
527
+ """
528
+ self._tryfinallys = []
529
+ self.stats = self.linter.add_stats(module=0, function=0,
530
+ method=0, class_=0)
531
+ @check_messages('missing-module-attribute')
532
+ def visit_module(self, node):
533
+ """check module name, docstring and required arguments
534
+ """
535
+ self.stats['module'] += 1
536
+ for attr in self.config.required_attributes:
537
+ if attr not in node:
538
+ self.add_message('missing-module-attribute', node=node, args=attr)
539
+
540
+ def visit_class(self, node):
541
+ """check module name, docstring and redefinition
542
+ increment branch counter
543
+ """
544
+ self.stats['class'] += 1
545
+
546
+ @check_messages('pointless-statement', 'pointless-string-statement',
547
+ 'expression-not-assigned')
548
+ def visit_discard(self, node):
549
+ """check for various kind of statements without effect"""
550
+ expr = node.value
551
+ if isinstance(expr, astroid.Const) and isinstance(expr.value,
552
+ basestring):
553
+ # treat string statement in a separated message
554
+ self.add_message('pointless-string-statement', node=node)
555
+ return
556
+ # ignore if this is :
557
+ # * a direct function call
558
+ # * the unique child of a try/except body
559
+ # * a yield (which are wrapped by a discard node in _ast XXX)
560
+ # warn W0106 if we have any underlying function call (we can't predict
561
+ # side effects), else pointless-statement
562
+ if (isinstance(expr, (astroid.Yield, astroid.CallFunc)) or
563
+ (isinstance(node.parent, astroid.TryExcept) and
564
+ node.parent.body == [node])):
565
+ return
566
+ if any(expr.nodes_of_class(astroid.CallFunc)):
567
+ self.add_message('expression-not-assigned', node=node, args=expr.as_string())
568
+ else:
569
+ self.add_message('pointless-statement', node=node)
570
+
571
+ @check_messages('unnecessary-lambda')
572
+ def visit_lambda(self, node):
573
+ """check whether or not the lambda is suspicious
574
+ """
575
+ # if the body of the lambda is a call expression with the same
576
+ # argument list as the lambda itself, then the lambda is
577
+ # possibly unnecessary and at least suspicious.
578
+ if node.args.defaults:
579
+ # If the arguments of the lambda include defaults, then a
580
+ # judgment cannot be made because there is no way to check
581
+ # that the defaults defined by the lambda are the same as
582
+ # the defaults defined by the function called in the body
583
+ # of the lambda.
584
+ return
585
+ call = node.body
586
+ if not isinstance(call, astroid.CallFunc):
587
+ # The body of the lambda must be a function call expression
588
+ # for the lambda to be unnecessary.
589
+ return
590
+ # XXX are lambda still different with astroid >= 0.18 ?
591
+ # *args and **kwargs need to be treated specially, since they
592
+ # are structured differently between the lambda and the function
593
+ # call (in the lambda they appear in the args.args list and are
594
+ # indicated as * and ** by two bits in the lambda's flags, but
595
+ # in the function call they are omitted from the args list and
596
+ # are indicated by separate attributes on the function call node).
597
+ ordinary_args = list(node.args.args)
598
+ if node.args.kwarg:
599
+ if (not call.kwargs
600
+ or not isinstance(call.kwargs, astroid.Name)
601
+ or node.args.kwarg != call.kwargs.name):
602
+ return
603
+ elif call.kwargs:
604
+ return
605
+ if node.args.vararg:
606
+ if (not call.starargs
607
+ or not isinstance(call.starargs, astroid.Name)
608
+ or node.args.vararg != call.starargs.name):
609
+ return
610
+ elif call.starargs:
611
+ return
612
+ # The "ordinary" arguments must be in a correspondence such that:
613
+ # ordinary_args[i].name == call.args[i].name.
614
+ if len(ordinary_args) != len(call.args):
615
+ return
616
+ for i in xrange(len(ordinary_args)):
617
+ if not isinstance(call.args[i], astroid.Name):
618
+ return
619
+ if node.args.args[i].name != call.args[i].name:
620
+ return
621
+ self.add_message('unnecessary-lambda', line=node.fromlineno, node=node)
622
+
623
+ @check_messages('dangerous-default-value')
624
+ def visit_function(self, node):
625
+ """check function name, docstring, arguments, redefinition,
626
+ variable names, max locals
627
+ """
628
+ self.stats[node.is_method() and 'method' or 'function'] += 1
629
+ # check for dangerous default values as arguments
630
+ for default in node.args.defaults:
631
+ try:
632
+ value = default.infer().next()
633
+ except astroid.InferenceError:
634
+ continue
635
+ builtins = astroid.bases.BUILTINS
636
+ if (isinstance(value, astroid.Instance) and
637
+ value.qname() in ['.'.join([builtins, x]) for x in ('set', 'dict', 'list')]):
638
+ if value is default:
639
+ msg = default.as_string()
640
+ elif type(value) is astroid.Instance:
641
+ msg = '%s (%s)' % (default.as_string(), value.qname())
642
+ else:
643
+ msg = '%s (%s)' % (default.as_string(), value.as_string())
644
+ self.add_message('dangerous-default-value', node=node, args=(msg,))
645
+
646
+ @check_messages('unreachable', 'lost-exception')
647
+ def visit_return(self, node):
648
+ """1 - check is the node has a right sibling (if so, that's some
649
+ unreachable code)
650
+ 2 - check is the node is inside the finally clause of a try...finally
651
+ block
652
+ """
653
+ self._check_unreachable(node)
654
+ # Is it inside final body of a try...finally bloc ?
655
+ self._check_not_in_finally(node, 'return', (astroid.Function,))
656
+
657
+ @check_messages('unreachable')
658
+ def visit_continue(self, node):
659
+ """check is the node has a right sibling (if so, that's some unreachable
660
+ code)
661
+ """
662
+ self._check_unreachable(node)
663
+
664
+ @check_messages('unreachable', 'lost-exception')
665
+ def visit_break(self, node):
666
+ """1 - check is the node has a right sibling (if so, that's some
667
+ unreachable code)
668
+ 2 - check is the node is inside the finally clause of a try...finally
669
+ block
670
+ """
671
+ # 1 - Is it right sibling ?
672
+ self._check_unreachable(node)
673
+ # 2 - Is it inside final body of a try...finally bloc ?
674
+ self._check_not_in_finally(node, 'break', (astroid.For, astroid.While,))
675
+
676
+ @check_messages('unreachable', 'old-raise-syntax')
677
+ def visit_raise(self, node):
678
+ """check if the node has a right sibling (if so, that's some unreachable
679
+ code)
680
+ """
681
+ self._check_unreachable(node)
682
+ if sys.version_info >= (3, 0):
683
+ return
684
+ if node.exc is not None and node.inst is not None and node.tback is None:
685
+ self.add_message('old-raise-syntax', node=node)
686
+
687
+ @check_messages('exec-used')
688
+ def visit_exec(self, node):
689
+ """just print a warning on exec statements"""
690
+ self.add_message('exec-used', node=node)
691
+
692
+ @check_messages('bad-builtin', 'star-args', 'eval-used',
693
+ 'exec-used', 'missing-reversed-argument',
694
+ 'bad-reversed-sequence')
695
+ def visit_callfunc(self, node):
696
+ """visit a CallFunc node -> check if this is not a blacklisted builtin
697
+ call and check for * or ** use
698
+ """
699
+ if isinstance(node.func, astroid.Name):
700
+ name = node.func.name
701
+ # ignore the name if it's not a builtin (i.e. not defined in the
702
+ # locals nor globals scope)
703
+ if not (name in node.frame() or
704
+ name in node.root()):
705
+ if name == 'exec':
706
+ self.add_message('exec-used', node=node)
707
+ elif name == 'reversed':
708
+ self._check_reversed(node)
709
+ elif name == 'eval':
710
+ self.add_message('eval-used', node=node)
711
+ if name in self.config.bad_functions:
712
+ self.add_message('bad-builtin', node=node, args=name)
713
+ if node.starargs or node.kwargs:
714
+ scope = node.scope()
715
+ if isinstance(scope, astroid.Function):
716
+ toprocess = [(n, vn) for (n, vn) in ((node.starargs, scope.args.vararg),
717
+ (node.kwargs, scope.args.kwarg)) if n]
718
+ if toprocess:
719
+ for cfnode, fargname in toprocess[:]:
720
+ if getattr(cfnode, 'name', None) == fargname:
721
+ toprocess.remove((cfnode, fargname))
722
+ if not toprocess:
723
+ return # star-args can be skipped
724
+ self.add_message('star-args', node=node.func)
725
+
726
+ @check_messages('assert-on-tuple')
727
+ def visit_assert(self, node):
728
+ """check the use of an assert statement on a tuple."""
729
+ if node.fail is None and isinstance(node.test, astroid.Tuple) and \
730
+ len(node.test.elts) == 2:
731
+ self.add_message('assert-on-tuple', node=node)
732
+
733
+ @check_messages('duplicate-key')
734
+ def visit_dict(self, node):
735
+ """check duplicate key in dictionary"""
736
+ keys = set()
737
+ for k, _ in node.items:
738
+ if isinstance(k, astroid.Const):
739
+ key = k.value
740
+ if key in keys:
741
+ self.add_message('duplicate-key', node=node, args=key)
742
+ keys.add(key)
743
+
744
+ def visit_tryfinally(self, node):
745
+ """update try...finally flag"""
746
+ self._tryfinallys.append(node)
747
+
748
+ def leave_tryfinally(self, node):
749
+ """update try...finally flag"""
750
+ self._tryfinallys.pop()
751
+
752
+ def _check_unreachable(self, node):
753
+ """check unreachable code"""
754
+ unreach_stmt = node.next_sibling()
755
+ if unreach_stmt is not None:
756
+ self.add_message('unreachable', node=unreach_stmt)
757
+
758
+ def _check_not_in_finally(self, node, node_name, breaker_classes=()):
759
+ """check that a node is not inside a finally clause of a
760
+ try...finally statement.
761
+ If we found before a try...finally bloc a parent which its type is
762
+ in breaker_classes, we skip the whole check."""
763
+ # if self._tryfinallys is empty, we're not a in try...finally bloc
764
+ if not self._tryfinallys:
765
+ return
766
+ # the node could be a grand-grand...-children of the try...finally
767
+ _parent = node.parent
768
+ _node = node
769
+ while _parent and not isinstance(_parent, breaker_classes):
770
+ if hasattr(_parent, 'finalbody') and _node in _parent.finalbody:
771
+ self.add_message('lost-exception', node=node, args=node_name)
772
+ return
773
+ _node = _parent
774
+ _parent = _node.parent
775
+
776
+ def _check_reversed(self, node):
777
+ """ check that the argument to `reversed` is a sequence """
778
+ try:
779
+ argument = safe_infer(get_argument_from_call(node, position=0))
780
+ except NoSuchArgumentError:
781
+ self.add_message('missing-reversed-argument', node=node)
782
+ else:
783
+ if argument is astroid.YES:
784
+ return
785
+ if argument is None:
786
+ # nothing was infered
787
+ # try to see if we have iter()
788
+ if isinstance(node.args[0], astroid.CallFunc):
789
+ try:
790
+ func = node.args[0].func.infer().next()
791
+ except InferenceError:
792
+ return
793
+ if (getattr(func, 'name', None) == 'iter' and
794
+ is_builtin_object(func)):
795
+ self.add_message('bad-reversed-sequence', node=node)
796
+ return
797
+
798
+ if isinstance(argument, astroid.Instance):
799
+ if (argument._proxied.name == 'dict' and
800
+ is_builtin_object(argument._proxied)):
801
+ self.add_message('bad-reversed-sequence', node=node)
802
+ return
803
+ elif any(ancestor.name == 'dict' and is_builtin_object(ancestor)
804
+ for ancestor in argument._proxied.ancestors()):
805
+ # mappings aren't accepted by reversed()
806
+ self.add_message('bad-reversed-sequence', node=node)
807
+ return
808
+
809
+ for methods in REVERSED_METHODS:
810
+ for meth in methods:
811
+ try:
812
+ argument.getattr(meth)
813
+ except astroid.NotFoundError:
814
+ break
815
+ else:
816
+ break
817
+ else:
818
+ # check if it is a .deque. It doesn't seem that
819
+ # we can retrieve special methods
820
+ # from C implemented constructs
821
+ if argument._proxied.qname().endswith(".deque"):
822
+ return
823
+ self.add_message('bad-reversed-sequence', node=node)
824
+ elif not isinstance(argument, (astroid.List, astroid.Tuple)):
825
+ # everything else is not a proper sequence for reversed()
826
+ self.add_message('bad-reversed-sequence', node=node)
827
+
828
+ _NAME_TYPES = {
829
+ 'module': (MOD_NAME_RGX, 'module'),
830
+ 'const': (CONST_NAME_RGX, 'constant'),
831
+ 'class': (CLASS_NAME_RGX, 'class'),
832
+ 'function': (DEFAULT_NAME_RGX, 'function'),
833
+ 'method': (DEFAULT_NAME_RGX, 'method'),
834
+ 'attr': (DEFAULT_NAME_RGX, 'attribute'),
835
+ 'argument': (DEFAULT_NAME_RGX, 'argument'),
836
+ 'variable': (DEFAULT_NAME_RGX, 'variable'),
837
+ 'class_attribute': (CLASS_ATTRIBUTE_RGX, 'class attribute'),
838
+ 'inlinevar': (COMP_VAR_RGX, 'inline iteration'),
839
+ }
840
+
841
+ def _create_naming_options():
842
+ name_options = []
843
+ for name_type, (rgx, human_readable_name) in _NAME_TYPES.iteritems():
844
+ name_type = name_type.replace('_', '-')
845
+ name_options.append((
846
+ '%s-rgx' % (name_type,),
847
+ {'default': rgx, 'type': 'regexp', 'metavar': '<regexp>',
848
+ 'help': 'Regular expression matching correct %s names' % (human_readable_name,)}))
849
+ name_options.append((
850
+ '%s-name-hint' % (name_type,),
851
+ {'default': rgx.pattern, 'type': 'string', 'metavar': '<string>',
852
+ 'help': 'Naming hint for %s names' % (human_readable_name,)}))
853
+
854
+ return tuple(name_options)
855
+
856
+ class NameChecker(_BasicChecker):
857
+ msgs = {
858
+ 'C0102': ('Black listed name "%s"',
859
+ 'blacklisted-name',
860
+ 'Used when the name is listed in the black list (unauthorized \
861
+ names).'),
862
+ 'C0103': ('Invalid %s name "%s"%s',
863
+ 'invalid-name',
864
+ 'Used when the name doesn\'t match the regular expression \
865
+ associated to its type (constant, variable, class...).'),
866
+ }
867
+
868
+ options = (# XXX use set
869
+ ('good-names',
870
+ {'default' : ('i', 'j', 'k', 'ex', 'Run', '_'),
871
+ 'type' :'csv', 'metavar' : '<names>',
872
+ 'help' : 'Good variable names which should always be accepted,'
873
+ ' separated by a comma'}
874
+ ),
875
+ ('bad-names',
876
+ {'default' : ('foo', 'bar', 'baz', 'toto', 'tutu', 'tata'),
877
+ 'type' :'csv', 'metavar' : '<names>',
878
+ 'help' : 'Bad variable names which should always be refused, '
879
+ 'separated by a comma'}
880
+ ),
881
+ ('name-group',
882
+ {'default' : (),
883
+ 'type' :'csv', 'metavar' : '<name1:name2>',
884
+ 'help' : ('Colon-delimited sets of names that determine each'
885
+ ' other\'s naming style when the name regexes'
886
+ ' allow several styles.')}
887
+ ),
888
+ ('include-naming-hint',
889
+ {'default': False, 'type' : 'yn', 'metavar' : '<y_or_n>',
890
+ 'help': 'Include a hint for the correct naming format with invalid-name'}
891
+ ),
892
+ ) + _create_naming_options()
893
+
894
+
895
+ def __init__(self, linter):
896
+ _BasicChecker.__init__(self, linter)
897
+ self._name_category = {}
898
+ self._name_group = {}
899
+
900
+ def open(self):
901
+ self.stats = self.linter.add_stats(badname_module=0,
902
+ badname_class=0, badname_function=0,
903
+ badname_method=0, badname_attr=0,
904
+ badname_const=0,
905
+ badname_variable=0,
906
+ badname_inlinevar=0,
907
+ badname_argument=0,
908
+ badname_class_attribute=0)
909
+ for group in self.config.name_group:
910
+ for name_type in group.split(':'):
911
+ self._name_group[name_type] = 'group_%s' % (group,)
912
+
913
+ @check_messages('blacklisted-name', 'invalid-name')
914
+ def visit_module(self, node):
915
+ self._check_name('module', node.name.split('.')[-1], node)
916
+
917
+ @check_messages('blacklisted-name', 'invalid-name')
918
+ def visit_class(self, node):
919
+ self._check_name('class', node.name, node)
920
+ for attr, anodes in node.instance_attrs.iteritems():
921
+ if not list(node.instance_attr_ancestors(attr)):
922
+ self._check_name('attr', attr, anodes[0])
923
+
924
+ @check_messages('blacklisted-name', 'invalid-name')
925
+ def visit_function(self, node):
926
+ # Do not emit any warnings if the method is just an implementation
927
+ # of a base class method.
928
+ if node.is_method() and overrides_a_method(node.parent.frame(), node.name):
929
+ return
930
+ self._check_name(_determine_function_name_type(node),
931
+ node.name, node)
932
+ # Check argument names
933
+ args = node.args.args
934
+ if args is not None:
935
+ self._recursive_check_names(args, node)
936
+
937
+ @check_messages('blacklisted-name', 'invalid-name')
938
+ def visit_global(self, node):
939
+ for name in node.names:
940
+ self._check_name('const', name, node)
941
+
942
+ @check_messages('blacklisted-name', 'invalid-name')
943
+ def visit_assname(self, node):
944
+ """check module level assigned names"""
945
+ frame = node.frame()
946
+ ass_type = node.ass_type()
947
+ if isinstance(ass_type, astroid.Comprehension):
948
+ self._check_name('inlinevar', node.name, node)
949
+ elif isinstance(frame, astroid.Module):
950
+ if isinstance(ass_type, astroid.Assign) and not in_loop(ass_type):
951
+ if isinstance(safe_infer(ass_type.value), astroid.Class):
952
+ self._check_name('class', node.name, node)
953
+ else:
954
+ self._check_name('const', node.name, node)
955
+ elif isinstance(ass_type, astroid.ExceptHandler):
956
+ self._check_name('variable', node.name, node)
957
+ elif isinstance(frame, astroid.Function):
958
+ # global introduced variable aren't in the function locals
959
+ if node.name in frame and node.name not in frame.argnames():
960
+ self._check_name('variable', node.name, node)
961
+ elif isinstance(frame, astroid.Class):
962
+ if not list(frame.local_attr_ancestors(node.name)):
963
+ self._check_name('class_attribute', node.name, node)
964
+
965
+ def _recursive_check_names(self, args, node):
966
+ """check names in a possibly recursive list <arg>"""
967
+ for arg in args:
968
+ if isinstance(arg, astroid.AssName):
969
+ self._check_name('argument', arg.name, node)
970
+ else:
971
+ self._recursive_check_names(arg.elts, node)
972
+
973
+ def _find_name_group(self, node_type):
974
+ return self._name_group.get(node_type, node_type)
975
+
976
+ def _is_multi_naming_match(self, match):
977
+ return (match is not None and
978
+ match.lastgroup is not None and
979
+ match.lastgroup not in EXEMPT_NAME_CATEGORIES)
980
+
981
+ def _check_name(self, node_type, name, node):
982
+ """check for a name using the type's regexp"""
983
+ if is_inside_except(node):
984
+ clobbering, _ = clobber_in_except(node)
985
+ if clobbering:
986
+ return
987
+ if name in self.config.good_names:
988
+ return
989
+ if name in self.config.bad_names:
990
+ self.stats['badname_' + node_type] += 1
991
+ self.add_message('blacklisted-name', node=node, args=name)
992
+ return
993
+ regexp = getattr(self.config, node_type + '_rgx')
994
+ match = regexp.match(name)
995
+
996
+ if self._is_multi_naming_match(match):
997
+ name_group = self._find_name_group(node_type)
998
+ if name_group not in self._name_category:
999
+ self._name_category[name_group] = match.lastgroup
1000
+ elif self._name_category[name_group] != match.lastgroup:
1001
+ match = None
1002
+
1003
+ if match is None:
1004
+ type_label = _NAME_TYPES[node_type][1]
1005
+ hint = ''
1006
+ if self.config.include_naming_hint:
1007
+ hint = ' (hint: %s)' % (getattr(self.config, node_type + '_name_hint'))
1008
+ self.add_message('invalid-name', node=node, args=(type_label, name, hint))
1009
+ self.stats['badname_' + node_type] += 1
1010
+
1011
+
1012
+ class DocStringChecker(_BasicChecker):
1013
+ msgs = {
1014
+ 'C0111': ('Missing %s docstring', # W0131
1015
+ 'missing-docstring',
1016
+ 'Used when a module, function, class or method has no docstring.\
1017
+ Some special methods like __init__ doesn\'t necessary require a \
1018
+ docstring.'),
1019
+ 'C0112': ('Empty %s docstring', # W0132
1020
+ 'empty-docstring',
1021
+ 'Used when a module, function, class or method has an empty \
1022
+ docstring (it would be too easy ;).'),
1023
+ }
1024
+ options = (('no-docstring-rgx',
1025
+ {'default' : NO_REQUIRED_DOC_RGX,
1026
+ 'type' : 'regexp', 'metavar' : '<regexp>',
1027
+ 'help' : 'Regular expression which should only match '
1028
+ 'function or class names that do not require a '
1029
+ 'docstring.'}
1030
+ ),
1031
+ ('docstring-min-length',
1032
+ {'default' : -1,
1033
+ 'type' : 'int', 'metavar' : '<int>',
1034
+ 'help': ('Minimum line length for functions/classes that'
1035
+ ' require docstrings, shorter ones are exempt.')}
1036
+ ),
1037
+ )
1038
+
1039
+
1040
+ def open(self):
1041
+ self.stats = self.linter.add_stats(undocumented_module=0,
1042
+ undocumented_function=0,
1043
+ undocumented_method=0,
1044
+ undocumented_class=0)
1045
+ @check_messages('missing-docstring', 'empty-docstring')
1046
+ def visit_module(self, node):
1047
+ self._check_docstring('module', node)
1048
+
1049
+ @check_messages('missing-docstring', 'empty-docstring')
1050
+ def visit_class(self, node):
1051
+ if self.config.no_docstring_rgx.match(node.name) is None:
1052
+ self._check_docstring('class', node)
1053
+ @check_messages('missing-docstring', 'empty-docstring')
1054
+ def visit_function(self, node):
1055
+ if self.config.no_docstring_rgx.match(node.name) is None:
1056
+ ftype = node.is_method() and 'method' or 'function'
1057
+ if isinstance(node.parent.frame(), astroid.Class):
1058
+ overridden = False
1059
+ # check if node is from a method overridden by its ancestor
1060
+ for ancestor in node.parent.frame().ancestors():
1061
+ if node.name in ancestor and \
1062
+ isinstance(ancestor[node.name], astroid.Function):
1063
+ overridden = True
1064
+ break
1065
+ self._check_docstring(ftype, node,
1066
+ report_missing=not overridden)
1067
+ else:
1068
+ self._check_docstring(ftype, node)
1069
+
1070
+ def _check_docstring(self, node_type, node, report_missing=True):
1071
+ """check the node has a non empty docstring"""
1072
+ docstring = node.doc
1073
+ if docstring is None:
1074
+ if not report_missing:
1075
+ return
1076
+ if node.body:
1077
+ lines = node.body[-1].lineno - node.body[0].lineno + 1
1078
+ else:
1079
+ lines = 0
1080
+ max_lines = self.config.docstring_min_length
1081
+
1082
+ if node_type != 'module' and max_lines > -1 and lines < max_lines:
1083
+ return
1084
+ self.stats['undocumented_'+node_type] += 1
1085
+ self.add_message('missing-docstring', node=node, args=(node_type,))
1086
+ elif not docstring.strip():
1087
+ self.stats['undocumented_'+node_type] += 1
1088
+ self.add_message('empty-docstring', node=node, args=(node_type,))
1089
+
1090
+
1091
+ class PassChecker(_BasicChecker):
1092
+ """check if the pass statement is really necessary"""
1093
+ msgs = {'W0107': ('Unnecessary pass statement',
1094
+ 'unnecessary-pass',
1095
+ 'Used when a "pass" statement that can be avoided is '
1096
+ 'encountered.'),
1097
+ }
1098
+ @check_messages('unnecessary-pass')
1099
+ def visit_pass(self, node):
1100
+ if len(node.parent.child_sequence(node)) > 1:
1101
+ self.add_message('unnecessary-pass', node=node)
1102
+
1103
+
1104
+ class LambdaForComprehensionChecker(_BasicChecker):
1105
+ """check for using a lambda where a comprehension would do.
1106
+
1107
+ See <http://www.artima.com/weblogs/viewpost.jsp?thread=98196>
1108
+ where GvR says comprehensions would be clearer.
1109
+ """
1110
+
1111
+ msgs = {'W0110': ('map/filter on lambda could be replaced by comprehension',
1112
+ 'deprecated-lambda',
1113
+ 'Used when a lambda is the first argument to "map" or '
1114
+ '"filter". It could be clearer as a list '
1115
+ 'comprehension or generator expression.',
1116
+ {'maxversion': (3, 0)}),
1117
+ }
1118
+
1119
+ @check_messages('deprecated-lambda')
1120
+ def visit_callfunc(self, node):
1121
+ """visit a CallFunc node, check if map or filter are called with a
1122
+ lambda
1123
+ """
1124
+ if not node.args:
1125
+ return
1126
+ if not isinstance(node.args[0], astroid.Lambda):
1127
+ return
1128
+ infered = safe_infer(node.func)
1129
+ if (is_builtin_object(infered)
1130
+ and infered.name in ['map', 'filter']):
1131
+ self.add_message('deprecated-lambda', node=node)
1132
+
1133
+
1134
+ def register(linter):
1135
+ """required method to auto register this checker"""
1136
+ linter.register_checker(BasicErrorChecker(linter))
1137
+ linter.register_checker(BasicChecker(linter))
1138
+ linter.register_checker(NameChecker(linter))
1139
+ linter.register_checker(DocStringChecker(linter))
1140
+ linter.register_checker(PassChecker(linter))
1141
+ linter.register_checker(LambdaForComprehensionChecker(linter))