libv8 6.7.288.46.1 → 7.3.492.27.0beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (408) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +4 -0
  4. data/README.md +2 -0
  5. data/ext/libv8/builder.rb +6 -2
  6. data/lib/libv8/version.rb +1 -1
  7. data/vendor/depot_tools/.gitattributes +1 -0
  8. data/vendor/depot_tools/.gitignore +7 -0
  9. data/vendor/depot_tools/CROS_OWNERS +5 -0
  10. data/vendor/depot_tools/OWNERS +12 -1
  11. data/vendor/depot_tools/PRESUBMIT.py +16 -9
  12. data/vendor/depot_tools/README.md +9 -2
  13. data/vendor/depot_tools/autoninja +14 -6
  14. data/vendor/depot_tools/autoninja.bat +11 -1
  15. data/vendor/depot_tools/autoninja.py +40 -18
  16. data/vendor/depot_tools/bb +12 -0
  17. data/vendor/depot_tools/bb.bat +7 -0
  18. data/vendor/depot_tools/bootstrap/win/manifest.txt +1 -1
  19. data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +1 -1
  20. data/vendor/depot_tools/bootstrap/win/win_tools.py +2 -1
  21. data/vendor/depot_tools/buildbucket.py +57 -4
  22. data/vendor/depot_tools/cipd +157 -44
  23. data/vendor/depot_tools/cipd.bat +51 -14
  24. data/vendor/depot_tools/cipd.ps1 +104 -42
  25. data/vendor/depot_tools/cipd_client_version +1 -1
  26. data/vendor/depot_tools/cipd_client_version.digests +21 -0
  27. data/vendor/depot_tools/cipd_manifest.txt +19 -6
  28. data/vendor/depot_tools/cipd_manifest.versions +318 -0
  29. data/vendor/depot_tools/clang_format.py +4 -4
  30. data/vendor/depot_tools/cpplint.py +44 -199
  31. data/vendor/depot_tools/dart_format.py +2 -2
  32. data/vendor/depot_tools/detect_host_arch.py +8 -3
  33. data/vendor/depot_tools/download_from_google_storage.py +47 -39
  34. data/vendor/depot_tools/fetch.py +30 -18
  35. data/vendor/depot_tools/fetch_configs/android_internal.py +34 -0
  36. data/vendor/depot_tools/fetch_configs/chromium.py +18 -1
  37. data/vendor/depot_tools/fetch_configs/config_util.py +4 -2
  38. data/vendor/depot_tools/fetch_configs/inspector_protocol.py +40 -0
  39. data/vendor/depot_tools/fetch_configs/node-ci.py +41 -0
  40. data/vendor/depot_tools/fix_encoding.py +3 -3
  41. data/vendor/depot_tools/gclient +1 -1
  42. data/vendor/depot_tools/gclient.py +415 -198
  43. data/vendor/depot_tools/gclient_eval.py +220 -171
  44. data/vendor/depot_tools/gclient_paths.py +142 -0
  45. data/vendor/depot_tools/gclient_scm.py +200 -51
  46. data/vendor/depot_tools/gclient_utils.py +88 -191
  47. data/vendor/depot_tools/gerrit_client.py +13 -0
  48. data/vendor/depot_tools/gerrit_util.py +158 -23
  49. data/vendor/depot_tools/git-nav-upstream +1 -1
  50. data/vendor/depot_tools/git_cache.py +77 -24
  51. data/vendor/depot_tools/git_cl.py +705 -1099
  52. data/vendor/depot_tools/git_common.py +9 -6
  53. data/vendor/depot_tools/git_map_branches.py +19 -2
  54. data/vendor/depot_tools/git_nav_downstream.py +3 -4
  55. data/vendor/depot_tools/git_rebase_update.py +14 -0
  56. data/vendor/depot_tools/git_reparent_branch.py +8 -2
  57. data/vendor/depot_tools/gn.py +38 -3
  58. data/vendor/depot_tools/gsutil.py +8 -3
  59. data/vendor/depot_tools/gsutil.py.bat +15 -0
  60. data/vendor/depot_tools/gsutil.vpython +16 -0
  61. data/vendor/depot_tools/infra/config/OWNERS +0 -1
  62. data/vendor/depot_tools/infra/config/recipes.cfg +3 -2
  63. data/vendor/depot_tools/lucicfg +12 -0
  64. data/vendor/depot_tools/lucicfg.bat +7 -0
  65. data/vendor/depot_tools/man/html/git-map-branches.html +34 -2
  66. data/vendor/depot_tools/man/html/git-new-branch.html +40 -32
  67. data/vendor/depot_tools/man/man1/git-map-branches.1 +24 -5
  68. data/vendor/depot_tools/man/man1/git-new-branch.1 +35 -27
  69. data/vendor/depot_tools/man/src/git-map-branches.demo.1.sh +1 -0
  70. data/vendor/depot_tools/man/src/git-map-branches.txt +10 -0
  71. data/vendor/depot_tools/man/src/git-new-branch.demo.1.sh +9 -4
  72. data/vendor/depot_tools/man/src/git-new-branch.txt +1 -1
  73. data/vendor/depot_tools/metrics.README.md +98 -0
  74. data/vendor/depot_tools/metrics.py +296 -0
  75. data/vendor/depot_tools/metrics_utils.py +303 -0
  76. data/vendor/depot_tools/my_activity.py +91 -29
  77. data/vendor/depot_tools/ninja +1 -1
  78. data/vendor/depot_tools/ninjalog.README.md +64 -0
  79. data/vendor/depot_tools/ninjalog_uploader.py +232 -0
  80. data/vendor/depot_tools/ninjalog_uploader_wrapper.py +116 -0
  81. data/vendor/depot_tools/owners.py +30 -13
  82. data/vendor/depot_tools/owners_finder.py +5 -2
  83. data/vendor/depot_tools/presubmit_canned_checks.py +188 -29
  84. data/vendor/depot_tools/presubmit_support.py +18 -41
  85. data/vendor/depot_tools/pylintrc +23 -19
  86. data/vendor/depot_tools/recipes/OWNERS +2 -0
  87. data/vendor/depot_tools/recipes/README.recipes.md +344 -151
  88. data/vendor/depot_tools/recipes/recipe_modules/bot_update/OWNERS +2 -0
  89. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +2 -16
  90. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +141 -99
  91. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +5 -8
  92. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +5 -8
  93. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +6 -98
  94. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +4 -9
  95. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +45 -5
  96. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +4 -9
  97. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +4 -9
  98. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{tryjob.json → input_commit_with_id_without_repo.json} +6 -11
  99. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{tryjob_empty_revision.json → multiple_patch_refs.json} +8 -9
  100. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +19 -29
  101. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{trychange.json → refs.json} +4 -9
  102. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +4 -9
  103. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +51 -6
  104. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +50 -6
  105. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +51 -6
  106. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +17 -25
  107. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +17 -25
  108. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +18 -26
  109. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +18 -26
  110. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +26 -28
  111. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +45 -5
  112. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +17 -25
  113. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +13 -0
  114. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_manifest_name.json +13 -152
  115. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +4 -9
  116. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +185 -202
  117. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +52 -157
  118. data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +5 -14
  119. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +34 -0
  120. data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +14 -2
  121. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +4 -5
  122. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +4 -5
  123. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +7 -5
  124. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +4 -5
  125. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +4 -5
  126. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +9 -3
  127. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +9 -3
  128. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +9 -3
  129. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +4 -5
  130. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +2 -3
  131. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +2 -3
  132. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +2 -3
  133. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +2 -3
  134. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +2 -3
  135. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +2 -3
  136. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +2 -3
  137. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +2 -3
  138. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +2 -3
  139. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +2 -3
  140. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +13 -8
  141. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +18 -12
  142. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +18 -12
  143. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +18 -12
  144. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +3 -0
  145. data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +1 -0
  146. data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +58 -46
  147. data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +65 -22
  148. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +20 -21
  149. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +20 -21
  150. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +20 -21
  151. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +20 -21
  152. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +5 -2
  153. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +62 -14
  154. data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +24 -38
  155. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +56 -50
  156. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.py +15 -9
  157. data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +4 -1
  158. data/vendor/depot_tools/recipes/recipe_modules/git/api.py +34 -22
  159. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +5 -6
  160. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +5 -6
  161. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +5 -6
  162. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +5 -6
  163. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +222 -0
  164. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +5 -6
  165. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +5 -6
  166. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +224 -0
  167. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +10 -6
  168. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +5 -7
  169. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +5 -6
  170. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +5 -6
  171. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +5 -7
  172. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +5 -6
  173. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +10 -5
  174. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +5 -6
  175. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +8 -9
  176. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +5 -6
  177. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +12 -8
  178. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +5 -6
  179. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +5 -6
  180. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +27 -11
  181. data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +1 -1
  182. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +12 -13
  183. data/vendor/depot_tools/recipes/recipe_modules/gitiles/__init__.py +5 -0
  184. data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +120 -5
  185. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +45 -3
  186. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.py +25 -0
  187. data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +56 -4
  188. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +6 -0
  189. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.py +49 -0
  190. data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +24 -13
  191. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +13 -14
  192. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +2 -3
  193. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +2 -3
  194. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +2 -3
  195. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +2 -3
  196. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +2 -3
  197. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +2 -3
  198. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +2 -3
  199. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +2 -3
  200. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +2 -3
  201. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +2 -3
  202. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +1 -2
  203. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +35 -0
  204. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +116 -0
  205. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +22 -0
  206. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +82 -0
  207. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +22 -0
  208. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +23 -0
  209. data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +1 -0
  210. data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +2 -7
  211. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +7 -6
  212. data/vendor/depot_tools/recipes/recipe_modules/tryserver/__init__.py +1 -0
  213. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +117 -8
  214. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +4 -5
  215. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +7 -4
  216. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +98 -7
  217. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +147 -0
  218. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +8 -5
  219. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +8 -5
  220. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +9 -6
  221. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +9 -6
  222. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +27 -2
  223. data/vendor/depot_tools/recipes/recipe_modules/tryserver/test_api.py +14 -0
  224. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/__init__.py +25 -0
  225. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/api.py +137 -0
  226. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +22 -0
  227. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +22 -0
  228. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +107 -0
  229. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +26 -0
  230. data/vendor/depot_tools/recipes/recipes.py +37 -27
  231. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +7 -10
  232. data/vendor/depot_tools/repo +34 -8
  233. data/vendor/depot_tools/roll_dep.py +52 -49
  234. data/vendor/depot_tools/scm.py +38 -23
  235. data/vendor/depot_tools/setup_color.py +4 -2
  236. data/vendor/depot_tools/split_cl.py +32 -4
  237. data/vendor/depot_tools/subprocess2.py +22 -4
  238. data/vendor/depot_tools/third_party/httplib2/README.chromium +2 -2
  239. data/vendor/depot_tools/third_party/httplib2/__init__.py +242 -158
  240. data/vendor/depot_tools/third_party/httplib2/cacerts.txt +57 -44
  241. data/vendor/depot_tools/third_party/httplib2/socks.py +15 -5
  242. data/vendor/depot_tools/third_party/logilab/README.chromium +2 -4
  243. data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +2 -1
  244. data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +10 -5
  245. data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +5 -5
  246. data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +233 -0
  247. data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +82 -33
  248. data/vendor/depot_tools/third_party/logilab/astroid/bases.py +137 -153
  249. data/vendor/depot_tools/third_party/logilab/astroid/brain/{builtin_inference.py → brain_builtin_inference.py} +117 -26
  250. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +15 -0
  251. data/vendor/depot_tools/third_party/logilab/astroid/brain/{py2gi.py → brain_gi.py} +48 -8
  252. data/vendor/depot_tools/third_party/logilab/astroid/brain/{py2mechanize.py → brain_mechanize.py} +0 -0
  253. data/vendor/depot_tools/third_party/logilab/astroid/brain/{pynose.py → brain_nose.py} +4 -1
  254. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +62 -0
  255. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +76 -0
  256. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +44 -0
  257. data/vendor/depot_tools/third_party/logilab/astroid/brain/{pysix_moves.py → brain_six.py} +28 -1
  258. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +65 -0
  259. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +473 -0
  260. data/vendor/depot_tools/third_party/logilab/astroid/builder.py +104 -81
  261. data/vendor/depot_tools/third_party/logilab/astroid/context.py +81 -0
  262. data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +75 -0
  263. data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +20 -0
  264. data/vendor/depot_tools/third_party/logilab/astroid/inference.py +137 -183
  265. data/vendor/depot_tools/third_party/logilab/astroid/manager.py +45 -169
  266. data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +37 -14
  267. data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +112 -41
  268. data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +243 -156
  269. data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +35 -22
  270. data/vendor/depot_tools/third_party/logilab/astroid/objects.py +186 -0
  271. data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +157 -102
  272. data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +32 -8
  273. data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +372 -309
  274. data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +652 -420
  275. data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +4 -21
  276. data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +96 -0
  277. data/vendor/depot_tools/third_party/logilab/astroid/util.py +89 -0
  278. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +19 -0
  279. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +11 -0
  280. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +20 -0
  281. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +1421 -0
  282. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +9 -0
  283. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +246 -0
  284. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +414 -0
  285. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +13 -0
  286. data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +24 -0
  287. data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +11 -0
  288. data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +19 -0
  289. data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +2729 -0
  290. data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +96 -0
  291. data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +512 -0
  292. data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +228 -0
  293. data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +901 -0
  294. data/vendor/depot_tools/third_party/pylint/README.chromium +2 -25
  295. data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +13 -3
  296. data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +1 -2
  297. data/vendor/depot_tools/third_party/pylint/checkers/async.py +82 -0
  298. data/vendor/depot_tools/third_party/pylint/checkers/base.py +893 -119
  299. data/vendor/depot_tools/third_party/pylint/checkers/classes.py +342 -204
  300. data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +51 -34
  301. data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +84 -47
  302. data/vendor/depot_tools/third_party/pylint/checkers/format.py +55 -30
  303. data/vendor/depot_tools/third_party/pylint/checkers/imports.py +314 -73
  304. data/vendor/depot_tools/third_party/pylint/checkers/logging.py +10 -8
  305. data/vendor/depot_tools/third_party/pylint/checkers/misc.py +2 -1
  306. data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +45 -48
  307. data/vendor/depot_tools/third_party/pylint/checkers/python3.py +31 -21
  308. data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +3 -3
  309. data/vendor/depot_tools/third_party/pylint/checkers/similar.py +4 -5
  310. data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +24 -10
  311. data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +120 -56
  312. data/vendor/depot_tools/third_party/pylint/checkers/strings.py +38 -35
  313. data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +485 -138
  314. data/vendor/depot_tools/third_party/pylint/checkers/utils.py +319 -142
  315. data/vendor/depot_tools/third_party/pylint/checkers/variables.py +329 -207
  316. data/vendor/depot_tools/third_party/pylint/config.py +739 -76
  317. data/vendor/depot_tools/third_party/pylint/epylint.py +9 -5
  318. data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
  319. data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +311 -0
  320. data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +62 -0
  321. data/vendor/depot_tools/third_party/{logilab/common → pylint}/graph.py +30 -133
  322. data/vendor/depot_tools/third_party/pylint/gui.py +2 -2
  323. data/vendor/depot_tools/third_party/pylint/interfaces.py +21 -3
  324. data/vendor/depot_tools/third_party/pylint/lint.py +123 -140
  325. data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +10 -13
  326. data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +15 -4
  327. data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +372 -0
  328. data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +30 -7
  329. data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +80 -2
  330. data/vendor/depot_tools/third_party/{logilab/common → pylint/pyreverse}/vcgutils.py +19 -37
  331. data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +3 -4
  332. data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +34 -18
  333. data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +1 -1
  334. data/vendor/depot_tools/third_party/pylint/reporters/html.py +10 -3
  335. data/vendor/depot_tools/third_party/pylint/reporters/json.py +10 -4
  336. data/vendor/depot_tools/third_party/pylint/reporters/text.py +94 -3
  337. data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +106 -0
  338. data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/html_writer.py +17 -57
  339. data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/nodes.py +52 -74
  340. data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/text_writer.py +14 -60
  341. data/vendor/depot_tools/third_party/pylint/testutils.py +22 -20
  342. data/vendor/depot_tools/third_party/pylint/utils.py +268 -44
  343. data/vendor/depot_tools/third_party/repo/progress.py +42 -0
  344. data/vendor/depot_tools/update_depot_tools +1 -1
  345. data/vendor/depot_tools/upload_metrics.py +25 -0
  346. data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +45 -15
  347. data/vendor/depot_tools/win_toolchain/package_from_installed.py +71 -24
  348. data/vendor/depot_tools/yapf +1 -1
  349. data/vendor/depot_tools/yapf.bat +1 -1
  350. metadata +92 -77
  351. data/vendor/depot_tools/git-crsync +0 -3
  352. data/vendor/depot_tools/infra/config/cq.cfg +0 -32
  353. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/apply_gerrit_ref.json +0 -29
  354. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/apply_gerrit_ref_custom.json +0 -29
  355. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/buildbot.json +0 -105
  356. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/shallow.json +0 -195
  357. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle_deprecated.json +0 -248
  358. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8.json +0 -248
  359. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_manifest_name_no_patch.json +0 -105
  360. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/apply_gerrit.py +0 -33
  361. data/vendor/depot_tools/third_party/logilab/astroid/brain/py2pytest.py +0 -31
  362. data/vendor/depot_tools/third_party/logilab/astroid/brain/py2qt4.py +0 -22
  363. data/vendor/depot_tools/third_party/logilab/astroid/brain/py2stdlib.py +0 -334
  364. data/vendor/depot_tools/third_party/logilab/astroid/inspector.py +0 -273
  365. data/vendor/depot_tools/third_party/logilab/astroid/utils.py +0 -239
  366. data/vendor/depot_tools/third_party/logilab/common/LICENSE.txt +0 -339
  367. data/vendor/depot_tools/third_party/logilab/common/README.chromium +0 -11
  368. data/vendor/depot_tools/third_party/logilab/common/__init__.py +0 -175
  369. data/vendor/depot_tools/third_party/logilab/common/__pkginfo__.py +0 -57
  370. data/vendor/depot_tools/third_party/logilab/common/cache.py +0 -114
  371. data/vendor/depot_tools/third_party/logilab/common/changelog.py +0 -238
  372. data/vendor/depot_tools/third_party/logilab/common/clcommands.py +0 -334
  373. data/vendor/depot_tools/third_party/logilab/common/cli.py +0 -211
  374. data/vendor/depot_tools/third_party/logilab/common/compat.py +0 -78
  375. data/vendor/depot_tools/third_party/logilab/common/configuration.py +0 -1105
  376. data/vendor/depot_tools/third_party/logilab/common/contexts.py +0 -5
  377. data/vendor/depot_tools/third_party/logilab/common/corbautils.py +0 -117
  378. data/vendor/depot_tools/third_party/logilab/common/daemon.py +0 -101
  379. data/vendor/depot_tools/third_party/logilab/common/date.py +0 -335
  380. data/vendor/depot_tools/third_party/logilab/common/dbf.py +0 -231
  381. data/vendor/depot_tools/third_party/logilab/common/debugger.py +0 -214
  382. data/vendor/depot_tools/third_party/logilab/common/decorators.py +0 -281
  383. data/vendor/depot_tools/third_party/logilab/common/deprecation.py +0 -189
  384. data/vendor/depot_tools/third_party/logilab/common/fileutils.py +0 -404
  385. data/vendor/depot_tools/third_party/logilab/common/interface.py +0 -71
  386. data/vendor/depot_tools/third_party/logilab/common/logging_ext.py +0 -195
  387. data/vendor/depot_tools/third_party/logilab/common/modutils.py +0 -702
  388. data/vendor/depot_tools/third_party/logilab/common/optik_ext.py +0 -392
  389. data/vendor/depot_tools/third_party/logilab/common/optparser.py +0 -92
  390. data/vendor/depot_tools/third_party/logilab/common/proc.py +0 -277
  391. data/vendor/depot_tools/third_party/logilab/common/pyro_ext.py +0 -180
  392. data/vendor/depot_tools/third_party/logilab/common/pytest.py +0 -1199
  393. data/vendor/depot_tools/third_party/logilab/common/registry.py +0 -1119
  394. data/vendor/depot_tools/third_party/logilab/common/shellutils.py +0 -462
  395. data/vendor/depot_tools/third_party/logilab/common/sphinx_ext.py +0 -87
  396. data/vendor/depot_tools/third_party/logilab/common/sphinxutils.py +0 -122
  397. data/vendor/depot_tools/third_party/logilab/common/table.py +0 -929
  398. data/vendor/depot_tools/third_party/logilab/common/tasksqueue.py +0 -101
  399. data/vendor/depot_tools/third_party/logilab/common/testlib.py +0 -1392
  400. data/vendor/depot_tools/third_party/logilab/common/textutils.py +0 -537
  401. data/vendor/depot_tools/third_party/logilab/common/tree.py +0 -369
  402. data/vendor/depot_tools/third_party/logilab/common/umessage.py +0 -194
  403. data/vendor/depot_tools/third_party/logilab/common/ureports/__init__.py +0 -172
  404. data/vendor/depot_tools/third_party/logilab/common/ureports/docbook_writer.py +0 -140
  405. data/vendor/depot_tools/third_party/logilab/common/urllib2ext.py +0 -89
  406. data/vendor/depot_tools/third_party/logilab/common/visitor.py +0 -109
  407. data/vendor/depot_tools/third_party/logilab/common/xmlrpcutils.py +0 -131
  408. data/vendor/depot_tools/third_party/logilab/common/xmlutils.py +0 -61
@@ -60,7 +60,9 @@ _IGNORE = 2
60
60
  # Whitespace checking config constants
61
61
  _DICT_SEPARATOR = 'dict-separator'
62
62
  _TRAILING_COMMA = 'trailing-comma'
63
- _NO_SPACE_CHECK_CHOICES = [_TRAILING_COMMA, _DICT_SEPARATOR]
63
+ _EMPTY_LINE = 'empty-line'
64
+ _NO_SPACE_CHECK_CHOICES = [_TRAILING_COMMA, _DICT_SEPARATOR, _EMPTY_LINE]
65
+ _DEFAULT_NO_SPACE_CHECK_CHOICES = [_TRAILING_COMMA, _DICT_SEPARATOR]
64
66
 
65
67
  MSGS = {
66
68
  'C0301': ('Line too long (%s/%s)',
@@ -81,7 +83,7 @@ MSGS = {
81
83
  'bad-indentation',
82
84
  'Used when an unexpected number of indentation\'s tabulations or '
83
85
  'spaces has been found.'),
84
- 'C0330': ('Wrong %s indentation%s.\n%s%s',
86
+ 'C0330': ('Wrong %s indentation%s%s.\n%s%s',
85
87
  'bad-continuation',
86
88
  'TODO'),
87
89
  'W0312': ('Found indentation with %ss instead of %ss',
@@ -124,8 +126,11 @@ MSGS = {
124
126
  def _underline_token(token):
125
127
  length = token[3][1] - token[2][1]
126
128
  offset = token[2][1]
127
- return token[4] + (' ' * offset) + ('^' * length)
128
-
129
+ referenced_line = token[4]
130
+ # If the referenced line does not end with a newline char, fix it
131
+ if referenced_line[-1] != '\n':
132
+ referenced_line += '\n'
133
+ return referenced_line + (' ' * offset) + ('^' * length)
129
134
 
130
135
  def _column_distance(token1, token2):
131
136
  if token1 == token2:
@@ -165,14 +170,22 @@ def _get_indent_length(line):
165
170
  def _get_indent_hint_line(bar_positions, bad_position):
166
171
  """Return a line with |s for each of the positions in the given lists."""
167
172
  if not bar_positions:
168
- return ''
173
+ return ('', '')
174
+ delta_message = ''
169
175
  markers = [(pos, '|') for pos in bar_positions]
176
+ if len(markers) == 1:
177
+ # if we have only one marker we'll provide an extra hint on how to fix
178
+ expected_position = markers[0][0]
179
+ delta = abs(expected_position - bad_position)
180
+ direction = 'add' if expected_position > bad_position else 'remove'
181
+ delta_message = _CONTINUATION_HINT_MESSAGE % (
182
+ direction, delta, 's' if delta > 1 else '')
170
183
  markers.append((bad_position, '^'))
171
184
  markers.sort()
172
185
  line = [' '] * (markers[-1][0] + 1)
173
186
  for position, marker in markers:
174
187
  line[position] = marker
175
- return ''.join(line)
188
+ return (''.join(line), delta_message)
176
189
 
177
190
 
178
191
  class _ContinuedIndent(object):
@@ -218,6 +231,7 @@ _CONTINUATION_MSG_PARTS = {
218
231
  CONTINUED_BLOCK: ('continued', ' before block'),
219
232
  }
220
233
 
234
+ _CONTINUATION_HINT_MESSAGE = ' (%s %d space%s)' # Ex: (remove 2 spaces)
221
235
 
222
236
  def _Offsets(*args):
223
237
  """Valid indentation offsets for a continued line."""
@@ -423,11 +437,17 @@ class FormatChecker(BaseTokenChecker):
423
437
  'help' : ('Allow the body of an if to be on the same '
424
438
  'line as the test if there is no else.')}),
425
439
  ('no-space-check',
426
- {'default': ','.join(_NO_SPACE_CHECK_CHOICES),
440
+ {'default': ','.join(_DEFAULT_NO_SPACE_CHECK_CHOICES),
441
+ 'metavar': ','.join(_NO_SPACE_CHECK_CHOICES),
427
442
  'type': 'multiple_choice',
428
443
  'choices': _NO_SPACE_CHECK_CHOICES,
429
444
  'help': ('List of optional constructs for which whitespace '
430
- 'checking is disabled')}),
445
+ 'checking is disabled. '
446
+ '`'+ _DICT_SEPARATOR + '` is used to allow tabulation '
447
+ 'in dicts, etc.: {1 : 1,\\n222: 2}. '
448
+ '`'+ _TRAILING_COMMA + '` allows a space between comma '
449
+ 'and closing bracket: (a, ). '
450
+ '`'+ _EMPTY_LINE + '` allows space-only lines.')}),
431
451
  ('max-module-lines',
432
452
  {'default' : 1000, 'type' : 'int', 'metavar' : '<int>',
433
453
  'help': 'Maximum number of lines in a module'}
@@ -510,27 +530,28 @@ class FormatChecker(BaseTokenChecker):
510
530
  depth += 1
511
531
  elif token[1] == ')':
512
532
  depth -= 1
513
- if not depth:
514
- # ')' can't happen after if (foo), since it would be a syntax error.
515
- if (tokens[i+1][1] in (':', ')', ']', '}', 'in') or
516
- tokens[i+1][0] in (tokenize.NEWLINE,
517
- tokenize.ENDMARKER,
518
- tokenize.COMMENT)):
519
- # The empty tuple () is always accepted.
520
- if i == start + 2:
521
- return
522
- if keyword_token == 'not':
523
- if not found_and_or:
524
- self.add_message('superfluous-parens', line=line_num,
525
- args=keyword_token)
526
- elif keyword_token in ('return', 'yield'):
533
+ if depth:
534
+ continue
535
+ # ')' can't happen after if (foo), since it would be a syntax error.
536
+ if (tokens[i+1][1] in (':', ')', ']', '}', 'in') or
537
+ tokens[i+1][0] in (tokenize.NEWLINE,
538
+ tokenize.ENDMARKER,
539
+ tokenize.COMMENT)):
540
+ # The empty tuple () is always accepted.
541
+ if i == start + 2:
542
+ return
543
+ if keyword_token == 'not':
544
+ if not found_and_or:
527
545
  self.add_message('superfluous-parens', line=line_num,
528
546
  args=keyword_token)
529
- elif keyword_token not in self._keywords_with_parens:
530
- if not (tokens[i+1][1] == 'in' and found_and_or):
531
- self.add_message('superfluous-parens', line=line_num,
532
- args=keyword_token)
533
- return
547
+ elif keyword_token in ('return', 'yield'):
548
+ self.add_message('superfluous-parens', line=line_num,
549
+ args=keyword_token)
550
+ elif keyword_token not in self._keywords_with_parens:
551
+ if not (tokens[i+1][1] == 'in' and found_and_or):
552
+ self.add_message('superfluous-parens', line=line_num,
553
+ args=keyword_token)
554
+ return
534
555
  elif depth == 1:
535
556
  # This is a tuple, which is always acceptable.
536
557
  if token[1] == ',':
@@ -846,11 +867,12 @@ class FormatChecker(BaseTokenChecker):
846
867
 
847
868
  def _add_continuation_message(self, state, offsets, tokens, position):
848
869
  readable_type, readable_position = _CONTINUATION_MSG_PARTS[state.context_type]
849
- hint_line = _get_indent_hint_line(offsets, tokens.start_col(position))
870
+ hint_line, delta_message = _get_indent_hint_line(offsets, tokens.start_col(position))
850
871
  self.add_message(
851
872
  'bad-continuation',
852
873
  line=tokens.start_line(position),
853
- args=(readable_type, readable_position, tokens.line(position), hint_line))
874
+ args=(readable_type, readable_position, delta_message,
875
+ tokens.line(position), hint_line))
854
876
 
855
877
  @check_messages('multiple-statements')
856
878
  def visit_default(self, node):
@@ -920,7 +942,10 @@ class FormatChecker(BaseTokenChecker):
920
942
  self.add_message('missing-final-newline', line=i)
921
943
  else:
922
944
  stripped_line = line.rstrip()
923
- if line[len(stripped_line):] not in ('\n', '\r\n'):
945
+ if not stripped_line and _EMPTY_LINE in self.config.no_space_check:
946
+ # allow empty lines
947
+ pass
948
+ elif line[len(stripped_line):] not in ('\n', '\r\n'):
924
949
  self.add_message('trailing-whitespace', line=i)
925
950
  # Don't count excess whitespace in the line length.
926
951
  line = stripped_line
@@ -15,34 +15,56 @@
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
16
  """imports checkers for Python code"""
17
17
 
18
+ import collections
19
+ from distutils import sysconfig
20
+ import os
18
21
  import sys
19
- from collections import defaultdict
20
22
 
21
23
  import six
22
- from six.moves import map # pylint: disable=redefined-builtin
23
-
24
- from logilab.common.graph import get_cycles, DotBackend
25
- from logilab.common.ureports import VerbatimText, Paragraph
26
24
 
27
25
  import astroid
28
26
  from astroid import are_exclusive
29
- from astroid.modutils import get_module_part, is_standard_module
27
+ from astroid.modutils import (get_module_part, is_standard_module,
28
+ file_from_modpath)
30
29
 
31
30
  from pylint.interfaces import IAstroidChecker
32
- from pylint.utils import EmptyReport
31
+ from pylint.utils import EmptyReport, get_global_option
33
32
  from pylint.checkers import BaseChecker
34
- from pylint.checkers.utils import check_messages, is_import_error
33
+ from pylint.checkers.utils import check_messages, node_ignores_exception
34
+ from pylint.graph import get_cycles, DotBackend
35
+ from pylint.reporters.ureports.nodes import VerbatimText, Paragraph
36
+
37
+
38
+ def _qualified_names(modname):
39
+ """Split the names of the given module into subparts
35
40
 
36
- def _except_import_error(node):
41
+ For example,
42
+ _qualified_names('pylint.checkers.ImportsChecker')
43
+ returns
44
+ ['pylint', 'pylint.checkers', 'pylint.checkers.ImportsChecker']
37
45
  """
38
- Check if the try-except node has an ImportError handler.
39
- Return True if an ImportError handler was infered, False otherwise.
46
+ names = modname.split('.')
47
+ return ['.'.join(names[0:i+1]) for i in range(len(names))]
48
+
49
+
50
+ def _get_import_name(importnode, modname):
51
+ """Get a prepared module name from the given import node
52
+
53
+ In the case of relative imports, this will return the
54
+ absolute qualified module name, which might be useful
55
+ for debugging. Otherwise, the initial module name
56
+ is returned unchanged.
40
57
  """
41
- if not isinstance(node, astroid.TryExcept):
42
- return
43
- return any(map(is_import_error, node.handlers))
58
+ if isinstance(importnode, astroid.ImportFrom):
59
+ if importnode.level:
60
+ root = importnode.root()
61
+ if isinstance(root, astroid.Module):
62
+ modname = root.relative_to_absolute_name(
63
+ modname, level=importnode.level)
64
+ return modname
65
+
44
66
 
45
- def get_first_import(node, context, name, base, level):
67
+ def _get_first_import(node, context, name, base, level):
46
68
  """return the node where [base.]<name> is imported or None if not found
47
69
  """
48
70
  fullname = '%s.%s' % (base, name) if base else name
@@ -58,7 +80,7 @@ def get_first_import(node, context, name, base, level):
58
80
  if any(fullname == iname[0] for iname in first.names):
59
81
  found = True
60
82
  break
61
- elif isinstance(first, astroid.From):
83
+ elif isinstance(first, astroid.ImportFrom):
62
84
  if level == first.level and any(
63
85
  fullname == '%s.%s' % (first.modname, iname[0])
64
86
  for iname in first.names):
@@ -69,7 +91,7 @@ def get_first_import(node, context, name, base, level):
69
91
 
70
92
  # utilities to represents import dependencies as tree and dot graph ###########
71
93
 
72
- def make_tree_defs(mod_files_list):
94
+ def _make_tree_defs(mod_files_list):
73
95
  """get a list of 2-uple (module, list_of_files_which_import_this_module),
74
96
  it will return a dictionary to represent this as a tree
75
97
  """
@@ -81,7 +103,8 @@ def make_tree_defs(mod_files_list):
81
103
  node[1] += files
82
104
  return tree_defs
83
105
 
84
- def repr_tree_defs(data, indent_str=None):
106
+
107
+ def _repr_tree_defs(data, indent_str=None):
85
108
  """return a string which represents imports as a tree"""
86
109
  lines = []
87
110
  nodes = data.items()
@@ -100,11 +123,11 @@ def repr_tree_defs(data, indent_str=None):
100
123
  else:
101
124
  sub_indent_str = '%s| ' % indent_str
102
125
  if sub:
103
- lines.append(repr_tree_defs(sub, sub_indent_str))
126
+ lines.append(_repr_tree_defs(sub, sub_indent_str))
104
127
  return '\n'.join(lines)
105
128
 
106
129
 
107
- def dependencies_graph(filename, dep_info):
130
+ def _dependencies_graph(filename, dep_info):
108
131
  """write dependencies as a dot (graphviz) file
109
132
  """
110
133
  done = {}
@@ -123,11 +146,11 @@ def dependencies_graph(filename, dep_info):
123
146
  printer.generate(filename)
124
147
 
125
148
 
126
- def make_graph(filename, dep_info, sect, gtype):
149
+ def _make_graph(filename, dep_info, sect, gtype):
127
150
  """generate a dependencies graph and add some information about it in the
128
151
  report's section
129
152
  """
130
- dependencies_graph(filename, dep_info)
153
+ _dependencies_graph(filename, dep_info)
131
154
  sect.append(Paragraph('%simports graph has been written to %s'
132
155
  % (gtype, filename)))
133
156
 
@@ -135,9 +158,10 @@ def make_graph(filename, dep_info, sect, gtype):
135
158
  # the import checker itself ###################################################
136
159
 
137
160
  MSGS = {
138
- 'F0401': ('Unable to import %s',
161
+ 'E0401': ('Unable to import %s',
139
162
  'import-error',
140
- 'Used when pylint has been unable to import a module.'),
163
+ 'Used when pylint has been unable to import a module.',
164
+ {'old_names': [('F0401', 'import-error')]}),
141
165
  'R0401': ('Cyclic import (%s)',
142
166
  'cyclic-import',
143
167
  'Used when a cyclic import between two or more modules is \
@@ -164,8 +188,23 @@ MSGS = {
164
188
  'W0410': ('__future__ import is not the first non docstring statement',
165
189
  'misplaced-future',
166
190
  'Python 2.5 and greater require __future__ import to be the \
167
- first non docstring statement in the module.',
168
- {'maxversion': (3, 0)}),
191
+ first non docstring statement in the module.'),
192
+
193
+ 'C0410': ('Multiple imports on one line (%s)',
194
+ 'multiple-imports',
195
+ 'Used when import statement importing multiple modules is '
196
+ 'detected.'),
197
+ 'C0411': ('%s comes before %s',
198
+ 'wrong-import-order',
199
+ 'Used when PEP8 import order is not respected (standard imports '
200
+ 'first, then third-party libraries, then local imports)'),
201
+ 'C0412': ('Imports from package %s are not grouped',
202
+ 'ungrouped-imports',
203
+ 'Used when imports are not grouped by packages'),
204
+ 'C0413': ('Import "%s" should be placed at the top of the '
205
+ 'module',
206
+ 'wrong-import-position',
207
+ 'Used when code and imports are mixed'),
169
208
  }
170
209
 
171
210
  class ImportsChecker(BaseChecker):
@@ -182,10 +221,10 @@ class ImportsChecker(BaseChecker):
182
221
  msgs = MSGS
183
222
  priority = -2
184
223
 
185
- if sys.version_info < (3,):
224
+ if six.PY2:
186
225
  deprecated_modules = ('regsub', 'TERMIOS', 'Bastion', 'rexec')
187
226
  else:
188
- deprecated_modules = ('stringprep', 'optparse')
227
+ deprecated_modules = ('optparse', )
189
228
  options = (('deprecated-modules',
190
229
  {'default' : deprecated_modules,
191
230
  'type' : 'csv',
@@ -220,19 +259,46 @@ given file (report RP0402 must not be disabled)'}
220
259
  BaseChecker.__init__(self, linter)
221
260
  self.stats = None
222
261
  self.import_graph = None
262
+ self._imports_stack = []
263
+ self._first_non_import_node = None
223
264
  self.__int_dep_info = self.__ext_dep_info = None
224
265
  self.reports = (('RP0401', 'External dependencies',
225
- self.report_external_dependencies),
266
+ self._report_external_dependencies),
226
267
  ('RP0402', 'Modules dependencies graph',
227
- self.report_dependencies_graph),
268
+ self._report_dependencies_graph),
228
269
  )
229
270
 
271
+ self._site_packages = self._compute_site_packages()
272
+
273
+ @staticmethod
274
+ def _compute_site_packages():
275
+ def _normalized_path(path):
276
+ return os.path.normcase(os.path.abspath(path))
277
+
278
+ paths = set()
279
+ real_prefix = getattr(sys, 'real_prefix', None)
280
+ for prefix in filter(None, (real_prefix, sys.prefix)):
281
+ path = sysconfig.get_python_lib(prefix=prefix)
282
+ path = _normalized_path(path)
283
+ paths.add(path)
284
+
285
+ # Handle Debian's derivatives /usr/local.
286
+ if os.path.isfile("/etc/debian_version"):
287
+ for prefix in filter(None, (real_prefix, sys.prefix)):
288
+ libpython = os.path.join(prefix, "local", "lib",
289
+ "python" + sysconfig.get_python_version(),
290
+ "dist-packages")
291
+ paths.add(libpython)
292
+ return paths
293
+
230
294
  def open(self):
231
295
  """called before visiting project (i.e set of modules)"""
232
296
  self.linter.add_stats(dependencies={})
233
297
  self.linter.add_stats(cycles=[])
234
298
  self.stats = self.linter.stats
235
- self.import_graph = defaultdict(set)
299
+ self.import_graph = collections.defaultdict(set)
300
+ self._ignored_modules = get_global_option(
301
+ self, 'ignored-modules', default=[])
236
302
 
237
303
  def close(self):
238
304
  """called before visiting project (i.e set of modules)"""
@@ -242,56 +308,211 @@ given file (report RP0402 must not be disabled)'}
242
308
  for cycle in get_cycles(self.import_graph, vertices=vertices):
243
309
  self.add_message('cyclic-import', args=' -> '.join(cycle))
244
310
 
311
+ @check_messages('wrong-import-position', 'multiple-imports',
312
+ 'relative-import', 'reimported')
245
313
  def visit_import(self, node):
246
314
  """triggered when an import statement is seen"""
315
+ self._check_reimport(node)
316
+
247
317
  modnode = node.root()
248
- for name, _ in node.names:
318
+ names = [name for name, _ in node.names]
319
+ if len(names) >= 2:
320
+ self.add_message('multiple-imports', args=', '.join(names), node=node)
321
+
322
+ for name in names:
323
+ self._check_deprecated_module(node, name)
249
324
  importedmodnode = self.get_imported_module(node, name)
325
+ if isinstance(node.scope(), astroid.Module):
326
+ self._check_position(node)
327
+ self._record_import(node, importedmodnode)
328
+
250
329
  if importedmodnode is None:
251
330
  continue
331
+
252
332
  self._check_relative_import(modnode, node, importedmodnode, name)
253
333
  self._add_imported_module(node, importedmodnode.name)
254
- self._check_deprecated_module(node, name)
255
- self._check_reimport(node, name)
256
334
 
257
- # TODO This appears to be the list of all messages of the checker...
258
- # @check_messages('W0410', 'W0401', 'W0403', 'W0402', 'W0404', 'W0406', 'F0401')
259
335
  @check_messages(*(MSGS.keys()))
260
- def visit_from(self, node):
336
+ def visit_importfrom(self, node):
261
337
  """triggered when a from statement is seen"""
262
338
  basename = node.modname
263
- if basename == '__future__':
264
- # check if this is the first non-docstring statement in the module
265
- prev = node.previous_sibling()
266
- if prev:
267
- # consecutive future statements are possible
268
- if not (isinstance(prev, astroid.From)
269
- and prev.modname == '__future__'):
270
- self.add_message('misplaced-future', node=node)
271
- return
272
- for name, _ in node.names:
273
- if name == '*':
274
- self.add_message('wildcard-import', args=basename, node=node)
339
+ self._check_misplaced_future(node)
340
+ self._check_deprecated_module(node, basename)
341
+ self._check_wildcard_imports(node)
342
+ self._check_same_line_imports(node)
343
+ self._check_reimport(node, basename=basename, level=node.level)
344
+
275
345
  modnode = node.root()
276
346
  importedmodnode = self.get_imported_module(node, basename)
347
+ if isinstance(node.scope(), astroid.Module):
348
+ self._check_position(node)
349
+ self._record_import(node, importedmodnode)
277
350
  if importedmodnode is None:
278
351
  return
279
352
  self._check_relative_import(modnode, node, importedmodnode, basename)
280
- self._check_deprecated_module(node, basename)
353
+
281
354
  for name, _ in node.names:
282
355
  if name != '*':
283
356
  self._add_imported_module(node, '%s.%s' % (importedmodnode.name, name))
284
- self._check_reimport(node, name, basename, node.level)
357
+
358
+ @check_messages('wrong-import-order', 'ungrouped-imports',
359
+ 'wrong-import-position')
360
+ def leave_module(self, node):
361
+ # Check imports are grouped by category (standard, 3rd party, local)
362
+ std_imports, ext_imports, loc_imports = self._check_imports_order(node)
363
+
364
+ # Check imports are grouped by package within a given category
365
+ met = set()
366
+ current_package = None
367
+ for import_node, import_name in std_imports + ext_imports + loc_imports:
368
+ package, _, _ = import_name.partition('.')
369
+ if current_package and current_package != package and package in met:
370
+ self.add_message('ungrouped-imports', node=import_node,
371
+ args=package)
372
+ current_package = package
373
+ met.add(package)
374
+
375
+ self._imports_stack = []
376
+ self._first_non_import_node = None
377
+
378
+ def visit_if(self, node):
379
+ # if the node does not contain an import instruction, and if it is the
380
+ # first node of the module, keep a track of it (all the import positions
381
+ # of the module will be compared to the position of this first
382
+ # instruction)
383
+ if self._first_non_import_node:
384
+ return
385
+ if not isinstance(node.parent, astroid.Module):
386
+ return
387
+ if any(node.nodes_of_class((astroid.Import, astroid.ImportFrom))):
388
+ return
389
+ self._first_non_import_node = node
390
+
391
+ visit_tryfinally = visit_tryexcept = visit_assignattr = visit_assign \
392
+ = visit_ifexp = visit_comprehension = visit_if
393
+
394
+ def visit_functiondef(self, node):
395
+ # If it is the first non import instruction of the module, record it.
396
+ if self._first_non_import_node:
397
+ return
398
+
399
+ # Check if the node belongs to an `If` or a `Try` block. If they
400
+ # contain imports, skip recording this node.
401
+ if not isinstance(node.parent.scope(), astroid.Module):
402
+ return
403
+
404
+ root = node
405
+ while not isinstance(root.parent, astroid.Module):
406
+ root = root.parent
407
+
408
+ if isinstance(root, (astroid.If, astroid.TryFinally, astroid.TryExcept)):
409
+ if any(root.nodes_of_class((astroid.Import, astroid.ImportFrom))):
410
+ return
411
+
412
+ self._first_non_import_node = node
413
+
414
+ visit_classdef = visit_for = visit_while = visit_functiondef
415
+
416
+ def _check_misplaced_future(self, node):
417
+ basename = node.modname
418
+ if basename == '__future__':
419
+ # check if this is the first non-docstring statement in the module
420
+ prev = node.previous_sibling()
421
+ if prev:
422
+ # consecutive future statements are possible
423
+ if not (isinstance(prev, astroid.ImportFrom)
424
+ and prev.modname == '__future__'):
425
+ self.add_message('misplaced-future', node=node)
426
+ return
427
+
428
+ def _check_same_line_imports(self, node):
429
+ # Detect duplicate imports on the same line.
430
+ names = (name for name, _ in node.names)
431
+ counter = collections.Counter(names)
432
+ for name, count in counter.items():
433
+ if count > 1:
434
+ self.add_message('reimported', node=node,
435
+ args=(name, node.fromlineno))
436
+
437
+ def _check_position(self, node):
438
+ """Check `node` import or importfrom node position is correct
439
+
440
+ Send a message if `node` comes before another instruction
441
+ """
442
+ # if a first non-import instruction has already been encountered,
443
+ # it means the import comes after it and therefore is not well placed
444
+ if self._first_non_import_node:
445
+ self.add_message('wrong-import-position', node=node,
446
+ args=node.as_string())
447
+
448
+ def _record_import(self, node, importedmodnode):
449
+ """Record the package `node` imports from"""
450
+ importedname = importedmodnode.name if importedmodnode else None
451
+ if not importedname:
452
+ importedname = node.names[0][0].split('.')[0]
453
+ self._imports_stack.append((node, importedname))
454
+
455
+ @staticmethod
456
+ def _is_fallback_import(node, imports):
457
+ imports = [import_node for (import_node, _) in imports]
458
+ return any(astroid.are_exclusive(import_node, node)
459
+ for import_node in imports)
460
+
461
+ def _check_imports_order(self, node):
462
+ """Checks imports of module `node` are grouped by category
463
+
464
+ Imports must follow this order: standard, 3rd party, local
465
+ """
466
+ extern_imports = []
467
+ local_imports = []
468
+ std_imports = []
469
+ for node, modname in self._imports_stack:
470
+ package = modname.split('.')[0]
471
+ if is_standard_module(modname):
472
+ std_imports.append((node, package))
473
+ wrong_import = extern_imports or local_imports
474
+ if not wrong_import:
475
+ continue
476
+ if self._is_fallback_import(node, wrong_import):
477
+ continue
478
+ self.add_message('wrong-import-order', node=node,
479
+ args=('standard import "%s"' % node.as_string(),
480
+ '"%s"' % wrong_import[0][0].as_string()))
481
+ else:
482
+ try:
483
+ filename = file_from_modpath([package])
484
+ except ImportError:
485
+ continue
486
+ if not filename:
487
+ continue
488
+
489
+ filename = os.path.normcase(os.path.abspath(filename))
490
+ if not any(filename.startswith(path) for path in self._site_packages):
491
+ local_imports.append((node, package))
492
+ continue
493
+ extern_imports.append((node, package))
494
+ if not local_imports:
495
+ continue
496
+ self.add_message('wrong-import-order', node=node,
497
+ args=('external import "%s"' % node.as_string(),
498
+ '"%s"' % local_imports[0][0].as_string()))
499
+ return std_imports, extern_imports, local_imports
285
500
 
286
501
  def get_imported_module(self, importnode, modname):
287
502
  try:
288
503
  return importnode.do_import_module(modname)
289
504
  except astroid.InferenceError as ex:
505
+ dotted_modname = _get_import_name(importnode, modname)
290
506
  if str(ex) != modname:
291
- args = '%r (%s)' % (modname, ex)
507
+ args = '%r (%s)' % (dotted_modname, ex)
292
508
  else:
293
- args = repr(modname)
294
- if not _except_import_error(importnode.parent):
509
+ args = repr(dotted_modname)
510
+
511
+ for submodule in _qualified_names(modname):
512
+ if submodule in self._ignored_modules:
513
+ return None
514
+
515
+ if not node_ignores_exception(importnode, ImportError):
295
516
  self.add_message("import-error", args=args, node=importnode)
296
517
 
297
518
  def _check_relative_import(self, modnode, importnode, importedmodnode,
@@ -315,19 +536,32 @@ given file (report RP0402 must not be disabled)'}
315
536
 
316
537
  def _add_imported_module(self, node, importedmodname):
317
538
  """notify an imported module, used to analyze dependencies"""
539
+ module_file = node.root().file
540
+ context_name = node.root().name
541
+ base = os.path.splitext(os.path.basename(module_file))[0]
542
+
543
+ # Determine if we have a `from .something import` in a package's
544
+ # __init__. This means the module will never be able to import
545
+ # itself using this condition (the level will be bigger or
546
+ # if the same module is named as the package, it will be different
547
+ # anyway).
548
+ if isinstance(node, astroid.ImportFrom):
549
+ if node.level and node.level > 0 and base == '__init__':
550
+ return
551
+
318
552
  try:
319
- importedmodname = get_module_part(importedmodname)
553
+ importedmodname = get_module_part(importedmodname,
554
+ module_file)
320
555
  except ImportError:
321
556
  pass
322
- context_name = node.root().name
557
+
323
558
  if context_name == importedmodname:
324
- # module importing itself !
325
559
  self.add_message('import-self', node=node)
326
560
  elif not is_standard_module(importedmodname):
327
561
  # handle dependencies
328
562
  importedmodnames = self.stats['dependencies'].setdefault(
329
563
  importedmodname, set())
330
- if not context_name in importedmodnames:
564
+ if context_name not in importedmodnames:
331
565
  importedmodnames.add(context_name)
332
566
  # update import graph
333
567
  mgraph = self.import_graph[context_name]
@@ -340,31 +574,33 @@ given file (report RP0402 must not be disabled)'}
340
574
  if mod_path == mod_name or mod_path.startswith(mod_name + '.'):
341
575
  self.add_message('deprecated-module', node=node, args=mod_path)
342
576
 
343
- def _check_reimport(self, node, name, basename=None, level=None):
577
+ def _check_reimport(self, node, basename=None, level=None):
344
578
  """check if the import is necessary (i.e. not already done)"""
345
579
  if not self.linter.is_message_enabled('reimported'):
346
580
  return
581
+
347
582
  frame = node.frame()
348
583
  root = node.root()
349
584
  contexts = [(frame, level)]
350
585
  if root is not frame:
351
586
  contexts.append((root, None))
352
- for context, level in contexts:
353
- first = get_first_import(node, context, name, basename, level)
354
- if first is not None:
355
- self.add_message('reimported', node=node,
356
- args=(name, first.fromlineno))
357
587
 
588
+ for context, level in contexts:
589
+ for name, _ in node.names:
590
+ first = _get_first_import(node, context, name, basename, level)
591
+ if first is not None:
592
+ self.add_message('reimported', node=node,
593
+ args=(name, first.fromlineno))
358
594
 
359
- def report_external_dependencies(self, sect, _, dummy):
595
+ def _report_external_dependencies(self, sect, _, dummy):
360
596
  """return a verbatim layout for displaying dependencies"""
361
- dep_info = make_tree_defs(six.iteritems(self._external_dependencies_info()))
597
+ dep_info = _make_tree_defs(six.iteritems(self._external_dependencies_info()))
362
598
  if not dep_info:
363
599
  raise EmptyReport()
364
- tree_str = repr_tree_defs(dep_info)
600
+ tree_str = _repr_tree_defs(dep_info)
365
601
  sect.append(VerbatimText(tree_str))
366
602
 
367
- def report_dependencies_graph(self, sect, _, dummy):
603
+ def _report_dependencies_graph(self, sect, _, dummy):
368
604
  """write dependencies as a dot (graphviz) file"""
369
605
  dep_info = self.stats['dependencies']
370
606
  if not dep_info or not (self.config.import_graph
@@ -373,15 +609,15 @@ given file (report RP0402 must not be disabled)'}
373
609
  raise EmptyReport()
374
610
  filename = self.config.import_graph
375
611
  if filename:
376
- make_graph(filename, dep_info, sect, '')
612
+ _make_graph(filename, dep_info, sect, '')
377
613
  filename = self.config.ext_import_graph
378
614
  if filename:
379
- make_graph(filename, self._external_dependencies_info(),
380
- sect, 'external ')
615
+ _make_graph(filename, self._external_dependencies_info(),
616
+ sect, 'external ')
381
617
  filename = self.config.int_import_graph
382
618
  if filename:
383
- make_graph(filename, self._internal_dependencies_info(),
384
- sect, 'internal ')
619
+ _make_graph(filename, self._internal_dependencies_info(),
620
+ sect, 'internal ')
385
621
 
386
622
  def _external_dependencies_info(self):
387
623
  """return cached external dependencies information or build and
@@ -407,6 +643,11 @@ given file (report RP0402 must not be disabled)'}
407
643
  result[importee] = importers
408
644
  return self.__int_dep_info
409
645
 
646
+ def _check_wildcard_imports(self, node):
647
+ for name, _ in node.names:
648
+ if name == '*':
649
+ self.add_message('wildcard-import', args=node.modname, node=node)
650
+
410
651
 
411
652
  def register(linter):
412
653
  """required method to auto register this checker """