exercism-analysis 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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,792 @@
1
+ # Copyright (c) 2003-2014 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
+ """classes checker for Python code
17
+ """
18
+ from __future__ import generators
19
+
20
+ import sys
21
+
22
+ import astroid
23
+ from astroid import YES, Instance, are_exclusive, AssAttr
24
+ from astroid.bases import Generator
25
+
26
+ from pylint.interfaces import IAstroidChecker
27
+ from pylint.checkers import BaseChecker
28
+ from pylint.checkers.utils import (PYMETHODS, overrides_a_method,
29
+ check_messages, is_attr_private, is_attr_protected, node_frame_class)
30
+
31
+ if sys.version_info >= (3, 0):
32
+ NEXT_METHOD = '__next__'
33
+ else:
34
+ NEXT_METHOD = 'next'
35
+ ITER_METHODS = ('__iter__', '__getitem__')
36
+
37
+ def class_is_abstract(node):
38
+ """return true if the given class node should be considered as an abstract
39
+ class
40
+ """
41
+ for method in node.methods():
42
+ if method.parent.frame() is node:
43
+ if method.is_abstract(pass_is_abstract=False):
44
+ return True
45
+ return False
46
+
47
+
48
+ MSGS = {
49
+ 'F0202': ('Unable to check methods signature (%s / %s)',
50
+ 'method-check-failed',
51
+ 'Used when PyLint has been unable to check methods signature \
52
+ compatibility for an unexpected reason. Please report this kind \
53
+ if you don\'t make sense of it.'),
54
+
55
+ 'E0202': ('An attribute defined in %s line %s hides this method',
56
+ 'method-hidden',
57
+ 'Used when a class defines a method which is hidden by an '
58
+ 'instance attribute from an ancestor class or set by some '
59
+ 'client code.'),
60
+ 'E0203': ('Access to member %r before its definition line %s',
61
+ 'access-member-before-definition',
62
+ 'Used when an instance member is accessed before it\'s actually\
63
+ assigned.'),
64
+ 'W0201': ('Attribute %r defined outside __init__',
65
+ 'attribute-defined-outside-init',
66
+ 'Used when an instance attribute is defined outside the __init__\
67
+ method.'),
68
+
69
+ 'W0212': ('Access to a protected member %s of a client class', # E0214
70
+ 'protected-access',
71
+ 'Used when a protected member (i.e. class member with a name \
72
+ beginning with an underscore) is access outside the class or a \
73
+ descendant of the class where it\'s defined.'),
74
+
75
+ 'E0211': ('Method has no argument',
76
+ 'no-method-argument',
77
+ 'Used when a method which should have the bound instance as \
78
+ first argument has no argument defined.'),
79
+ 'E0213': ('Method should have "self" as first argument',
80
+ 'no-self-argument',
81
+ 'Used when a method has an attribute different the "self" as\
82
+ first argument. This is considered as an error since this is\
83
+ a so common convention that you shouldn\'t break it!'),
84
+ 'C0202': ('Class method %s should have %s as first argument', # E0212
85
+ 'bad-classmethod-argument',
86
+ 'Used when a class method has a first argument named differently '
87
+ 'than the value specified in valid-classmethod-first-arg option '
88
+ '(default to "cls"), recommended to easily differentiate them '
89
+ 'from regular instance methods.'),
90
+ 'C0203': ('Metaclass method %s should have %s as first argument', # E0214
91
+ 'bad-mcs-method-argument',
92
+ 'Used when a metaclass method has a first agument named '
93
+ 'differently than the value specified in valid-classmethod-first'
94
+ '-arg option (default to "cls"), recommended to easily '
95
+ 'differentiate them from regular instance methods.'),
96
+ 'C0204': ('Metaclass class method %s should have %s as first argument',
97
+ 'bad-mcs-classmethod-argument',
98
+ 'Used when a metaclass class method has a first argument named '
99
+ 'differently than the value specified in valid-metaclass-'
100
+ 'classmethod-first-arg option (default to "mcs"), recommended to '
101
+ 'easily differentiate them from regular instance methods.'),
102
+
103
+ 'W0211': ('Static method with %r as first argument',
104
+ 'bad-staticmethod-argument',
105
+ 'Used when a static method has "self" or a value specified in '
106
+ 'valid-classmethod-first-arg option or '
107
+ 'valid-metaclass-classmethod-first-arg option as first argument.'
108
+ ),
109
+ 'R0201': ('Method could be a function',
110
+ 'no-self-use',
111
+ 'Used when a method doesn\'t use its bound instance, and so could\
112
+ be written as a function.'
113
+ ),
114
+
115
+ 'E0221': ('Interface resolved to %s is not a class',
116
+ 'interface-is-not-class',
117
+ 'Used when a class claims to implement an interface which is not \
118
+ a class.'),
119
+ 'E0222': ('Missing method %r from %s interface',
120
+ 'missing-interface-method',
121
+ 'Used when a method declared in an interface is missing from a \
122
+ class implementing this interface'),
123
+ 'W0221': ('Arguments number differs from %s method',
124
+ 'arguments-differ',
125
+ 'Used when a method has a different number of arguments than in \
126
+ the implemented interface or in an overridden method.'),
127
+ 'W0222': ('Signature differs from %s method',
128
+ 'signature-differs',
129
+ 'Used when a method signature is different than in the \
130
+ implemented interface or in an overridden method.'),
131
+ 'W0223': ('Method %r is abstract in class %r but is not overridden',
132
+ 'abstract-method',
133
+ 'Used when an abstract method (i.e. raise NotImplementedError) is \
134
+ not overridden in concrete class.'
135
+ ),
136
+ 'F0220': ('failed to resolve interfaces implemented by %s (%s)', # W0224
137
+ 'unresolved-interface',
138
+ 'Used when a PyLint as failed to find interfaces implemented by \
139
+ a class'),
140
+
141
+
142
+ 'W0231': ('__init__ method from base class %r is not called',
143
+ 'super-init-not-called',
144
+ 'Used when an ancestor class method has an __init__ method \
145
+ which is not called by a derived class.'),
146
+ 'W0232': ('Class has no __init__ method',
147
+ 'no-init',
148
+ 'Used when a class has no __init__ method, neither its parent \
149
+ classes.'),
150
+ 'W0233': ('__init__ method from a non direct base class %r is called',
151
+ 'non-parent-init-called',
152
+ 'Used when an __init__ method is called on a class which is not \
153
+ in the direct ancestors for the analysed class.'),
154
+ 'W0234': ('__iter__ returns non-iterator',
155
+ 'non-iterator-returned',
156
+ 'Used when an __iter__ method returns something which is not an \
157
+ iterable (i.e. has no `%s` method)' % NEXT_METHOD),
158
+ 'E0235': ('__exit__ must accept 3 arguments: type, value, traceback',
159
+ 'bad-context-manager',
160
+ 'Used when the __exit__ special method, belonging to a \
161
+ context manager, does not accept 3 arguments \
162
+ (type, value, traceback).'),
163
+ 'E0236': ('Invalid object %r in __slots__, must contain '
164
+ 'only non empty strings',
165
+ 'invalid-slots-object',
166
+ 'Used when an invalid (non-string) object occurs in __slots__.'),
167
+ 'E0238': ('Invalid __slots__ object',
168
+ 'invalid-slots',
169
+ 'Used when an invalid __slots__ is found in class. '
170
+ 'Only a string, an iterable or a sequence is permitted.')
171
+
172
+
173
+ }
174
+
175
+
176
+ class ClassChecker(BaseChecker):
177
+ """checks for :
178
+ * methods without self as first argument
179
+ * overridden methods signature
180
+ * access only to existent members via self
181
+ * attributes not defined in the __init__ method
182
+ * supported interfaces implementation
183
+ * unreachable code
184
+ """
185
+
186
+ __implements__ = (IAstroidChecker,)
187
+
188
+ # configuration section name
189
+ name = 'classes'
190
+ # messages
191
+ msgs = MSGS
192
+ priority = -2
193
+ # configuration options
194
+ options = (('ignore-iface-methods',
195
+ {'default' : (#zope interface
196
+ 'isImplementedBy', 'deferred', 'extends', 'names',
197
+ 'namesAndDescriptions', 'queryDescriptionFor', 'getBases',
198
+ 'getDescriptionFor', 'getDoc', 'getName', 'getTaggedValue',
199
+ 'getTaggedValueTags', 'isEqualOrExtendedBy', 'setTaggedValue',
200
+ 'isImplementedByInstancesOf',
201
+ # twisted
202
+ 'adaptWith',
203
+ # logilab.common interface
204
+ 'is_implemented_by'),
205
+ 'type' : 'csv',
206
+ 'metavar' : '<method names>',
207
+ 'help' : 'List of interface methods to ignore, \
208
+ separated by a comma. This is used for instance to not check methods defines \
209
+ in Zope\'s Interface base class.'}
210
+ ),
211
+
212
+ ('defining-attr-methods',
213
+ {'default' : ('__init__', '__new__', 'setUp'),
214
+ 'type' : 'csv',
215
+ 'metavar' : '<method names>',
216
+ 'help' : 'List of method names used to declare (i.e. assign) \
217
+ instance attributes.'}
218
+ ),
219
+ ('valid-classmethod-first-arg',
220
+ {'default' : ('cls',),
221
+ 'type' : 'csv',
222
+ 'metavar' : '<argument names>',
223
+ 'help' : 'List of valid names for the first argument in \
224
+ a class method.'}
225
+ ),
226
+ ('valid-metaclass-classmethod-first-arg',
227
+ {'default' : ('mcs',),
228
+ 'type' : 'csv',
229
+ 'metavar' : '<argument names>',
230
+ 'help' : 'List of valid names for the first argument in \
231
+ a metaclass class method.'}
232
+ ),
233
+
234
+ )
235
+
236
+ def __init__(self, linter=None):
237
+ BaseChecker.__init__(self, linter)
238
+ self._accessed = []
239
+ self._first_attrs = []
240
+ self._meth_could_be_func = None
241
+
242
+ def visit_class(self, node):
243
+ """init visit variable _accessed and check interfaces
244
+ """
245
+ self._accessed.append({})
246
+ self._check_bases_classes(node)
247
+ self._check_interfaces(node)
248
+ # if not an interface, exception, metaclass
249
+ if node.type == 'class':
250
+ try:
251
+ node.local_attr('__init__')
252
+ except astroid.NotFoundError:
253
+ self.add_message('no-init', args=node, node=node)
254
+ self._check_slots(node)
255
+
256
+ @check_messages('access-member-before-definition', 'attribute-defined-outside-init')
257
+ def leave_class(self, cnode):
258
+ """close a class node:
259
+ check that instance attributes are defined in __init__ and check
260
+ access to existent members
261
+ """
262
+ # check access to existent members on non metaclass classes
263
+ accessed = self._accessed.pop()
264
+ if cnode.type != 'metaclass':
265
+ self._check_accessed_members(cnode, accessed)
266
+ # checks attributes are defined in an allowed method such as __init__
267
+ if not self.linter.is_message_enabled('attribute-defined-outside-init'):
268
+ return
269
+ defining_methods = self.config.defining_attr_methods
270
+ for attr, nodes in cnode.instance_attrs.iteritems():
271
+ nodes = [n for n in nodes if not
272
+ isinstance(n.statement(), (astroid.Delete, astroid.AugAssign))]
273
+ if not nodes:
274
+ continue # error detected by typechecking
275
+ attr_defined = False
276
+ # check if any method attr is defined in is a defining method
277
+ for node in nodes:
278
+ if node.frame().name in defining_methods:
279
+ attr_defined = True
280
+ if not attr_defined:
281
+ # check attribute is defined in a parent's __init__
282
+ for parent in cnode.instance_attr_ancestors(attr):
283
+ attr_defined = False
284
+ # check if any parent method attr is defined in is a defining method
285
+ for node in parent.instance_attrs[attr]:
286
+ if node.frame().name in defining_methods:
287
+ attr_defined = True
288
+ if attr_defined:
289
+ # we're done :)
290
+ break
291
+ else:
292
+ # check attribute is defined as a class attribute
293
+ try:
294
+ cnode.local_attr(attr)
295
+ except astroid.NotFoundError:
296
+ self.add_message('attribute-defined-outside-init', args=attr, node=node)
297
+
298
+ def visit_function(self, node):
299
+ """check method arguments, overriding"""
300
+ # ignore actual functions
301
+ if not node.is_method():
302
+ return
303
+ klass = node.parent.frame()
304
+ self._meth_could_be_func = True
305
+ # check first argument is self if this is actually a method
306
+ self._check_first_arg_for_type(node, klass.type == 'metaclass')
307
+ if node.name == '__init__':
308
+ self._check_init(node)
309
+ return
310
+ # check signature if the method overloads inherited method
311
+ for overridden in klass.local_attr_ancestors(node.name):
312
+ # get astroid for the searched method
313
+ try:
314
+ meth_node = overridden[node.name]
315
+ except KeyError:
316
+ # we have found the method but it's not in the local
317
+ # dictionary.
318
+ # This may happen with astroid build from living objects
319
+ continue
320
+ if not isinstance(meth_node, astroid.Function):
321
+ continue
322
+ self._check_signature(node, meth_node, 'overridden')
323
+ break
324
+ if node.decorators:
325
+ for decorator in node.decorators.nodes:
326
+ if isinstance(decorator, astroid.Getattr) and \
327
+ decorator.attrname in ('getter', 'setter', 'deleter'):
328
+ # attribute affectation will call this method, not hiding it
329
+ return
330
+ if isinstance(decorator, astroid.Name) and decorator.name == 'property':
331
+ # attribute affectation will either call a setter or raise
332
+ # an attribute error, anyway not hiding the function
333
+ return
334
+ # check if the method is hidden by an attribute
335
+ try:
336
+ overridden = klass.instance_attr(node.name)[0] # XXX
337
+ args = (overridden.root().name, overridden.fromlineno)
338
+ self.add_message('method-hidden', args=args, node=node)
339
+ except astroid.NotFoundError:
340
+ pass
341
+
342
+ # check non-iterators in __iter__
343
+ if node.name == '__iter__':
344
+ self._check_iter(node)
345
+ elif node.name == '__exit__':
346
+ self._check_exit(node)
347
+
348
+ def _check_slots(self, node):
349
+ if '__slots__' not in node.locals:
350
+ return
351
+ for slots in node.igetattr('__slots__'):
352
+ # check if __slots__ is a valid type
353
+ for meth in ITER_METHODS:
354
+ try:
355
+ slots.getattr(meth)
356
+ break
357
+ except astroid.NotFoundError:
358
+ continue
359
+ else:
360
+ self.add_message('invalid-slots', node=node)
361
+ continue
362
+
363
+ if isinstance(slots, astroid.Const):
364
+ # a string, ignore the following checks
365
+ continue
366
+ if not hasattr(slots, 'itered'):
367
+ # we can't obtain the values, maybe a .deque?
368
+ continue
369
+
370
+ if isinstance(slots, astroid.Dict):
371
+ values = [item[0] for item in slots.items]
372
+ else:
373
+ values = slots.itered()
374
+ if values is YES:
375
+ return
376
+
377
+ for elt in values:
378
+ try:
379
+ self._check_slots_elt(elt)
380
+ except astroid.InferenceError:
381
+ continue
382
+
383
+ def _check_slots_elt(self, elt):
384
+ for infered in elt.infer():
385
+ if infered is YES:
386
+ continue
387
+ if (not isinstance(infered, astroid.Const) or
388
+ not isinstance(infered.value, str)):
389
+ self.add_message('invalid-slots-object',
390
+ args=infered.as_string(),
391
+ node=elt)
392
+ continue
393
+ if not infered.value:
394
+ self.add_message('invalid-slots-object',
395
+ args=infered.as_string(),
396
+ node=elt)
397
+
398
+ def _check_iter(self, node):
399
+ try:
400
+ infered = node.infer_call_result(node)
401
+ except astroid.InferenceError:
402
+ return
403
+
404
+ for infered_node in infered:
405
+ if (infered_node is YES
406
+ or isinstance(infered_node, Generator)):
407
+ continue
408
+ if isinstance(infered_node, astroid.Instance):
409
+ try:
410
+ infered_node.local_attr(NEXT_METHOD)
411
+ except astroid.NotFoundError:
412
+ self.add_message('non-iterator-returned',
413
+ node=node)
414
+ break
415
+
416
+ def _check_exit(self, node):
417
+ positional = sum(1 for arg in node.args.args if arg.name != 'self')
418
+ if positional < 3 and not node.args.vararg:
419
+ self.add_message('bad-context-manager',
420
+ node=node)
421
+ elif positional > 3:
422
+ self.add_message('bad-context-manager',
423
+ node=node)
424
+
425
+ def leave_function(self, node):
426
+ """on method node, check if this method couldn't be a function
427
+
428
+ ignore class, static and abstract methods, initializer,
429
+ methods overridden from a parent class and any
430
+ kind of method defined in an interface for this warning
431
+ """
432
+ if node.is_method():
433
+ if node.args.args is not None:
434
+ self._first_attrs.pop()
435
+ if not self.linter.is_message_enabled('no-self-use'):
436
+ return
437
+ class_node = node.parent.frame()
438
+ if (self._meth_could_be_func and node.type == 'method'
439
+ and not node.name in PYMETHODS
440
+ and not (node.is_abstract() or
441
+ overrides_a_method(class_node, node.name))
442
+ and class_node.type != 'interface'):
443
+ self.add_message('no-self-use', node=node)
444
+
445
+ def visit_getattr(self, node):
446
+ """check if the getattr is an access to a class member
447
+ if so, register it. Also check for access to protected
448
+ class member from outside its class (but ignore __special__
449
+ methods)
450
+ """
451
+ attrname = node.attrname
452
+ # Check self
453
+ if self.is_first_attr(node):
454
+ self._accessed[-1].setdefault(attrname, []).append(node)
455
+ return
456
+ if not self.linter.is_message_enabled('protected-access'):
457
+ return
458
+
459
+ self._check_protected_attribute_access(node)
460
+
461
+ def visit_assattr(self, node):
462
+ if isinstance(node.ass_type(), astroid.AugAssign) and self.is_first_attr(node):
463
+ self._accessed[-1].setdefault(node.attrname, []).append(node)
464
+
465
+ @check_messages('protected-access')
466
+ def visit_assign(self, assign_node):
467
+ node = assign_node.targets[0]
468
+ if not isinstance(node, AssAttr):
469
+ return
470
+
471
+ if self.is_first_attr(node):
472
+ return
473
+
474
+ self._check_protected_attribute_access(node)
475
+
476
+ def _check_protected_attribute_access(self, node):
477
+ '''Given an attribute access node (set or get), check if attribute
478
+ access is legitimate. Call _check_first_attr with node before calling
479
+ this method. Valid cases are:
480
+ * self._attr in a method or cls._attr in a classmethod. Checked by
481
+ _check_first_attr.
482
+ * Klass._attr inside "Klass" class.
483
+ * Klass2._attr inside "Klass" class when Klass2 is a base class of
484
+ Klass.
485
+ '''
486
+ attrname = node.attrname
487
+
488
+ if is_attr_protected(attrname):
489
+
490
+ klass = node_frame_class(node)
491
+
492
+ # XXX infer to be more safe and less dirty ??
493
+ # in classes, check we are not getting a parent method
494
+ # through the class object or through super
495
+ callee = node.expr.as_string()
496
+
497
+ # We are not in a class, no remaining valid case
498
+ if klass is None:
499
+ self.add_message('protected-access', node=node, args=attrname)
500
+ return
501
+
502
+ # If the expression begins with a call to super, that's ok.
503
+ if isinstance(node.expr, astroid.CallFunc) and \
504
+ isinstance(node.expr.func, astroid.Name) and \
505
+ node.expr.func.name == 'super':
506
+ return
507
+
508
+ # We are in a class, one remaining valid cases, Klass._attr inside
509
+ # Klass
510
+ if not (callee == klass.name or callee in klass.basenames):
511
+ self.add_message('protected-access', node=node, args=attrname)
512
+
513
+ def visit_name(self, node):
514
+ """check if the name handle an access to a class member
515
+ if so, register it
516
+ """
517
+ if self._first_attrs and (node.name == self._first_attrs[-1] or
518
+ not self._first_attrs[-1]):
519
+ self._meth_could_be_func = False
520
+
521
+ def _check_accessed_members(self, node, accessed):
522
+ """check that accessed members are defined"""
523
+ # XXX refactor, probably much simpler now that E0201 is in type checker
524
+ for attr, nodes in accessed.iteritems():
525
+ # deactivate "except doesn't do anything", that's expected
526
+ # pylint: disable=W0704
527
+ try:
528
+ # is it a class attribute ?
529
+ node.local_attr(attr)
530
+ # yes, stop here
531
+ continue
532
+ except astroid.NotFoundError:
533
+ pass
534
+ # is it an instance attribute of a parent class ?
535
+ try:
536
+ node.instance_attr_ancestors(attr).next()
537
+ # yes, stop here
538
+ continue
539
+ except StopIteration:
540
+ pass
541
+ # is it an instance attribute ?
542
+ try:
543
+ defstmts = node.instance_attr(attr)
544
+ except astroid.NotFoundError:
545
+ pass
546
+ else:
547
+ # filter out augment assignment nodes
548
+ defstmts = [stmt for stmt in defstmts if stmt not in nodes]
549
+ if not defstmts:
550
+ # only augment assignment for this node, no-member should be
551
+ # triggered by the typecheck checker
552
+ continue
553
+ # filter defstmts to only pick the first one when there are
554
+ # several assignments in the same scope
555
+ scope = defstmts[0].scope()
556
+ defstmts = [stmt for i, stmt in enumerate(defstmts)
557
+ if i == 0 or stmt.scope() is not scope]
558
+ # if there are still more than one, don't attempt to be smarter
559
+ # than we can be
560
+ if len(defstmts) == 1:
561
+ defstmt = defstmts[0]
562
+ # check that if the node is accessed in the same method as
563
+ # it's defined, it's accessed after the initial assignment
564
+ frame = defstmt.frame()
565
+ lno = defstmt.fromlineno
566
+ for _node in nodes:
567
+ if _node.frame() is frame and _node.fromlineno < lno \
568
+ and not are_exclusive(_node.statement(), defstmt, ('AttributeError', 'Exception', 'BaseException')):
569
+ self.add_message('access-member-before-definition',
570
+ node=_node, args=(attr, lno))
571
+
572
+ def _check_first_arg_for_type(self, node, metaclass=0):
573
+ """check the name of first argument, expect:
574
+
575
+ * 'self' for a regular method
576
+ * 'cls' for a class method or a metaclass regular method (actually
577
+ valid-classmethod-first-arg value)
578
+ * 'mcs' for a metaclass class method (actually
579
+ valid-metaclass-classmethod-first-arg)
580
+ * not one of the above for a static method
581
+ """
582
+ # don't care about functions with unknown argument (builtins)
583
+ if node.args.args is None:
584
+ return
585
+ first_arg = node.args.args and node.argnames()[0]
586
+ self._first_attrs.append(first_arg)
587
+ first = self._first_attrs[-1]
588
+ # static method
589
+ if node.type == 'staticmethod':
590
+ if (first_arg == 'self' or
591
+ first_arg in self.config.valid_classmethod_first_arg or
592
+ first_arg in self.config.valid_metaclass_classmethod_first_arg):
593
+ self.add_message('bad-staticmethod-argument', args=first, node=node)
594
+ return
595
+ self._first_attrs[-1] = None
596
+ # class / regular method with no args
597
+ elif not node.args.args:
598
+ self.add_message('no-method-argument', node=node)
599
+ # metaclass
600
+ elif metaclass:
601
+ # metaclass __new__ or classmethod
602
+ if node.type == 'classmethod':
603
+ self._check_first_arg_config(first,
604
+ self.config.valid_metaclass_classmethod_first_arg, node,
605
+ 'bad-mcs-classmethod-argument', node.name)
606
+ # metaclass regular method
607
+ else:
608
+ self._check_first_arg_config(first,
609
+ self.config.valid_classmethod_first_arg, node, 'bad-mcs-method-argument',
610
+ node.name)
611
+ # regular class
612
+ else:
613
+ # class method
614
+ if node.type == 'classmethod':
615
+ self._check_first_arg_config(first,
616
+ self.config.valid_classmethod_first_arg, node, 'bad-classmethod-argument',
617
+ node.name)
618
+ # regular method without self as argument
619
+ elif first != 'self':
620
+ self.add_message('no-self-argument', node=node)
621
+
622
+ def _check_first_arg_config(self, first, config, node, message,
623
+ method_name):
624
+ if first not in config:
625
+ if len(config) == 1:
626
+ valid = repr(config[0])
627
+ else:
628
+ valid = ', '.join(
629
+ repr(v)
630
+ for v in config[:-1])
631
+ valid = '%s or %r' % (
632
+ valid, config[-1])
633
+ self.add_message(message, args=(method_name, valid), node=node)
634
+
635
+ def _check_bases_classes(self, node):
636
+ """check that the given class node implements abstract methods from
637
+ base classes
638
+ """
639
+ # check if this class abstract
640
+ if class_is_abstract(node):
641
+ return
642
+ for method in node.methods():
643
+ owner = method.parent.frame()
644
+ if owner is node:
645
+ continue
646
+ # owner is not this class, it must be a parent class
647
+ # check that the ancestor's method is not abstract
648
+ if method.name in node.locals:
649
+ # it is redefined as an attribute or with a descriptor
650
+ continue
651
+ if method.is_abstract(pass_is_abstract=False):
652
+ self.add_message('abstract-method', node=node,
653
+ args=(method.name, owner.name))
654
+
655
+ def _check_interfaces(self, node):
656
+ """check that the given class node really implements declared
657
+ interfaces
658
+ """
659
+ e0221_hack = [False]
660
+ def iface_handler(obj):
661
+ """filter interface objects, it should be classes"""
662
+ if not isinstance(obj, astroid.Class):
663
+ e0221_hack[0] = True
664
+ self.add_message('interface-is-not-class', node=node,
665
+ args=(obj.as_string(),))
666
+ return False
667
+ return True
668
+ ignore_iface_methods = self.config.ignore_iface_methods
669
+ try:
670
+ for iface in node.interfaces(handler_func=iface_handler):
671
+ for imethod in iface.methods():
672
+ name = imethod.name
673
+ if name.startswith('_') or name in ignore_iface_methods:
674
+ # don't check method beginning with an underscore,
675
+ # usually belonging to the interface implementation
676
+ continue
677
+ # get class method astroid
678
+ try:
679
+ method = node_method(node, name)
680
+ except astroid.NotFoundError:
681
+ self.add_message('missing-interface-method', args=(name, iface.name),
682
+ node=node)
683
+ continue
684
+ # ignore inherited methods
685
+ if method.parent.frame() is not node:
686
+ continue
687
+ # check signature
688
+ self._check_signature(method, imethod,
689
+ '%s interface' % iface.name)
690
+ except astroid.InferenceError:
691
+ if e0221_hack[0]:
692
+ return
693
+ implements = Instance(node).getattr('__implements__')[0]
694
+ assignment = implements.parent
695
+ assert isinstance(assignment, astroid.Assign)
696
+ # assignment.expr can be a Name or a Tuple or whatever.
697
+ # Use as_string() for the message
698
+ # FIXME: in case of multiple interfaces, find which one could not
699
+ # be resolved
700
+ self.add_message('unresolved-interface', node=implements,
701
+ args=(node.name, assignment.value.as_string()))
702
+
703
+ def _check_init(self, node):
704
+ """check that the __init__ method call super or ancestors'__init__
705
+ method
706
+ """
707
+ if (not self.linter.is_message_enabled('super-init-not-called') and
708
+ not self.linter.is_message_enabled('non-parent-init-called')):
709
+ return
710
+ klass_node = node.parent.frame()
711
+ to_call = _ancestors_to_call(klass_node)
712
+ not_called_yet = dict(to_call)
713
+ for stmt in node.nodes_of_class(astroid.CallFunc):
714
+ expr = stmt.func
715
+ if not isinstance(expr, astroid.Getattr) \
716
+ or expr.attrname != '__init__':
717
+ continue
718
+ # skip the test if using super
719
+ if isinstance(expr.expr, astroid.CallFunc) and \
720
+ isinstance(expr.expr.func, astroid.Name) and \
721
+ expr.expr.func.name == 'super':
722
+ return
723
+ try:
724
+ klass = expr.expr.infer().next()
725
+ if klass is YES:
726
+ continue
727
+ try:
728
+ del not_called_yet[klass]
729
+ except KeyError:
730
+ if klass not in to_call:
731
+ self.add_message('non-parent-init-called', node=expr, args=klass.name)
732
+ except astroid.InferenceError:
733
+ continue
734
+ for klass, method in not_called_yet.iteritems():
735
+ if klass.name == 'object' or method.parent.name == 'object':
736
+ continue
737
+ self.add_message('super-init-not-called', args=klass.name, node=node)
738
+
739
+ def _check_signature(self, method1, refmethod, class_type):
740
+ """check that the signature of the two given methods match
741
+
742
+ class_type is in 'class', 'interface'
743
+ """
744
+ if not (isinstance(method1, astroid.Function)
745
+ and isinstance(refmethod, astroid.Function)):
746
+ self.add_message('method-check-failed', args=(method1, refmethod), node=method1)
747
+ return
748
+ # don't care about functions with unknown argument (builtins)
749
+ if method1.args.args is None or refmethod.args.args is None:
750
+ return
751
+ # if we use *args, **kwargs, skip the below checks
752
+ if method1.args.vararg or method1.args.kwarg:
753
+ return
754
+ if is_attr_private(method1.name):
755
+ return
756
+ if len(method1.args.args) != len(refmethod.args.args):
757
+ self.add_message('arguments-differ', args=class_type, node=method1)
758
+ elif len(method1.args.defaults) < len(refmethod.args.defaults):
759
+ self.add_message('signature-differs', args=class_type, node=method1)
760
+
761
+ def is_first_attr(self, node):
762
+ """Check that attribute lookup name use first attribute variable name
763
+ (self for method, cls for classmethod and mcs for metaclass).
764
+ """
765
+ return self._first_attrs and isinstance(node.expr, astroid.Name) and \
766
+ node.expr.name == self._first_attrs[-1]
767
+
768
+ def _ancestors_to_call(klass_node, method='__init__'):
769
+ """return a dictionary where keys are the list of base classes providing
770
+ the queried method, and so that should/may be called from the method node
771
+ """
772
+ to_call = {}
773
+ for base_node in klass_node.ancestors(recurs=False):
774
+ try:
775
+ to_call[base_node] = base_node.igetattr(method).next()
776
+ except astroid.InferenceError:
777
+ continue
778
+ return to_call
779
+
780
+
781
+ def node_method(node, method_name):
782
+ """get astroid for <method_name> on the given class node, ensuring it
783
+ is a Function node
784
+ """
785
+ for n in node.local_attr(method_name):
786
+ if isinstance(n, astroid.Function):
787
+ return n
788
+ raise astroid.NotFoundError(method_name)
789
+
790
+ def register(linter):
791
+ """required method to auto register this checker """
792
+ linter.register_checker(ClassChecker(linter))