exercism-analysis 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. checksums.yaml +7 -0
  2. data/exercism-analysis.gemspec +30 -0
  3. data/lib/exercism-analysis.rb +38 -0
  4. data/lib/exercism-analysis/adapters/adapter.rb +23 -0
  5. data/lib/exercism-analysis/adapters/clojure.rb +13 -0
  6. data/lib/exercism-analysis/adapters/go.rb +19 -0
  7. data/lib/exercism-analysis/adapters/javascript.rb +13 -0
  8. data/lib/exercism-analysis/adapters/python.rb +13 -0
  9. data/lib/exercism-analysis/adapters/ruby.rb +19 -0
  10. data/lib/exercism-analysis/analysis.rb +18 -0
  11. data/lib/exercism-analysis/analyzers/analyzer.rb +54 -0
  12. data/lib/exercism-analysis/analyzers/clojure/kibit.rb +25 -0
  13. data/lib/exercism-analysis/analyzers/go/golint.rb +23 -0
  14. data/lib/exercism-analysis/analyzers/javascript/jslint.rb +24 -0
  15. data/lib/exercism-analysis/analyzers/python/pylint.rb +24 -0
  16. data/lib/exercism-analysis/analyzers/ruby/control_flow.rb +21 -0
  17. data/lib/exercism-analysis/analyzers/ruby/enumerable_condition.rb +21 -0
  18. data/lib/exercism-analysis/analyzers/ruby/for_loop.rb +29 -0
  19. data/lib/exercism-analysis/analyzers/ruby/indentation.rb +21 -0
  20. data/lib/exercism-analysis/analyzers/ruby/iter_mutation.rb +37 -0
  21. data/lib/exercism-analysis/analyzers/ruby/output.rb +20 -0
  22. data/lib/exercism-analysis/analyzers/ruby/range.rb +28 -0
  23. data/lib/exercism-analysis/analyzers/ruby/roodi.rb +19 -0
  24. data/lib/exercism-analysis/analyzers/ruby/send.rb +25 -0
  25. data/lib/exercism-analysis/analyzers/ruby/shebang.rb +23 -0
  26. data/lib/exercism-analysis/analyzers/ruby/tab.rb +38 -0
  27. data/lib/exercism-analysis/processors/call_processor.rb +39 -0
  28. data/lib/exercism-analysis/processors/control_flow_processor.rb +27 -0
  29. data/lib/exercism-analysis/processors/enumerable_condition_processor.rb +31 -0
  30. data/lib/exercism-analysis/processors/for_loop_processor.rb +21 -0
  31. data/lib/exercism-analysis/processors/indentation_processor.rb +69 -0
  32. data/lib/exercism-analysis/processors/iter_mutation_processor.rb +50 -0
  33. data/lib/exercism-analysis/processors/processor.rb +34 -0
  34. data/lib/exercism-analysis/processors/range_processor.rb +23 -0
  35. data/lib/exercism-analysis/processors/send_processor.rb +23 -0
  36. data/lib/exercism-analysis/templates/each_to_map.rb +29 -0
  37. data/lib/exercism-analysis/templates/each_to_select.rb +31 -0
  38. data/lib/exercism-analysis/templates/range_exclusive.rb +19 -0
  39. data/lib/exercism-analysis/templates/template.rb +29 -0
  40. data/vendor/clojure/kibit-runner/LICENSE +214 -0
  41. data/vendor/clojure/kibit-runner/project.clj +10 -0
  42. data/vendor/clojure/kibit-runner/src/kibit_runner/core.clj +17 -0
  43. data/vendor/clojure/kibit-runner/target/kibit-runner-0.1.0-SNAPSHOT-standalone.jar +0 -0
  44. data/vendor/clojure/kibit-runner/target/kibit-runner-0.1.0-SNAPSHOT.jar +0 -0
  45. data/vendor/clojure/kibit-runner/target/stale/extract-native.dependencies +1 -0
  46. data/vendor/go/src/github.com/golang/lint/LICENSE +27 -0
  47. data/vendor/go/src/github.com/golang/lint/README +59 -0
  48. data/vendor/go/src/github.com/golang/lint/golint/golint.go +67 -0
  49. data/vendor/go/src/github.com/golang/lint/lint.go +1061 -0
  50. data/vendor/go/src/runner/golint_runner.go +23 -0
  51. data/vendor/javascript/jshint_runner.js +6 -0
  52. data/vendor/javascript/node_modules/jshint/README.md +47 -0
  53. data/vendor/javascript/node_modules/jshint/bin/apply +6 -0
  54. data/vendor/javascript/node_modules/jshint/bin/build +36 -0
  55. data/vendor/javascript/node_modules/jshint/bin/changelog +36 -0
  56. data/vendor/javascript/node_modules/jshint/bin/jshint +3 -0
  57. data/vendor/javascript/node_modules/jshint/bin/land +34 -0
  58. data/vendor/javascript/node_modules/jshint/data/ascii-identifier-data.js +22 -0
  59. data/vendor/javascript/node_modules/jshint/data/non-ascii-identifier-part-only.js +1570 -0
  60. data/vendor/javascript/node_modules/jshint/data/non-ascii-identifier-start.js +48477 -0
  61. data/vendor/javascript/node_modules/jshint/dist/jshint-rhino.js +60642 -0
  62. data/vendor/javascript/node_modules/jshint/dist/jshint.js +60525 -0
  63. data/vendor/javascript/node_modules/jshint/node_modules/cli/README.md +196 -0
  64. data/vendor/javascript/node_modules/jshint/node_modules/cli/cli.js +1139 -0
  65. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/cat.js +17 -0
  66. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/command.js +16 -0
  67. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/echo.js +54 -0
  68. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/glob.js +6 -0
  69. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/long_desc.js +20 -0
  70. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/progress.js +11 -0
  71. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/sort.js +18 -0
  72. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/spinner.js +9 -0
  73. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/static.coffee +27 -0
  74. data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/static.js +25 -0
  75. data/vendor/javascript/node_modules/jshint/node_modules/cli/index.js +1 -0
  76. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE +27 -0
  77. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/README.md +250 -0
  78. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js +9 -0
  79. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js +9 -0
  80. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js +728 -0
  81. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  82. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md +42 -0
  83. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  84. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  85. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json +51 -0
  86. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js +25 -0
  87. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/package.json +58 -0
  88. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js +176 -0
  89. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js +63 -0
  90. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json +351 -0
  91. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js +55 -0
  92. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js +19 -0
  93. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js +118 -0
  94. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js +10 -0
  95. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js +113 -0
  96. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js +73 -0
  97. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js +36 -0
  98. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js +39 -0
  99. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js +46 -0
  100. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js +32 -0
  101. data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js +11 -0
  102. data/vendor/javascript/node_modules/jshint/node_modules/cli/package.json +70 -0
  103. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/LICENCE +19 -0
  104. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/README.md +33 -0
  105. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/index.js +86 -0
  106. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/LICENCE +19 -0
  107. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/README.md +45 -0
  108. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/index.js +5 -0
  109. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/package.json +89 -0
  110. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/seed.js +16 -0
  111. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/test/index.js +28 -0
  112. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/test/static/index.html +10 -0
  113. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/package.json +88 -0
  114. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/index.js +67 -0
  115. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/static/index.html +12 -0
  116. data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js +53 -0
  117. data/vendor/javascript/node_modules/jshint/node_modules/exit/Gruntfile.js +48 -0
  118. data/vendor/javascript/node_modules/jshint/node_modules/exit/LICENSE-MIT +22 -0
  119. data/vendor/javascript/node_modules/jshint/node_modules/exit/README.md +75 -0
  120. data/vendor/javascript/node_modules/jshint/node_modules/exit/lib/exit.js +41 -0
  121. data/vendor/javascript/node_modules/jshint/node_modules/exit/package.json +69 -0
  122. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/exit_test.js +121 -0
  123. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stderr.txt +10 -0
  124. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stdout-stderr.txt +20 -0
  125. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stdout.txt +10 -0
  126. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stderr.txt +100 -0
  127. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stdout-stderr.txt +200 -0
  128. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stdout.txt +100 -0
  129. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stderr.txt +1000 -0
  130. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stdout-stderr.txt +2000 -0
  131. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stdout.txt +1000 -0
  132. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/create-files.sh +8 -0
  133. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/log-broken.js +23 -0
  134. data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/log.js +25 -0
  135. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/LICENSE +18 -0
  136. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/README.md +83 -0
  137. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/CollectingHandler.js +55 -0
  138. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/FeedHandler.js +95 -0
  139. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Parser.js +337 -0
  140. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/ProxyHandler.js +27 -0
  141. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Stream.js +35 -0
  142. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Tokenizer.js +891 -0
  143. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/WritableStream.js +21 -0
  144. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/index.js +68 -0
  145. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/LICENSE +11 -0
  146. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/index.js +14 -0
  147. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/package.json +40 -0
  148. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/readme.md +1 -0
  149. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/LICENSE +11 -0
  150. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/index.js +211 -0
  151. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/package.json +68 -0
  152. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/readme.md +102 -0
  153. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/01-basic.json +57 -0
  154. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/02-single_tag_1.json +21 -0
  155. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/03-single_tag_2.json +21 -0
  156. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/04-unescaped_in_script.json +27 -0
  157. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/05-tags_in_comment.json +18 -0
  158. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/06-comment_in_script.json +18 -0
  159. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/07-unescaped_in_style.json +20 -0
  160. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/08-extra_spaces_in_tag.json +20 -0
  161. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/09-unquoted_attrib.json +20 -0
  162. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/10-singular_attribute.json +15 -0
  163. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/11-text_outside_tags.json +40 -0
  164. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/12-text_only.json +11 -0
  165. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/13-comment_in_text.json +19 -0
  166. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/14-comment_in_text_in_script.json +18 -0
  167. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/15-non-verbose.json +22 -0
  168. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/16-normalize_whitespace.json +47 -0
  169. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/17-xml_namespace.json +18 -0
  170. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/18-enforce_empty_tags.json +16 -0
  171. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/19-ignore_empty_tags.json +20 -0
  172. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/20-template_script_tags.json +20 -0
  173. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/21-conditional_comments.json +15 -0
  174. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/22-lowercase_tags.json +41 -0
  175. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/23-dom-lvl1.json +121 -0
  176. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/tests.js +58 -0
  177. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/LICENSE +11 -0
  178. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/index.js +14 -0
  179. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/helpers.js +141 -0
  180. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/legacy.js +87 -0
  181. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/manipulation.js +77 -0
  182. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/querying.js +94 -0
  183. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/stringify.js +93 -0
  184. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/traversal.js +24 -0
  185. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/package.json +71 -0
  186. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/readme.md +1 -0
  187. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/fixture.js +6 -0
  188. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/tests/helpers.js +89 -0
  189. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/tests/legacy.js +119 -0
  190. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/utils.js +9 -0
  191. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/LICENSE +11 -0
  192. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/index.js +31 -0
  193. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/decode.js +72 -0
  194. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js +26 -0
  195. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/encode.js +48 -0
  196. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/decode.json +1 -0
  197. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/entities.json +1 -0
  198. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/legacy.json +1 -0
  199. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/xml.json +1 -0
  200. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/package.json +79 -0
  201. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/readme.md +31 -0
  202. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/test/mocha.opts +2 -0
  203. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/test/test.js +150 -0
  204. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/LICENSE +18 -0
  205. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/README.md +15 -0
  206. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/duplex.js +1 -0
  207. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/float.patch +923 -0
  208. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js +89 -0
  209. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js +46 -0
  210. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js +944 -0
  211. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js +209 -0
  212. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js +472 -0
  213. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/README.md +3 -0
  214. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/float.patch +604 -0
  215. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/lib/util.js +107 -0
  216. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/package.json +53 -0
  217. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/util.js +106 -0
  218. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/LICENSE +16 -0
  219. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/README.md +42 -0
  220. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/inherits.js +1 -0
  221. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/inherits_browser.js +23 -0
  222. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/package.json +51 -0
  223. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/test.js +25 -0
  224. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/README.md +54 -0
  225. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/build/build.js +209 -0
  226. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/component.json +19 -0
  227. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/index.js +3 -0
  228. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/package.json +54 -0
  229. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/LICENSE +20 -0
  230. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/README.md +7 -0
  231. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/index.js +200 -0
  232. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/package.json +53 -0
  233. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/package.json +68 -0
  234. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js +1 -0
  235. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/readable.js +7 -0
  236. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/transform.js +1 -0
  237. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/writable.js +1 -0
  238. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/package.json +90 -0
  239. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/01-events.js +9 -0
  240. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/02-stream.js +23 -0
  241. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/03-feed.js +19 -0
  242. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Atom_Example.xml +25 -0
  243. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Attributes.html +16 -0
  244. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Basic.html +1 -0
  245. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/RDF_Example.xml +63 -0
  246. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/RSS_Example.xml +48 -0
  247. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/01-simple.json +44 -0
  248. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/02-template.json +63 -0
  249. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/03-lowercase_tags.json +46 -0
  250. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/04-cdata.json +50 -0
  251. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/05-cdata-special.json +35 -0
  252. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/06-leading-lt.json +16 -0
  253. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/07-self-closing.json +67 -0
  254. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/08-implicit-close-tags.json +59 -0
  255. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/09-attributes.json +68 -0
  256. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/10-crazy-attrib.json +52 -0
  257. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/11-script_in_script.json +54 -0
  258. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/12-long-comment-end.json +20 -0
  259. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/13-long-cdata-end.json +22 -0
  260. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/14-implicit-open-tags.json +27 -0
  261. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/15-lt-whitespace.json +16 -0
  262. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/16-double_attribs.json +45 -0
  263. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/17-numeric_entities.json +16 -0
  264. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/18-legacy_entities.json +16 -0
  265. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/19-named_entities.json +16 -0
  266. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/20-xml_entities.json +16 -0
  267. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/21-entity_in_attribute.json +38 -0
  268. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/22-double_brackets.json +41 -0
  269. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/23-legacy_entity_fail.json +16 -0
  270. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/24-special_special.json +133 -0
  271. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/25-empty_tag_name.json +13 -0
  272. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/26-not-quite-closed.json +35 -0
  273. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/27-entities_in_attributes.json +62 -0
  274. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/28-cdata_in_html.json +9 -0
  275. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/29-comment_edge-cases.json +18 -0
  276. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/30-cdata_edge-cases.json +22 -0
  277. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/01-rss.js +34 -0
  278. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/02-atom.js +18 -0
  279. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/03-rdf.js +20 -0
  280. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/01-basic.json +83 -0
  281. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/02-RSS.json +1093 -0
  282. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/03-Atom.json +644 -0
  283. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/04-RDF.json +1399 -0
  284. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/05-Attributes.json +354 -0
  285. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/api.js +63 -0
  286. data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/test-helper.js +83 -0
  287. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/LICENSE +23 -0
  288. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/README.md +218 -0
  289. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/minimatch.js +1061 -0
  290. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +14 -0
  291. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
  292. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
  293. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +252 -0
  294. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json +50 -0
  295. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js +369 -0
  296. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
  297. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
  298. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
  299. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
  300. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
  301. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json +58 -0
  302. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
  303. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
  304. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/package.json +57 -0
  305. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/basic.js +399 -0
  306. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/brace-expand.js +33 -0
  307. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/caching.js +14 -0
  308. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/defaults.js +274 -0
  309. data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  310. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/LICENSE +26 -0
  311. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/README.md +569 -0
  312. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/bin/shjs +51 -0
  313. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/global.js +3 -0
  314. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/make.js +47 -0
  315. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/package.json +61 -0
  316. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/scripts/generate-docs.js +21 -0
  317. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js +50 -0
  318. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/shell.js +157 -0
  319. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cat.js +43 -0
  320. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cd.js +19 -0
  321. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/chmod.js +208 -0
  322. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/common.js +203 -0
  323. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cp.js +201 -0
  324. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/dirs.js +191 -0
  325. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/echo.js +20 -0
  326. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/error.js +10 -0
  327. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/exec.js +181 -0
  328. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/find.js +51 -0
  329. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/grep.js +52 -0
  330. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/ln.js +53 -0
  331. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/ls.js +126 -0
  332. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/mkdir.js +68 -0
  333. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/mv.js +80 -0
  334. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/popd.js +1 -0
  335. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/pushd.js +1 -0
  336. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/pwd.js +11 -0
  337. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/rm.js +145 -0
  338. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/sed.js +43 -0
  339. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/tempdir.js +56 -0
  340. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/test.js +85 -0
  341. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/to.js +29 -0
  342. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/toEnd.js +29 -0
  343. data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/which.js +83 -0
  344. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/cli.js +41 -0
  345. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/package.json +76 -0
  346. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/readme.md +74 -0
  347. data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/strip-json-comments.js +64 -0
  348. data/vendor/javascript/node_modules/jshint/node_modules/underscore/LICENSE +23 -0
  349. data/vendor/javascript/node_modules/jshint/node_modules/underscore/README.md +22 -0
  350. data/vendor/javascript/node_modules/jshint/node_modules/underscore/package.json +66 -0
  351. data/vendor/javascript/node_modules/jshint/node_modules/underscore/underscore-min.js +6 -0
  352. data/vendor/javascript/node_modules/jshint/node_modules/underscore/underscore.js +1343 -0
  353. data/vendor/javascript/node_modules/jshint/package.json +80 -0
  354. data/vendor/javascript/node_modules/jshint/src/cli.js +731 -0
  355. data/vendor/javascript/node_modules/jshint/src/jshint.js +5023 -0
  356. data/vendor/javascript/node_modules/jshint/src/lex.js +1650 -0
  357. data/vendor/javascript/node_modules/jshint/src/messages.js +223 -0
  358. data/vendor/javascript/node_modules/jshint/src/platforms/rhino.js +115 -0
  359. data/vendor/javascript/node_modules/jshint/src/reg.js +38 -0
  360. data/vendor/javascript/node_modules/jshint/src/reporters/checkstyle.js +81 -0
  361. data/vendor/javascript/node_modules/jshint/src/reporters/default.js +34 -0
  362. data/vendor/javascript/node_modules/jshint/src/reporters/jslint_xml.js +57 -0
  363. data/vendor/javascript/node_modules/jshint/src/reporters/non_error.js +52 -0
  364. data/vendor/javascript/node_modules/jshint/src/state.js +28 -0
  365. data/vendor/javascript/node_modules/jshint/src/style.js +143 -0
  366. data/vendor/javascript/node_modules/jshint/src/vars.js +658 -0
  367. data/vendor/python/astroid/COPYING +339 -0
  368. data/vendor/python/astroid/COPYING.LESSER +510 -0
  369. data/vendor/python/astroid/ChangeLog +574 -0
  370. data/vendor/python/astroid/MANIFEST.in +9 -0
  371. data/vendor/python/astroid/README +56 -0
  372. data/vendor/python/astroid/README.Python3 +26 -0
  373. data/vendor/python/astroid/__init__.py +118 -0
  374. data/vendor/python/astroid/__init__.pyc +0 -0
  375. data/vendor/python/astroid/__pkginfo__.py +48 -0
  376. data/vendor/python/astroid/__pkginfo__.pyc +0 -0
  377. data/vendor/python/astroid/announce.txt +23 -0
  378. data/vendor/python/astroid/as_string.py +496 -0
  379. data/vendor/python/astroid/as_string.pyc +0 -0
  380. data/vendor/python/astroid/bases.py +618 -0
  381. data/vendor/python/astroid/bases.pyc +0 -0
  382. data/vendor/python/astroid/brain/py2gi.py +159 -0
  383. data/vendor/python/astroid/brain/py2gi.pyc +0 -0
  384. data/vendor/python/astroid/brain/py2mechanize.py +20 -0
  385. data/vendor/python/astroid/brain/py2mechanize.pyc +0 -0
  386. data/vendor/python/astroid/brain/py2qt4.py +25 -0
  387. data/vendor/python/astroid/brain/py2qt4.pyc +0 -0
  388. data/vendor/python/astroid/brain/py2stdlib.py +252 -0
  389. data/vendor/python/astroid/brain/py2stdlib.pyc +0 -0
  390. data/vendor/python/astroid/builder.py +238 -0
  391. data/vendor/python/astroid/builder.pyc +0 -0
  392. data/vendor/python/astroid/exceptions.py +51 -0
  393. data/vendor/python/astroid/exceptions.pyc +0 -0
  394. data/vendor/python/astroid/inference.py +393 -0
  395. data/vendor/python/astroid/inference.pyc +0 -0
  396. data/vendor/python/astroid/inspector.py +275 -0
  397. data/vendor/python/astroid/manager.py +336 -0
  398. data/vendor/python/astroid/manager.pyc +0 -0
  399. data/vendor/python/astroid/mixins.py +122 -0
  400. data/vendor/python/astroid/mixins.pyc +0 -0
  401. data/vendor/python/astroid/node_classes.py +928 -0
  402. data/vendor/python/astroid/node_classes.pyc +0 -0
  403. data/vendor/python/astroid/nodes.py +73 -0
  404. data/vendor/python/astroid/nodes.pyc +0 -0
  405. data/vendor/python/astroid/protocols.py +322 -0
  406. data/vendor/python/astroid/protocols.pyc +0 -0
  407. data/vendor/python/astroid/raw_building.py +361 -0
  408. data/vendor/python/astroid/raw_building.pyc +0 -0
  409. data/vendor/python/astroid/rebuilder.py +954 -0
  410. data/vendor/python/astroid/rebuilder.pyc +0 -0
  411. data/vendor/python/astroid/scoped_nodes.py +1118 -0
  412. data/vendor/python/astroid/scoped_nodes.pyc +0 -0
  413. data/vendor/python/astroid/setup.py +184 -0
  414. data/vendor/python/astroid/tox.ini +10 -0
  415. data/vendor/python/astroid/utils.py +236 -0
  416. data/vendor/python/astroid/utils.pyc +0 -0
  417. data/vendor/python/logilab/__init__.py +0 -0
  418. data/vendor/python/logilab/__init__.pyc +0 -0
  419. data/vendor/python/logilab/common/COPYING +339 -0
  420. data/vendor/python/logilab/common/COPYING.LESSER +510 -0
  421. data/vendor/python/logilab/common/ChangeLog +1517 -0
  422. data/vendor/python/logilab/common/MANIFEST.in +13 -0
  423. data/vendor/python/logilab/common/README +185 -0
  424. data/vendor/python/logilab/common/README.Python3 +29 -0
  425. data/vendor/python/logilab/common/__init__.py +171 -0
  426. data/vendor/python/logilab/common/__init__.pyc +0 -0
  427. data/vendor/python/logilab/common/__pkginfo__.py +53 -0
  428. data/vendor/python/logilab/common/__pkginfo__.pyc +0 -0
  429. data/vendor/python/logilab/common/announce.txt +25 -0
  430. data/vendor/python/logilab/common/bin/pytest +7 -0
  431. data/vendor/python/logilab/common/bin/pytest.bat +17 -0
  432. data/vendor/python/logilab/common/cache.py +114 -0
  433. data/vendor/python/logilab/common/changelog.py +236 -0
  434. data/vendor/python/logilab/common/changelog.pyc +0 -0
  435. data/vendor/python/logilab/common/clcommands.py +332 -0
  436. data/vendor/python/logilab/common/cli.py +208 -0
  437. data/vendor/python/logilab/common/compat.py +243 -0
  438. data/vendor/python/logilab/common/compat.pyc +0 -0
  439. data/vendor/python/logilab/common/configuration.py +1094 -0
  440. data/vendor/python/logilab/common/configuration.pyc +0 -0
  441. data/vendor/python/logilab/common/contexts.py +5 -0
  442. data/vendor/python/logilab/common/corbautils.py +117 -0
  443. data/vendor/python/logilab/common/daemon.py +100 -0
  444. data/vendor/python/logilab/common/date.py +333 -0
  445. data/vendor/python/logilab/common/dbf.py +229 -0
  446. data/vendor/python/logilab/common/debugger.py +210 -0
  447. data/vendor/python/logilab/common/decorators.py +281 -0
  448. data/vendor/python/logilab/common/decorators.pyc +0 -0
  449. data/vendor/python/logilab/common/deprecation.py +188 -0
  450. data/vendor/python/logilab/common/deprecation.pyc +0 -0
  451. data/vendor/python/logilab/common/fileutils.py +402 -0
  452. data/vendor/python/logilab/common/graph.py +276 -0
  453. data/vendor/python/logilab/common/graph.pyc +0 -0
  454. data/vendor/python/logilab/common/hg.py +130 -0
  455. data/vendor/python/logilab/common/interface.py +71 -0
  456. data/vendor/python/logilab/common/interface.pyc +0 -0
  457. data/vendor/python/logilab/common/logging_ext.py +193 -0
  458. data/vendor/python/logilab/common/modutils.py +695 -0
  459. data/vendor/python/logilab/common/modutils.pyc +0 -0
  460. data/vendor/python/logilab/common/optik_ext.py +391 -0
  461. data/vendor/python/logilab/common/optik_ext.pyc +0 -0
  462. data/vendor/python/logilab/common/optparser.py +90 -0
  463. data/vendor/python/logilab/common/proc.py +277 -0
  464. data/vendor/python/logilab/common/pyro_ext.py +180 -0
  465. data/vendor/python/logilab/common/pytest.py +1177 -0
  466. data/vendor/python/logilab/common/python-logilab-common.spec +184 -0
  467. data/vendor/python/logilab/common/registry.py +1113 -0
  468. data/vendor/python/logilab/common/setup.cfg +3 -0
  469. data/vendor/python/logilab/common/setup.py +189 -0
  470. data/vendor/python/logilab/common/shellutils.py +455 -0
  471. data/vendor/python/logilab/common/sphinx_ext.py +87 -0
  472. data/vendor/python/logilab/common/sphinxutils.py +122 -0
  473. data/vendor/python/logilab/common/table.py +925 -0
  474. data/vendor/python/logilab/common/tasksqueue.py +100 -0
  475. data/vendor/python/logilab/common/textutils.py +534 -0
  476. data/vendor/python/logilab/common/textutils.pyc +0 -0
  477. data/vendor/python/logilab/common/tree.py +369 -0
  478. data/vendor/python/logilab/common/tree.pyc +0 -0
  479. data/vendor/python/logilab/common/umessage.py +190 -0
  480. data/vendor/python/logilab/common/ureports/__init__.py +174 -0
  481. data/vendor/python/logilab/common/ureports/__init__.pyc +0 -0
  482. data/vendor/python/logilab/common/ureports/docbook_writer.py +139 -0
  483. data/vendor/python/logilab/common/ureports/html_writer.py +131 -0
  484. data/vendor/python/logilab/common/ureports/html_writer.pyc +0 -0
  485. data/vendor/python/logilab/common/ureports/nodes.py +201 -0
  486. data/vendor/python/logilab/common/ureports/nodes.pyc +0 -0
  487. data/vendor/python/logilab/common/ureports/text_writer.py +140 -0
  488. data/vendor/python/logilab/common/ureports/text_writer.pyc +0 -0
  489. data/vendor/python/logilab/common/urllib2ext.py +87 -0
  490. data/vendor/python/logilab/common/vcgutils.py +216 -0
  491. data/vendor/python/logilab/common/visitor.py +107 -0
  492. data/vendor/python/logilab/common/visitor.pyc +0 -0
  493. data/vendor/python/logilab/common/xmlrpcutils.py +131 -0
  494. data/vendor/python/logilab/common/xmlutils.py +61 -0
  495. data/vendor/python/pylint/CONTRIBUTORS.txt +38 -0
  496. data/vendor/python/pylint/COPYING +340 -0
  497. data/vendor/python/pylint/ChangeLog +1437 -0
  498. data/vendor/python/pylint/DEPENDS +3 -0
  499. data/vendor/python/pylint/MANIFEST.in +14 -0
  500. data/vendor/python/pylint/README +50 -0
  501. data/vendor/python/pylint/README.Python3 +37 -0
  502. data/vendor/python/pylint/__init__.py +44 -0
  503. data/vendor/python/pylint/__init__.pyc +0 -0
  504. data/vendor/python/pylint/__main__.py +3 -0
  505. data/vendor/python/pylint/__pkginfo__.py +74 -0
  506. data/vendor/python/pylint/__pkginfo__.pyc +0 -0
  507. data/vendor/python/pylint/bin/epylint +3 -0
  508. data/vendor/python/pylint/bin/epylint.bat +5 -0
  509. data/vendor/python/pylint/bin/pylint +3 -0
  510. data/vendor/python/pylint/bin/pylint-gui +3 -0
  511. data/vendor/python/pylint/bin/pylint-gui.bat +5 -0
  512. data/vendor/python/pylint/bin/pylint.bat +5 -0
  513. data/vendor/python/pylint/bin/pyreverse +3 -0
  514. data/vendor/python/pylint/bin/pyreverse.bat +5 -0
  515. data/vendor/python/pylint/bin/symilar +3 -0
  516. data/vendor/python/pylint/bin/symilar.bat +5 -0
  517. data/vendor/python/pylint/checkers/__init__.py +145 -0
  518. data/vendor/python/pylint/checkers/__init__.pyc +0 -0
  519. data/vendor/python/pylint/checkers/base.py +1141 -0
  520. data/vendor/python/pylint/checkers/base.pyc +0 -0
  521. data/vendor/python/pylint/checkers/classes.py +792 -0
  522. data/vendor/python/pylint/checkers/classes.pyc +0 -0
  523. data/vendor/python/pylint/checkers/design_analysis.py +367 -0
  524. data/vendor/python/pylint/checkers/design_analysis.pyc +0 -0
  525. data/vendor/python/pylint/checkers/exceptions.py +306 -0
  526. data/vendor/python/pylint/checkers/exceptions.pyc +0 -0
  527. data/vendor/python/pylint/checkers/format.py +943 -0
  528. data/vendor/python/pylint/checkers/format.pyc +0 -0
  529. data/vendor/python/pylint/checkers/imports.py +394 -0
  530. data/vendor/python/pylint/checkers/imports.pyc +0 -0
  531. data/vendor/python/pylint/checkers/logging.py +213 -0
  532. data/vendor/python/pylint/checkers/logging.pyc +0 -0
  533. data/vendor/python/pylint/checkers/misc.py +90 -0
  534. data/vendor/python/pylint/checkers/misc.pyc +0 -0
  535. data/vendor/python/pylint/checkers/newstyle.py +151 -0
  536. data/vendor/python/pylint/checkers/newstyle.pyc +0 -0
  537. data/vendor/python/pylint/checkers/raw_metrics.py +129 -0
  538. data/vendor/python/pylint/checkers/raw_metrics.pyc +0 -0
  539. data/vendor/python/pylint/checkers/similar.py +365 -0
  540. data/vendor/python/pylint/checkers/similar.pyc +0 -0
  541. data/vendor/python/pylint/checkers/stdlib.py +69 -0
  542. data/vendor/python/pylint/checkers/stdlib.pyc +0 -0
  543. data/vendor/python/pylint/checkers/strings.py +304 -0
  544. data/vendor/python/pylint/checkers/strings.pyc +0 -0
  545. data/vendor/python/pylint/checkers/typecheck.py +451 -0
  546. data/vendor/python/pylint/checkers/typecheck.pyc +0 -0
  547. data/vendor/python/pylint/checkers/utils.py +416 -0
  548. data/vendor/python/pylint/checkers/utils.pyc +0 -0
  549. data/vendor/python/pylint/checkers/variables.py +741 -0
  550. data/vendor/python/pylint/checkers/variables.pyc +0 -0
  551. data/vendor/python/pylint/config.py +156 -0
  552. data/vendor/python/pylint/config.pyc +0 -0
  553. data/vendor/python/pylint/epylint.py +175 -0
  554. data/vendor/python/pylint/gui.py +508 -0
  555. data/vendor/python/pylint/interfaces.py +72 -0
  556. data/vendor/python/pylint/interfaces.pyc +0 -0
  557. data/vendor/python/pylint/lint.py +1106 -0
  558. data/vendor/python/pylint/lint.pyc +0 -0
  559. data/vendor/python/pylint/pyreverse/__init__.py +5 -0
  560. data/vendor/python/pylint/pyreverse/diadefslib.py +233 -0
  561. data/vendor/python/pylint/pyreverse/diagrams.py +247 -0
  562. data/vendor/python/pylint/pyreverse/main.py +124 -0
  563. data/vendor/python/pylint/pyreverse/utils.py +131 -0
  564. data/vendor/python/pylint/pyreverse/writer.py +199 -0
  565. data/vendor/python/pylint/reporters/__init__.py +138 -0
  566. data/vendor/python/pylint/reporters/__init__.pyc +0 -0
  567. data/vendor/python/pylint/reporters/guireporter.py +28 -0
  568. data/vendor/python/pylint/reporters/guireporter.pyc +0 -0
  569. data/vendor/python/pylint/reporters/html.py +70 -0
  570. data/vendor/python/pylint/reporters/html.pyc +0 -0
  571. data/vendor/python/pylint/reporters/text.py +143 -0
  572. data/vendor/python/pylint/reporters/text.pyc +0 -0
  573. data/vendor/python/pylint/setup.cfg +3 -0
  574. data/vendor/python/pylint/setup.py +203 -0
  575. data/vendor/python/pylint/tox.ini +10 -0
  576. data/vendor/python/pylint/utils.py +744 -0
  577. data/vendor/python/pylint/utils.pyc +0 -0
  578. data/vendor/python/pylint_runner.py +22 -0
  579. metadata +675 -0
@@ -0,0 +1,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))