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.
- checksums.yaml +7 -0
- data/exercism-analysis.gemspec +30 -0
- data/lib/exercism-analysis.rb +38 -0
- data/lib/exercism-analysis/adapters/adapter.rb +23 -0
- data/lib/exercism-analysis/adapters/clojure.rb +13 -0
- data/lib/exercism-analysis/adapters/go.rb +19 -0
- data/lib/exercism-analysis/adapters/javascript.rb +13 -0
- data/lib/exercism-analysis/adapters/python.rb +13 -0
- data/lib/exercism-analysis/adapters/ruby.rb +19 -0
- data/lib/exercism-analysis/analysis.rb +18 -0
- data/lib/exercism-analysis/analyzers/analyzer.rb +54 -0
- data/lib/exercism-analysis/analyzers/clojure/kibit.rb +25 -0
- data/lib/exercism-analysis/analyzers/go/golint.rb +23 -0
- data/lib/exercism-analysis/analyzers/javascript/jslint.rb +24 -0
- data/lib/exercism-analysis/analyzers/python/pylint.rb +24 -0
- data/lib/exercism-analysis/analyzers/ruby/control_flow.rb +21 -0
- data/lib/exercism-analysis/analyzers/ruby/enumerable_condition.rb +21 -0
- data/lib/exercism-analysis/analyzers/ruby/for_loop.rb +29 -0
- data/lib/exercism-analysis/analyzers/ruby/indentation.rb +21 -0
- data/lib/exercism-analysis/analyzers/ruby/iter_mutation.rb +37 -0
- data/lib/exercism-analysis/analyzers/ruby/output.rb +20 -0
- data/lib/exercism-analysis/analyzers/ruby/range.rb +28 -0
- data/lib/exercism-analysis/analyzers/ruby/roodi.rb +19 -0
- data/lib/exercism-analysis/analyzers/ruby/send.rb +25 -0
- data/lib/exercism-analysis/analyzers/ruby/shebang.rb +23 -0
- data/lib/exercism-analysis/analyzers/ruby/tab.rb +38 -0
- data/lib/exercism-analysis/processors/call_processor.rb +39 -0
- data/lib/exercism-analysis/processors/control_flow_processor.rb +27 -0
- data/lib/exercism-analysis/processors/enumerable_condition_processor.rb +31 -0
- data/lib/exercism-analysis/processors/for_loop_processor.rb +21 -0
- data/lib/exercism-analysis/processors/indentation_processor.rb +69 -0
- data/lib/exercism-analysis/processors/iter_mutation_processor.rb +50 -0
- data/lib/exercism-analysis/processors/processor.rb +34 -0
- data/lib/exercism-analysis/processors/range_processor.rb +23 -0
- data/lib/exercism-analysis/processors/send_processor.rb +23 -0
- data/lib/exercism-analysis/templates/each_to_map.rb +29 -0
- data/lib/exercism-analysis/templates/each_to_select.rb +31 -0
- data/lib/exercism-analysis/templates/range_exclusive.rb +19 -0
- data/lib/exercism-analysis/templates/template.rb +29 -0
- data/vendor/clojure/kibit-runner/LICENSE +214 -0
- data/vendor/clojure/kibit-runner/project.clj +10 -0
- data/vendor/clojure/kibit-runner/src/kibit_runner/core.clj +17 -0
- data/vendor/clojure/kibit-runner/target/kibit-runner-0.1.0-SNAPSHOT-standalone.jar +0 -0
- data/vendor/clojure/kibit-runner/target/kibit-runner-0.1.0-SNAPSHOT.jar +0 -0
- data/vendor/clojure/kibit-runner/target/stale/extract-native.dependencies +1 -0
- data/vendor/go/src/github.com/golang/lint/LICENSE +27 -0
- data/vendor/go/src/github.com/golang/lint/README +59 -0
- data/vendor/go/src/github.com/golang/lint/golint/golint.go +67 -0
- data/vendor/go/src/github.com/golang/lint/lint.go +1061 -0
- data/vendor/go/src/runner/golint_runner.go +23 -0
- data/vendor/javascript/jshint_runner.js +6 -0
- data/vendor/javascript/node_modules/jshint/README.md +47 -0
- data/vendor/javascript/node_modules/jshint/bin/apply +6 -0
- data/vendor/javascript/node_modules/jshint/bin/build +36 -0
- data/vendor/javascript/node_modules/jshint/bin/changelog +36 -0
- data/vendor/javascript/node_modules/jshint/bin/jshint +3 -0
- data/vendor/javascript/node_modules/jshint/bin/land +34 -0
- data/vendor/javascript/node_modules/jshint/data/ascii-identifier-data.js +22 -0
- data/vendor/javascript/node_modules/jshint/data/non-ascii-identifier-part-only.js +1570 -0
- data/vendor/javascript/node_modules/jshint/data/non-ascii-identifier-start.js +48477 -0
- data/vendor/javascript/node_modules/jshint/dist/jshint-rhino.js +60642 -0
- data/vendor/javascript/node_modules/jshint/dist/jshint.js +60525 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/README.md +196 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/cli.js +1139 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/cat.js +17 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/command.js +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/echo.js +54 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/glob.js +6 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/long_desc.js +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/progress.js +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/sort.js +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/spinner.js +9 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/static.coffee +27 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/examples/static.js +25 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/index.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE +27 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/README.md +250 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js +9 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js +9 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js +728 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md +42 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json +51 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js +25 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/package.json +58 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js +176 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js +63 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json +351 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js +55 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js +118 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js +10 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js +113 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js +73 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js +36 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js +39 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js +46 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js +32 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/cli/package.json +70 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/LICENCE +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/README.md +33 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/index.js +86 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/LICENCE +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/README.md +45 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/index.js +5 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/package.json +89 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/seed.js +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/test/index.js +28 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/test/static/index.html +10 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/package.json +88 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/index.js +67 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/static/index.html +12 -0
- data/vendor/javascript/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js +53 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/Gruntfile.js +48 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/LICENSE-MIT +22 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/README.md +75 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/lib/exit.js +41 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/package.json +69 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/exit_test.js +121 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stderr.txt +10 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stdout-stderr.txt +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/10-stdout.txt +10 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stderr.txt +100 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stdout-stderr.txt +200 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/100-stdout.txt +100 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stderr.txt +1000 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stdout-stderr.txt +2000 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/1000-stdout.txt +1000 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/create-files.sh +8 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/log-broken.js +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/exit/test/fixtures/log.js +25 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/LICENSE +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/README.md +83 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/CollectingHandler.js +55 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/FeedHandler.js +95 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Parser.js +337 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/ProxyHandler.js +27 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Stream.js +35 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/Tokenizer.js +891 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/WritableStream.js +21 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/lib/index.js +68 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/LICENSE +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/index.js +14 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/package.json +40 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/readme.md +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/LICENSE +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/index.js +211 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/package.json +68 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/readme.md +102 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/01-basic.json +57 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/02-single_tag_1.json +21 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/03-single_tag_2.json +21 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/04-unescaped_in_script.json +27 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/05-tags_in_comment.json +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/06-comment_in_script.json +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/07-unescaped_in_style.json +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/08-extra_spaces_in_tag.json +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/09-unquoted_attrib.json +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/10-singular_attribute.json +15 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/11-text_outside_tags.json +40 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/12-text_only.json +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/13-comment_in_text.json +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/14-comment_in_text_in_script.json +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/15-non-verbose.json +22 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/16-normalize_whitespace.json +47 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/17-xml_namespace.json +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/18-enforce_empty_tags.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/19-ignore_empty_tags.json +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/20-template_script_tags.json +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/21-conditional_comments.json +15 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/22-lowercase_tags.json +41 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/cases/23-dom-lvl1.json +121 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/test/tests.js +58 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/LICENSE +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/index.js +14 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/helpers.js +141 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/legacy.js +87 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/manipulation.js +77 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/querying.js +94 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/stringify.js +93 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/lib/traversal.js +24 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/package.json +71 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/readme.md +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/fixture.js +6 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/tests/helpers.js +89 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/tests/legacy.js +119 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/test/utils.js +9 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/LICENSE +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/index.js +31 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/decode.js +72 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js +26 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/lib/encode.js +48 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/decode.json +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/entities.json +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/legacy.json +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/maps/xml.json +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/package.json +79 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/readme.md +31 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/test/mocha.opts +2 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/test/test.js +150 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/LICENSE +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/README.md +15 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/duplex.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/float.patch +923 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js +89 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js +46 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js +944 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js +209 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js +472 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/README.md +3 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/float.patch +604 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/lib/util.js +107 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/package.json +53 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/util.js +106 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/LICENSE +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/README.md +42 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/inherits.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/inherits_browser.js +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/package.json +51 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/test.js +25 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/README.md +54 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/build/build.js +209 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/component.json +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/index.js +3 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/package.json +54 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/LICENSE +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/README.md +7 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/index.js +200 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/package.json +53 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/package.json +68 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/readable.js +7 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/transform.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/writable.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/package.json +90 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/01-events.js +9 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/02-stream.js +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/03-feed.js +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Atom_Example.xml +25 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Attributes.html +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/Basic.html +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/RDF_Example.xml +63 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Documents/RSS_Example.xml +48 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/01-simple.json +44 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/02-template.json +63 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/03-lowercase_tags.json +46 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/04-cdata.json +50 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/05-cdata-special.json +35 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/06-leading-lt.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/07-self-closing.json +67 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/08-implicit-close-tags.json +59 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/09-attributes.json +68 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/10-crazy-attrib.json +52 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/11-script_in_script.json +54 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/12-long-comment-end.json +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/13-long-cdata-end.json +22 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/14-implicit-open-tags.json +27 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/15-lt-whitespace.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/16-double_attribs.json +45 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/17-numeric_entities.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/18-legacy_entities.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/19-named_entities.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/20-xml_entities.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/21-entity_in_attribute.json +38 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/22-double_brackets.json +41 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/23-legacy_entity_fail.json +16 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/24-special_special.json +133 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/25-empty_tag_name.json +13 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/26-not-quite-closed.json +35 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/27-entities_in_attributes.json +62 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/28-cdata_in_html.json +9 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/29-comment_edge-cases.json +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Events/30-cdata_edge-cases.json +22 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/01-rss.js +34 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/02-atom.js +18 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Feeds/03-rdf.js +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/01-basic.json +83 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/02-RSS.json +1093 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/03-Atom.json +644 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/04-RDF.json +1399 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/Stream/05-Attributes.json +354 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/api.js +63 -0
- data/vendor/javascript/node_modules/jshint/node_modules/htmlparser2/test/test-helper.js +83 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/LICENSE +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/README.md +218 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/minimatch.js +1061 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +14 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +252 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json +50 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js +369 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json +58 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/package.json +57 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/basic.js +399 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/brace-expand.js +33 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/caching.js +14 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/defaults.js +274 -0
- data/vendor/javascript/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/LICENSE +26 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/README.md +569 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/bin/shjs +51 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/global.js +3 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/make.js +47 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/package.json +61 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/scripts/generate-docs.js +21 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js +50 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/shell.js +157 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cat.js +43 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cd.js +19 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/chmod.js +208 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/common.js +203 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/cp.js +201 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/dirs.js +191 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/echo.js +20 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/error.js +10 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/exec.js +181 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/find.js +51 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/grep.js +52 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/ln.js +53 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/ls.js +126 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/mkdir.js +68 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/mv.js +80 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/popd.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/pushd.js +1 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/pwd.js +11 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/rm.js +145 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/sed.js +43 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/tempdir.js +56 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/test.js +85 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/to.js +29 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/toEnd.js +29 -0
- data/vendor/javascript/node_modules/jshint/node_modules/shelljs/src/which.js +83 -0
- data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/cli.js +41 -0
- data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/package.json +76 -0
- data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/readme.md +74 -0
- data/vendor/javascript/node_modules/jshint/node_modules/strip-json-comments/strip-json-comments.js +64 -0
- data/vendor/javascript/node_modules/jshint/node_modules/underscore/LICENSE +23 -0
- data/vendor/javascript/node_modules/jshint/node_modules/underscore/README.md +22 -0
- data/vendor/javascript/node_modules/jshint/node_modules/underscore/package.json +66 -0
- data/vendor/javascript/node_modules/jshint/node_modules/underscore/underscore-min.js +6 -0
- data/vendor/javascript/node_modules/jshint/node_modules/underscore/underscore.js +1343 -0
- data/vendor/javascript/node_modules/jshint/package.json +80 -0
- data/vendor/javascript/node_modules/jshint/src/cli.js +731 -0
- data/vendor/javascript/node_modules/jshint/src/jshint.js +5023 -0
- data/vendor/javascript/node_modules/jshint/src/lex.js +1650 -0
- data/vendor/javascript/node_modules/jshint/src/messages.js +223 -0
- data/vendor/javascript/node_modules/jshint/src/platforms/rhino.js +115 -0
- data/vendor/javascript/node_modules/jshint/src/reg.js +38 -0
- data/vendor/javascript/node_modules/jshint/src/reporters/checkstyle.js +81 -0
- data/vendor/javascript/node_modules/jshint/src/reporters/default.js +34 -0
- data/vendor/javascript/node_modules/jshint/src/reporters/jslint_xml.js +57 -0
- data/vendor/javascript/node_modules/jshint/src/reporters/non_error.js +52 -0
- data/vendor/javascript/node_modules/jshint/src/state.js +28 -0
- data/vendor/javascript/node_modules/jshint/src/style.js +143 -0
- data/vendor/javascript/node_modules/jshint/src/vars.js +658 -0
- data/vendor/python/astroid/COPYING +339 -0
- data/vendor/python/astroid/COPYING.LESSER +510 -0
- data/vendor/python/astroid/ChangeLog +574 -0
- data/vendor/python/astroid/MANIFEST.in +9 -0
- data/vendor/python/astroid/README +56 -0
- data/vendor/python/astroid/README.Python3 +26 -0
- data/vendor/python/astroid/__init__.py +118 -0
- data/vendor/python/astroid/__init__.pyc +0 -0
- data/vendor/python/astroid/__pkginfo__.py +48 -0
- data/vendor/python/astroid/__pkginfo__.pyc +0 -0
- data/vendor/python/astroid/announce.txt +23 -0
- data/vendor/python/astroid/as_string.py +496 -0
- data/vendor/python/astroid/as_string.pyc +0 -0
- data/vendor/python/astroid/bases.py +618 -0
- data/vendor/python/astroid/bases.pyc +0 -0
- data/vendor/python/astroid/brain/py2gi.py +159 -0
- data/vendor/python/astroid/brain/py2gi.pyc +0 -0
- data/vendor/python/astroid/brain/py2mechanize.py +20 -0
- data/vendor/python/astroid/brain/py2mechanize.pyc +0 -0
- data/vendor/python/astroid/brain/py2qt4.py +25 -0
- data/vendor/python/astroid/brain/py2qt4.pyc +0 -0
- data/vendor/python/astroid/brain/py2stdlib.py +252 -0
- data/vendor/python/astroid/brain/py2stdlib.pyc +0 -0
- data/vendor/python/astroid/builder.py +238 -0
- data/vendor/python/astroid/builder.pyc +0 -0
- data/vendor/python/astroid/exceptions.py +51 -0
- data/vendor/python/astroid/exceptions.pyc +0 -0
- data/vendor/python/astroid/inference.py +393 -0
- data/vendor/python/astroid/inference.pyc +0 -0
- data/vendor/python/astroid/inspector.py +275 -0
- data/vendor/python/astroid/manager.py +336 -0
- data/vendor/python/astroid/manager.pyc +0 -0
- data/vendor/python/astroid/mixins.py +122 -0
- data/vendor/python/astroid/mixins.pyc +0 -0
- data/vendor/python/astroid/node_classes.py +928 -0
- data/vendor/python/astroid/node_classes.pyc +0 -0
- data/vendor/python/astroid/nodes.py +73 -0
- data/vendor/python/astroid/nodes.pyc +0 -0
- data/vendor/python/astroid/protocols.py +322 -0
- data/vendor/python/astroid/protocols.pyc +0 -0
- data/vendor/python/astroid/raw_building.py +361 -0
- data/vendor/python/astroid/raw_building.pyc +0 -0
- data/vendor/python/astroid/rebuilder.py +954 -0
- data/vendor/python/astroid/rebuilder.pyc +0 -0
- data/vendor/python/astroid/scoped_nodes.py +1118 -0
- data/vendor/python/astroid/scoped_nodes.pyc +0 -0
- data/vendor/python/astroid/setup.py +184 -0
- data/vendor/python/astroid/tox.ini +10 -0
- data/vendor/python/astroid/utils.py +236 -0
- data/vendor/python/astroid/utils.pyc +0 -0
- data/vendor/python/logilab/__init__.py +0 -0
- data/vendor/python/logilab/__init__.pyc +0 -0
- data/vendor/python/logilab/common/COPYING +339 -0
- data/vendor/python/logilab/common/COPYING.LESSER +510 -0
- data/vendor/python/logilab/common/ChangeLog +1517 -0
- data/vendor/python/logilab/common/MANIFEST.in +13 -0
- data/vendor/python/logilab/common/README +185 -0
- data/vendor/python/logilab/common/README.Python3 +29 -0
- data/vendor/python/logilab/common/__init__.py +171 -0
- data/vendor/python/logilab/common/__init__.pyc +0 -0
- data/vendor/python/logilab/common/__pkginfo__.py +53 -0
- data/vendor/python/logilab/common/__pkginfo__.pyc +0 -0
- data/vendor/python/logilab/common/announce.txt +25 -0
- data/vendor/python/logilab/common/bin/pytest +7 -0
- data/vendor/python/logilab/common/bin/pytest.bat +17 -0
- data/vendor/python/logilab/common/cache.py +114 -0
- data/vendor/python/logilab/common/changelog.py +236 -0
- data/vendor/python/logilab/common/changelog.pyc +0 -0
- data/vendor/python/logilab/common/clcommands.py +332 -0
- data/vendor/python/logilab/common/cli.py +208 -0
- data/vendor/python/logilab/common/compat.py +243 -0
- data/vendor/python/logilab/common/compat.pyc +0 -0
- data/vendor/python/logilab/common/configuration.py +1094 -0
- data/vendor/python/logilab/common/configuration.pyc +0 -0
- data/vendor/python/logilab/common/contexts.py +5 -0
- data/vendor/python/logilab/common/corbautils.py +117 -0
- data/vendor/python/logilab/common/daemon.py +100 -0
- data/vendor/python/logilab/common/date.py +333 -0
- data/vendor/python/logilab/common/dbf.py +229 -0
- data/vendor/python/logilab/common/debugger.py +210 -0
- data/vendor/python/logilab/common/decorators.py +281 -0
- data/vendor/python/logilab/common/decorators.pyc +0 -0
- data/vendor/python/logilab/common/deprecation.py +188 -0
- data/vendor/python/logilab/common/deprecation.pyc +0 -0
- data/vendor/python/logilab/common/fileutils.py +402 -0
- data/vendor/python/logilab/common/graph.py +276 -0
- data/vendor/python/logilab/common/graph.pyc +0 -0
- data/vendor/python/logilab/common/hg.py +130 -0
- data/vendor/python/logilab/common/interface.py +71 -0
- data/vendor/python/logilab/common/interface.pyc +0 -0
- data/vendor/python/logilab/common/logging_ext.py +193 -0
- data/vendor/python/logilab/common/modutils.py +695 -0
- data/vendor/python/logilab/common/modutils.pyc +0 -0
- data/vendor/python/logilab/common/optik_ext.py +391 -0
- data/vendor/python/logilab/common/optik_ext.pyc +0 -0
- data/vendor/python/logilab/common/optparser.py +90 -0
- data/vendor/python/logilab/common/proc.py +277 -0
- data/vendor/python/logilab/common/pyro_ext.py +180 -0
- data/vendor/python/logilab/common/pytest.py +1177 -0
- data/vendor/python/logilab/common/python-logilab-common.spec +184 -0
- data/vendor/python/logilab/common/registry.py +1113 -0
- data/vendor/python/logilab/common/setup.cfg +3 -0
- data/vendor/python/logilab/common/setup.py +189 -0
- data/vendor/python/logilab/common/shellutils.py +455 -0
- data/vendor/python/logilab/common/sphinx_ext.py +87 -0
- data/vendor/python/logilab/common/sphinxutils.py +122 -0
- data/vendor/python/logilab/common/table.py +925 -0
- data/vendor/python/logilab/common/tasksqueue.py +100 -0
- data/vendor/python/logilab/common/textutils.py +534 -0
- data/vendor/python/logilab/common/textutils.pyc +0 -0
- data/vendor/python/logilab/common/tree.py +369 -0
- data/vendor/python/logilab/common/tree.pyc +0 -0
- data/vendor/python/logilab/common/umessage.py +190 -0
- data/vendor/python/logilab/common/ureports/__init__.py +174 -0
- data/vendor/python/logilab/common/ureports/__init__.pyc +0 -0
- data/vendor/python/logilab/common/ureports/docbook_writer.py +139 -0
- data/vendor/python/logilab/common/ureports/html_writer.py +131 -0
- data/vendor/python/logilab/common/ureports/html_writer.pyc +0 -0
- data/vendor/python/logilab/common/ureports/nodes.py +201 -0
- data/vendor/python/logilab/common/ureports/nodes.pyc +0 -0
- data/vendor/python/logilab/common/ureports/text_writer.py +140 -0
- data/vendor/python/logilab/common/ureports/text_writer.pyc +0 -0
- data/vendor/python/logilab/common/urllib2ext.py +87 -0
- data/vendor/python/logilab/common/vcgutils.py +216 -0
- data/vendor/python/logilab/common/visitor.py +107 -0
- data/vendor/python/logilab/common/visitor.pyc +0 -0
- data/vendor/python/logilab/common/xmlrpcutils.py +131 -0
- data/vendor/python/logilab/common/xmlutils.py +61 -0
- data/vendor/python/pylint/CONTRIBUTORS.txt +38 -0
- data/vendor/python/pylint/COPYING +340 -0
- data/vendor/python/pylint/ChangeLog +1437 -0
- data/vendor/python/pylint/DEPENDS +3 -0
- data/vendor/python/pylint/MANIFEST.in +14 -0
- data/vendor/python/pylint/README +50 -0
- data/vendor/python/pylint/README.Python3 +37 -0
- data/vendor/python/pylint/__init__.py +44 -0
- data/vendor/python/pylint/__init__.pyc +0 -0
- data/vendor/python/pylint/__main__.py +3 -0
- data/vendor/python/pylint/__pkginfo__.py +74 -0
- data/vendor/python/pylint/__pkginfo__.pyc +0 -0
- data/vendor/python/pylint/bin/epylint +3 -0
- data/vendor/python/pylint/bin/epylint.bat +5 -0
- data/vendor/python/pylint/bin/pylint +3 -0
- data/vendor/python/pylint/bin/pylint-gui +3 -0
- data/vendor/python/pylint/bin/pylint-gui.bat +5 -0
- data/vendor/python/pylint/bin/pylint.bat +5 -0
- data/vendor/python/pylint/bin/pyreverse +3 -0
- data/vendor/python/pylint/bin/pyreverse.bat +5 -0
- data/vendor/python/pylint/bin/symilar +3 -0
- data/vendor/python/pylint/bin/symilar.bat +5 -0
- data/vendor/python/pylint/checkers/__init__.py +145 -0
- data/vendor/python/pylint/checkers/__init__.pyc +0 -0
- data/vendor/python/pylint/checkers/base.py +1141 -0
- data/vendor/python/pylint/checkers/base.pyc +0 -0
- data/vendor/python/pylint/checkers/classes.py +792 -0
- data/vendor/python/pylint/checkers/classes.pyc +0 -0
- data/vendor/python/pylint/checkers/design_analysis.py +367 -0
- data/vendor/python/pylint/checkers/design_analysis.pyc +0 -0
- data/vendor/python/pylint/checkers/exceptions.py +306 -0
- data/vendor/python/pylint/checkers/exceptions.pyc +0 -0
- data/vendor/python/pylint/checkers/format.py +943 -0
- data/vendor/python/pylint/checkers/format.pyc +0 -0
- data/vendor/python/pylint/checkers/imports.py +394 -0
- data/vendor/python/pylint/checkers/imports.pyc +0 -0
- data/vendor/python/pylint/checkers/logging.py +213 -0
- data/vendor/python/pylint/checkers/logging.pyc +0 -0
- data/vendor/python/pylint/checkers/misc.py +90 -0
- data/vendor/python/pylint/checkers/misc.pyc +0 -0
- data/vendor/python/pylint/checkers/newstyle.py +151 -0
- data/vendor/python/pylint/checkers/newstyle.pyc +0 -0
- data/vendor/python/pylint/checkers/raw_metrics.py +129 -0
- data/vendor/python/pylint/checkers/raw_metrics.pyc +0 -0
- data/vendor/python/pylint/checkers/similar.py +365 -0
- data/vendor/python/pylint/checkers/similar.pyc +0 -0
- data/vendor/python/pylint/checkers/stdlib.py +69 -0
- data/vendor/python/pylint/checkers/stdlib.pyc +0 -0
- data/vendor/python/pylint/checkers/strings.py +304 -0
- data/vendor/python/pylint/checkers/strings.pyc +0 -0
- data/vendor/python/pylint/checkers/typecheck.py +451 -0
- data/vendor/python/pylint/checkers/typecheck.pyc +0 -0
- data/vendor/python/pylint/checkers/utils.py +416 -0
- data/vendor/python/pylint/checkers/utils.pyc +0 -0
- data/vendor/python/pylint/checkers/variables.py +741 -0
- data/vendor/python/pylint/checkers/variables.pyc +0 -0
- data/vendor/python/pylint/config.py +156 -0
- data/vendor/python/pylint/config.pyc +0 -0
- data/vendor/python/pylint/epylint.py +175 -0
- data/vendor/python/pylint/gui.py +508 -0
- data/vendor/python/pylint/interfaces.py +72 -0
- data/vendor/python/pylint/interfaces.pyc +0 -0
- data/vendor/python/pylint/lint.py +1106 -0
- data/vendor/python/pylint/lint.pyc +0 -0
- data/vendor/python/pylint/pyreverse/__init__.py +5 -0
- data/vendor/python/pylint/pyreverse/diadefslib.py +233 -0
- data/vendor/python/pylint/pyreverse/diagrams.py +247 -0
- data/vendor/python/pylint/pyreverse/main.py +124 -0
- data/vendor/python/pylint/pyreverse/utils.py +131 -0
- data/vendor/python/pylint/pyreverse/writer.py +199 -0
- data/vendor/python/pylint/reporters/__init__.py +138 -0
- data/vendor/python/pylint/reporters/__init__.pyc +0 -0
- data/vendor/python/pylint/reporters/guireporter.py +28 -0
- data/vendor/python/pylint/reporters/guireporter.pyc +0 -0
- data/vendor/python/pylint/reporters/html.py +70 -0
- data/vendor/python/pylint/reporters/html.pyc +0 -0
- data/vendor/python/pylint/reporters/text.py +143 -0
- data/vendor/python/pylint/reporters/text.pyc +0 -0
- data/vendor/python/pylint/setup.cfg +3 -0
- data/vendor/python/pylint/setup.py +203 -0
- data/vendor/python/pylint/tox.ini +10 -0
- data/vendor/python/pylint/utils.py +744 -0
- data/vendor/python/pylint/utils.pyc +0 -0
- data/vendor/python/pylint_runner.py +22 -0
- metadata +675 -0
|
Binary file
|
|
@@ -0,0 +1,367 @@
|
|
|
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
|
+
"""check for signs of poor design"""
|
|
17
|
+
|
|
18
|
+
from astroid import Function, If, InferenceError
|
|
19
|
+
|
|
20
|
+
from pylint.interfaces import IAstroidChecker
|
|
21
|
+
from pylint.checkers import BaseChecker
|
|
22
|
+
from pylint.checkers.utils import check_messages
|
|
23
|
+
|
|
24
|
+
import re
|
|
25
|
+
|
|
26
|
+
# regexp for ignored argument name
|
|
27
|
+
IGNORED_ARGUMENT_NAMES = re.compile('_.*')
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def class_is_abstract(klass):
|
|
31
|
+
"""return true if the given class node should be considered as an abstract
|
|
32
|
+
class
|
|
33
|
+
"""
|
|
34
|
+
for attr in klass.values():
|
|
35
|
+
if isinstance(attr, Function):
|
|
36
|
+
if attr.is_abstract(pass_is_abstract=False):
|
|
37
|
+
return True
|
|
38
|
+
return False
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
MSGS = {
|
|
42
|
+
'R0901': ('Too many ancestors (%s/%s)',
|
|
43
|
+
'too-many-ancestors',
|
|
44
|
+
'Used when class has too many parent classes, try to reduce \
|
|
45
|
+
this to get a simpler (and so easier to use) class.'),
|
|
46
|
+
'R0902': ('Too many instance attributes (%s/%s)',
|
|
47
|
+
'too-many-instance-attributes',
|
|
48
|
+
'Used when class has too many instance attributes, try to reduce \
|
|
49
|
+
this to get a simpler (and so easier to use) class.'),
|
|
50
|
+
'R0903': ('Too few public methods (%s/%s)',
|
|
51
|
+
'too-few-public-methods',
|
|
52
|
+
'Used when class has too few public methods, so be sure it\'s \
|
|
53
|
+
really worth it.'),
|
|
54
|
+
'R0904': ('Too many public methods (%s/%s)',
|
|
55
|
+
'too-many-public-methods',
|
|
56
|
+
'Used when class has too many public methods, try to reduce \
|
|
57
|
+
this to get a simpler (and so easier to use) class.'),
|
|
58
|
+
|
|
59
|
+
'R0911': ('Too many return statements (%s/%s)',
|
|
60
|
+
'too-many-return-statements',
|
|
61
|
+
'Used when a function or method has too many return statement, \
|
|
62
|
+
making it hard to follow.'),
|
|
63
|
+
'R0912': ('Too many branches (%s/%s)',
|
|
64
|
+
'too-many-branches',
|
|
65
|
+
'Used when a function or method has too many branches, \
|
|
66
|
+
making it hard to follow.'),
|
|
67
|
+
'R0913': ('Too many arguments (%s/%s)',
|
|
68
|
+
'too-many-arguments',
|
|
69
|
+
'Used when a function or method takes too many arguments.'),
|
|
70
|
+
'R0914': ('Too many local variables (%s/%s)',
|
|
71
|
+
'too-many-locals',
|
|
72
|
+
'Used when a function or method has too many local variables.'),
|
|
73
|
+
'R0915': ('Too many statements (%s/%s)',
|
|
74
|
+
'too-many-statements',
|
|
75
|
+
'Used when a function or method has too many statements. You \
|
|
76
|
+
should then split it in smaller functions / methods.'),
|
|
77
|
+
|
|
78
|
+
'R0921': ('Abstract class not referenced',
|
|
79
|
+
'abstract-class-not-used',
|
|
80
|
+
'Used when an abstract class is not used as ancestor anywhere.'),
|
|
81
|
+
'R0922': ('Abstract class is only referenced %s times',
|
|
82
|
+
'abstract-class-little-used',
|
|
83
|
+
'Used when an abstract class is used less than X times as \
|
|
84
|
+
ancestor.'),
|
|
85
|
+
'R0923': ('Interface not implemented',
|
|
86
|
+
'interface-not-implemented',
|
|
87
|
+
'Used when an interface class is not implemented anywhere.'),
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class MisdesignChecker(BaseChecker):
|
|
92
|
+
"""checks for sign of poor/misdesign:
|
|
93
|
+
* number of methods, attributes, local variables...
|
|
94
|
+
* size, complexity of functions, methods
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
__implements__ = (IAstroidChecker,)
|
|
98
|
+
|
|
99
|
+
# configuration section name
|
|
100
|
+
name = 'design'
|
|
101
|
+
# messages
|
|
102
|
+
msgs = MSGS
|
|
103
|
+
priority = -2
|
|
104
|
+
# configuration options
|
|
105
|
+
options = (('max-args',
|
|
106
|
+
{'default' : 5, 'type' : 'int', 'metavar' : '<int>',
|
|
107
|
+
'help': 'Maximum number of arguments for function / method'}
|
|
108
|
+
),
|
|
109
|
+
('ignored-argument-names',
|
|
110
|
+
{'default' : IGNORED_ARGUMENT_NAMES,
|
|
111
|
+
'type' :'regexp', 'metavar' : '<regexp>',
|
|
112
|
+
'help' : 'Argument names that match this expression will be '
|
|
113
|
+
'ignored. Default to name with leading underscore'}
|
|
114
|
+
),
|
|
115
|
+
('max-locals',
|
|
116
|
+
{'default' : 15, 'type' : 'int', 'metavar' : '<int>',
|
|
117
|
+
'help': 'Maximum number of locals for function / method body'}
|
|
118
|
+
),
|
|
119
|
+
('max-returns',
|
|
120
|
+
{'default' : 6, 'type' : 'int', 'metavar' : '<int>',
|
|
121
|
+
'help': 'Maximum number of return / yield for function / '
|
|
122
|
+
'method body'}
|
|
123
|
+
),
|
|
124
|
+
('max-branches',
|
|
125
|
+
{'default' : 12, 'type' : 'int', 'metavar' : '<int>',
|
|
126
|
+
'help': 'Maximum number of branch for function / method body'}
|
|
127
|
+
),
|
|
128
|
+
('max-statements',
|
|
129
|
+
{'default' : 50, 'type' : 'int', 'metavar' : '<int>',
|
|
130
|
+
'help': 'Maximum number of statements in function / method '
|
|
131
|
+
'body'}
|
|
132
|
+
),
|
|
133
|
+
('max-parents',
|
|
134
|
+
{'default' : 7,
|
|
135
|
+
'type' : 'int',
|
|
136
|
+
'metavar' : '<num>',
|
|
137
|
+
'help' : 'Maximum number of parents for a class (see R0901).'}
|
|
138
|
+
),
|
|
139
|
+
('max-attributes',
|
|
140
|
+
{'default' : 7,
|
|
141
|
+
'type' : 'int',
|
|
142
|
+
'metavar' : '<num>',
|
|
143
|
+
'help' : 'Maximum number of attributes for a class \
|
|
144
|
+
(see R0902).'}
|
|
145
|
+
),
|
|
146
|
+
('min-public-methods',
|
|
147
|
+
{'default' : 2,
|
|
148
|
+
'type' : 'int',
|
|
149
|
+
'metavar' : '<num>',
|
|
150
|
+
'help' : 'Minimum number of public methods for a class \
|
|
151
|
+
(see R0903).'}
|
|
152
|
+
),
|
|
153
|
+
('max-public-methods',
|
|
154
|
+
{'default' : 20,
|
|
155
|
+
'type' : 'int',
|
|
156
|
+
'metavar' : '<num>',
|
|
157
|
+
'help' : 'Maximum number of public methods for a class \
|
|
158
|
+
(see R0904).'}
|
|
159
|
+
),
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def __init__(self, linter=None):
|
|
163
|
+
BaseChecker.__init__(self, linter)
|
|
164
|
+
self.stats = None
|
|
165
|
+
self._returns = None
|
|
166
|
+
self._branches = None
|
|
167
|
+
self._used_abstracts = None
|
|
168
|
+
self._used_ifaces = None
|
|
169
|
+
self._abstracts = None
|
|
170
|
+
self._ifaces = None
|
|
171
|
+
self._stmts = 0
|
|
172
|
+
|
|
173
|
+
def open(self):
|
|
174
|
+
"""initialize visit variables"""
|
|
175
|
+
self.stats = self.linter.add_stats()
|
|
176
|
+
self._returns = []
|
|
177
|
+
self._branches = []
|
|
178
|
+
self._used_abstracts = {}
|
|
179
|
+
self._used_ifaces = {}
|
|
180
|
+
self._abstracts = []
|
|
181
|
+
self._ifaces = []
|
|
182
|
+
|
|
183
|
+
# Check 'R0921', 'R0922', 'R0923'
|
|
184
|
+
def close(self):
|
|
185
|
+
"""check that abstract/interface classes are used"""
|
|
186
|
+
for abstract in self._abstracts:
|
|
187
|
+
if not abstract in self._used_abstracts:
|
|
188
|
+
self.add_message('abstract-class-not-used', node=abstract)
|
|
189
|
+
elif self._used_abstracts[abstract] < 2:
|
|
190
|
+
self.add_message('abstract-class-little-used', node=abstract,
|
|
191
|
+
args=self._used_abstracts[abstract])
|
|
192
|
+
for iface in self._ifaces:
|
|
193
|
+
if not iface in self._used_ifaces:
|
|
194
|
+
self.add_message('interface-not-implemented', node=iface)
|
|
195
|
+
|
|
196
|
+
@check_messages('too-many-ancestors', 'too-many-instance-attributes',
|
|
197
|
+
'too-few-public-methods', 'too-many-public-methods',
|
|
198
|
+
'abstract-class-not-used', 'abstract-class-little-used',
|
|
199
|
+
'interface-not-implemented')
|
|
200
|
+
def visit_class(self, node):
|
|
201
|
+
"""check size of inheritance hierarchy and number of instance attributes
|
|
202
|
+
"""
|
|
203
|
+
self._inc_branch()
|
|
204
|
+
# Is the total inheritance hierarchy is 7 or less?
|
|
205
|
+
nb_parents = len(list(node.ancestors()))
|
|
206
|
+
if nb_parents > self.config.max_parents:
|
|
207
|
+
self.add_message('too-many-ancestors', node=node,
|
|
208
|
+
args=(nb_parents, self.config.max_parents))
|
|
209
|
+
# Does the class contain less than 20 attributes for
|
|
210
|
+
# non-GUI classes (40 for GUI)?
|
|
211
|
+
# FIXME detect gui classes
|
|
212
|
+
if len(node.instance_attrs) > self.config.max_attributes:
|
|
213
|
+
self.add_message('too-many-instance-attributes', node=node,
|
|
214
|
+
args=(len(node.instance_attrs),
|
|
215
|
+
self.config.max_attributes))
|
|
216
|
+
# update abstract / interface classes structures
|
|
217
|
+
if class_is_abstract(node):
|
|
218
|
+
self._abstracts.append(node)
|
|
219
|
+
elif node.type == 'interface' and node.name != 'Interface':
|
|
220
|
+
self._ifaces.append(node)
|
|
221
|
+
for parent in node.ancestors(False):
|
|
222
|
+
if parent.name == 'Interface':
|
|
223
|
+
continue
|
|
224
|
+
self._used_ifaces[parent] = 1
|
|
225
|
+
try:
|
|
226
|
+
for iface in node.interfaces():
|
|
227
|
+
self._used_ifaces[iface] = 1
|
|
228
|
+
except InferenceError:
|
|
229
|
+
# XXX log ?
|
|
230
|
+
pass
|
|
231
|
+
for parent in node.ancestors():
|
|
232
|
+
try:
|
|
233
|
+
self._used_abstracts[parent] += 1
|
|
234
|
+
except KeyError:
|
|
235
|
+
self._used_abstracts[parent] = 1
|
|
236
|
+
|
|
237
|
+
@check_messages('too-many-ancestors', 'too-many-instance-attributes',
|
|
238
|
+
'too-few-public-methods', 'too-many-public-methods',
|
|
239
|
+
'abstract-class-not-used', 'abstract-class-little-used',
|
|
240
|
+
'interface-not-implemented')
|
|
241
|
+
def leave_class(self, node):
|
|
242
|
+
"""check number of public methods"""
|
|
243
|
+
nb_public_methods = 0
|
|
244
|
+
special_methods = set()
|
|
245
|
+
for method in node.methods():
|
|
246
|
+
if not method.name.startswith('_'):
|
|
247
|
+
nb_public_methods += 1
|
|
248
|
+
if method.name.startswith("__"):
|
|
249
|
+
special_methods.add(method.name)
|
|
250
|
+
# Does the class contain less than 20 public methods ?
|
|
251
|
+
if nb_public_methods > self.config.max_public_methods:
|
|
252
|
+
self.add_message('too-many-public-methods', node=node,
|
|
253
|
+
args=(nb_public_methods,
|
|
254
|
+
self.config.max_public_methods))
|
|
255
|
+
# stop here for exception, metaclass and interface classes
|
|
256
|
+
if node.type != 'class':
|
|
257
|
+
return
|
|
258
|
+
# Does the class contain more than 5 public methods ?
|
|
259
|
+
if nb_public_methods < self.config.min_public_methods:
|
|
260
|
+
self.add_message('R0903', node=node,
|
|
261
|
+
args=(nb_public_methods,
|
|
262
|
+
self.config.min_public_methods))
|
|
263
|
+
|
|
264
|
+
@check_messages('too-many-return-statements', 'too-many-branches',
|
|
265
|
+
'too-many-arguments', 'too-many-locals', 'too-many-statements')
|
|
266
|
+
def visit_function(self, node):
|
|
267
|
+
"""check function name, docstring, arguments, redefinition,
|
|
268
|
+
variable names, max locals
|
|
269
|
+
"""
|
|
270
|
+
self._inc_branch()
|
|
271
|
+
# init branch and returns counters
|
|
272
|
+
self._returns.append(0)
|
|
273
|
+
self._branches.append(0)
|
|
274
|
+
# check number of arguments
|
|
275
|
+
args = node.args.args
|
|
276
|
+
if args is not None:
|
|
277
|
+
ignored_args_num = len(
|
|
278
|
+
[arg for arg in args
|
|
279
|
+
if self.config.ignored_argument_names.match(arg.name)])
|
|
280
|
+
argnum = len(args) - ignored_args_num
|
|
281
|
+
if argnum > self.config.max_args:
|
|
282
|
+
self.add_message('too-many-arguments', node=node,
|
|
283
|
+
args=(len(args), self.config.max_args))
|
|
284
|
+
else:
|
|
285
|
+
ignored_args_num = 0
|
|
286
|
+
# check number of local variables
|
|
287
|
+
locnum = len(node.locals) - ignored_args_num
|
|
288
|
+
if locnum > self.config.max_locals:
|
|
289
|
+
self.add_message('too-many-locals', node=node,
|
|
290
|
+
args=(locnum, self.config.max_locals))
|
|
291
|
+
# init statements counter
|
|
292
|
+
self._stmts = 1
|
|
293
|
+
|
|
294
|
+
@check_messages('too-many-return-statements', 'too-many-branches', 'too-many-arguments', 'too-many-locals', 'too-many-statements')
|
|
295
|
+
def leave_function(self, node):
|
|
296
|
+
"""most of the work is done here on close:
|
|
297
|
+
checks for max returns, branch, return in __init__
|
|
298
|
+
"""
|
|
299
|
+
returns = self._returns.pop()
|
|
300
|
+
if returns > self.config.max_returns:
|
|
301
|
+
self.add_message('too-many-return-statements', node=node,
|
|
302
|
+
args=(returns, self.config.max_returns))
|
|
303
|
+
branches = self._branches.pop()
|
|
304
|
+
if branches > self.config.max_branches:
|
|
305
|
+
self.add_message('too-many-branches', node=node,
|
|
306
|
+
args=(branches, self.config.max_branches))
|
|
307
|
+
# check number of statements
|
|
308
|
+
if self._stmts > self.config.max_statements:
|
|
309
|
+
self.add_message('too-many-statements', node=node,
|
|
310
|
+
args=(self._stmts, self.config.max_statements))
|
|
311
|
+
|
|
312
|
+
def visit_return(self, _):
|
|
313
|
+
"""count number of returns"""
|
|
314
|
+
if not self._returns:
|
|
315
|
+
return # return outside function, reported by the base checker
|
|
316
|
+
self._returns[-1] += 1
|
|
317
|
+
|
|
318
|
+
def visit_default(self, node):
|
|
319
|
+
"""default visit method -> increments the statements counter if
|
|
320
|
+
necessary
|
|
321
|
+
"""
|
|
322
|
+
if node.is_statement:
|
|
323
|
+
self._stmts += 1
|
|
324
|
+
|
|
325
|
+
def visit_tryexcept(self, node):
|
|
326
|
+
"""increments the branches counter"""
|
|
327
|
+
branches = len(node.handlers)
|
|
328
|
+
if node.orelse:
|
|
329
|
+
branches += 1
|
|
330
|
+
self._inc_branch(branches)
|
|
331
|
+
self._stmts += branches
|
|
332
|
+
|
|
333
|
+
def visit_tryfinally(self, _):
|
|
334
|
+
"""increments the branches counter"""
|
|
335
|
+
self._inc_branch(2)
|
|
336
|
+
self._stmts += 2
|
|
337
|
+
|
|
338
|
+
def visit_if(self, node):
|
|
339
|
+
"""increments the branches counter"""
|
|
340
|
+
branches = 1
|
|
341
|
+
# don't double count If nodes coming from some 'elif'
|
|
342
|
+
if node.orelse and (len(node.orelse) > 1 or
|
|
343
|
+
not isinstance(node.orelse[0], If)):
|
|
344
|
+
branches += 1
|
|
345
|
+
self._inc_branch(branches)
|
|
346
|
+
self._stmts += branches
|
|
347
|
+
|
|
348
|
+
def visit_while(self, node):
|
|
349
|
+
"""increments the branches counter"""
|
|
350
|
+
branches = 1
|
|
351
|
+
if node.orelse:
|
|
352
|
+
branches += 1
|
|
353
|
+
self._inc_branch(branches)
|
|
354
|
+
|
|
355
|
+
visit_for = visit_while
|
|
356
|
+
|
|
357
|
+
def _inc_branch(self, branchesnum=1):
|
|
358
|
+
"""increments the branches counter"""
|
|
359
|
+
branches = self._branches
|
|
360
|
+
for i in xrange(len(branches)):
|
|
361
|
+
branches[i] += branchesnum
|
|
362
|
+
|
|
363
|
+
# FIXME: make a nice report...
|
|
364
|
+
|
|
365
|
+
def register(linter):
|
|
366
|
+
"""required method to auto register this checker """
|
|
367
|
+
linter.register_checker(MisdesignChecker(linter))
|
|
Binary file
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE).
|
|
2
|
+
# http://www.logilab.fr/ -- mailto:contact@logilab.fr
|
|
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
|
+
"""exceptions handling (raising, catching, exceptions classes) checker
|
|
16
|
+
"""
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
from logilab.common.compat import builtins
|
|
20
|
+
BUILTINS_NAME = builtins.__name__
|
|
21
|
+
import astroid
|
|
22
|
+
from astroid import YES, Instance, unpack_infer
|
|
23
|
+
|
|
24
|
+
from pylint.checkers import BaseChecker
|
|
25
|
+
from pylint.checkers.utils import is_empty, is_raising, check_messages
|
|
26
|
+
from pylint.interfaces import IAstroidChecker
|
|
27
|
+
|
|
28
|
+
def infer_bases(klass):
|
|
29
|
+
""" Fully infer the bases of the klass node.
|
|
30
|
+
|
|
31
|
+
This doesn't use .ancestors(), because we need
|
|
32
|
+
the non-inferable nodes (YES nodes),
|
|
33
|
+
which can't be retrieved from .ancestors()
|
|
34
|
+
"""
|
|
35
|
+
for base in klass.bases:
|
|
36
|
+
try:
|
|
37
|
+
inferit = base.infer().next()
|
|
38
|
+
except astroid.InferenceError:
|
|
39
|
+
continue
|
|
40
|
+
if inferit is YES:
|
|
41
|
+
yield inferit
|
|
42
|
+
else:
|
|
43
|
+
for base in infer_bases(inferit):
|
|
44
|
+
yield base
|
|
45
|
+
|
|
46
|
+
PY3K = sys.version_info >= (3, 0)
|
|
47
|
+
OVERGENERAL_EXCEPTIONS = ('Exception',)
|
|
48
|
+
|
|
49
|
+
MSGS = {
|
|
50
|
+
'E0701': ('Bad except clauses order (%s)',
|
|
51
|
+
'bad-except-order',
|
|
52
|
+
'Used when except clauses are not in the correct order (from the '
|
|
53
|
+
'more specific to the more generic). If you don\'t fix the order, '
|
|
54
|
+
'some exceptions may not be catched by the most specific handler.'),
|
|
55
|
+
'E0702': ('Raising %s while only classes, instances or string are allowed',
|
|
56
|
+
'raising-bad-type',
|
|
57
|
+
'Used when something which is neither a class, an instance or a \
|
|
58
|
+
string is raised (i.e. a `TypeError` will be raised).'),
|
|
59
|
+
'E0703': ('Exception context set to something which is not an '
|
|
60
|
+
'exception, nor None',
|
|
61
|
+
'bad-exception-context',
|
|
62
|
+
'Used when using the syntax "raise ... from ...", '
|
|
63
|
+
'where the exception context is not an exception, '
|
|
64
|
+
'nor None.',
|
|
65
|
+
{'minversion': (3, 0)}),
|
|
66
|
+
'E0710': ('Raising a new style class which doesn\'t inherit from BaseException',
|
|
67
|
+
'raising-non-exception',
|
|
68
|
+
'Used when a new style class which doesn\'t inherit from \
|
|
69
|
+
BaseException is raised.'),
|
|
70
|
+
'E0711': ('NotImplemented raised - should raise NotImplementedError',
|
|
71
|
+
'notimplemented-raised',
|
|
72
|
+
'Used when NotImplemented is raised instead of \
|
|
73
|
+
NotImplementedError'),
|
|
74
|
+
'E0712': ('Catching an exception which doesn\'t inherit from BaseException: %s',
|
|
75
|
+
'catching-non-exception',
|
|
76
|
+
'Used when a class which doesn\'t inherit from \
|
|
77
|
+
BaseException is used as an exception in an except clause.'),
|
|
78
|
+
|
|
79
|
+
'W0701': ('Raising a string exception',
|
|
80
|
+
'raising-string',
|
|
81
|
+
'Used when a string exception is raised.'),
|
|
82
|
+
'W0702': ('No exception type(s) specified',
|
|
83
|
+
'bare-except',
|
|
84
|
+
'Used when an except clause doesn\'t specify exceptions type to \
|
|
85
|
+
catch.'),
|
|
86
|
+
'W0703': ('Catching too general exception %s',
|
|
87
|
+
'broad-except',
|
|
88
|
+
'Used when an except catches a too general exception, \
|
|
89
|
+
possibly burying unrelated errors.'),
|
|
90
|
+
'W0704': ('Except doesn\'t do anything',
|
|
91
|
+
'pointless-except',
|
|
92
|
+
'Used when an except clause does nothing but "pass" and there is\
|
|
93
|
+
no "else" clause.'),
|
|
94
|
+
'W0710': ('Exception doesn\'t inherit from standard "Exception" class',
|
|
95
|
+
'nonstandard-exception',
|
|
96
|
+
'Used when a custom exception class is raised but doesn\'t \
|
|
97
|
+
inherit from the builtin "Exception" class.',
|
|
98
|
+
{'maxversion': (3, 0)}),
|
|
99
|
+
'W0711': ('Exception to catch is the result of a binary "%s" operation',
|
|
100
|
+
'binary-op-exception',
|
|
101
|
+
'Used when the exception to catch is of the form \
|
|
102
|
+
"except A or B:". If intending to catch multiple, \
|
|
103
|
+
rewrite as "except (A, B):"'),
|
|
104
|
+
'W0712': ('Implicit unpacking of exceptions is not supported in Python 3',
|
|
105
|
+
'unpacking-in-except',
|
|
106
|
+
'Python3 will not allow implicit unpacking of exceptions in except '
|
|
107
|
+
'clauses. '
|
|
108
|
+
'See http://www.python.org/dev/peps/pep-3110/',
|
|
109
|
+
{'maxversion': (3, 0)}),
|
|
110
|
+
'W0713': ('Indexing exceptions will not work on Python 3',
|
|
111
|
+
'indexing-exception',
|
|
112
|
+
'Indexing exceptions will not work on Python 3. Use '
|
|
113
|
+
'`exception.args[index]` instead.',
|
|
114
|
+
{'maxversion': (3, 0)}),
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
if sys.version_info < (3, 0):
|
|
119
|
+
EXCEPTIONS_MODULE = "exceptions"
|
|
120
|
+
else:
|
|
121
|
+
EXCEPTIONS_MODULE = "builtins"
|
|
122
|
+
|
|
123
|
+
class ExceptionsChecker(BaseChecker):
|
|
124
|
+
"""checks for
|
|
125
|
+
* excepts without exception filter
|
|
126
|
+
* type of raise argument : string, Exceptions, other values
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
__implements__ = IAstroidChecker
|
|
130
|
+
|
|
131
|
+
name = 'exceptions'
|
|
132
|
+
msgs = MSGS
|
|
133
|
+
priority = -4
|
|
134
|
+
options = (('overgeneral-exceptions',
|
|
135
|
+
{'default' : OVERGENERAL_EXCEPTIONS,
|
|
136
|
+
'type' :'csv', 'metavar' : '<comma-separated class names>',
|
|
137
|
+
'help' : 'Exceptions that will emit a warning '
|
|
138
|
+
'when being caught. Defaults to "%s"' % (
|
|
139
|
+
', '.join(OVERGENERAL_EXCEPTIONS),)}
|
|
140
|
+
),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
@check_messages('raising-string', 'nonstandard-exception', 'raising-bad-type',
|
|
144
|
+
'raising-non-exception', 'notimplemented-raised', 'bad-exception-context')
|
|
145
|
+
def visit_raise(self, node):
|
|
146
|
+
"""visit raise possibly inferring value"""
|
|
147
|
+
# ignore empty raise
|
|
148
|
+
if node.exc is None:
|
|
149
|
+
return
|
|
150
|
+
if PY3K and node.cause:
|
|
151
|
+
try:
|
|
152
|
+
cause = node.cause.infer().next()
|
|
153
|
+
except astroid.InferenceError:
|
|
154
|
+
pass
|
|
155
|
+
else:
|
|
156
|
+
if cause is YES:
|
|
157
|
+
return
|
|
158
|
+
if isinstance(cause, astroid.Const):
|
|
159
|
+
if cause.value is not None:
|
|
160
|
+
self.add_message('bad-exception-context',
|
|
161
|
+
node=node)
|
|
162
|
+
elif (not isinstance(cause, astroid.Class) and
|
|
163
|
+
not inherit_from_std_ex(cause)):
|
|
164
|
+
self.add_message('bad-exception-context',
|
|
165
|
+
node=node)
|
|
166
|
+
expr = node.exc
|
|
167
|
+
if self._check_raise_value(node, expr):
|
|
168
|
+
return
|
|
169
|
+
else:
|
|
170
|
+
try:
|
|
171
|
+
value = unpack_infer(expr).next()
|
|
172
|
+
except astroid.InferenceError:
|
|
173
|
+
return
|
|
174
|
+
self._check_raise_value(node, value)
|
|
175
|
+
|
|
176
|
+
def _check_raise_value(self, node, expr):
|
|
177
|
+
"""check for bad values, string exception and class inheritance
|
|
178
|
+
"""
|
|
179
|
+
value_found = True
|
|
180
|
+
if isinstance(expr, astroid.Const):
|
|
181
|
+
value = expr.value
|
|
182
|
+
if isinstance(value, str):
|
|
183
|
+
self.add_message('raising-string', node=node)
|
|
184
|
+
else:
|
|
185
|
+
self.add_message('raising-bad-type', node=node,
|
|
186
|
+
args=value.__class__.__name__)
|
|
187
|
+
elif (isinstance(expr, astroid.Name) and \
|
|
188
|
+
expr.name in ('None', 'True', 'False')) or \
|
|
189
|
+
isinstance(expr, (astroid.List, astroid.Dict, astroid.Tuple,
|
|
190
|
+
astroid.Module, astroid.Function)):
|
|
191
|
+
self.add_message('raising-bad-type', node=node, args=expr.name)
|
|
192
|
+
elif ((isinstance(expr, astroid.Name) and expr.name == 'NotImplemented')
|
|
193
|
+
or (isinstance(expr, astroid.CallFunc) and
|
|
194
|
+
isinstance(expr.func, astroid.Name) and
|
|
195
|
+
expr.func.name == 'NotImplemented')):
|
|
196
|
+
self.add_message('notimplemented-raised', node=node)
|
|
197
|
+
elif isinstance(expr, astroid.BinOp) and expr.op == '%':
|
|
198
|
+
self.add_message('raising-string', node=node)
|
|
199
|
+
elif isinstance(expr, (Instance, astroid.Class)):
|
|
200
|
+
if isinstance(expr, Instance):
|
|
201
|
+
expr = expr._proxied
|
|
202
|
+
if (isinstance(expr, astroid.Class) and
|
|
203
|
+
not inherit_from_std_ex(expr) and
|
|
204
|
+
expr.root().name != BUILTINS_NAME):
|
|
205
|
+
if expr.newstyle:
|
|
206
|
+
self.add_message('raising-non-exception', node=node)
|
|
207
|
+
else:
|
|
208
|
+
self.add_message('nonstandard-exception', node=node)
|
|
209
|
+
else:
|
|
210
|
+
value_found = False
|
|
211
|
+
else:
|
|
212
|
+
value_found = False
|
|
213
|
+
return value_found
|
|
214
|
+
|
|
215
|
+
@check_messages('unpacking-in-except')
|
|
216
|
+
def visit_excepthandler(self, node):
|
|
217
|
+
"""Visit an except handler block and check for exception unpacking."""
|
|
218
|
+
if isinstance(node.name, (astroid.Tuple, astroid.List)):
|
|
219
|
+
self.add_message('unpacking-in-except', node=node)
|
|
220
|
+
|
|
221
|
+
@check_messages('indexing-exception')
|
|
222
|
+
def visit_subscript(self, node):
|
|
223
|
+
""" Look for indexing exceptions. """
|
|
224
|
+
try:
|
|
225
|
+
for infered in node.value.infer():
|
|
226
|
+
if not isinstance(infered, astroid.Instance):
|
|
227
|
+
continue
|
|
228
|
+
if inherit_from_std_ex(infered):
|
|
229
|
+
self.add_message('indexing-exception', node=node)
|
|
230
|
+
except astroid.InferenceError:
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
@check_messages('bare-except', 'broad-except', 'pointless-except',
|
|
234
|
+
'binary-op-exception', 'bad-except-order',
|
|
235
|
+
'catching-non-exception')
|
|
236
|
+
def visit_tryexcept(self, node):
|
|
237
|
+
"""check for empty except"""
|
|
238
|
+
exceptions_classes = []
|
|
239
|
+
nb_handlers = len(node.handlers)
|
|
240
|
+
for index, handler in enumerate(node.handlers):
|
|
241
|
+
# single except doing nothing but "pass" without else clause
|
|
242
|
+
if nb_handlers == 1 and is_empty(handler.body) and not node.orelse:
|
|
243
|
+
self.add_message('pointless-except', node=handler.type or handler.body[0])
|
|
244
|
+
if handler.type is None:
|
|
245
|
+
if nb_handlers == 1 and not is_raising(handler.body):
|
|
246
|
+
self.add_message('bare-except', node=handler)
|
|
247
|
+
# check if a "except:" is followed by some other
|
|
248
|
+
# except
|
|
249
|
+
elif index < (nb_handlers - 1):
|
|
250
|
+
msg = 'empty except clause should always appear last'
|
|
251
|
+
self.add_message('bad-except-order', node=node, args=msg)
|
|
252
|
+
|
|
253
|
+
elif isinstance(handler.type, astroid.BoolOp):
|
|
254
|
+
self.add_message('binary-op-exception', node=handler, args=handler.type.op)
|
|
255
|
+
else:
|
|
256
|
+
try:
|
|
257
|
+
excs = list(unpack_infer(handler.type))
|
|
258
|
+
except astroid.InferenceError:
|
|
259
|
+
continue
|
|
260
|
+
for exc in excs:
|
|
261
|
+
# XXX skip other non class nodes
|
|
262
|
+
if exc is YES or not isinstance(exc, astroid.Class):
|
|
263
|
+
continue
|
|
264
|
+
exc_ancestors = [anc for anc in exc.ancestors()
|
|
265
|
+
if isinstance(anc, astroid.Class)]
|
|
266
|
+
for previous_exc in exceptions_classes:
|
|
267
|
+
if previous_exc in exc_ancestors:
|
|
268
|
+
msg = '%s is an ancestor class of %s' % (
|
|
269
|
+
previous_exc.name, exc.name)
|
|
270
|
+
self.add_message('bad-except-order', node=handler.type, args=msg)
|
|
271
|
+
if (exc.name in self.config.overgeneral_exceptions
|
|
272
|
+
and exc.root().name == EXCEPTIONS_MODULE
|
|
273
|
+
and nb_handlers == 1 and not is_raising(handler.body)):
|
|
274
|
+
self.add_message('broad-except', args=exc.name, node=handler.type)
|
|
275
|
+
|
|
276
|
+
if (not inherit_from_std_ex(exc) and
|
|
277
|
+
exc.root().name != BUILTINS_NAME):
|
|
278
|
+
# try to see if the exception is based on a C based
|
|
279
|
+
# exception, by infering all the base classes and
|
|
280
|
+
# looking for inference errors
|
|
281
|
+
bases = infer_bases(exc)
|
|
282
|
+
fully_infered = all(inferit is not YES
|
|
283
|
+
for inferit in bases)
|
|
284
|
+
if fully_infered:
|
|
285
|
+
self.add_message('catching-non-exception',
|
|
286
|
+
node=handler.type,
|
|
287
|
+
args=(exc.name, ))
|
|
288
|
+
|
|
289
|
+
exceptions_classes += excs
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def inherit_from_std_ex(node):
|
|
293
|
+
"""return true if the given class node is subclass of
|
|
294
|
+
exceptions.Exception
|
|
295
|
+
"""
|
|
296
|
+
if node.name in ('Exception', 'BaseException') \
|
|
297
|
+
and node.root().name == EXCEPTIONS_MODULE:
|
|
298
|
+
return True
|
|
299
|
+
for parent in node.ancestors(recurs=False):
|
|
300
|
+
if inherit_from_std_ex(parent):
|
|
301
|
+
return True
|
|
302
|
+
return False
|
|
303
|
+
|
|
304
|
+
def register(linter):
|
|
305
|
+
"""required method to auto register this checker"""
|
|
306
|
+
linter.register_checker(ExceptionsChecker(linter))
|