com.googler.python 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/package.json +4 -2
  2. package/python3.4.2/lib/python3.4/site-packages/pip/__init__.py +1 -277
  3. package/python3.4.2/lib/python3.4/site-packages/pip/__main__.py +19 -7
  4. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/__init__.py +246 -0
  5. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/basecommand.py +373 -0
  6. package/python3.4.2/lib/python3.4/site-packages/pip/{baseparser.py → _internal/baseparser.py} +240 -224
  7. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/build_env.py +92 -0
  8. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/cache.py +202 -0
  9. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/cmdoptions.py +609 -0
  10. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/__init__.py +79 -0
  11. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/check.py +42 -0
  12. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/completion.py +94 -0
  13. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/configuration.py +227 -0
  14. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/download.py +233 -0
  15. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/freeze.py +96 -0
  16. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/hash.py +57 -0
  17. package/python3.4.2/lib/python3.4/site-packages/pip/{commands → _internal/commands}/help.py +36 -33
  18. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/install.py +477 -0
  19. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/list.py +343 -0
  20. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/search.py +135 -0
  21. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/show.py +164 -0
  22. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/uninstall.py +71 -0
  23. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/wheel.py +179 -0
  24. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/compat.py +235 -0
  25. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/configuration.py +378 -0
  26. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/download.py +922 -0
  27. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/exceptions.py +249 -0
  28. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/index.py +1117 -0
  29. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/locations.py +194 -0
  30. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/models/__init__.py +4 -0
  31. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/models/index.py +15 -0
  32. package/python3.4.2/lib/python3.4/site-packages/pip/{_vendor/requests/packages/urllib3/contrib → _internal/operations}/__init__.py +0 -0
  33. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/operations/check.py +106 -0
  34. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/operations/freeze.py +252 -0
  35. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/operations/prepare.py +378 -0
  36. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/pep425tags.py +317 -0
  37. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/__init__.py +69 -0
  38. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_file.py +338 -0
  39. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_install.py +1115 -0
  40. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_set.py +164 -0
  41. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_uninstall.py +455 -0
  42. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/resolve.py +354 -0
  43. package/python3.4.2/lib/python3.4/site-packages/pip/{status_codes.py → _internal/status_codes.py} +8 -6
  44. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/__init__.py +0 -0
  45. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/appdirs.py +258 -0
  46. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/deprecation.py +77 -0
  47. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/encoding.py +33 -0
  48. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/filesystem.py +28 -0
  49. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/glibc.py +84 -0
  50. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/hashes.py +94 -0
  51. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/logging.py +132 -0
  52. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/misc.py +851 -0
  53. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/outdated.py +163 -0
  54. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/packaging.py +70 -0
  55. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/setuptools_build.py +8 -0
  56. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/temp_dir.py +82 -0
  57. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/typing.py +29 -0
  58. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/ui.py +421 -0
  59. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/__init__.py +471 -0
  60. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/bazaar.py +113 -0
  61. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/git.py +311 -0
  62. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/mercurial.py +105 -0
  63. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/subversion.py +271 -0
  64. package/python3.4.2/lib/python3.4/site-packages/pip/_internal/wheel.py +817 -0
  65. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/__init__.py +109 -8
  66. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/appdirs.py +604 -0
  67. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/__init__.py +11 -0
  68. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/_cmd.py +60 -0
  69. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/adapter.py +134 -0
  70. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/cache.py +39 -0
  71. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +2 -0
  72. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +133 -0
  73. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +43 -0
  74. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/compat.py +29 -0
  75. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/controller.py +373 -0
  76. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/filewrapper.py +78 -0
  77. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/heuristics.py +138 -0
  78. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/serialize.py +194 -0
  79. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/wrapper.py +27 -0
  80. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/certifi/__init__.py +3 -0
  81. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/certifi/__main__.py +2 -0
  82. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests → certifi}/cacert.pem +1765 -2358
  83. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/certifi/core.py +37 -0
  84. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/__init__.py +39 -32
  85. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
  86. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/big5prober.py +47 -42
  87. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/chardistribution.py +233 -231
  88. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
  89. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/charsetprober.py +145 -0
  90. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/cli/__init__.py +1 -0
  91. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/cli/chardetect.py +85 -0
  92. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/codingstatemachine.py +88 -0
  93. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/compat.py +34 -34
  94. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/cp949prober.py +49 -44
  95. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/enums.py +76 -0
  96. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/escprober.py +101 -0
  97. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/escsm.py +246 -0
  98. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/eucjpprober.py +92 -0
  99. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/euckrfreq.py +195 -0
  100. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/euckrprober.py +47 -42
  101. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/euctwfreq.py +387 -428
  102. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/euctwprober.py +46 -41
  103. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/gb2312freq.py +283 -472
  104. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/gb2312prober.py +46 -41
  105. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/hebrewprober.py +292 -283
  106. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/jisfreq.py +325 -569
  107. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/jpcntx.py +233 -219
  108. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langbulgarianmodel.py +228 -229
  109. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langcyrillicmodel.py +333 -329
  110. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langgreekmodel.py +225 -225
  111. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langhebrewmodel.py +200 -201
  112. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langhungarianmodel.py +225 -225
  113. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langthaimodel.py +199 -200
  114. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/langturkishmodel.py +193 -0
  115. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/latin1prober.py +145 -139
  116. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/mbcharsetprober.py +91 -0
  117. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/mbcsgroupprober.py +54 -54
  118. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/mbcssm.py +572 -0
  119. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/sbcharsetprober.py +132 -0
  120. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/sbcsgroupprober.py +73 -69
  121. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/sjisprober.py +92 -0
  122. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/universaldetector.py +286 -0
  123. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/utf8prober.py +82 -76
  124. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/version.py +9 -0
  125. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/__init__.py +7 -7
  126. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/ansi.py +102 -50
  127. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/ansitowin32.py +236 -190
  128. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/initialise.py +82 -56
  129. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/win32.py +156 -137
  130. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/winterm.py +162 -120
  131. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/__init__.py +23 -23
  132. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/__init__.py +6 -6
  133. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/misc.py +41 -41
  134. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/shutil.py +761 -761
  135. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +84 -84
  136. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +788 -788
  137. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/tarfile.py +2607 -2607
  138. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/compat.py +1117 -1064
  139. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/database.py +1318 -1301
  140. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/index.py +516 -488
  141. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/locators.py +1292 -1194
  142. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/manifest.py +393 -364
  143. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/markers.py +131 -190
  144. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/metadata.py +1068 -1026
  145. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/resources.py +355 -317
  146. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/scripts.py +415 -323
  147. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/t32.exe +0 -0
  148. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/t64.exe +0 -0
  149. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/util.py +1755 -1575
  150. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/version.py +736 -721
  151. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/w32.exe +0 -0
  152. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/w64.exe +0 -0
  153. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/wheel.py +984 -958
  154. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distro.py +1104 -0
  155. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/__init__.py +35 -23
  156. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{ihatexml.py → _ihatexml.py} +288 -285
  157. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{inputstream.py → _inputstream.py} +923 -881
  158. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{tokenizer.py → _tokenizer.py} +1721 -1731
  159. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/__init__.py +14 -12
  160. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/_base.py +37 -37
  161. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/datrie.py +44 -44
  162. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/py.py +67 -67
  163. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{utils.py → _utils.py} +124 -82
  164. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/constants.py +2947 -3104
  165. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +29 -20
  166. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/{_base.py → base.py} +12 -12
  167. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +73 -65
  168. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/lint.py +93 -93
  169. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +207 -205
  170. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +896 -12
  171. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/whitespace.py +38 -38
  172. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/html5parser.py +2791 -2713
  173. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/serializer.py +409 -0
  174. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +30 -0
  175. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +54 -0
  176. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +50 -44
  177. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +88 -76
  178. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/{_base.py → base.py} +417 -377
  179. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +236 -227
  180. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +340 -337
  181. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +366 -369
  182. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +154 -57
  183. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/{_base.py → base.py} +252 -200
  184. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +43 -46
  185. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +130 -138
  186. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/{lxmletree.py → etree_lxml.py} +213 -208
  187. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/{genshistream.py → genshi.py} +69 -69
  188. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/__init__.py +2 -0
  189. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/codec.py +118 -0
  190. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/compat.py +12 -0
  191. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/core.py +387 -0
  192. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/idnadata.py +1585 -0
  193. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/intranges.py +53 -0
  194. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/package_data.py +2 -0
  195. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/uts46data.py +7634 -0
  196. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/ipaddress.py +2419 -0
  197. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/__init__.py +347 -0
  198. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/linklockfile.py +73 -0
  199. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/mkdirlockfile.py +84 -0
  200. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/pidlockfile.py +190 -0
  201. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/sqlitelockfile.py +156 -0
  202. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/symlinklockfile.py +70 -0
  203. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/__init__.py +66 -0
  204. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/_version.py +1 -0
  205. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/exceptions.py +41 -0
  206. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/fallback.py +971 -0
  207. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/__about__.py +21 -0
  208. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/__init__.py +14 -0
  209. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/_compat.py +30 -0
  210. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/_structures.py +70 -0
  211. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/markers.py +301 -0
  212. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/requirements.py +130 -0
  213. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/specifiers.py +774 -0
  214. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/utils.py +63 -0
  215. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/version.py +441 -0
  216. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{pkg_resources.py → pkg_resources/__init__.py} +3125 -2762
  217. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pkg_resources/py31compat.py +22 -0
  218. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/__init__.py +127 -0
  219. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/bar.py +88 -0
  220. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/counter.py +48 -0
  221. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/helpers.py +91 -0
  222. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/spinner.py +44 -0
  223. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pyparsing.py +5720 -0
  224. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/__init__.py +3 -0
  225. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/core.py +13 -0
  226. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/parser.py +374 -0
  227. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/writer.py +127 -0
  228. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/__init__.py +123 -77
  229. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/__version__.py +14 -0
  230. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/_internal_utils.py +42 -0
  231. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/adapters.py +525 -388
  232. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/api.py +152 -120
  233. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/auth.py +293 -193
  234. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/certs.py +18 -24
  235. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/compat.py +73 -115
  236. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/cookies.py +542 -454
  237. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/exceptions.py +122 -75
  238. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/help.py +120 -0
  239. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/hooks.py +34 -45
  240. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/models.py +948 -803
  241. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages.py +16 -0
  242. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/sessions.py +737 -637
  243. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/status_codes.py +91 -88
  244. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/structures.py +105 -127
  245. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/utils.py +904 -673
  246. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/retrying.py +267 -0
  247. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/six.py +891 -646
  248. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/__init__.py +97 -0
  249. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/_collections.py +319 -0
  250. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/connection.py +373 -0
  251. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/connectionpool.py +905 -710
  252. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  253. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  254. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +593 -0
  255. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +343 -0
  256. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/appengine.py +296 -0
  257. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/contrib/ntlmpool.py +112 -120
  258. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +455 -0
  259. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +810 -0
  260. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/socks.py +188 -0
  261. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/exceptions.py +246 -0
  262. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/fields.py +178 -177
  263. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/filepost.py +94 -100
  264. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/__init__.py +5 -4
  265. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  266. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +53 -0
  267. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/ordered_dict.py +259 -260
  268. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/packages/six.py +868 -0
  269. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/ssl_match_hostname/__init__.py +19 -13
  270. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/ssl_match_hostname/_implementation.py +157 -105
  271. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/poolmanager.py +440 -0
  272. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/request.py +148 -141
  273. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/response.py +626 -0
  274. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/__init__.py +54 -0
  275. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/connection.py +130 -0
  276. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/request.py +118 -0
  277. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/response.py +81 -0
  278. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/retry.py +401 -0
  279. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/selectors.py +581 -0
  280. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/ssl_.py +341 -0
  281. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/util/timeout.py +242 -234
  282. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/util/url.py +230 -162
  283. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/wait.py +40 -0
  284. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
  285. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/labels.py +231 -0
  286. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
  287. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/tests.py +153 -0
  288. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
  289. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/_markerlib/__init__.py +0 -16
  290. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/_markerlib/markers.py +0 -119
  291. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/sanitizer.py +0 -271
  292. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/serializer/__init__.py +0 -16
  293. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/serializer/htmlserializer.py +0 -320
  294. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/pulldom.py +0 -63
  295. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/re-vendor.py +0 -34
  296. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/__init__.py +0 -3
  297. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/big5freq.py +0 -925
  298. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/chardetect.py +0 -46
  299. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/charsetgroupprober.py +0 -106
  300. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/charsetprober.py +0 -62
  301. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/codingstatemachine.py +0 -61
  302. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/constants.py +0 -39
  303. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/escprober.py +0 -86
  304. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/escsm.py +0 -242
  305. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/eucjpprober.py +0 -90
  306. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/euckrfreq.py +0 -596
  307. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/mbcharsetprober.py +0 -86
  308. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/mbcssm.py +0 -575
  309. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/sbcharsetprober.py +0 -120
  310. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/sjisprober.py +0 -91
  311. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/universaldetector.py +0 -170
  312. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/__init__.py +0 -58
  313. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/_collections.py +0 -205
  314. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/connection.py +0 -204
  315. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py +0 -422
  316. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/exceptions.py +0 -126
  317. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/packages/six.py +0 -385
  318. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/poolmanager.py +0 -258
  319. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/response.py +0 -308
  320. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/__init__.py +0 -27
  321. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/connection.py +0 -45
  322. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/request.py +0 -68
  323. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/response.py +0 -13
  324. package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py +0 -133
  325. package/python3.4.2/lib/python3.4/site-packages/pip/backwardcompat/__init__.py +0 -138
  326. package/python3.4.2/lib/python3.4/site-packages/pip/basecommand.py +0 -201
  327. package/python3.4.2/lib/python3.4/site-packages/pip/cmdoptions.py +0 -371
  328. package/python3.4.2/lib/python3.4/site-packages/pip/commands/__init__.py +0 -88
  329. package/python3.4.2/lib/python3.4/site-packages/pip/commands/bundle.py +0 -42
  330. package/python3.4.2/lib/python3.4/site-packages/pip/commands/completion.py +0 -59
  331. package/python3.4.2/lib/python3.4/site-packages/pip/commands/freeze.py +0 -114
  332. package/python3.4.2/lib/python3.4/site-packages/pip/commands/install.py +0 -314
  333. package/python3.4.2/lib/python3.4/site-packages/pip/commands/list.py +0 -162
  334. package/python3.4.2/lib/python3.4/site-packages/pip/commands/search.py +0 -132
  335. package/python3.4.2/lib/python3.4/site-packages/pip/commands/show.py +0 -80
  336. package/python3.4.2/lib/python3.4/site-packages/pip/commands/uninstall.py +0 -59
  337. package/python3.4.2/lib/python3.4/site-packages/pip/commands/unzip.py +0 -7
  338. package/python3.4.2/lib/python3.4/site-packages/pip/commands/wheel.py +0 -195
  339. package/python3.4.2/lib/python3.4/site-packages/pip/commands/zip.py +0 -351
  340. package/python3.4.2/lib/python3.4/site-packages/pip/download.py +0 -644
  341. package/python3.4.2/lib/python3.4/site-packages/pip/exceptions.py +0 -46
  342. package/python3.4.2/lib/python3.4/site-packages/pip/index.py +0 -990
  343. package/python3.4.2/lib/python3.4/site-packages/pip/locations.py +0 -171
  344. package/python3.4.2/lib/python3.4/site-packages/pip/log.py +0 -276
  345. package/python3.4.2/lib/python3.4/site-packages/pip/pep425tags.py +0 -102
  346. package/python3.4.2/lib/python3.4/site-packages/pip/req.py +0 -1931
  347. package/python3.4.2/lib/python3.4/site-packages/pip/runner.py +0 -18
  348. package/python3.4.2/lib/python3.4/site-packages/pip/util.py +0 -720
  349. package/python3.4.2/lib/python3.4/site-packages/pip/vcs/__init__.py +0 -251
  350. package/python3.4.2/lib/python3.4/site-packages/pip/vcs/bazaar.py +0 -131
  351. package/python3.4.2/lib/python3.4/site-packages/pip/vcs/git.py +0 -194
  352. package/python3.4.2/lib/python3.4/site-packages/pip/vcs/mercurial.py +0 -151
  353. package/python3.4.2/lib/python3.4/site-packages/pip/vcs/subversion.py +0 -273
  354. package/python3.4.2/lib/python3.4/site-packages/pip/wheel.py +0 -560
@@ -0,0 +1,373 @@
1
+ """
2
+ The httplib2 algorithms ported for use with requests.
3
+ """
4
+ import logging
5
+ import re
6
+ import calendar
7
+ import time
8
+ from email.utils import parsedate_tz
9
+
10
+ from pip._vendor.requests.structures import CaseInsensitiveDict
11
+
12
+ from .cache import DictCache
13
+ from .serialize import Serializer
14
+
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
19
+
20
+
21
+ def parse_uri(uri):
22
+ """Parses a URI using the regex given in Appendix B of RFC 3986.
23
+
24
+ (scheme, authority, path, query, fragment) = parse_uri(uri)
25
+ """
26
+ groups = URI.match(uri).groups()
27
+ return (groups[1], groups[3], groups[4], groups[6], groups[8])
28
+
29
+
30
+ class CacheController(object):
31
+ """An interface to see if request should cached or not.
32
+ """
33
+ def __init__(self, cache=None, cache_etags=True, serializer=None,
34
+ status_codes=None):
35
+ self.cache = cache or DictCache()
36
+ self.cache_etags = cache_etags
37
+ self.serializer = serializer or Serializer()
38
+ self.cacheable_status_codes = status_codes or (200, 203, 300, 301)
39
+
40
+ @classmethod
41
+ def _urlnorm(cls, uri):
42
+ """Normalize the URL to create a safe key for the cache"""
43
+ (scheme, authority, path, query, fragment) = parse_uri(uri)
44
+ if not scheme or not authority:
45
+ raise Exception("Only absolute URIs are allowed. uri = %s" % uri)
46
+
47
+ scheme = scheme.lower()
48
+ authority = authority.lower()
49
+
50
+ if not path:
51
+ path = "/"
52
+
53
+ # Could do syntax based normalization of the URI before
54
+ # computing the digest. See Section 6.2.2 of Std 66.
55
+ request_uri = query and "?".join([path, query]) or path
56
+ defrag_uri = scheme + "://" + authority + request_uri
57
+
58
+ return defrag_uri
59
+
60
+ @classmethod
61
+ def cache_url(cls, uri):
62
+ return cls._urlnorm(uri)
63
+
64
+ def parse_cache_control(self, headers):
65
+ known_directives = {
66
+ # https://tools.ietf.org/html/rfc7234#section-5.2
67
+ 'max-age': (int, True,),
68
+ 'max-stale': (int, False,),
69
+ 'min-fresh': (int, True,),
70
+ 'no-cache': (None, False,),
71
+ 'no-store': (None, False,),
72
+ 'no-transform': (None, False,),
73
+ 'only-if-cached' : (None, False,),
74
+ 'must-revalidate': (None, False,),
75
+ 'public': (None, False,),
76
+ 'private': (None, False,),
77
+ 'proxy-revalidate': (None, False,),
78
+ 's-maxage': (int, True,)
79
+ }
80
+
81
+ cc_headers = headers.get('cache-control',
82
+ headers.get('Cache-Control', ''))
83
+
84
+ retval = {}
85
+
86
+ for cc_directive in cc_headers.split(','):
87
+ parts = cc_directive.split('=', 1)
88
+ directive = parts[0].strip()
89
+
90
+ try:
91
+ typ, required = known_directives[directive]
92
+ except KeyError:
93
+ logger.debug('Ignoring unknown cache-control directive: %s',
94
+ directive)
95
+ continue
96
+
97
+ if not typ or not required:
98
+ retval[directive] = None
99
+ if typ:
100
+ try:
101
+ retval[directive] = typ(parts[1].strip())
102
+ except IndexError:
103
+ if required:
104
+ logger.debug('Missing value for cache-control '
105
+ 'directive: %s', directive)
106
+ except ValueError:
107
+ logger.debug('Invalid value for cache-control directive '
108
+ '%s, must be %s', directive, typ.__name__)
109
+
110
+ return retval
111
+
112
+ def cached_request(self, request):
113
+ """
114
+ Return a cached response if it exists in the cache, otherwise
115
+ return False.
116
+ """
117
+ cache_url = self.cache_url(request.url)
118
+ logger.debug('Looking up "%s" in the cache', cache_url)
119
+ cc = self.parse_cache_control(request.headers)
120
+
121
+ # Bail out if the request insists on fresh data
122
+ if 'no-cache' in cc:
123
+ logger.debug('Request header has "no-cache", cache bypassed')
124
+ return False
125
+
126
+ if 'max-age' in cc and cc['max-age'] == 0:
127
+ logger.debug('Request header has "max_age" as 0, cache bypassed')
128
+ return False
129
+
130
+ # Request allows serving from the cache, let's see if we find something
131
+ cache_data = self.cache.get(cache_url)
132
+ if cache_data is None:
133
+ logger.debug('No cache entry available')
134
+ return False
135
+
136
+ # Check whether it can be deserialized
137
+ resp = self.serializer.loads(request, cache_data)
138
+ if not resp:
139
+ logger.warning('Cache entry deserialization failed, entry ignored')
140
+ return False
141
+
142
+ # If we have a cached 301, return it immediately. We don't
143
+ # need to test our response for other headers b/c it is
144
+ # intrinsically "cacheable" as it is Permanent.
145
+ # See:
146
+ # https://tools.ietf.org/html/rfc7231#section-6.4.2
147
+ #
148
+ # Client can try to refresh the value by repeating the request
149
+ # with cache busting headers as usual (ie no-cache).
150
+ if resp.status == 301:
151
+ msg = ('Returning cached "301 Moved Permanently" response '
152
+ '(ignoring date and etag information)')
153
+ logger.debug(msg)
154
+ return resp
155
+
156
+ headers = CaseInsensitiveDict(resp.headers)
157
+ if not headers or 'date' not in headers:
158
+ if 'etag' not in headers:
159
+ # Without date or etag, the cached response can never be used
160
+ # and should be deleted.
161
+ logger.debug('Purging cached response: no date or etag')
162
+ self.cache.delete(cache_url)
163
+ logger.debug('Ignoring cached response: no date')
164
+ return False
165
+
166
+ now = time.time()
167
+ date = calendar.timegm(
168
+ parsedate_tz(headers['date'])
169
+ )
170
+ current_age = max(0, now - date)
171
+ logger.debug('Current age based on date: %i', current_age)
172
+
173
+ # TODO: There is an assumption that the result will be a
174
+ # urllib3 response object. This may not be best since we
175
+ # could probably avoid instantiating or constructing the
176
+ # response until we know we need it.
177
+ resp_cc = self.parse_cache_control(headers)
178
+
179
+ # determine freshness
180
+ freshness_lifetime = 0
181
+
182
+ # Check the max-age pragma in the cache control header
183
+ if 'max-age' in resp_cc:
184
+ freshness_lifetime = resp_cc['max-age']
185
+ logger.debug('Freshness lifetime from max-age: %i',
186
+ freshness_lifetime)
187
+
188
+ # If there isn't a max-age, check for an expires header
189
+ elif 'expires' in headers:
190
+ expires = parsedate_tz(headers['expires'])
191
+ if expires is not None:
192
+ expire_time = calendar.timegm(expires) - date
193
+ freshness_lifetime = max(0, expire_time)
194
+ logger.debug("Freshness lifetime from expires: %i",
195
+ freshness_lifetime)
196
+
197
+ # Determine if we are setting freshness limit in the
198
+ # request. Note, this overrides what was in the response.
199
+ if 'max-age' in cc:
200
+ freshness_lifetime = cc['max-age']
201
+ logger.debug('Freshness lifetime from request max-age: %i',
202
+ freshness_lifetime)
203
+
204
+ if 'min-fresh' in cc:
205
+ min_fresh = cc['min-fresh']
206
+ # adjust our current age by our min fresh
207
+ current_age += min_fresh
208
+ logger.debug('Adjusted current age from min-fresh: %i',
209
+ current_age)
210
+
211
+ # Return entry if it is fresh enough
212
+ if freshness_lifetime > current_age:
213
+ logger.debug('The response is "fresh", returning cached response')
214
+ logger.debug('%i > %i', freshness_lifetime, current_age)
215
+ return resp
216
+
217
+ # we're not fresh. If we don't have an Etag, clear it out
218
+ if 'etag' not in headers:
219
+ logger.debug(
220
+ 'The cached response is "stale" with no etag, purging'
221
+ )
222
+ self.cache.delete(cache_url)
223
+
224
+ # return the original handler
225
+ return False
226
+
227
+ def conditional_headers(self, request):
228
+ cache_url = self.cache_url(request.url)
229
+ resp = self.serializer.loads(request, self.cache.get(cache_url))
230
+ new_headers = {}
231
+
232
+ if resp:
233
+ headers = CaseInsensitiveDict(resp.headers)
234
+
235
+ if 'etag' in headers:
236
+ new_headers['If-None-Match'] = headers['ETag']
237
+
238
+ if 'last-modified' in headers:
239
+ new_headers['If-Modified-Since'] = headers['Last-Modified']
240
+
241
+ return new_headers
242
+
243
+ def cache_response(self, request, response, body=None,
244
+ status_codes=None):
245
+ """
246
+ Algorithm for caching requests.
247
+
248
+ This assumes a requests Response object.
249
+ """
250
+ # From httplib2: Don't cache 206's since we aren't going to
251
+ # handle byte range requests
252
+ cacheable_status_codes = status_codes or self.cacheable_status_codes
253
+ if response.status not in cacheable_status_codes:
254
+ logger.debug(
255
+ 'Status code %s not in %s',
256
+ response.status,
257
+ cacheable_status_codes
258
+ )
259
+ return
260
+
261
+ response_headers = CaseInsensitiveDict(response.headers)
262
+
263
+ # If we've been given a body, our response has a Content-Length, that
264
+ # Content-Length is valid then we can check to see if the body we've
265
+ # been given matches the expected size, and if it doesn't we'll just
266
+ # skip trying to cache it.
267
+ if (body is not None and
268
+ "content-length" in response_headers and
269
+ response_headers["content-length"].isdigit() and
270
+ int(response_headers["content-length"]) != len(body)):
271
+ return
272
+
273
+ cc_req = self.parse_cache_control(request.headers)
274
+ cc = self.parse_cache_control(response_headers)
275
+
276
+ cache_url = self.cache_url(request.url)
277
+ logger.debug('Updating cache with response from "%s"', cache_url)
278
+
279
+ # Delete it from the cache if we happen to have it stored there
280
+ no_store = False
281
+ if 'no-store' in cc:
282
+ no_store = True
283
+ logger.debug('Response header has "no-store"')
284
+ if 'no-store' in cc_req:
285
+ no_store = True
286
+ logger.debug('Request header has "no-store"')
287
+ if no_store and self.cache.get(cache_url):
288
+ logger.debug('Purging existing cache entry to honor "no-store"')
289
+ self.cache.delete(cache_url)
290
+
291
+ # If we've been given an etag, then keep the response
292
+ if self.cache_etags and 'etag' in response_headers:
293
+ logger.debug('Caching due to etag')
294
+ self.cache.set(
295
+ cache_url,
296
+ self.serializer.dumps(request, response, body=body),
297
+ )
298
+
299
+ # Add to the cache any 301s. We do this before looking that
300
+ # the Date headers.
301
+ elif response.status == 301:
302
+ logger.debug('Caching permanant redirect')
303
+ self.cache.set(
304
+ cache_url,
305
+ self.serializer.dumps(request, response)
306
+ )
307
+
308
+ # Add to the cache if the response headers demand it. If there
309
+ # is no date header then we can't do anything about expiring
310
+ # the cache.
311
+ elif 'date' in response_headers:
312
+ # cache when there is a max-age > 0
313
+ if 'max-age' in cc and cc['max-age'] > 0:
314
+ logger.debug('Caching b/c date exists and max-age > 0')
315
+ self.cache.set(
316
+ cache_url,
317
+ self.serializer.dumps(request, response, body=body),
318
+ )
319
+
320
+ # If the request can expire, it means we should cache it
321
+ # in the meantime.
322
+ elif 'expires' in response_headers:
323
+ if response_headers['expires']:
324
+ logger.debug('Caching b/c of expires header')
325
+ self.cache.set(
326
+ cache_url,
327
+ self.serializer.dumps(request, response, body=body),
328
+ )
329
+
330
+ def update_cached_response(self, request, response):
331
+ """On a 304 we will get a new set of headers that we want to
332
+ update our cached value with, assuming we have one.
333
+
334
+ This should only ever be called when we've sent an ETag and
335
+ gotten a 304 as the response.
336
+ """
337
+ cache_url = self.cache_url(request.url)
338
+
339
+ cached_response = self.serializer.loads(
340
+ request,
341
+ self.cache.get(cache_url)
342
+ )
343
+
344
+ if not cached_response:
345
+ # we didn't have a cached response
346
+ return response
347
+
348
+ # Lets update our headers with the headers from the new request:
349
+ # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1
350
+ #
351
+ # The server isn't supposed to send headers that would make
352
+ # the cached body invalid. But... just in case, we'll be sure
353
+ # to strip out ones we know that might be problmatic due to
354
+ # typical assumptions.
355
+ excluded_headers = [
356
+ "content-length",
357
+ ]
358
+
359
+ cached_response.headers.update(
360
+ dict((k, v) for k, v in response.headers.items()
361
+ if k.lower() not in excluded_headers)
362
+ )
363
+
364
+ # we want a 200 b/c we have content via the cache
365
+ cached_response.status = 200
366
+
367
+ # update our cache
368
+ self.cache.set(
369
+ cache_url,
370
+ self.serializer.dumps(request, cached_response),
371
+ )
372
+
373
+ return cached_response
@@ -0,0 +1,78 @@
1
+ from io import BytesIO
2
+
3
+
4
+ class CallbackFileWrapper(object):
5
+ """
6
+ Small wrapper around a fp object which will tee everything read into a
7
+ buffer, and when that file is closed it will execute a callback with the
8
+ contents of that buffer.
9
+
10
+ All attributes are proxied to the underlying file object.
11
+
12
+ This class uses members with a double underscore (__) leading prefix so as
13
+ not to accidentally shadow an attribute.
14
+ """
15
+
16
+ def __init__(self, fp, callback):
17
+ self.__buf = BytesIO()
18
+ self.__fp = fp
19
+ self.__callback = callback
20
+
21
+ def __getattr__(self, name):
22
+ # The vaguaries of garbage collection means that self.__fp is
23
+ # not always set. By using __getattribute__ and the private
24
+ # name[0] allows looking up the attribute value and raising an
25
+ # AttributeError when it doesn't exist. This stop thigns from
26
+ # infinitely recursing calls to getattr in the case where
27
+ # self.__fp hasn't been set.
28
+ #
29
+ # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers
30
+ fp = self.__getattribute__('_CallbackFileWrapper__fp')
31
+ return getattr(fp, name)
32
+
33
+ def __is_fp_closed(self):
34
+ try:
35
+ return self.__fp.fp is None
36
+ except AttributeError:
37
+ pass
38
+
39
+ try:
40
+ return self.__fp.closed
41
+ except AttributeError:
42
+ pass
43
+
44
+ # We just don't cache it then.
45
+ # TODO: Add some logging here...
46
+ return False
47
+
48
+ def _close(self):
49
+ if self.__callback:
50
+ self.__callback(self.__buf.getvalue())
51
+
52
+ # We assign this to None here, because otherwise we can get into
53
+ # really tricky problems where the CPython interpreter dead locks
54
+ # because the callback is holding a reference to something which
55
+ # has a __del__ method. Setting this to None breaks the cycle
56
+ # and allows the garbage collector to do it's thing normally.
57
+ self.__callback = None
58
+
59
+ def read(self, amt=None):
60
+ data = self.__fp.read(amt)
61
+ self.__buf.write(data)
62
+ if self.__is_fp_closed():
63
+ self._close()
64
+
65
+ return data
66
+
67
+ def _safe_read(self, amt):
68
+ data = self.__fp._safe_read(amt)
69
+ if amt == 2 and data == b'\r\n':
70
+ # urllib executes this read to toss the CRLF at the end
71
+ # of the chunk.
72
+ return data
73
+
74
+ self.__buf.write(data)
75
+ if self.__is_fp_closed():
76
+ self._close()
77
+
78
+ return data
@@ -0,0 +1,138 @@
1
+ import calendar
2
+ import time
3
+
4
+ from email.utils import formatdate, parsedate, parsedate_tz
5
+
6
+ from datetime import datetime, timedelta
7
+
8
+ TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT"
9
+
10
+
11
+ def expire_after(delta, date=None):
12
+ date = date or datetime.utcnow()
13
+ return date + delta
14
+
15
+
16
+ def datetime_to_header(dt):
17
+ return formatdate(calendar.timegm(dt.timetuple()))
18
+
19
+
20
+ class BaseHeuristic(object):
21
+
22
+ def warning(self, response):
23
+ """
24
+ Return a valid 1xx warning header value describing the cache
25
+ adjustments.
26
+
27
+ The response is provided too allow warnings like 113
28
+ http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
29
+ to explicitly say response is over 24 hours old.
30
+ """
31
+ return '110 - "Response is Stale"'
32
+
33
+ def update_headers(self, response):
34
+ """Update the response headers with any new headers.
35
+
36
+ NOTE: This SHOULD always include some Warning header to
37
+ signify that the response was cached by the client, not
38
+ by way of the provided headers.
39
+ """
40
+ return {}
41
+
42
+ def apply(self, response):
43
+ updated_headers = self.update_headers(response)
44
+
45
+ if updated_headers:
46
+ response.headers.update(updated_headers)
47
+ warning_header_value = self.warning(response)
48
+ if warning_header_value is not None:
49
+ response.headers.update({'Warning': warning_header_value})
50
+
51
+ return response
52
+
53
+
54
+ class OneDayCache(BaseHeuristic):
55
+ """
56
+ Cache the response by providing an expires 1 day in the
57
+ future.
58
+ """
59
+ def update_headers(self, response):
60
+ headers = {}
61
+
62
+ if 'expires' not in response.headers:
63
+ date = parsedate(response.headers['date'])
64
+ expires = expire_after(timedelta(days=1),
65
+ date=datetime(*date[:6]))
66
+ headers['expires'] = datetime_to_header(expires)
67
+ headers['cache-control'] = 'public'
68
+ return headers
69
+
70
+
71
+ class ExpiresAfter(BaseHeuristic):
72
+ """
73
+ Cache **all** requests for a defined time period.
74
+ """
75
+
76
+ def __init__(self, **kw):
77
+ self.delta = timedelta(**kw)
78
+
79
+ def update_headers(self, response):
80
+ expires = expire_after(self.delta)
81
+ return {
82
+ 'expires': datetime_to_header(expires),
83
+ 'cache-control': 'public',
84
+ }
85
+
86
+ def warning(self, response):
87
+ tmpl = '110 - Automatically cached for %s. Response might be stale'
88
+ return tmpl % self.delta
89
+
90
+
91
+ class LastModified(BaseHeuristic):
92
+ """
93
+ If there is no Expires header already, fall back on Last-Modified
94
+ using the heuristic from
95
+ http://tools.ietf.org/html/rfc7234#section-4.2.2
96
+ to calculate a reasonable value.
97
+
98
+ Firefox also does something like this per
99
+ https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
100
+ http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397
101
+ Unlike mozilla we limit this to 24-hr.
102
+ """
103
+ cacheable_by_default_statuses = set([
104
+ 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501
105
+ ])
106
+
107
+ def update_headers(self, resp):
108
+ headers = resp.headers
109
+
110
+ if 'expires' in headers:
111
+ return {}
112
+
113
+ if 'cache-control' in headers and headers['cache-control'] != 'public':
114
+ return {}
115
+
116
+ if resp.status not in self.cacheable_by_default_statuses:
117
+ return {}
118
+
119
+ if 'date' not in headers or 'last-modified' not in headers:
120
+ return {}
121
+
122
+ date = calendar.timegm(parsedate_tz(headers['date']))
123
+ last_modified = parsedate(headers['last-modified'])
124
+ if date is None or last_modified is None:
125
+ return {}
126
+
127
+ now = time.time()
128
+ current_age = max(0, now - date)
129
+ delta = date - calendar.timegm(last_modified)
130
+ freshness_lifetime = max(0, min(delta / 10, 24 * 3600))
131
+ if freshness_lifetime <= current_age:
132
+ return {}
133
+
134
+ expires = date + freshness_lifetime
135
+ return {'expires': time.strftime(TIME_FMT, time.gmtime(expires))}
136
+
137
+ def warning(self, resp):
138
+ return None