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,943 @@
1
+ # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify it under
4
+ # the terms of the GNU General Public License as published by the Free Software
5
+ # Foundation; either version 2 of the License, or (at your option) any later
6
+ # version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful, but WITHOUT
9
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License along with
13
+ # this program; if not, write to the Free Software Foundation, Inc.,
14
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15
+ """Python code format's checker.
16
+
17
+ By default try to follow Guido's style guide :
18
+
19
+ http://www.python.org/doc/essays/styleguide.html
20
+
21
+ Some parts of the process_token method is based from The Tab Nanny std module.
22
+ """
23
+
24
+ import keyword
25
+ import sys
26
+ import tokenize
27
+
28
+ if not hasattr(tokenize, 'NL'):
29
+ raise ValueError("tokenize.NL doesn't exist -- tokenize module too old")
30
+
31
+ from astroid import nodes
32
+
33
+ from pylint.interfaces import ITokenChecker, IAstroidChecker, IRawChecker
34
+ from pylint.checkers import BaseTokenChecker
35
+ from pylint.checkers.utils import check_messages
36
+ from pylint.utils import WarningScope, OPTION_RGX
37
+
38
+ _CONTINUATION_BLOCK_OPENERS = ['elif', 'except', 'for', 'if', 'while', 'def', 'class']
39
+ _KEYWORD_TOKENS = ['assert', 'del', 'elif', 'except', 'for', 'if', 'in', 'not',
40
+ 'raise', 'return', 'while', 'yield']
41
+ if sys.version_info < (3, 0):
42
+ _KEYWORD_TOKENS.append('print')
43
+
44
+ _SPACED_OPERATORS = ['==', '<', '>', '!=', '<>', '<=', '>=',
45
+ '+=', '-=', '*=', '**=', '/=', '//=', '&=', '|=', '^=',
46
+ '%=', '>>=', '<<=']
47
+ _OPENING_BRACKETS = ['(', '[', '{']
48
+ _CLOSING_BRACKETS = [')', ']', '}']
49
+ _TAB_LENGTH = 8
50
+
51
+ _EOL = frozenset([tokenize.NEWLINE, tokenize.NL, tokenize.COMMENT])
52
+ _JUNK_TOKENS = (tokenize.COMMENT, tokenize.NL)
53
+
54
+ # Whitespace checking policy constants
55
+ _MUST = 0
56
+ _MUST_NOT = 1
57
+ _IGNORE = 2
58
+
59
+ # Whitespace checking config constants
60
+ _DICT_SEPARATOR = 'dict-separator'
61
+ _TRAILING_COMMA = 'trailing-comma'
62
+ _NO_SPACE_CHECK_CHOICES = [_TRAILING_COMMA, _DICT_SEPARATOR]
63
+
64
+ MSGS = {
65
+ 'C0301': ('Line too long (%s/%s)',
66
+ 'line-too-long',
67
+ 'Used when a line is longer than a given number of characters.'),
68
+ 'C0302': ('Too many lines in module (%s)', # was W0302
69
+ 'too-many-lines',
70
+ 'Used when a module has too much lines, reducing its readability.'
71
+ ),
72
+ 'C0303': ('Trailing whitespace',
73
+ 'trailing-whitespace',
74
+ 'Used when there is whitespace between the end of a line and the '
75
+ 'newline.'),
76
+ 'C0304': ('Final newline missing',
77
+ 'missing-final-newline',
78
+ 'Used when the last line in a file is missing a newline.'),
79
+ 'W0311': ('Bad indentation. Found %s %s, expected %s',
80
+ 'bad-indentation',
81
+ 'Used when an unexpected number of indentation\'s tabulations or '
82
+ 'spaces has been found.'),
83
+ 'C0330': ('Wrong %s indentation%s.\n%s%s',
84
+ 'bad-continuation',
85
+ 'TODO'),
86
+ 'W0312': ('Found indentation with %ss instead of %ss',
87
+ 'mixed-indentation',
88
+ 'Used when there are some mixed tabs and spaces in a module.'),
89
+ 'W0301': ('Unnecessary semicolon', # was W0106
90
+ 'unnecessary-semicolon',
91
+ 'Used when a statement is ended by a semi-colon (";"), which \
92
+ isn\'t necessary (that\'s python, not C ;).'),
93
+ 'C0321': ('More than one statement on a single line',
94
+ 'multiple-statements',
95
+ 'Used when more than on statement are found on the same line.',
96
+ {'scope': WarningScope.NODE}),
97
+ 'C0325' : ('Unnecessary parens after %r keyword',
98
+ 'superfluous-parens',
99
+ 'Used when a single item in parentheses follows an if, for, or '
100
+ 'other keyword.'),
101
+ 'C0326': ('%s space %s %s %s\n%s',
102
+ 'bad-whitespace',
103
+ ('Used when a wrong number of spaces is used around an operator, '
104
+ 'bracket or block opener.'),
105
+ {'old_names': [('C0323', 'no-space-after-operator'),
106
+ ('C0324', 'no-space-after-comma'),
107
+ ('C0322', 'no-space-before-operator')]})
108
+ }
109
+
110
+
111
+ if sys.version_info < (3, 0):
112
+
113
+ MSGS.update({
114
+ 'W0331': ('Use of the <> operator',
115
+ 'old-ne-operator',
116
+ 'Used when the deprecated "<>" operator is used instead \
117
+ of "!=".'),
118
+ 'W0332': ('Use of "l" as long integer identifier',
119
+ 'lowercase-l-suffix',
120
+ 'Used when a lower case "l" is used to mark a long integer. You '
121
+ 'should use a upper case "L" since the letter "l" looks too much '
122
+ 'like the digit "1"'),
123
+ 'W0333': ('Use of the `` operator',
124
+ 'backtick',
125
+ 'Used when the deprecated "``" (backtick) operator is used '
126
+ 'instead of the str() function.',
127
+ {'scope': WarningScope.NODE}),
128
+ })
129
+
130
+
131
+ def _underline_token(token):
132
+ length = token[3][1] - token[2][1]
133
+ offset = token[2][1]
134
+ return token[4] + (' ' * offset) + ('^' * length)
135
+
136
+
137
+ def _column_distance(token1, token2):
138
+ if token1 == token2:
139
+ return 0
140
+ if token2[3] < token1[3]:
141
+ token1, token2 = token2, token1
142
+ if token1[3][0] != token2[2][0]:
143
+ return None
144
+ return token2[2][1] - token1[3][1]
145
+
146
+
147
+ def _last_token_on_line_is(tokens, line_end, token):
148
+ return (
149
+ line_end > 0 and tokens.token(line_end-1) == token or
150
+ line_end > 1 and tokens.token(line_end-2) == token
151
+ and tokens.type(line_end-1) == tokenize.COMMENT)
152
+
153
+
154
+ def _token_followed_by_eol(tokens, position):
155
+ return (tokens.type(position+1) == tokenize.NL or
156
+ tokens.type(position+1) == tokenize.COMMENT and
157
+ tokens.type(position+2) == tokenize.NL)
158
+
159
+
160
+ def _get_indent_length(line):
161
+ """Return the length of the indentation on the given token's line."""
162
+ result = 0
163
+ for char in line:
164
+ if char == ' ':
165
+ result += 1
166
+ elif char == '\t':
167
+ result += _TAB_LENGTH
168
+ else:
169
+ break
170
+ return result
171
+
172
+
173
+ def _get_indent_hint_line(bar_positions, bad_position):
174
+ """Return a line with |s for each of the positions in the given lists."""
175
+ if not bar_positions:
176
+ return ''
177
+ markers = [(pos, '|') for pos in bar_positions]
178
+ markers.append((bad_position, '^'))
179
+ markers.sort()
180
+ line = [' '] * (markers[-1][0] + 1)
181
+ for position, marker in markers:
182
+ line[position] = marker
183
+ return ''.join(line)
184
+
185
+
186
+ class _ContinuedIndent(object):
187
+ __slots__ = ('valid_outdent_offsets',
188
+ 'valid_continuation_offsets',
189
+ 'context_type',
190
+ 'token',
191
+ 'position')
192
+
193
+ def __init__(self,
194
+ context_type,
195
+ token,
196
+ position,
197
+ valid_outdent_offsets,
198
+ valid_continuation_offsets):
199
+ self.valid_outdent_offsets = valid_outdent_offsets
200
+ self.valid_continuation_offsets = valid_continuation_offsets
201
+ self.context_type = context_type
202
+ self.position = position
203
+ self.token = token
204
+
205
+
206
+ # The contexts for hanging indents.
207
+ # A hanging indented dictionary value after :
208
+ HANGING_DICT_VALUE = 'dict-value'
209
+ # Hanging indentation in an expression.
210
+ HANGING = 'hanging'
211
+ # Hanging indentation in a block header.
212
+ HANGING_BLOCK = 'hanging-block'
213
+ # Continued indentation inside an expression.
214
+ CONTINUED = 'continued'
215
+ # Continued indentation in a block header.
216
+ CONTINUED_BLOCK = 'continued-block'
217
+
218
+ SINGLE_LINE = 'single'
219
+ WITH_BODY = 'multi'
220
+
221
+ _CONTINUATION_MSG_PARTS = {
222
+ HANGING_DICT_VALUE: ('hanging', ' in dict value'),
223
+ HANGING: ('hanging', ''),
224
+ HANGING_BLOCK: ('hanging', ' before block'),
225
+ CONTINUED: ('continued', ''),
226
+ CONTINUED_BLOCK: ('continued', ' before block'),
227
+ }
228
+
229
+
230
+ def _Offsets(*args):
231
+ """Valid indentation offsets for a continued line."""
232
+ return dict((a, None) for a in args)
233
+
234
+
235
+ def _BeforeBlockOffsets(single, with_body):
236
+ """Valid alternative indent offsets for continued lines before blocks.
237
+
238
+ :param single: Valid offset for statements on a single logical line.
239
+ :param with_body: Valid offset for statements on several lines.
240
+ """
241
+ return {single: SINGLE_LINE, with_body: WITH_BODY}
242
+
243
+
244
+ class TokenWrapper(object):
245
+ """A wrapper for readable access to token information."""
246
+
247
+ def __init__(self, tokens):
248
+ self._tokens = tokens
249
+
250
+ def token(self, idx):
251
+ return self._tokens[idx][1]
252
+
253
+ def type(self, idx):
254
+ return self._tokens[idx][0]
255
+
256
+ def start_line(self, idx):
257
+ return self._tokens[idx][2][0]
258
+
259
+ def start_col(self, idx):
260
+ return self._tokens[idx][2][1]
261
+
262
+ def line(self, idx):
263
+ return self._tokens[idx][4]
264
+
265
+
266
+ class ContinuedLineState(object):
267
+ """Tracker for continued indentation inside a logical line."""
268
+
269
+ def __init__(self, tokens, config):
270
+ self._line_start = -1
271
+ self._cont_stack = []
272
+ self._is_block_opener = False
273
+ self.retained_warnings = []
274
+ self._config = config
275
+ self._tokens = TokenWrapper(tokens)
276
+
277
+ @property
278
+ def has_content(self):
279
+ return bool(self._cont_stack)
280
+
281
+ @property
282
+ def _block_indent_size(self):
283
+ return len(self._config.indent_string.replace('\t', ' ' * _TAB_LENGTH))
284
+
285
+ @property
286
+ def _continuation_size(self):
287
+ return self._config.indent_after_paren
288
+
289
+ def handle_line_start(self, pos):
290
+ """Record the first non-junk token at the start of a line."""
291
+ if self._line_start > -1:
292
+ return
293
+ self._is_block_opener = self._tokens.token(pos) in _CONTINUATION_BLOCK_OPENERS
294
+ self._line_start = pos
295
+
296
+ def next_physical_line(self):
297
+ """Prepares the tracker for a new physical line (NL)."""
298
+ self._line_start = -1
299
+ self._is_block_opener = False
300
+
301
+ def next_logical_line(self):
302
+ """Prepares the tracker for a new logical line (NEWLINE).
303
+
304
+ A new logical line only starts with block indentation.
305
+ """
306
+ self.next_physical_line()
307
+ self.retained_warnings = []
308
+ self._cont_stack = []
309
+
310
+ def add_block_warning(self, token_position, state, valid_offsets):
311
+ self.retained_warnings.append((token_position, state, valid_offsets))
312
+
313
+ def get_valid_offsets(self, idx):
314
+ """"Returns the valid offsets for the token at the given position."""
315
+ # The closing brace on a dict or the 'for' in a dict comprehension may
316
+ # reset two indent levels because the dict value is ended implicitly
317
+ stack_top = -1
318
+ if self._tokens.token(idx) in ('}', 'for') and self._cont_stack[-1].token == ':':
319
+ stack_top = -2
320
+ indent = self._cont_stack[stack_top]
321
+ if self._tokens.token(idx) in _CLOSING_BRACKETS:
322
+ valid_offsets = indent.valid_outdent_offsets
323
+ else:
324
+ valid_offsets = indent.valid_continuation_offsets
325
+ return indent, valid_offsets.copy()
326
+
327
+ def _hanging_indent_after_bracket(self, bracket, position):
328
+ """Extracts indentation information for a hanging indent."""
329
+ indentation = _get_indent_length(self._tokens.line(position))
330
+ if self._is_block_opener and self._continuation_size == self._block_indent_size:
331
+ return _ContinuedIndent(
332
+ HANGING_BLOCK,
333
+ bracket,
334
+ position,
335
+ _Offsets(indentation + self._continuation_size, indentation),
336
+ _BeforeBlockOffsets(indentation + self._continuation_size,
337
+ indentation + self._continuation_size * 2))
338
+ elif bracket == ':':
339
+ if self._cont_stack[-1].context_type == CONTINUED:
340
+ # If the dict key was on the same line as the open brace, the new
341
+ # correct indent should be relative to the key instead of the
342
+ # current indent level
343
+ paren_align = self._cont_stack[-1].valid_outdent_offsets
344
+ next_align = self._cont_stack[-1].valid_continuation_offsets.copy()
345
+ next_align[next_align.keys()[0] + self._continuation_size] = True
346
+ else:
347
+ next_align = _Offsets(indentation + self._continuation_size, indentation)
348
+ paren_align = _Offsets(indentation + self._continuation_size, indentation)
349
+ return _ContinuedIndent(HANGING_DICT_VALUE, bracket, position, paren_align, next_align)
350
+ else:
351
+ return _ContinuedIndent(
352
+ HANGING,
353
+ bracket,
354
+ position,
355
+ _Offsets(indentation, indentation + self._continuation_size),
356
+ _Offsets(indentation + self._continuation_size))
357
+
358
+ def _continuation_inside_bracket(self, bracket, pos):
359
+ """Extracts indentation information for a continued indent."""
360
+ indentation = _get_indent_length(self._tokens.line(pos))
361
+ if self._is_block_opener and self._tokens.start_col(pos+1) - indentation == self._block_indent_size:
362
+ return _ContinuedIndent(
363
+ CONTINUED_BLOCK,
364
+ bracket,
365
+ pos,
366
+ _Offsets(self._tokens.start_col(pos)),
367
+ _BeforeBlockOffsets(self._tokens.start_col(pos+1),
368
+ self._tokens.start_col(pos+1) + self._continuation_size))
369
+ else:
370
+ return _ContinuedIndent(
371
+ CONTINUED,
372
+ bracket,
373
+ pos,
374
+ _Offsets(self._tokens.start_col(pos)),
375
+ _Offsets(self._tokens.start_col(pos+1)))
376
+
377
+ def pop_token(self):
378
+ self._cont_stack.pop()
379
+
380
+ def push_token(self, token, position):
381
+ """Pushes a new token for continued indentation on the stack.
382
+
383
+ Tokens that can modify continued indentation offsets are:
384
+ * opening brackets
385
+ * 'lambda'
386
+ * : inside dictionaries
387
+
388
+ push_token relies on the caller to filter out those
389
+ interesting tokens.
390
+
391
+ :param token: The concrete token
392
+ :param position: The position of the token in the stream.
393
+ """
394
+ if _token_followed_by_eol(self._tokens, position):
395
+ self._cont_stack.append(
396
+ self._hanging_indent_after_bracket(token, position))
397
+ else:
398
+ self._cont_stack.append(
399
+ self._continuation_inside_bracket(token, position))
400
+
401
+
402
+ class FormatChecker(BaseTokenChecker):
403
+ """checks for :
404
+ * unauthorized constructions
405
+ * strict indentation
406
+ * line length
407
+ * use of <> instead of !=
408
+ """
409
+
410
+ __implements__ = (ITokenChecker, IAstroidChecker, IRawChecker)
411
+
412
+ # configuration section name
413
+ name = 'format'
414
+ # messages
415
+ msgs = MSGS
416
+ # configuration options
417
+ # for available dict keys/values see the optik parser 'add_option' method
418
+ options = (('max-line-length',
419
+ {'default' : 80, 'type' : "int", 'metavar' : '<int>',
420
+ 'help' : 'Maximum number of characters on a single line.'}),
421
+ ('ignore-long-lines',
422
+ {'type': 'regexp', 'metavar': '<regexp>',
423
+ 'default': r'^\s*(# )?<?https?://\S+>?$',
424
+ 'help': ('Regexp for a line that is allowed to be longer than '
425
+ 'the limit.')}),
426
+ ('single-line-if-stmt',
427
+ {'default': False, 'type' : 'yn', 'metavar' : '<y_or_n>',
428
+ 'help' : ('Allow the body of an if to be on the same '
429
+ 'line as the test if there is no else.')}),
430
+ ('no-space-check',
431
+ {'default': ','.join(_NO_SPACE_CHECK_CHOICES),
432
+ 'type': 'multiple_choice',
433
+ 'choices': _NO_SPACE_CHECK_CHOICES,
434
+ 'help': ('List of optional constructs for which whitespace '
435
+ 'checking is disabled')}),
436
+ ('max-module-lines',
437
+ {'default' : 1000, 'type' : 'int', 'metavar' : '<int>',
438
+ 'help': 'Maximum number of lines in a module'}
439
+ ),
440
+ ('indent-string',
441
+ {'default' : ' ', 'type' : "string", 'metavar' : '<string>',
442
+ 'help' : 'String used as indentation unit. This is usually \
443
+ " " (4 spaces) or "\\t" (1 tab).'}),
444
+ ('indent-after-paren',
445
+ {'type': 'int', 'metavar': '<int>', 'default': 4,
446
+ 'help': 'Number of spaces of indent required inside a hanging '
447
+ ' or continued line.'}),
448
+ )
449
+
450
+ def __init__(self, linter=None):
451
+ BaseTokenChecker.__init__(self, linter)
452
+ self._lines = None
453
+ self._visited_lines = None
454
+ self._bracket_stack = [None]
455
+
456
+ def _pop_token(self):
457
+ self._bracket_stack.pop()
458
+ self._current_line.pop_token()
459
+
460
+ def _push_token(self, token, idx):
461
+ self._bracket_stack.append(token)
462
+ self._current_line.push_token(token, idx)
463
+
464
+ def new_line(self, tokens, line_end, line_start):
465
+ """a new line has been encountered, process it if necessary"""
466
+ if _last_token_on_line_is(tokens, line_end, ';'):
467
+ self.add_message('unnecessary-semicolon', line=tokens.start_line(line_end))
468
+
469
+ line_num = tokens.start_line(line_start)
470
+ line = tokens.line(line_start)
471
+ if tokens.type(line_start) not in _JUNK_TOKENS:
472
+ self._lines[line_num] = line.split('\n')[0]
473
+ self.check_lines(line, line_num)
474
+
475
+ def process_module(self, module):
476
+ self._keywords_with_parens = set()
477
+ if 'print_function' in module.future_imports:
478
+ self._keywords_with_parens.add('print')
479
+
480
+ def _check_keyword_parentheses(self, tokens, start):
481
+ """Check that there are not unnecessary parens after a keyword.
482
+
483
+ Parens are unnecessary if there is exactly one balanced outer pair on a
484
+ line, and it is followed by a colon, and contains no commas (i.e. is not a
485
+ tuple).
486
+
487
+ Args:
488
+ tokens: list of Tokens; the entire list of Tokens.
489
+ start: int; the position of the keyword in the token list.
490
+ """
491
+ # If the next token is not a paren, we're fine.
492
+ if self._inside_brackets(':') and tokens[start][1] == 'for':
493
+ self._pop_token()
494
+ if tokens[start+1][1] != '(':
495
+ return
496
+
497
+ found_and_or = False
498
+ depth = 0
499
+ keyword_token = tokens[start][1]
500
+ line_num = tokens[start][2][0]
501
+
502
+ for i in xrange(start, len(tokens) - 1):
503
+ token = tokens[i]
504
+
505
+ # If we hit a newline, then assume any parens were for continuation.
506
+ if token[0] == tokenize.NL:
507
+ return
508
+
509
+ if token[1] == '(':
510
+ depth += 1
511
+ elif token[1] == ')':
512
+ depth -= 1
513
+ if not depth:
514
+ # ')' can't happen after if (foo), since it would be a syntax error.
515
+ if (tokens[i+1][1] in (':', ')', ']', '}', 'in') or
516
+ tokens[i+1][0] in (tokenize.NEWLINE, tokenize.ENDMARKER,
517
+ tokenize.COMMENT)):
518
+ # The empty tuple () is always accepted.
519
+ if i == start + 2:
520
+ return
521
+ if keyword_token == 'not':
522
+ if not found_and_or:
523
+ self.add_message('superfluous-parens', line=line_num,
524
+ args=keyword_token)
525
+ elif keyword_token in ('return', 'yield'):
526
+ self.add_message('superfluous-parens', line=line_num,
527
+ args=keyword_token)
528
+ elif keyword_token not in self._keywords_with_parens:
529
+ if not (tokens[i+1][1] == 'in' and found_and_or):
530
+ self.add_message('superfluous-parens', line=line_num,
531
+ args=keyword_token)
532
+ return
533
+ elif depth == 1:
534
+ # This is a tuple, which is always acceptable.
535
+ if token[1] == ',':
536
+ return
537
+ # 'and' and 'or' are the only boolean operators with lower precedence
538
+ # than 'not', so parens are only required when they are found.
539
+ elif token[1] in ('and', 'or'):
540
+ found_and_or = True
541
+ # A yield inside an expression must always be in parentheses,
542
+ # quit early without error.
543
+ elif token[1] == 'yield':
544
+ return
545
+ # A generator expression always has a 'for' token in it, and
546
+ # the 'for' token is only legal inside parens when it is in a
547
+ # generator expression. The parens are necessary here, so bail
548
+ # without an error.
549
+ elif token[1] == 'for':
550
+ return
551
+
552
+ def _opening_bracket(self, tokens, i):
553
+ self._push_token(tokens[i][1], i)
554
+ # Special case: ignore slices
555
+ if tokens[i][1] == '[' and tokens[i+1][1] == ':':
556
+ return
557
+
558
+ if (i > 0 and (tokens[i-1][0] == tokenize.NAME and
559
+ not (keyword.iskeyword(tokens[i-1][1]))
560
+ or tokens[i-1][1] in _CLOSING_BRACKETS)):
561
+ self._check_space(tokens, i, (_MUST_NOT, _MUST_NOT))
562
+ else:
563
+ self._check_space(tokens, i, (_IGNORE, _MUST_NOT))
564
+
565
+ def _closing_bracket(self, tokens, i):
566
+ if self._inside_brackets(':'):
567
+ self._pop_token()
568
+ self._pop_token()
569
+ # Special case: ignore slices
570
+ if tokens[i-1][1] == ':' and tokens[i][1] == ']':
571
+ return
572
+ policy_before = _MUST_NOT
573
+ if tokens[i][1] in _CLOSING_BRACKETS and tokens[i-1][1] == ',':
574
+ if _TRAILING_COMMA in self.config.no_space_check:
575
+ policy_before = _IGNORE
576
+
577
+ self._check_space(tokens, i, (policy_before, _IGNORE))
578
+
579
+ def _check_equals_spacing(self, tokens, i):
580
+ """Check the spacing of a single equals sign."""
581
+ if self._inside_brackets('(') or self._inside_brackets('lambda'):
582
+ self._check_space(tokens, i, (_MUST_NOT, _MUST_NOT))
583
+ else:
584
+ self._check_space(tokens, i, (_MUST, _MUST))
585
+
586
+ def _open_lambda(self, tokens, i): # pylint:disable=unused-argument
587
+ self._push_token('lambda', i)
588
+
589
+ def _handle_colon(self, tokens, i):
590
+ # Special case: ignore slices
591
+ if self._inside_brackets('['):
592
+ return
593
+ if (self._inside_brackets('{') and
594
+ _DICT_SEPARATOR in self.config.no_space_check):
595
+ policy = (_IGNORE, _IGNORE)
596
+ else:
597
+ policy = (_MUST_NOT, _MUST)
598
+ self._check_space(tokens, i, policy)
599
+
600
+ if self._inside_brackets('lambda'):
601
+ self._pop_token()
602
+ elif self._inside_brackets('{'):
603
+ self._push_token(':', i)
604
+
605
+ def _handle_comma(self, tokens, i):
606
+ # Only require a following whitespace if this is
607
+ # not a hanging comma before a closing bracket.
608
+ if tokens[i+1][1] in _CLOSING_BRACKETS:
609
+ self._check_space(tokens, i, (_MUST_NOT, _IGNORE))
610
+ else:
611
+ self._check_space(tokens, i, (_MUST_NOT, _MUST))
612
+ if self._inside_brackets(':'):
613
+ self._pop_token()
614
+
615
+ def _check_surrounded_by_space(self, tokens, i):
616
+ """Check that a binary operator is surrounded by exactly one space."""
617
+ self._check_space(tokens, i, (_MUST, _MUST))
618
+
619
+ def _check_space(self, tokens, i, policies):
620
+ def _policy_string(policy):
621
+ if policy == _MUST:
622
+ return 'Exactly one', 'required'
623
+ else:
624
+ return 'No', 'allowed'
625
+
626
+ def _name_construct(token):
627
+ if tokens[i][1] == ',':
628
+ return 'comma'
629
+ elif tokens[i][1] == ':':
630
+ return ':'
631
+ elif tokens[i][1] in '()[]{}':
632
+ return 'bracket'
633
+ elif tokens[i][1] in ('<', '>', '<=', '>=', '!=', '=='):
634
+ return 'comparison'
635
+ else:
636
+ if self._inside_brackets('('):
637
+ return 'keyword argument assignment'
638
+ else:
639
+ return 'assignment'
640
+
641
+ good_space = [True, True]
642
+ pairs = [(tokens[i-1], tokens[i]), (tokens[i], tokens[i+1])]
643
+
644
+ for other_idx, (policy, token_pair) in enumerate(zip(policies, pairs)):
645
+ if token_pair[other_idx][0] in _EOL or policy == _IGNORE:
646
+ continue
647
+
648
+ distance = _column_distance(*token_pair)
649
+ if distance is None:
650
+ continue
651
+ good_space[other_idx] = (
652
+ (policy == _MUST and distance == 1) or
653
+ (policy == _MUST_NOT and distance == 0))
654
+
655
+ warnings = []
656
+ if not any(good_space) and policies[0] == policies[1]:
657
+ warnings.append((policies[0], 'around'))
658
+ else:
659
+ for ok, policy, position in zip(good_space, policies, ('before', 'after')):
660
+ if not ok:
661
+ warnings.append((policy, position))
662
+ for policy, position in warnings:
663
+ construct = _name_construct(tokens[i])
664
+ count, state = _policy_string(policy)
665
+ self.add_message('bad-whitespace', line=tokens[i][2][0],
666
+ args=(count, state, position, construct,
667
+ _underline_token(tokens[i])))
668
+
669
+ def _inside_brackets(self, left):
670
+ return self._bracket_stack[-1] == left
671
+
672
+ def _handle_old_ne_operator(self, tokens, i):
673
+ if tokens[i][1] == '<>':
674
+ self.add_message('old-ne-operator', line=tokens[i][2][0])
675
+
676
+ def _prepare_token_dispatcher(self):
677
+ raw = [
678
+ (_KEYWORD_TOKENS,
679
+ self._check_keyword_parentheses),
680
+
681
+ (_OPENING_BRACKETS, self._opening_bracket),
682
+
683
+ (_CLOSING_BRACKETS, self._closing_bracket),
684
+
685
+ (['='], self._check_equals_spacing),
686
+
687
+ (_SPACED_OPERATORS, self._check_surrounded_by_space),
688
+
689
+ ([','], self._handle_comma),
690
+
691
+ ([':'], self._handle_colon),
692
+
693
+ (['lambda'], self._open_lambda),
694
+
695
+ (['<>'], self._handle_old_ne_operator),
696
+ ]
697
+
698
+ dispatch = {}
699
+ for tokens, handler in raw:
700
+ for token in tokens:
701
+ dispatch[token] = handler
702
+ return dispatch
703
+
704
+ def process_tokens(self, tokens):
705
+ """process tokens and search for :
706
+
707
+ _ non strict indentation (i.e. not always using the <indent> parameter as
708
+ indent unit)
709
+ _ too long lines (i.e. longer than <max_chars>)
710
+ _ optionally bad construct (if given, bad_construct must be a compiled
711
+ regular expression).
712
+ """
713
+ self._bracket_stack = [None]
714
+ indents = [0]
715
+ check_equal = False
716
+ line_num = 0
717
+ self._lines = {}
718
+ self._visited_lines = {}
719
+ token_handlers = self._prepare_token_dispatcher()
720
+
721
+ self._current_line = ContinuedLineState(tokens, self.config)
722
+ for idx, (tok_type, token, start, _, line) in enumerate(tokens):
723
+ if start[0] != line_num:
724
+ line_num = start[0]
725
+ # A tokenizer oddity: if an indented line contains a multi-line
726
+ # docstring, the line member of the INDENT token does not contain
727
+ # the full line; therefore we check the next token on the line.
728
+ if tok_type == tokenize.INDENT:
729
+ self.new_line(TokenWrapper(tokens), idx-1, idx+1)
730
+ else:
731
+ self.new_line(TokenWrapper(tokens), idx-1, idx)
732
+
733
+ if tok_type == tokenize.NEWLINE:
734
+ # a program statement, or ENDMARKER, will eventually follow,
735
+ # after some (possibly empty) run of tokens of the form
736
+ # (NL | COMMENT)* (INDENT | DEDENT+)?
737
+ # If an INDENT appears, setting check_equal is wrong, and will
738
+ # be undone when we see the INDENT.
739
+ check_equal = True
740
+ self._process_retained_warnings(TokenWrapper(tokens), idx)
741
+ self._current_line.next_logical_line()
742
+ elif tok_type == tokenize.INDENT:
743
+ check_equal = False
744
+ self.check_indent_level(token, indents[-1]+1, line_num)
745
+ indents.append(indents[-1]+1)
746
+ elif tok_type == tokenize.DEDENT:
747
+ # there's nothing we need to check here! what's important is
748
+ # that when the run of DEDENTs ends, the indentation of the
749
+ # program statement (or ENDMARKER) that triggered the run is
750
+ # equal to what's left at the top of the indents stack
751
+ check_equal = True
752
+ if len(indents) > 1:
753
+ del indents[-1]
754
+ elif tok_type == tokenize.NL:
755
+ self._check_continued_indentation(TokenWrapper(tokens), idx+1)
756
+ self._current_line.next_physical_line()
757
+ elif tok_type != tokenize.COMMENT:
758
+ self._current_line.handle_line_start(idx)
759
+ # This is the first concrete token following a NEWLINE, so it
760
+ # must be the first token of the next program statement, or an
761
+ # ENDMARKER; the "line" argument exposes the leading whitespace
762
+ # for this statement; in the case of ENDMARKER, line is an empty
763
+ # string, so will properly match the empty string with which the
764
+ # "indents" stack was seeded
765
+ if check_equal:
766
+ check_equal = False
767
+ self.check_indent_level(line, indents[-1], line_num)
768
+
769
+ if tok_type == tokenize.NUMBER and token.endswith('l'):
770
+ self.add_message('lowercase-l-suffix', line=line_num)
771
+
772
+ try:
773
+ handler = token_handlers[token]
774
+ except KeyError:
775
+ pass
776
+ else:
777
+ handler(tokens, idx)
778
+
779
+ line_num -= 1 # to be ok with "wc -l"
780
+ if line_num > self.config.max_module_lines:
781
+ self.add_message('too-many-lines', args=line_num, line=1)
782
+
783
+ def _process_retained_warnings(self, tokens, current_pos):
784
+ single_line_block_stmt = not _last_token_on_line_is(tokens, current_pos, ':')
785
+
786
+ for indent_pos, state, offsets in self._current_line.retained_warnings:
787
+ block_type = offsets[tokens.start_col(indent_pos)]
788
+ hints = dict((k, v) for k, v in offsets.iteritems()
789
+ if v != block_type)
790
+ if single_line_block_stmt and block_type == WITH_BODY:
791
+ self._add_continuation_message(state, hints, tokens, indent_pos)
792
+ elif not single_line_block_stmt and block_type == SINGLE_LINE:
793
+ self._add_continuation_message(state, hints, tokens, indent_pos)
794
+
795
+ def _check_continued_indentation(self, tokens, next_idx):
796
+ # Do not issue any warnings if the next line is empty.
797
+ if not self._current_line.has_content or tokens.type(next_idx) == tokenize.NL:
798
+ return
799
+
800
+ state, valid_offsets = self._current_line.get_valid_offsets(next_idx)
801
+ # Special handling for hanging comments. If the last line ended with a
802
+ # comment and the new line contains only a comment, the line may also be
803
+ # indented to the start of the previous comment.
804
+ if (tokens.type(next_idx) == tokenize.COMMENT and
805
+ tokens.type(next_idx-2) == tokenize.COMMENT):
806
+ valid_offsets[tokens.start_col(next_idx-2)] = True
807
+
808
+ # We can only decide if the indentation of a continued line before opening
809
+ # a new block is valid once we know of the body of the block is on the
810
+ # same line as the block opener. Since the token processing is single-pass,
811
+ # emitting those warnings is delayed until the block opener is processed.
812
+ if (state.context_type in (HANGING_BLOCK, CONTINUED_BLOCK)
813
+ and tokens.start_col(next_idx) in valid_offsets):
814
+ self._current_line.add_block_warning(next_idx, state, valid_offsets)
815
+ elif tokens.start_col(next_idx) not in valid_offsets:
816
+ self._add_continuation_message(state, valid_offsets, tokens, next_idx)
817
+
818
+ def _add_continuation_message(self, state, offsets, tokens, position):
819
+ readable_type, readable_position = _CONTINUATION_MSG_PARTS[state.context_type]
820
+ hint_line = _get_indent_hint_line(offsets, tokens.start_col(position))
821
+ self.add_message(
822
+ 'bad-continuation',
823
+ line=tokens.start_line(position),
824
+ args=(readable_type, readable_position, tokens.line(position), hint_line))
825
+
826
+ @check_messages('multiple-statements')
827
+ def visit_default(self, node):
828
+ """check the node line number and check it if not yet done"""
829
+ if not node.is_statement:
830
+ return
831
+ if not node.root().pure_python:
832
+ return # XXX block visit of child nodes
833
+ prev_sibl = node.previous_sibling()
834
+ if prev_sibl is not None:
835
+ prev_line = prev_sibl.fromlineno
836
+ else:
837
+ # The line on which a finally: occurs in a try/finally
838
+ # is not directly represented in the AST. We infer it
839
+ # by taking the last line of the body and adding 1, which
840
+ # should be the line of finally:
841
+ if (isinstance(node.parent, nodes.TryFinally)
842
+ and node in node.parent.finalbody):
843
+ prev_line = node.parent.body[0].tolineno + 1
844
+ else:
845
+ prev_line = node.parent.statement().fromlineno
846
+ line = node.fromlineno
847
+ assert line, node
848
+ if prev_line == line and self._visited_lines.get(line) != 2:
849
+ self._check_multi_statement_line(node, line)
850
+ return
851
+ if line in self._visited_lines:
852
+ return
853
+ try:
854
+ tolineno = node.blockstart_tolineno
855
+ except AttributeError:
856
+ tolineno = node.tolineno
857
+ assert tolineno, node
858
+ lines = []
859
+ for line in xrange(line, tolineno + 1):
860
+ self._visited_lines[line] = 1
861
+ try:
862
+ lines.append(self._lines[line].rstrip())
863
+ except KeyError:
864
+ lines.append('')
865
+
866
+ def _check_multi_statement_line(self, node, line):
867
+ """Check for lines containing multiple statements."""
868
+ # Do not warn about multiple nested context managers
869
+ # in with statements.
870
+ if isinstance(node, nodes.With):
871
+ return
872
+ # For try... except... finally..., the two nodes
873
+ # appear to be on the same line due to how the AST is built.
874
+ if (isinstance(node, nodes.TryExcept) and
875
+ isinstance(node.parent, nodes.TryFinally)):
876
+ return
877
+ if (isinstance(node.parent, nodes.If) and not node.parent.orelse
878
+ and self.config.single_line_if_stmt):
879
+ return
880
+ self.add_message('multiple-statements', node=node)
881
+ self._visited_lines[line] = 2
882
+
883
+ @check_messages('backtick')
884
+ def visit_backquote(self, node):
885
+ self.add_message('backtick', node=node)
886
+
887
+ def check_lines(self, lines, i):
888
+ """check lines have less than a maximum number of characters
889
+ """
890
+ max_chars = self.config.max_line_length
891
+ ignore_long_line = self.config.ignore_long_lines
892
+
893
+ for line in lines.splitlines(True):
894
+ if not line.endswith('\n'):
895
+ self.add_message('missing-final-newline', line=i)
896
+ else:
897
+ stripped_line = line.rstrip()
898
+ if line[len(stripped_line):] not in ('\n', '\r\n'):
899
+ self.add_message('trailing-whitespace', line=i)
900
+ # Don't count excess whitespace in the line length.
901
+ line = stripped_line
902
+ mobj = OPTION_RGX.search(line)
903
+ if mobj and mobj.group(1).split('=', 1)[0].strip() == 'disable':
904
+ line = line.split('#')[0].rstrip()
905
+
906
+ if len(line) > max_chars and not ignore_long_line.search(line):
907
+ self.add_message('line-too-long', line=i, args=(len(line), max_chars))
908
+ i += 1
909
+
910
+ def check_indent_level(self, string, expected, line_num):
911
+ """return the indent level of the string
912
+ """
913
+ indent = self.config.indent_string
914
+ if indent == '\\t': # \t is not interpreted in the configuration file
915
+ indent = '\t'
916
+ level = 0
917
+ unit_size = len(indent)
918
+ while string[:unit_size] == indent:
919
+ string = string[unit_size:]
920
+ level += 1
921
+ suppl = ''
922
+ while string and string[0] in ' \t':
923
+ if string[0] != indent[0]:
924
+ if string[0] == '\t':
925
+ args = ('tab', 'space')
926
+ else:
927
+ args = ('space', 'tab')
928
+ self.add_message('mixed-indentation', args=args, line=line_num)
929
+ return level
930
+ suppl += string[0]
931
+ string = string[1:]
932
+ if level != expected or suppl:
933
+ i_type = 'spaces'
934
+ if indent[0] == '\t':
935
+ i_type = 'tabs'
936
+ self.add_message('bad-indentation', line=line_num,
937
+ args=(level * unit_size + len(suppl), i_type,
938
+ expected * unit_size))
939
+
940
+
941
+ def register(linter):
942
+ """required method to auto register this checker """
943
+ linter.register_checker(FormatChecker(linter))