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,156 @@
1
+ # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
2
+ # This program is free software; you can redistribute it and/or modify it under
3
+ # the terms of the GNU General Public License as published by the Free Software
4
+ # Foundation; either version 2 of the License, or (at your option) any later
5
+ # version.
6
+ #
7
+ # This program is distributed in the hope that it will be useful, but WITHOUT
8
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
10
+ #
11
+ # You should have received a copy of the GNU General Public License along with
12
+ # this program; if not, write to the Free Software Foundation, Inc.,
13
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14
+ """utilities for Pylint configuration :
15
+
16
+ * pylintrc
17
+ * pylint.d (PYLINTHOME)
18
+ """
19
+ from __future__ import with_statement
20
+
21
+ import pickle
22
+ import os
23
+ import sys
24
+ from os.path import exists, isfile, join, expanduser, abspath, dirname
25
+
26
+ # pylint home is used to save old runs results ################################
27
+
28
+ USER_HOME = expanduser('~')
29
+ if 'PYLINTHOME' in os.environ:
30
+ PYLINT_HOME = os.environ['PYLINTHOME']
31
+ if USER_HOME == '~':
32
+ USER_HOME = dirname(PYLINT_HOME)
33
+ elif USER_HOME == '~':
34
+ PYLINT_HOME = ".pylint.d"
35
+ else:
36
+ PYLINT_HOME = join(USER_HOME, '.pylint.d')
37
+
38
+ def get_pdata_path(base_name, recurs):
39
+ """return the path of the file which should contain old search data for the
40
+ given base_name with the given options values
41
+ """
42
+ base_name = base_name.replace(os.sep, '_')
43
+ return join(PYLINT_HOME, "%s%s%s"%(base_name, recurs, '.stats'))
44
+
45
+ def load_results(base):
46
+ """try to unpickle and return data from file if it exists and is not
47
+ corrupted
48
+
49
+ return an empty dictionary if it doesn't exists
50
+ """
51
+ data_file = get_pdata_path(base, 1)
52
+ try:
53
+ with open(data_file) as stream:
54
+ return pickle.load(stream)
55
+ except:
56
+ return {}
57
+
58
+ if sys.version_info < (3, 0):
59
+ _PICK_MOD = 'w'
60
+ else:
61
+ _PICK_MOD = 'wb'
62
+
63
+ def save_results(results, base):
64
+ """pickle results"""
65
+ if not exists(PYLINT_HOME):
66
+ try:
67
+ os.mkdir(PYLINT_HOME)
68
+ except OSError:
69
+ print >> sys.stderr, 'Unable to create directory %s' % PYLINT_HOME
70
+ data_file = get_pdata_path(base, 1)
71
+ try:
72
+ with open(data_file, _PICK_MOD) as stream:
73
+ pickle.dump(results, stream)
74
+ except (IOError, OSError), ex:
75
+ print >> sys.stderr, 'Unable to create file %s: %s' % (data_file, ex)
76
+
77
+ # location of the configuration file ##########################################
78
+
79
+
80
+ def find_pylintrc():
81
+ """search the pylint rc file and return its path if it find it, else None
82
+ """
83
+ # is there a pylint rc file in the current directory ?
84
+ if exists('pylintrc'):
85
+ return abspath('pylintrc')
86
+ if isfile('__init__.py'):
87
+ curdir = abspath(os.getcwd())
88
+ while isfile(join(curdir, '__init__.py')):
89
+ curdir = abspath(join(curdir, '..'))
90
+ if isfile(join(curdir, 'pylintrc')):
91
+ return join(curdir, 'pylintrc')
92
+ if 'PYLINTRC' in os.environ and exists(os.environ['PYLINTRC']):
93
+ pylintrc = os.environ['PYLINTRC']
94
+ else:
95
+ user_home = expanduser('~')
96
+ if user_home == '~' or user_home == '/root':
97
+ pylintrc = ".pylintrc"
98
+ else:
99
+ pylintrc = join(user_home, '.pylintrc')
100
+ if not isfile(pylintrc):
101
+ pylintrc = join(user_home, '.config', 'pylintrc')
102
+ if not isfile(pylintrc):
103
+ if isfile('/etc/pylintrc'):
104
+ pylintrc = '/etc/pylintrc'
105
+ else:
106
+ pylintrc = None
107
+ return pylintrc
108
+
109
+ PYLINTRC = find_pylintrc()
110
+
111
+ ENV_HELP = '''
112
+ The following environment variables are used:
113
+ * PYLINTHOME
114
+ Path to the directory where the persistent for the run will be stored. If
115
+ not found, it defaults to ~/.pylint.d/ or .pylint.d (in the current working
116
+ directory).
117
+ * PYLINTRC
118
+ Path to the configuration file. See the documentation for the method used
119
+ to search for configuration file.
120
+ ''' % globals()
121
+
122
+ # evaluation messages #########################################################
123
+
124
+ def get_note_message(note):
125
+ """return a message according to note
126
+ note is a float < 10 (10 is the highest note)
127
+ """
128
+ assert note <= 10, "Note is %.2f. Either you cheated, or pylint's \
129
+ broken!" % note
130
+ if note < 0:
131
+ msg = 'You have to do something quick !'
132
+ elif note < 1:
133
+ msg = 'Hey! This is really dreadful. Or maybe pylint is buggy?'
134
+ elif note < 2:
135
+ msg = "Come on! You can't be proud of this code"
136
+ elif note < 3:
137
+ msg = 'Hum... Needs work.'
138
+ elif note < 4:
139
+ msg = 'Wouldn\'t you be a bit lazy?'
140
+ elif note < 5:
141
+ msg = 'A little more work would make it acceptable.'
142
+ elif note < 6:
143
+ msg = 'Just the bare minimum. Give it a bit more polish. '
144
+ elif note < 7:
145
+ msg = 'This is okay-ish, but I\'m sure you can do better.'
146
+ elif note < 8:
147
+ msg = 'If you commit now, people should not be making nasty \
148
+ comments about you on c.l.py'
149
+ elif note < 9:
150
+ msg = 'That\'s pretty good. Good work mate.'
151
+ elif note < 10:
152
+ msg = 'So close to being perfect...'
153
+ else:
154
+ msg = 'Wow ! Now this deserves our uttermost respect.\nPlease send \
155
+ your code to python-projects@logilab.org'
156
+ return msg
@@ -0,0 +1,175 @@
1
+ # -*- coding: utf-8; mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=python:et:sw=4:ts=4:sts=4
2
+ # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
3
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it under
6
+ # the terms of the GNU General Public License as published by the Free Software
7
+ # Foundation; either version 2 of the License, or (at your option) any later
8
+ # version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful, but WITHOUT
11
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
13
+ #
14
+ # You should have received a copy of the GNU General Public License along with
15
+ # this program; if not, write to the Free Software Foundation, Inc.,
16
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+ """Emacs and Flymake compatible Pylint.
18
+
19
+ This script is for integration with emacs and is compatible with flymake mode.
20
+
21
+ epylint walks out of python packages before invoking pylint. This avoids
22
+ reporting import errors that occur when a module within a package uses the
23
+ absolute import path to get another module within this package.
24
+
25
+ For example:
26
+ - Suppose a package is structured as
27
+
28
+ a/__init__.py
29
+ a/b/x.py
30
+ a/c/y.py
31
+
32
+ - Then if y.py imports x as "from a.b import x" the following produces pylint
33
+ errors
34
+
35
+ cd a/c; pylint y.py
36
+
37
+ - The following obviously doesn't
38
+
39
+ pylint a/c/y.py
40
+
41
+ - As this script will be invoked by emacs within the directory of the file
42
+ we are checking we need to go out of it to avoid these false positives.
43
+
44
+
45
+ You may also use py_run to run pylint with desired options and get back (or not)
46
+ its output.
47
+ """
48
+
49
+ import sys, os, re
50
+ import os.path as osp
51
+ from subprocess import Popen, PIPE
52
+
53
+ def _get_env():
54
+ '''Extracts the environment PYTHONPATH and appends the current sys.path to
55
+ those.'''
56
+ env = dict(os.environ)
57
+ env['PYTHONPATH'] = os.pathsep.join(sys.path)
58
+ return env
59
+
60
+ def lint(filename, options=None):
61
+ """Pylint the given file.
62
+
63
+ When run from emacs we will be in the directory of a file, and passed its
64
+ filename. If this file is part of a package and is trying to import other
65
+ modules from within its own package or another package rooted in a directory
66
+ below it, pylint will classify it as a failed import.
67
+
68
+ To get around this, we traverse down the directory tree to find the root of
69
+ the package this module is in. We then invoke pylint from this directory.
70
+
71
+ Finally, we must correct the filenames in the output generated by pylint so
72
+ Emacs doesn't become confused (it will expect just the original filename,
73
+ while pylint may extend it with extra directories if we've traversed down
74
+ the tree)
75
+ """
76
+ # traverse downwards until we are out of a python package
77
+ full_path = osp.abspath(filename)
78
+ parent_path = osp.dirname(full_path)
79
+ child_path = osp.basename(full_path)
80
+
81
+ while parent_path != "/" and osp.exists(osp.join(parent_path, '__init__.py')):
82
+ child_path = osp.join(osp.basename(parent_path), child_path)
83
+ parent_path = osp.dirname(parent_path)
84
+
85
+ # Start pylint
86
+ # Ensure we use the python and pylint associated with the running epylint
87
+ from pylint import lint as lint_mod
88
+ lint_path = lint_mod.__file__
89
+ options = options or ['--disable=C,R,I']
90
+ cmd = [sys.executable, lint_path] + options + [
91
+ '--msg-template', '{path}:{line}: {category} ({msg_id}, {symbol}, {obj}) {msg}',
92
+ '-r', 'n', child_path]
93
+ process = Popen(cmd, stdout=PIPE, cwd=parent_path, env=_get_env(),
94
+ universal_newlines=True)
95
+
96
+ for line in process.stdout:
97
+ # remove pylintrc warning
98
+ if line.startswith("No config file found"):
99
+ continue
100
+
101
+ # modify the file name thats output to reverse the path traversal we made
102
+ parts = line.split(":")
103
+ if parts and parts[0] == child_path:
104
+ line = ":".join([filename] + parts[1:])
105
+ print line,
106
+
107
+ process.wait()
108
+ return process.returncode
109
+
110
+
111
+ def py_run(command_options='', return_std=False, stdout=None, stderr=None,
112
+ script='epylint'):
113
+ """Run pylint from python
114
+
115
+ ``command_options`` is a string containing ``pylint`` command line options;
116
+ ``return_std`` (boolean) indicates return of created standart output
117
+ and error (see below);
118
+ ``stdout`` and ``stderr`` are 'file-like' objects in which standart output
119
+ could be written.
120
+
121
+ Calling agent is responsible for stdout/err management (creation, close).
122
+ Default standart output and error are those from sys,
123
+ or standalone ones (``subprocess.PIPE``) are used
124
+ if they are not set and ``return_std``.
125
+
126
+ If ``return_std`` is set to ``True``, this function returns a 2-uple
127
+ containing standart output and error related to created process,
128
+ as follows: ``(stdout, stderr)``.
129
+
130
+ A trivial usage could be as follows:
131
+ >>> py_run( '--version')
132
+ No config file found, using default configuration
133
+ pylint 0.18.1,
134
+ ...
135
+
136
+ To silently run Pylint on a module, and get its standart output and error:
137
+ >>> (pylint_stdout, pylint_stderr) = py_run( 'module_name.py', True)
138
+ """
139
+ # Create command line to call pylint
140
+ if os.name == 'nt':
141
+ script += '.bat'
142
+ command_line = script + ' ' + command_options
143
+ # Providing standart output and/or error if not set
144
+ if stdout is None:
145
+ if return_std:
146
+ stdout = PIPE
147
+ else:
148
+ stdout = sys.stdout
149
+ if stderr is None:
150
+ if return_std:
151
+ stderr = PIPE
152
+ else:
153
+ stderr = sys.stderr
154
+ # Call pylint in a subprocess
155
+ p = Popen(command_line, shell=True, stdout=stdout, stderr=stderr,
156
+ env=_get_env(), universal_newlines=True)
157
+ p.wait()
158
+ # Return standart output and error
159
+ if return_std:
160
+ return (p.stdout, p.stderr)
161
+
162
+
163
+ def Run():
164
+ if len(sys.argv) == 1:
165
+ print "Usage: %s <filename> [options]" % sys.argv[0]
166
+ sys.exit(1)
167
+ elif not osp.exists(sys.argv[1]):
168
+ print "%s does not exist" % sys.argv[1]
169
+ sys.exit(1)
170
+ else:
171
+ sys.exit(lint(sys.argv[1], sys.argv[2:]))
172
+
173
+
174
+ if __name__ == '__main__':
175
+ Run()
@@ -0,0 +1,508 @@
1
+ # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
2
+ # http://www.logilab.fr/ -- mailto:contact@logilab.fr
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify it under
5
+ # the terms of the GNU General Public License as published by the Free Software
6
+ # Foundation; either version 2 of the License, or (at your option) any later
7
+ # version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
12
+ #
13
+ # You should have received a copy of the GNU General Public License along with
14
+ # this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
+ """Tkinker gui for pylint"""
17
+
18
+ import os
19
+ import sys
20
+ import re
21
+ import Queue
22
+ from threading import Thread
23
+ from Tkinter import (Tk, Frame, Listbox, Entry, Label, Button, Scrollbar,
24
+ Checkbutton, Radiobutton, IntVar, StringVar)
25
+ from Tkinter import (TOP, LEFT, RIGHT, BOTTOM, END, X, Y, BOTH, SUNKEN, W,
26
+ HORIZONTAL, DISABLED, NORMAL, W)
27
+ from tkFileDialog import askopenfilename, askdirectory
28
+
29
+ import pylint.lint
30
+ from pylint.reporters.guireporter import GUIReporter
31
+
32
+ HOME = os.path.expanduser('~/')
33
+ HISTORY = '.pylint-gui-history'
34
+ COLORS = {'(I)':'lightblue',
35
+ '(C)':'blue', '(R)':'darkblue',
36
+ '(W)':'black', '(E)':'darkred',
37
+ '(F)':'red'}
38
+
39
+
40
+ def convert_to_string(msg):
41
+ """make a string representation of a message"""
42
+ module_object = msg.module
43
+ if msg.obj:
44
+ module_object += ".%s" % msg.obj
45
+ return "(%s) %s [%d]: %s" % (msg.C, module_object, msg.line, msg.msg)
46
+
47
+ class BasicStream(object):
48
+ '''
49
+ used in gui reporter instead of writing to stdout, it is written to
50
+ this stream and saved in contents
51
+ '''
52
+ def __init__(self, gui):
53
+ """init"""
54
+ self.curline = ""
55
+ self.gui = gui
56
+ self.contents = []
57
+ self.outdict = {}
58
+ self.currout = None
59
+ self.next_title = None
60
+
61
+ def write(self, text):
62
+ """write text to the stream"""
63
+ if re.match('^--+$', text.strip()) or re.match('^==+$', text.strip()):
64
+ if self.currout:
65
+ self.outdict[self.currout].remove(self.next_title)
66
+ self.outdict[self.currout].pop()
67
+ self.currout = self.next_title
68
+ self.outdict[self.currout] = ['']
69
+
70
+ if text.strip():
71
+ self.next_title = text.strip()
72
+
73
+ if text.startswith(os.linesep):
74
+ self.contents.append('')
75
+ if self.currout:
76
+ self.outdict[self.currout].append('')
77
+ self.contents[-1] += text.strip(os.linesep)
78
+ if self.currout:
79
+ self.outdict[self.currout][-1] += text.strip(os.linesep)
80
+ if text.endswith(os.linesep) and text.strip():
81
+ self.contents.append('')
82
+ if self.currout:
83
+ self.outdict[self.currout].append('')
84
+
85
+ def fix_contents(self):
86
+ """finalize what the contents of the dict should look like before output"""
87
+ for item in self.outdict:
88
+ num_empty = self.outdict[item].count('')
89
+ for _ in xrange(num_empty):
90
+ self.outdict[item].remove('')
91
+ if self.outdict[item]:
92
+ self.outdict[item].pop(0)
93
+
94
+ def output_contents(self):
95
+ """output contents of dict to the gui, and set the rating"""
96
+ self.fix_contents()
97
+ self.gui.tabs = self.outdict
98
+ try:
99
+ self.gui.rating.set(self.outdict['Global evaluation'][0])
100
+ except:
101
+ self.gui.rating.set('Error')
102
+ self.gui.refresh_results_window()
103
+
104
+ #reset stream variables for next run
105
+ self.contents = []
106
+ self.outdict = {}
107
+ self.currout = None
108
+ self.next_title = None
109
+
110
+
111
+ class LintGui(object):
112
+ """Build and control a window to interact with pylint"""
113
+
114
+ def __init__(self, root=None):
115
+ """init"""
116
+ self.root = root or Tk()
117
+ self.root.title('Pylint')
118
+ #reporter
119
+ self.reporter = None
120
+ #message queue for output from reporter
121
+ self.msg_queue = Queue.Queue()
122
+ self.msgs = []
123
+ self.visible_msgs = []
124
+ self.filenames = []
125
+ self.rating = StringVar()
126
+ self.tabs = {}
127
+ self.report_stream = BasicStream(self)
128
+ #gui objects
129
+ self.lb_messages = None
130
+ self.showhistory = None
131
+ self.results = None
132
+ self.btnRun = None
133
+ self.information_box = None
134
+ self.convention_box = None
135
+ self.refactor_box = None
136
+ self.warning_box = None
137
+ self.error_box = None
138
+ self.fatal_box = None
139
+ self.txtModule = None
140
+ self.status = None
141
+ self.msg_type_dict = None
142
+ self.init_gui()
143
+
144
+ def init_gui(self):
145
+ """init helper"""
146
+ #setting up frames
147
+ top_frame = Frame(self.root)
148
+ mid_frame = Frame(self.root)
149
+ radio_frame = Frame(self.root)
150
+ res_frame = Frame(self.root)
151
+ msg_frame = Frame(self.root)
152
+ check_frame = Frame(self.root)
153
+ history_frame = Frame(self.root)
154
+ btn_frame = Frame(self.root)
155
+ rating_frame = Frame(self.root)
156
+ top_frame.pack(side=TOP, fill=X)
157
+ mid_frame.pack(side=TOP, fill=X)
158
+ history_frame.pack(side=TOP, fill=BOTH, expand=True)
159
+ radio_frame.pack(side=TOP, fill=BOTH, expand=True)
160
+ rating_frame.pack(side=TOP, fill=BOTH, expand=True)
161
+ res_frame.pack(side=TOP, fill=BOTH, expand=True)
162
+ check_frame.pack(side=TOP, fill=BOTH, expand=True)
163
+ msg_frame.pack(side=TOP, fill=BOTH, expand=True)
164
+ btn_frame.pack(side=TOP, fill=X)
165
+
166
+ # Binding F5 application-wide to run lint
167
+ self.root.bind('<F5>', self.run_lint)
168
+
169
+ #Message ListBox
170
+ rightscrollbar = Scrollbar(msg_frame)
171
+ rightscrollbar.pack(side=RIGHT, fill=Y)
172
+ bottomscrollbar = Scrollbar(msg_frame, orient=HORIZONTAL)
173
+ bottomscrollbar.pack(side=BOTTOM, fill=X)
174
+ self.lb_messages = Listbox(msg_frame,
175
+ yscrollcommand=rightscrollbar.set,
176
+ xscrollcommand=bottomscrollbar.set,
177
+ bg="white")
178
+ self.lb_messages.bind("<Double-Button-1>", self.show_sourcefile)
179
+ self.lb_messages.pack(expand=True, fill=BOTH)
180
+ rightscrollbar.config(command=self.lb_messages.yview)
181
+ bottomscrollbar.config(command=self.lb_messages.xview)
182
+
183
+ #History ListBoxes
184
+ rightscrollbar2 = Scrollbar(history_frame)
185
+ rightscrollbar2.pack(side=RIGHT, fill=Y)
186
+ bottomscrollbar2 = Scrollbar(history_frame, orient=HORIZONTAL)
187
+ bottomscrollbar2.pack(side=BOTTOM, fill=X)
188
+ self.showhistory = Listbox(history_frame,
189
+ yscrollcommand=rightscrollbar2.set,
190
+ xscrollcommand=bottomscrollbar2.set,
191
+ bg="white")
192
+ self.showhistory.pack(expand=True, fill=BOTH)
193
+ rightscrollbar2.config(command=self.showhistory.yview)
194
+ bottomscrollbar2.config(command=self.showhistory.xview)
195
+ self.showhistory.bind('<Double-Button-1>', self.select_recent_file)
196
+ self.set_history_window()
197
+
198
+ #status bar
199
+ self.status = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W)
200
+ self.status.pack(side=BOTTOM, fill=X)
201
+
202
+ #labelbl_ratingls
203
+ lbl_rating_label = Label(rating_frame, text='Rating:')
204
+ lbl_rating_label.pack(side=LEFT)
205
+ lbl_rating = Label(rating_frame, textvariable=self.rating)
206
+ lbl_rating.pack(side=LEFT)
207
+ Label(mid_frame, text='Recently Used:').pack(side=LEFT)
208
+ Label(top_frame, text='Module or package').pack(side=LEFT)
209
+
210
+ #file textbox
211
+ self.txt_module = Entry(top_frame, background='white')
212
+ self.txt_module.bind('<Return>', self.run_lint)
213
+ self.txt_module.pack(side=LEFT, expand=True, fill=X)
214
+
215
+ #results box
216
+ rightscrollbar = Scrollbar(res_frame)
217
+ rightscrollbar.pack(side=RIGHT, fill=Y)
218
+ bottomscrollbar = Scrollbar(res_frame, orient=HORIZONTAL)
219
+ bottomscrollbar.pack(side=BOTTOM, fill=X)
220
+ self.results = Listbox(res_frame,
221
+ yscrollcommand=rightscrollbar.set,
222
+ xscrollcommand=bottomscrollbar.set,
223
+ bg="white", font="Courier")
224
+ self.results.pack(expand=True, fill=BOTH, side=BOTTOM)
225
+ rightscrollbar.config(command=self.results.yview)
226
+ bottomscrollbar.config(command=self.results.xview)
227
+
228
+ #buttons
229
+ Button(top_frame, text='Open', command=self.file_open).pack(side=LEFT)
230
+ Button(top_frame, text='Open Package',
231
+ command=(lambda: self.file_open(package=True))).pack(side=LEFT)
232
+
233
+ self.btnRun = Button(top_frame, text='Run', command=self.run_lint)
234
+ self.btnRun.pack(side=LEFT)
235
+ Button(btn_frame, text='Quit', command=self.quit).pack(side=BOTTOM)
236
+
237
+ #radio buttons
238
+ self.information_box = IntVar()
239
+ self.convention_box = IntVar()
240
+ self.refactor_box = IntVar()
241
+ self.warning_box = IntVar()
242
+ self.error_box = IntVar()
243
+ self.fatal_box = IntVar()
244
+ i = Checkbutton(check_frame, text="Information", fg=COLORS['(I)'],
245
+ variable=self.information_box, command=self.refresh_msg_window)
246
+ c = Checkbutton(check_frame, text="Convention", fg=COLORS['(C)'],
247
+ variable=self.convention_box, command=self.refresh_msg_window)
248
+ r = Checkbutton(check_frame, text="Refactor", fg=COLORS['(R)'],
249
+ variable=self.refactor_box, command=self.refresh_msg_window)
250
+ w = Checkbutton(check_frame, text="Warning", fg=COLORS['(W)'],
251
+ variable=self.warning_box, command=self.refresh_msg_window)
252
+ e = Checkbutton(check_frame, text="Error", fg=COLORS['(E)'],
253
+ variable=self.error_box, command=self.refresh_msg_window)
254
+ f = Checkbutton(check_frame, text="Fatal", fg=COLORS['(F)'],
255
+ variable=self.fatal_box, command=self.refresh_msg_window)
256
+ i.select()
257
+ c.select()
258
+ r.select()
259
+ w.select()
260
+ e.select()
261
+ f.select()
262
+ i.pack(side=LEFT)
263
+ c.pack(side=LEFT)
264
+ r.pack(side=LEFT)
265
+ w.pack(side=LEFT)
266
+ e.pack(side=LEFT)
267
+ f.pack(side=LEFT)
268
+
269
+ #check boxes
270
+ self.box = StringVar()
271
+ # XXX should be generated
272
+ report = Radiobutton(
273
+ radio_frame, text="Report", variable=self.box,
274
+ value="Report", command=self.refresh_results_window)
275
+ raw_met = Radiobutton(
276
+ radio_frame, text="Raw metrics", variable=self.box,
277
+ value="Raw metrics", command=self.refresh_results_window)
278
+ dup = Radiobutton(
279
+ radio_frame, text="Duplication", variable=self.box,
280
+ value="Duplication", command=self.refresh_results_window)
281
+ ext = Radiobutton(
282
+ radio_frame, text="External dependencies",
283
+ variable=self.box, value="External dependencies",
284
+ command=self.refresh_results_window)
285
+ stat = Radiobutton(
286
+ radio_frame, text="Statistics by type",
287
+ variable=self.box, value="Statistics by type",
288
+ command=self.refresh_results_window)
289
+ msg_cat = Radiobutton(
290
+ radio_frame, text="Messages by category",
291
+ variable=self.box, value="Messages by category",
292
+ command=self.refresh_results_window)
293
+ msg = Radiobutton(
294
+ radio_frame, text="Messages", variable=self.box,
295
+ value="Messages", command=self.refresh_results_window)
296
+ source_file = Radiobutton(
297
+ radio_frame, text="Source File", variable=self.box,
298
+ value="Source File", command=self.refresh_results_window)
299
+ report.select()
300
+ report.grid(column=0, row=0, sticky=W)
301
+ raw_met.grid(column=1, row=0, sticky=W)
302
+ dup.grid(column=2, row=0, sticky=W)
303
+ msg.grid(column=3, row=0, sticky=W)
304
+ stat.grid(column=0, row=1, sticky=W)
305
+ msg_cat.grid(column=1, row=1, sticky=W)
306
+ ext.grid(column=2, row=1, sticky=W)
307
+ source_file.grid(column=3, row=1, sticky=W)
308
+
309
+ #dictionary for check boxes and associated error term
310
+ self.msg_type_dict = {
311
+ 'I': lambda: self.information_box.get() == 1,
312
+ 'C': lambda: self.convention_box.get() == 1,
313
+ 'R': lambda: self.refactor_box.get() == 1,
314
+ 'E': lambda: self.error_box.get() == 1,
315
+ 'W': lambda: self.warning_box.get() == 1,
316
+ 'F': lambda: self.fatal_box.get() == 1
317
+ }
318
+ self.txt_module.focus_set()
319
+
320
+
321
+ def select_recent_file(self, event):
322
+ """adds the selected file in the history listbox to the Module box"""
323
+ if not self.showhistory.size():
324
+ return
325
+
326
+ selected = self.showhistory.curselection()
327
+ item = self.showhistory.get(selected)
328
+ #update module
329
+ self.txt_module.delete(0, END)
330
+ self.txt_module.insert(0, item)
331
+
332
+ def refresh_msg_window(self):
333
+ """refresh the message window with current output"""
334
+ #clear the window
335
+ self.lb_messages.delete(0, END)
336
+ self.visible_msgs = []
337
+ for msg in self.msgs:
338
+ if self.msg_type_dict.get(msg.C)():
339
+ self.visible_msgs.append(msg)
340
+ msg_str = convert_to_string(msg)
341
+ self.lb_messages.insert(END, msg_str)
342
+ fg_color = COLORS.get(msg_str[:3], 'black')
343
+ self.lb_messages.itemconfigure(END, fg=fg_color)
344
+
345
+ def refresh_results_window(self):
346
+ """refresh the results window with current output"""
347
+ #clear the window
348
+ self.results.delete(0, END)
349
+ try:
350
+ for res in self.tabs[self.box.get()]:
351
+ self.results.insert(END, res)
352
+ except:
353
+ pass
354
+
355
+ def process_incoming(self):
356
+ """process the incoming messages from running pylint"""
357
+ while self.msg_queue.qsize():
358
+ try:
359
+ msg = self.msg_queue.get(0)
360
+ if msg == "DONE":
361
+ self.report_stream.output_contents()
362
+ return False
363
+
364
+ #adding message to list of msgs
365
+ self.msgs.append(msg)
366
+
367
+ #displaying msg if message type is selected in check box
368
+ if self.msg_type_dict.get(msg.C)():
369
+ self.visible_msgs.append(msg)
370
+ msg_str = convert_to_string(msg)
371
+ self.lb_messages.insert(END, msg_str)
372
+ fg_color = COLORS.get(msg_str[:3], 'black')
373
+ self.lb_messages.itemconfigure(END, fg=fg_color)
374
+
375
+ except Queue.Empty:
376
+ pass
377
+ return True
378
+
379
+ def periodic_call(self):
380
+ """determine when to unlock the run button"""
381
+ if self.process_incoming():
382
+ self.root.after(100, self.periodic_call)
383
+ else:
384
+ #enabling button so it can be run again
385
+ self.btnRun.config(state=NORMAL)
386
+
387
+ def mainloop(self):
388
+ """launch the mainloop of the application"""
389
+ self.root.mainloop()
390
+
391
+ def quit(self, _=None):
392
+ """quit the application"""
393
+ self.root.quit()
394
+
395
+ def halt(self):
396
+ """program halt placeholder"""
397
+ return
398
+
399
+ def file_open(self, package=False, _=None):
400
+ """launch a file browser"""
401
+ if not package:
402
+ filename = askopenfilename(parent=self.root, filetypes=[('pythonfiles', '*.py'),
403
+ ('allfiles', '*')], title='Select Module')
404
+ else:
405
+ filename = askdirectory(title="Select A Folder", mustexist=1)
406
+
407
+ if filename == ():
408
+ return
409
+
410
+ self.txt_module.delete(0, END)
411
+ self.txt_module.insert(0, filename)
412
+
413
+ def update_filenames(self):
414
+ """update the list of recent filenames"""
415
+ filename = self.txt_module.get()
416
+ if not filename:
417
+ filename = os.getcwd()
418
+ if filename+'\n' in self.filenames:
419
+ index = self.filenames.index(filename+'\n')
420
+ self.filenames.pop(index)
421
+
422
+ #ensure only 10 most recent are stored
423
+ if len(self.filenames) == 10:
424
+ self.filenames.pop()
425
+ self.filenames.insert(0, filename+'\n')
426
+
427
+ def set_history_window(self):
428
+ """update the history window with info from the history file"""
429
+ #clear the window
430
+ self.showhistory.delete(0, END)
431
+ # keep the last 10 most recent files
432
+ try:
433
+ view_history = open(HOME+HISTORY, 'r')
434
+ for hist in view_history.readlines():
435
+ if not hist in self.filenames:
436
+ self.filenames.append(hist)
437
+ self.showhistory.insert(END, hist.split('\n')[0])
438
+ view_history.close()
439
+ except IOError:
440
+ # do nothing since history file will be created later
441
+ return
442
+
443
+ def run_lint(self, _=None):
444
+ """launches pylint"""
445
+ self.update_filenames()
446
+ self.root.configure(cursor='watch')
447
+ self.reporter = GUIReporter(self, output=self.report_stream)
448
+ module = self.txt_module.get()
449
+ if not module:
450
+ module = os.getcwd()
451
+
452
+ #cleaning up msgs and windows
453
+ self.msgs = []
454
+ self.visible_msgs = []
455
+ self.lb_messages.delete(0, END)
456
+ self.tabs = {}
457
+ self.results.delete(0, END)
458
+ self.btnRun.config(state=DISABLED)
459
+
460
+ #setting up a worker thread to run pylint
461
+ worker = Thread(target=lint_thread, args=(module, self.reporter, self,))
462
+ self.periodic_call()
463
+ worker.start()
464
+
465
+ # Overwrite the .pylint-gui-history file with all the new recently added files
466
+ # in order from filenames but only save last 10 files
467
+ write_history = open(HOME+HISTORY, 'w')
468
+ write_history.writelines(self.filenames)
469
+ write_history.close()
470
+ self.set_history_window()
471
+
472
+ self.root.configure(cursor='')
473
+
474
+ def show_sourcefile(self, event=None):
475
+ selected = self.lb_messages.curselection()
476
+ if not selected:
477
+ return
478
+
479
+ msg = self.visible_msgs[int(selected[0])]
480
+ scroll = msg.line - 3
481
+ if scroll < 0:
482
+ scroll = 0
483
+
484
+ self.tabs["Source File"] = open(msg.path, "r").readlines()
485
+ self.box.set("Source File")
486
+ self.refresh_results_window()
487
+ self.results.yview(scroll)
488
+ self.results.select_set(msg.line - 1)
489
+
490
+
491
+ def lint_thread(module, reporter, gui):
492
+ """thread for pylint"""
493
+ gui.status.text = "processing module(s)"
494
+ pylint.lint.Run(args=[module], reporter=reporter, exit=False)
495
+ gui.msg_queue.put("DONE")
496
+
497
+
498
+ def Run(args):
499
+ """launch pylint gui from args"""
500
+ if args:
501
+ print 'USAGE: pylint-gui\n launch a simple pylint gui using Tk'
502
+ sys.exit(1)
503
+ gui = LintGui()
504
+ gui.mainloop()
505
+ sys.exit(0)
506
+
507
+ if __name__ == '__main__':
508
+ Run(sys.argv[1:])