Initialization of the project

master
parent 7401445928
commit ad49ea81fa
  1. 3
      .vscode/settings.json
  2. 21
      LICENSE
  3. 36
      README.md
  4. BIN
      __pycache__/run.cpython-37.pyc
  5. 8
      backend/requirements.txt
  6. 1
      dist/index.html
  7. 18
      frontend/.babelrc
  8. 9
      frontend/.editorconfig
  9. 2
      frontend/.eslintignore
  10. 27
      frontend/.eslintrc.js
  11. 14
      frontend/.gitignore
  12. 8
      frontend/.postcssrc.js
  13. 41
      frontend/build/build.js
  14. 49
      frontend/build/check-versions.js
  15. 10
      frontend/build/dev-client.js
  16. 105
      frontend/build/dev-server.js
  17. 72
      frontend/build/utils.js
  18. 19
      frontend/build/vue-loader.conf.js
  19. 75
      frontend/build/webpack.base.conf.js
  20. 36
      frontend/build/webpack.dev.conf.js
  21. 124
      frontend/build/webpack.prod.conf.js
  22. 7
      frontend/config/dev.env.js
  23. 42
      frontend/config/index.js
  24. 4
      frontend/config/prod.env.js
  25. 11
      frontend/index.html
  26. 10535
      frontend/package-lock.json
  27. 73
      frontend/package.json
  28. 23
      frontend/src/App.vue
  29. BIN
      frontend/src/assets/logo.png
  30. 5
      frontend/src/components/About.vue
  31. 53
      frontend/src/components/HelloWorld.vue
  32. 43
      frontend/src/components/Home.vue
  33. 5
      frontend/src/components/NotFound.vue
  34. 12
      frontend/src/main.js
  35. 18
      frontend/src/router/index.js
  36. 0
      frontend/static/.gitkeep
  37. 76
      myenv/bin/activate
  38. 37
      myenv/bin/activate.csh
  39. 75
      myenv/bin/activate.fish
  40. 11
      myenv/bin/easy_install
  41. 11
      myenv/bin/easy_install-3.7
  42. 11
      myenv/bin/pip
  43. 11
      myenv/bin/pip3
  44. 11
      myenv/bin/pip3.7
  45. 1
      myenv/bin/python
  46. 1
      myenv/bin/python3
  47. 1
      myenv/bin/python3.7
  48. BIN
      myenv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc
  49. 5
      myenv/lib/python3.7/site-packages/easy_install.py
  50. 1
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER
  51. 20
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/LICENSE.txt
  52. 78
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/METADATA
  53. 580
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/RECORD
  54. 6
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL
  55. 5
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/entry_points.txt
  56. 1
      myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt
  57. 1
      myenv/lib/python3.7/site-packages/pip/__init__.py
  58. 19
      myenv/lib/python3.7/site-packages/pip/__main__.py
  59. BIN
      myenv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc
  60. BIN
      myenv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc
  61. 246
      myenv/lib/python3.7/site-packages/pip/_internal/__init__.py
  62. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc
  63. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/basecommand.cpython-37.pyc
  64. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/baseparser.cpython-37.pyc
  65. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc
  66. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc
  67. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cmdoptions.cpython-37.pyc
  68. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/compat.cpython-37.pyc
  69. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc
  70. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc
  71. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc
  72. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc
  73. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc
  74. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc
  75. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc
  76. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/status_codes.cpython-37.pyc
  77. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc
  78. 373
      myenv/lib/python3.7/site-packages/pip/_internal/basecommand.py
  79. 240
      myenv/lib/python3.7/site-packages/pip/_internal/baseparser.py
  80. 92
      myenv/lib/python3.7/site-packages/pip/_internal/build_env.py
  81. 202
      myenv/lib/python3.7/site-packages/pip/_internal/cache.py
  82. 609
      myenv/lib/python3.7/site-packages/pip/_internal/cmdoptions.py
  83. 79
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py
  84. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc
  85. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc
  86. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc
  87. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc
  88. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc
  89. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc
  90. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc
  91. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc
  92. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc
  93. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc
  94. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc
  95. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc
  96. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc
  97. BIN
      myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc
  98. 42
      myenv/lib/python3.7/site-packages/pip/_internal/commands/check.py
  99. 94
      myenv/lib/python3.7/site-packages/pip/_internal/commands/completion.py
  100. 227
      myenv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,3 @@
{
"git.ignoreLimitWarning": true
}

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 oleg-agapov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,2 +1,36 @@
# iStacking # flask-vue-spa
Vue.js SPA served over Flask microframework
* Python: 3.6.3
* Vue.js: 2.5.2
* vue-router: 3.0.1
* axios: 0.16.2
Tutorial on how I build this app:
https://medium.com/@oleg.agapov/full-stack-single-page-application-with-vue-js-and-flask-b1e036315532
## Build Setup
``` bash
# install front-end
cd frontend
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production/Flask with minification
npm run build
# install back-end
cd ../backend
virtualenv -p python3 venv
source venv/bin/activate
pip install -r requirements.txt
cd ..
# serve back-end at localhost:5000
FLASK_APP=run.py flask run
```

Binary file not shown.

@ -0,0 +1,8 @@
click==6.7
Flask>=0.12.3
Flask-Cors==3.0.3
itsdangerous==0.24
Jinja2>=2.10.1
MarkupSafe==1.0
six==1.11.0
Werkzeug==0.12.2

1
dist/index.html vendored

@ -0,0 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><title>frontend</title><link href=/static/css/app.dfca11727ccf9e74f393b0c223db19ce.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.d4a6057c666542329f1b.js></script><script type=text/javascript src=/static/js/vendor.1e5687ded8537373b3d4.js></script><script type=text/javascript src=/static/js/app.c1b5e870a4e821397b86.js></script></body></html>

@ -0,0 +1,18 @@
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-runtime"],
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": ["istanbul"]
}
}
}

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

@ -0,0 +1,2 @@
build/*.js
config/*.js

@ -0,0 +1,27 @@
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parser: 'babel-eslint',
parserOptions: {
sourceType: 'module'
},
env: {
browser: true,
},
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
extends: 'standard',
// required to lint *.vue files
plugins: [
'html'
],
// add your custom rules here
'rules': {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
}
}

@ -0,0 +1,14 @@
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

@ -0,0 +1,8 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}

@ -0,0 +1,41 @@
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, function (err, stats) {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})

@ -0,0 +1,49 @@
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}

@ -0,0 +1,10 @@
/* eslint-disable */
'use strict'
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})

@ -0,0 +1,105 @@
'use strict'
require('./check-versions')()
const config = require('../config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
const opn = require('opn')
const path = require('path')
const express = require('express')
const webpack = require('webpack')
const proxyMiddleware = require('http-proxy-middleware')
const webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
const port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
const autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
const proxyTable = config.dev.proxyTable
const app = express()
const compiler = webpack(webpackConfig)
const devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
const hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: false,
heartbeat: 2000
})
// force page reload when html-webpack-plugin template changes
// currently disabled until this is resolved:
// https://github.com/jantimon/html-webpack-plugin/issues/680
// compiler.plugin('compilation', function (compilation) {
// compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
// hotMiddleware.publish({ action: 'reload' })
// cb()
// })
// })
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
let options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// serve pure static assets
const staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
const uri = 'http://localhost:' + port
var _resolve
var _reject
var readyPromise = new Promise((resolve, reject) => {
_resolve = resolve
_reject = reject
})
var server
var portfinder = require('portfinder')
portfinder.basePort = port
console.log('> Starting dev server...')
devMiddleware.waitUntilValid(() => {
portfinder.getPort((err, port) => {
if (err) {
_reject(err)
}
process.env.PORT = port
var uri = 'http://localhost:' + port
console.log('> Listening at ' + uri + '\n')
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
server = app.listen(port)
_resolve()
})
})
module.exports = {
ready: readyPromise,
close: () => {
server.close()
}
}

@ -0,0 +1,72 @@
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
//minimize: process.env.NODE_ENV === 'production',
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}

@ -0,0 +1,19 @@
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
}),
transformToRequire: {
video: 'src',
source: 'src',
img: 'src',
image: 'xlink:href'
}
}

@ -0,0 +1,75 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('src'),
}
},
module: {
rules: [
{
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter')
}
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
}
}

@ -0,0 +1,36 @@
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin()
]
})

@ -0,0 +1,124 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const env = config.build.env
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
// UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true
}
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vender modules does not change
new webpack.HashedModuleIdsPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig

@ -0,0 +1,7 @@
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})

@ -0,0 +1,42 @@
'use strict'
// Template version: 1.1.3
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
productionSourceMap: true,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
},
dev: {
env: require('./dev.env'),
port: process.env.PORT || 8080,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}

@ -0,0 +1,4 @@
'use strict'
module.exports = {
NODE_ENV: '"production"'
}

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>frontend</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,73 @@
{
"name": "frontend",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "Oleg Agapov <oleg@starcoders.com>",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"start": "npm run dev",
"build": "node build/build.js",
"lint": "eslint --ext .js,.vue src"
},
"dependencies": {
"axios": "^0.19.0",
"vue": "^2.6.10",
"vue-router": "^3.0.6"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^7.1.1",
"babel-loader": "^7.1.1",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^2.0.1",
"connect-history-api-fallback": "^1.3.0",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^3.0.0",
"eslint": "^3.19.0",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-html": "^3.0.0",
"eslint-plugin-import": "^2.7.0",
"eslint-plugin-node": "^5.2.0",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-standard": "^3.0.1",
"eventsource-polyfill": "^0.9.6",
"express": "^4.14.1",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"http-proxy-middleware": "^0.19.1",
"opn": "^5.1.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"url-loader": "^2.0.1",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": ">=3.3.2",
"webpack-dev-middleware": "^1.12.0",
"webpack-hot-middleware": "^2.18.2",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 4.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}

@ -0,0 +1,23 @@
<template>
<div id="app">
<img src="./assets/logo.png">
<router-view/>
</div>
</template>
<script>
export default {
name: 'app'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

@ -0,0 +1,5 @@
<template>
<div>
<p>About</p>
</div>
</template>

@ -0,0 +1,53 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<h2>Essential Links</h2>
<ul>
<li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
<br>
<li><a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a></li>
</ul>
<h2>Ecosystem</h2>
<ul>
<li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
<li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
<li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

@ -0,0 +1,43 @@
<template>
<div>
<p>Home page</p>
<p>Random number from backend: {{ randomNumber }}</p>
<button @click="getRandom">New random number</button>
</div>
</template>
<script>
import axios from 'axios'
export default {
data () {
return {
randomNumber: 0
}
},
methods: {
getRandomInt (min, max) {
min = Math.ceil(min)
max = Math.floor(max)
return Math.floor(Math.random() * (max - min + 1)) + min
},
getRandom () {
// this.randomNumber = this.getRandomInt(1, 100)
this.randomNumber = this.getRandomFromBackend()
},
getRandomFromBackend () {
const path = `http://localhost:5000/api/random`
axios.get(path)
.then(response => {
this.randomNumber = response.data.randomNumber
})
.catch(error => {
console.log(error)
})
}
},
created () {
this.getRandom()
}
}
</script>

@ -0,0 +1,5 @@
<template>
<div>
<p>404 - Not Found</p>
</div>
</template>

@ -0,0 +1,12 @@
import Vue from 'vue'
import App from './App'
import router from './router'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
render: h => h(App)
})

@ -0,0 +1,18 @@
import Vue from 'vue'
import Router from 'vue-router'
const routerOptions = [
{ path: '/', component: 'Home' },
{ path: '/about', component: 'About' },
{ path: '*', component: 'NotFound' }
]
const routes = routerOptions.map(route => {
return {
...route,
component: () => import(`@/components/${route.component}.vue`)
}
})
Vue.use(Router)
export default new Router({
routes,
mode: 'history'
})

76
myenv/bin/activate vendored

@ -0,0 +1,76 @@
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
deactivate () {
# reset old environment variables
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
PATH="${_OLD_VIRTUAL_PATH:-}"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r
fi
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "$1" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV="/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
if [ "x(myenv) " != x ] ; then
PS1="(myenv) ${PS1:-}"
else
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
fi
export PS1
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r
fi

@ -0,0 +1,37 @@
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv"
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
set _OLD_VIRTUAL_PROMPT="$prompt"
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
if ("myenv" != "") then
set env_name = "myenv"
else
if (`basename "VIRTUAL_ENV"` == "__") then
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
else
set env_name = `basename "$VIRTUAL_ENV"`
endif
endif
set prompt = "[$env_name] $prompt"
unset env_name
endif
alias pydoc python -m pydoc
rehash

@ -0,0 +1,75 @@
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
# you cannot run it directly
function deactivate -d "Exit virtualenv and return to normal shell environment"
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
set -gx PATH $_OLD_VIRTUAL_PATH
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
functions -e fish_prompt
set -e _OLD_FISH_PROMPT_OVERRIDE
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
end
set -e VIRTUAL_ENV
if test "$argv[1]" != "nondestructive"
# Self destruct!
functions -e deactivate
end
end
# unset irrelevant variables
deactivate nondestructive
set -gx VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv"
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
# unset PYTHONHOME if set
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# fish uses a function instead of an env var to generate the prompt.
# save the current fish_prompt function as the function _old_fish_prompt
functions -c fish_prompt _old_fish_prompt
# with the original prompt function renamed, we can override with our own.
function fish_prompt
# Save the return status of the last command
set -l old_status $status
# Prompt override?
if test -n "(myenv) "
printf "%s%s" "(myenv) " (set_color normal)
else
# ...Otherwise, prepend env
set -l _checkbase (basename "$VIRTUAL_ENV")
if test $_checkbase = "__"
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
else
printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
end
end
# Restore the return status of the previous command.
echo "exit $old_status" | .
_old_fish_prompt
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
end

@ -0,0 +1,11 @@
#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

@ -0,0 +1,11 @@
#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

11
myenv/bin/pip vendored

@ -0,0 +1,11 @@
#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

11
myenv/bin/pip3 vendored

@ -0,0 +1,11 @@
#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

11
myenv/bin/pip3.7 vendored

@ -0,0 +1,11 @@
#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

1
myenv/bin/python vendored

@ -0,0 +1 @@
python3.7

1
myenv/bin/python3 vendored

@ -0,0 +1 @@
python3.7

@ -0,0 +1 @@
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7

@ -0,0 +1,5 @@
"""Run the EasyInstall command"""
if __name__ == '__main__':
from setuptools.command.easy_install import main
main()

@ -0,0 +1,20 @@
Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file)
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

@ -0,0 +1,78 @@
Metadata-Version: 2.1
Name: pip
Version: 10.0.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: python-virtualenv@groups.google.com
License: MIT
Keywords: easy_install distutils setuptools egg virtualenv
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Build Tools
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*
Provides-Extra: testing
Provides-Extra: testing
Requires-Dist: pytest; extra == 'testing'
Requires-Dist: mock; extra == 'testing'
Requires-Dist: pretend; extra == 'testing'
Requires-Dist: scripttest (>=1.3); extra == 'testing'
Requires-Dist: virtualenv (>=1.10); extra == 'testing'
Requires-Dist: freezegun; extra == 'testing'
pip
===
The `PyPA recommended`_ tool for installing Python packages.
.. image:: https://img.shields.io/pypi/v/pip.svg
:target: https://pypi.org/project/pip/
.. image:: https://img.shields.io/travis/pypa/pip/master.svg
:target: http://travis-ci.org/pypa/pip
.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg
:target: https://ci.appveyor.com/project/pypa/pip/history
.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
:target: https://pip.pypa.io/en/latest
* `Installation`_
* `Documentation`_
* `Changelog`_
* `GitHub Page`_
* `Issue Tracking`_
* `User mailing list`_
* `Dev mailing list`_
* User IRC: #pypa on Freenode.
* Dev IRC: #pypa-dev on Freenode.
Code of Conduct
---------------
Everyone interacting in the pip project's codebases, issue trackers, chat
rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_.
.. _PyPA recommended: https://packaging.python.org/en/latest/current/
.. _Installation: https://pip.pypa.io/en/stable/installing.html
.. _Documentation: https://pip.pypa.io/en/stable/
.. _Changelog: https://pip.pypa.io/en/stable/news.html
.. _GitHub Page: https://github.com/pypa/pip
.. _Issue Tracking: https://github.com/pypa/pip/issues
.. _User mailing list: http://groups.google.com/group/python-virtualenv
.. _Dev mailing list: http://groups.google.com/group/pypa-dev
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/

@ -0,0 +1,580 @@
pip/__init__.py,sha256=IgfvBPgESEvKl_J7zm-RppLOZaMhirh4JiDSZV-HCco,24
pip/__main__.py,sha256=Rh5KFcZw82ZKcILJdoSeIv_dGdMww0FM1Ocj9zzU2pU,629
pip/_internal/__init__.py,sha256=h0icMQeJDPEUwN9d0nQDY_lQCygIvI6zvUhOg7h90Zs,8675
pip/_internal/basecommand.py,sha256=FlXB2xTq725sFwutRcNY3MWARRMmTJ5kM21Wss-Ba8g,14014
pip/_internal/baseparser.py,sha256=aX6GSSbH7ttoToso0HZg2Dhk1rMUqF5cBA5leEUEqIs,8764
pip/_internal/build_env.py,sha256=G0PPCOcslQ4b2NriSnBBFQkZUepD4TzJvNPbSNMnv_I,2773
pip/_internal/cache.py,sha256=gyZxE0dtVBQaWs3vt5eyLPjJF_KPg8mhPqxc8vowjsE,7023
pip/_internal/cmdoptions.py,sha256=sAalMay3GiDFkIXN_jQb1OChKlFxoySePz_80utMAno,16679
pip/_internal/compat.py,sha256=T9XXobaTlSnF57r913o1sDTWyMpNJnR7s7GvxgHKJI0,7912
pip/_internal/configuration.py,sha256=YIcGqy3YEc17PhjaRHoGbQumZsIXW9B1cMYfa3jOOIo,13330
pip/_internal/download.py,sha256=nFjVi42nF3LmGHBD158uk2724dBDvOh7mLd6ownaxUg,34257
pip/_internal/exceptions.py,sha256=U8EF9G6z62FA2XINXBe7Yg8yGBcf3CJD92s9VrWx84U,8470
pip/_internal/index.py,sha256=LZ00_ZTkvMXNbacLY-qMK-eBAP7GI2HB-RLx0fFWGoE,41718
pip/_internal/locations.py,sha256=bUbACpIX6FL_MTcFn7Vi1Wesxqc5TAnNBLcPXmDr6wc,6504
pip/_internal/pep425tags.py,sha256=d-MxINADjnVAOLFYbCCDac9g_AruL85uOabDnV840fM,11115
pip/_internal/resolve.py,sha256=7-UwudentwAU4WPOxXLXNzIIdnMVolvbCOB8IaIEYq8,13939
pip/_internal/status_codes.py,sha256=Yyjh7KoKMFzRF-kYDVkdWYP0gZaPaSskwwRIuqMHdc4,164
pip/_internal/wheel.py,sha256=pmdKiG6cKG3pjoQZTc-kA5kwKR56Ioj3Fdnf-R9KM20,31967
pip/_internal/commands/__init__.py,sha256=m3VffLjVOXGIR6utX9NXPxAHFzbYgH05IV01-zBlw8o,2297
pip/_internal/commands/check.py,sha256=J3lbjbwgMUS4dDsLnvDA4bJwtnAO-BDy2UA3qLXQPb4,1500
pip/_internal/commands/completion.py,sha256=wR1ZRBgHA1S7KnJWR6kGFL-Y1FnO1K0Xf_XBF3wUm_E,3018
pip/_internal/commands/configuration.py,sha256=BfeZEMSHgD4l754I2V00hS8ReEdutEGMcQaWKdtz2c0,7343
pip/_internal/commands/download.py,sha256=RLkyWbc9uw1iLGlR5KGPXgKXb1Wz6NM3kT9wUeQ89bM,9092
pip/_internal/commands/freeze.py,sha256=08R8n0lh-ZwD5lASiKJkKTkORFZSIHLvOSRznufWzRg,3320
pip/_internal/commands/hash.py,sha256=qKoCGvq6KuWrUFB63_1FGy4x2g044irk_ocC7lHafZM,1729
pip/_internal/commands/help.py,sha256=8frkEwpOOi7owyUIMyxN-r5EQkGxxOvOQ9aMCJmi9KA,1079
pip/_internal/commands/install.py,sha256=zqmxI_6bfLnwbteGFffqSSzNJxRhSCgVhh__PWFm6yY,20270
pip/_internal/commands/list.py,sha256=jIlRIPNIcr6gIuBXkyw6RevBlEThmlVW2Tp8kH9UpcM,11957
pip/_internal/commands/search.py,sha256=DthDK8pP6jZBqCVB9cT6SRzAYMeO3orjLiy_VBQ34g8,4842
pip/_internal/commands/show.py,sha256=bQvIXwdGv3teH9mDS8xOhsMOi0G5shC5g0ec1Jen4GU,6378
pip/_internal/commands/uninstall.py,sha256=0kFt2ShaTEFGmtbbOId9HKzXOI2645rS8y8YK_3Pmq0,2786
pip/_internal/commands/wheel.py,sha256=hWfSsII65HD3ZkjZ8SOPYg2adD5rX241gt2BzcbBDxg,6986
pip/_internal/models/__init__.py,sha256=h9ecr0egfOgSwbvfj9VBln71JazHbu-uR_sUEYq5K-o,85
pip/_internal/models/index.py,sha256=lyGdfJJRWktK_yYw7JsDnG7sURh5UJHOmc3Y29qopms,433
pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_internal/operations/check.py,sha256=X_-sP0QUNSknCEUqmKI2ZMfO1L9Igi6m24_V2H64zqU,3776
pip/_internal/operations/freeze.py,sha256=myl8xl9SwJowX-fUYjeP2vQ7y1Y7bWoNM9U0g46AATI,10277
pip/_internal/operations/prepare.py,sha256=7-7iMRirq4PU9e5JFLPfRZ-S2Ns0lAPjRo63VDil7dM,15496
pip/_internal/req/__init__.py,sha256=r8dLbzoGMf-kLQVmZD8w7Ekh7Qh8tbZMNsSQnk_agrg,2152
pip/_internal/req/req_file.py,sha256=TkrIqOaMok_8tNs3HPSDVmBW-Awdpj7mBhGlsRHIByA,12248
pip/_internal/req/req_install.py,sha256=jmPY2CB2dpkVWdl3ucTajTfIJBOMe80SeGZJju3qzLs,43930
pip/_internal/req/req_set.py,sha256=c-STvuL06rzHqOMJOovMinuWeT-7XZnl1XtdbSAi_6E,7268
pip/_internal/req/req_uninstall.py,sha256=5dOiMppROHiQ5bVO9ydLgOppqLpSpipL22IZvq8mZOk,17002
pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_internal/utils/appdirs.py,sha256=BRHuV2oKQwXqXxKn_mDADgadzDGOXRlL9IWQ8YePds8,9372
pip/_internal/utils/deprecation.py,sha256=nXr5A3qXJw9qw40zHd3sPqAEeuk1pNM7ujmjU_GA0ZM,2374
pip/_internal/utils/encoding.py,sha256=w-LGqMBuaXKmbiyfjrvkZPRlRMrcOwHwawcX4cUmZWA,1058
pip/_internal/utils/filesystem.py,sha256=_8Es0meQBRDb_56ViTGlHucXOhsXJh8J38QJglgm9Gg,937
pip/_internal/utils/glibc.py,sha256=TkIgCmg4VaYiN1764-9YBAPKOaHZyRTclwI-rYnx3VE,3088
pip/_internal/utils/hashes.py,sha256=fvTpLRakvChw5UbYerszdg3KK0KImwQWddZAHDmhnFI,2994
pip/_internal/utils/logging.py,sha256=5exO6tVvea_EsPk-SN6lawgbpmXopJDecYnt5AonGWs,3586
pip/_internal/utils/misc.py,sha256=VwQjWHOAA9MuD_dFQZ35TorMs7iNep1W68IURqyAsJQ,28053
pip/_internal/utils/outdated.py,sha256=4Gk5M1ciDGSW-teJe2sSO5bk_eGMLTR7YipX47-wllU,5951
pip/_internal/utils/packaging.py,sha256=EqCvwBiNqWvqNIbMYsOXKVCQWShjREN1ugQJFuJtMsk,2347
pip/_internal/utils/setuptools_build.py,sha256=HeJI9JPWldoZ8aznrqUDM8yajM6Cb4lWcP5a1-ITlZY,286
pip/_internal/utils/temp_dir.py,sha256=QQIQxk2JtywkkzIWZl6AgerRzBS8avWCrgqoNw3ZvzE,2697
pip/_internal/utils/typing.py,sha256=Qbt5MzIla2cXbfiqkgevVtj9iICLkG2Km_wVFUcdeGo,1144
pip/_internal/utils/ui.py,sha256=YejN0-Wnw-Wxrcncfuroo8gxzQxZ8D8UR-Yw3kM9ebY,14058
pip/_internal/vcs/__init__.py,sha256=DuVrznP2Byzvn-MQfJFMJq6J8wbO13djSGtl17CCUIw,15755
pip/_internal/vcs/bazaar.py,sha256=ns_yLoGvxfjZGLPB9EnduES29HgkdIUpD0PumZFFrys,3848
pip/_internal/vcs/git.py,sha256=wltK2rdQgmAH2fOLIYlZJKG020vkV_51E9-XoTxi_GU,11743
pip/_internal/vcs/mercurial.py,sha256=QLDVwNNqZBmFUehgqdnkmHXYuS1uM4Y-BhwIN-NZKxA,3708
pip/_internal/vcs/subversion.py,sha256=yDl4-9akhvT5vOikcyLIrG-id7dNu175slw8nlKNjaA,9826
pip/_vendor/__init__.py,sha256=WzUY8TjsL8huF2bvDmJ0jJaZZqHYFWBR59W-jIMhmZY,4841
pip/_vendor/appdirs.py,sha256=FP--W5qMHqF69_aVHkK86rahEMqjx9bGMthBtop4o7Q,25151
pip/_vendor/distro.py,sha256=3629Gq_vpInTGR9r3JOFYZe0NNXIYLR36EB1r7KKZWo,40565
pip/_vendor/ipaddress.py,sha256=pQLwJp-Y6fejIsVhu4AtzGb0sWT9VQ3IJ6CVHc0xiLQ,82271
pip/_vendor/pyparsing.py,sha256=lVzkkak4qOnUwe9UdXqAh38yMKQ_JJir3cyvWC3-4Co,231068
pip/_vendor/retrying.py,sha256=LfbAQSee7r9F4SHbBcI1OBu7OLSDDr04Qsw9zkuC0Jw,10239
pip/_vendor/six.py,sha256=AlC1P9p2M-P18p0YMxuf2K9ZUOJDlDTV7XOT4j-UdE0,31779
pip/_vendor/cachecontrol/__init__.py,sha256=uceTzGAT6-yqquMtT1VM0v442Oepfjh3UayG2elwiTA,313
pip/_vendor/cachecontrol/_cmd.py,sha256=wmV963nAqd798iZV4mAOFVflVMb24PQyor7yaUY18-8,1380
pip/_vendor/cachecontrol/adapter.py,sha256=mjwrhPJ93xdX71vrNfbvuQ1qHMsuU6moqw6z6l7USrw,5156
pip/_vendor/cachecontrol/cache.py,sha256=zoR7ySiJAw1fErdOCFAiMXTT8Ym4_w-qYd5sxmWbgIM,829
pip/_vendor/cachecontrol/compat.py,sha256=3BisP29GBHAo0QxUrbpBsMeXSp8YzKQcGHwEW7VYU2U,724
pip/_vendor/cachecontrol/controller.py,sha256=kPPbgL2TSCSX8D9PNKpKaRpYiBobf3e4GtICbPHKnM4,14232
pip/_vendor/cachecontrol/filewrapper.py,sha256=VHFoFNSCKbMSYMEoFqzq2Fb1QJ--n8S-zf2vPHIm4z0,2609
pip/_vendor/cachecontrol/heuristics.py,sha256=ZVGTWaBSoERb4v7b7_72RCdWgcJ2NhH-8UJxKWuWQL8,4282
pip/_vendor/cachecontrol/serialize.py,sha256=tENdPZInXRYmFwtmMg80WKTTTfhqYQSBogHzwPfbCnM,7249
pip/_vendor/cachecontrol/wrapper.py,sha256=T0xfnMREVtxouHnjZ3Tutgni3dh7KZUwkCgF5lnxVqM,781
pip/_vendor/cachecontrol/caches/__init__.py,sha256=rN8Ox5dd2ucPtgkybgz77XfTTUL4HFTO2-n2ACK2q3E,88
pip/_vendor/cachecontrol/caches/file_cache.py,sha256=XQ9Jx6toKoWVyvX8gVQy2TO_RaxBZ84lItIcaxgUeBA,4202
pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=KhAFz-jv40vlQz8wOJFjH_4ZkOCGZ57ltrS6a55V30Y,1145
pip/_vendor/certifi/__init__.py,sha256=y0h3xfIlqLlYBlOUNZX0VVt8Kim1ZOLnNjjnW5TsLVI,66
pip/_vendor/certifi/__main__.py,sha256=1KEP4dm8_1Xrt08ozOzq9-Ibu3vRX4Ix5qJhUphBz_8,43
pip/_vendor/certifi/cacert.pem,sha256=7CEXfLHxDwvDpwVu0y_2lfJYk63cU-KUKI_DL1Lq8Uo,271088
pip/_vendor/certifi/core.py,sha256=ZwgmmJFMPi1askRkL5S7Rt4SvZnK34AQDItgsuVDHaY,873
pip/_vendor/chardet/__init__.py,sha256=4IALi1GamO36WXX5HGuw8nq5kZAUvbbz_mfZ3o4Vi6Q,1598
pip/_vendor/chardet/big5freq.py,sha256=dwRzRlsGp3Zgr1JQSSSwnxvyaZ7_q-5kuPfCVMuy4to,31640
pip/_vendor/chardet/big5prober.py,sha256=TpmdoNfRtnQ7x9Q_p-a1CHaG-ok2mbisN5e9UHAtOiY,1804
pip/_vendor/chardet/chardistribution.py,sha256=NzboAhfS6GODy_Tp6BkmUOL4NuxwTVfdVFcKA9bdUAo,9644
pip/_vendor/chardet/charsetgroupprober.py,sha256=ft0AbLXJbzf4H8ZFQGs9JruhyIYNbcCayiOKt7keX4U,3893
pip/_vendor/chardet/charsetprober.py,sha256=kk5-m0VdjqzbEhPRkBZ386R3fBQo3DxsBrdL-WFyk1o,5255
pip/_vendor/chardet/codingstatemachine.py,sha256=qz9ZwK1q4mZ4s4zDRbyXu5KaGunYbk7g1Z7fqfb4mA4,3678
pip/_vendor/chardet/compat.py,sha256=fzrojuU_eJuG1DGfZUqZC0H-13rCKdB0Dp4Msry45Kk,1168
pip/_vendor/chardet/cp949prober.py,sha256=5NnMVUcel3jDY3w8ljD0cXyj2lcrvdagxOVE1jxl7xc,1904
pip/_vendor/chardet/enums.py,sha256=3H_EIVP-VUYOdKqe2xmYdyooEDSLqS8sACMbn_3oejU,1737
pip/_vendor/chardet/escprober.py,sha256=5MrTnVtZGEt3ssnY-lOXmOo3JY-CIqz9ruG3KjDpkbY,4051
pip/_vendor/chardet/escsm.py,sha256=xQbwmM3Ieuskg-Aohyc6-bSfg3vsY0tx2TEKLDoVZGg,10756
pip/_vendor/chardet/eucjpprober.py,sha256=PHumemJS19xMhDR4xPrsvxMfyBfsb297kVWmYz6zgy8,3841
pip/_vendor/chardet/euckrfreq.py,sha256=MrLrIWMtlaDI0LYt-MM3MougBbLtSWHs6kvZx0VasIM,13741
pip/_vendor/chardet/euckrprober.py,sha256=VbiOn7_id7mL9Q5GdeV0Ze3w5fG0nRCpUkEzeR-bnnY,1795
pip/_vendor/chardet/euctwfreq.py,sha256=ZPBIHZDwNknGf7m6r4xGH8bX0W38qBpnTwVVv1QHw_M,32008
pip/_vendor/chardet/euctwprober.py,sha256=hlUyGKUxzOPfBxCcyUcvRZSxgkLuvRoDU9wejp6YMiM,1793
pip/_vendor/chardet/gb2312freq.py,sha256=aLHs-2GS8vmSM2ljyoWWgeVq_xRRcS_gN7ykpIiV43A,20998
pip/_vendor/chardet/gb2312prober.py,sha256=msVbrDFcrJRE_XvsyETiqbTGfvdFhVIEZ2zBd-OENaE,1800
pip/_vendor/chardet/hebrewprober.py,sha256=r81LqgKb24ZbvOmfi95MzItUxx7bkrjJR1ppkj5rvZw,14130
pip/_vendor/chardet/jisfreq.py,sha256=vrqCR4CmwownBVXJ3Hh_gsfiDnIHOELbcNmTyC6Jx3w,26102
pip/_vendor/chardet/jpcntx.py,sha256=Cn4cypo2y8CpqCan-zsdfYdEgXkRCnsqQoYaCu6FRjI,19876
pip/_vendor/chardet/langbulgarianmodel.py,sha256=5lclhylDVAOLeJHlnOm69zrxCLkyDMjQIQU6VBQZDXM,13067
pip/_vendor/chardet/langcyrillicmodel.py,sha256=UrFtQKuen6p_BkTB--vJ0gL70i0I68heaU7dyvocIBo,18281
pip/_vendor/chardet/langgreekmodel.py,sha256=qC6d4lhMPrMvg0-4jJjcbq4mAITzg13nTcQcSHPgNLQ,12913
pip/_vendor/chardet/langhebrewmodel.py,sha256=NOVTSRijKrUxo-n5Ums6HIbnG0rVP6cz6DfgqQ8x5JY,11545
pip/_vendor/chardet/langhungarianmodel.py,sha256=ODhhGyhBUyB-Idb-PPKMdOx8j6D-i08Uih3tUMCGYEU,12817
pip/_vendor/chardet/langthaimodel.py,sha256=konL5O3RkhYg8eP__wo2KS_8b5xW-NSkC2YKrHdEyoA,11489
pip/_vendor/chardet/langturkishmodel.py,sha256=zuXKW-cDnX07Pfxe_uGDg4GRW2atWo0-Y3S9gLW5tJs,11295
pip/_vendor/chardet/latin1prober.py,sha256=s1SFkEFY2NGe2_9bgX2MhOmyM_U_qSd_jVSdkdSgZxs,5515
pip/_vendor/chardet/mbcharsetprober.py,sha256=hzFVD-brxTAVLnTAkDqa1ztd6RwGGwb5oAdvhj1-lE8,3504
pip/_vendor/chardet/mbcsgroupprober.py,sha256=DlT-X7KRUl5y3SWJNqF1NXqvkjVc47jPKjJ2j4KVs3A,2066
pip/_vendor/chardet/mbcssm.py,sha256=LGUDh1VB61rWsZB4QlJBzaCjI2PUEUgbBc91gPlX4DQ,26053
pip/_vendor/chardet/sbcharsetprober.py,sha256=Mo5ei_pFbGUi2iU_mu_z7nhvoT57BAz4ArB2sU-5Brc,5789
pip/_vendor/chardet/sbcsgroupprober.py,sha256=8QJNorUc5Kf7qY5kA0wFx6VjehbF9czir_YwqnPAFKM,3619
pip/_vendor/chardet/sjisprober.py,sha256=1WGev_SSHpa7AVXmM0DIONl1OvyKc8mdydUNaKtGGNI,3866
pip/_vendor/chardet/universaldetector.py,sha256=QWmEZZ5YGLjgW0IHL99GH8sAz0-Ss0_hlMZvaiyWVdY,12771
pip/_vendor/chardet/utf8prober.py,sha256=rGwn69WfIvmibp0sWvYuH_TPoXs7zzwKHTX79Ojbr9o,2848
pip/_vendor/chardet/version.py,sha256=tlfcQ3YlTcJAVNI1yBvSZRc0x89mVEBc3KzvRNlNLYU,251
pip/_vendor/chardet/cli/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
pip/_vendor/chardet/cli/chardetect.py,sha256=jRgVc5dO4Q1XEu8U4hW1JgF7jSMpKpFSbcNUerja-tc,2859
pip/_vendor/colorama/__init__.py,sha256=whcPsYXKzF0-MPCAz-vZ6Zd47N3WsHRyiAL1fKXqywk,247
pip/_vendor/colorama/ansi.py,sha256=ch3DG2AkcsfuoL9pbb2wWbDSPa9XKdJOG2hcvWlcoRo,2626
pip/_vendor/colorama/ansitowin32.py,sha256=JPr6ygKbsdEf6kiD451CKNmsCv5mynro0wvqx3MVEdE,9904
pip/_vendor/colorama/initialise.py,sha256=RoreuRuUDL2tOM_9lgS2jCwTe_7MJgivNnKBqSqOWH8,1999
pip/_vendor/colorama/win32.py,sha256=VKw0bstCPxo8cuzuzqd8rwcSAqsg-XGTQhjQ-i2yLYg,5582
pip/_vendor/colorama/winterm.py,sha256=HLWnoOYgZoV0k3ierZVLjalxIAnnKRZOpMYdnw1mJyY,6452
pip/_vendor/distlib/__init__.py,sha256=qqL7IwXhPX99TEn0ZZViD-qGbtWQt6tQMEvHAvEZnp4,604
pip/_vendor/distlib/compat.py,sha256=bt1NmKYnjqXNL1H7wZvQvxa6un7bNkzGaWAL20zTNeg,42524
pip/_vendor/distlib/database.py,sha256=YM136SthxK27i3BnN7lZnGz9ojYbE-fpbb0XPO60PBY,52204
pip/_vendor/distlib/index.py,sha256=e7NL77TofD_nGakAUpuGEYBZ0mQrIFCwlk6O9NYNGgc,21589
pip/_vendor/distlib/locators.py,sha256=SbcWC4i_dMZdsyd6bkJJxrK4LyEvGnLWGOoqIe_EX0Y,52949
pip/_vendor/distlib/manifest.py,sha256=0TlGw5ZyFp8wxr_GJz7tAAXGYwUJvceMIOsh9ydAXpM,15204
pip/_vendor/distlib/markers.py,sha256=k4Fx6LHfaIaX1eOIoaWK_-o-zE8zoT5rXwb6mbnLoXk,4518
pip/_vendor/distlib/metadata.py,sha256=3UhLlEcPqM04S0V8ErkpB-BtB9y9KRzo9Y7wOJ0gN8g,41077
pip/_vendor/distlib/resources.py,sha256=5Xn4ehSMQKsu6kf4gxIsMvy668RRvtL0XwUPytyviPE,11121
pip/_vendor/distlib/scripts.py,sha256=HQWiNeLsOTvlPV_oXYWWEmcYkB2JWUfd_uvFwsdUs0E,17000
pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672
pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400
pip/_vendor/distlib/util.py,sha256=001EgqgtSL4OyKcBUEuXw2MHWhvywa-dok37oco2meE,61249
pip/_vendor/distlib/version.py,sha256=tFjbWEAxyeCDw0dWQDJsWsu9EzegUI5Yhm3IBu2x8hY,24127
pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088
pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328
pip/_vendor/distlib/wheel.py,sha256=UjFZFgLgwR93x2w94eT5sdE0RlFysONrqTxxEabvAaA,40490
pip/_vendor/distlib/_backport/__init__.py,sha256=XkACqtjaFfFn1QQBFDNxSqhMva0LqXeeh6H3fVwwLQ4,280
pip/_vendor/distlib/_backport/misc.py,sha256=focjmI7975W3LgEtiNC99lvxohfZdsNSLTakOcPNShs,1012
pip/_vendor/distlib/_backport/shutil.py,sha256=5fh9dIYeC0kn_dJ0aPmf9LD-KBIrb5Ls8BLvpEQFanY,26408
pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=LoipPkR2PfCKC7JUQBGxp6OFVlWIiWBXT-rNuzv8acU,2701
pip/_vendor/distlib/_backport/sysconfig.py,sha256=Aim_2sc3NKNpn2jhcs11eYutzCaHoP0mprxZRw7901Q,27752
pip/_vendor/distlib/_backport/tarfile.py,sha256=fzwGLsCdTmO8uzoHjyjSgu4-srrDQEAcw4jNKUfvQH0,95235
pip/_vendor/html5lib/__init__.py,sha256=I6pIlbwpm1kWyTxyN75xY1k39xbQbB9594RG482qMkw,1197
pip/_vendor/html5lib/_ihatexml.py,sha256=57rnJVn6e6coDPaWi2mPaOx90vZBbeczq2WhvFswNjc,16993
pip/_vendor/html5lib/_inputstream.py,sha256=FWkYxymJwSdbgvSD30q7A_PUF8Ux9ieL7XrYyNa7JV4,33475
pip/_vendor/html5lib/_tokenizer.py,sha256=CC6FQW_g5TYQ3x0_Qv7LnX2EN5bDkyCtnbdHRFNpcfI,78301
pip/_vendor/html5lib/_utils.py,sha256=iDaIb_kEGHMmStFSqI7-VNMWFeJ2M_s5RRDTi0x3xV0,4139
pip/_vendor/html5lib/constants.py,sha256=mch2PjgQKA1FDLxUsE3hBSnehEiK7CFJqLX90RDoeUM,86465
pip/_vendor/html5lib/html5parser.py,sha256=a-ma5DCah-z2FAMv5Kitpvv8VTEl2DmfWQMEBhCAN2M,121754
pip/_vendor/html5lib/serializer.py,sha256=lo3hpkSIelyAIpYUvV9942iVtTBvOBFn44kOY5Aki40,16167
pip/_vendor/html5lib/_trie/__init__.py,sha256=d3JrXCIMoiedbsVrNTzuc9F1bcuxW3u9Fk2k_vYsqgE,303
pip/_vendor/html5lib/_trie/_base.py,sha256=zBZ77JleT-kocEBTgqPAsABXr2bWyTMmc-qFfDLh6zM,967
pip/_vendor/html5lib/_trie/datrie.py,sha256=HqcJwB9Qd0n1GTg2diREOpricdMdGy_x7AEMZ7fZ494,1222
pip/_vendor/html5lib/_trie/py.py,sha256=LmuYcbypKw-aMLcT0-IY6WewATGzg1QRkmyd8hTBQeY,1842
pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=0TV6VWJzhNkcLFiR7BNZUJsTJgAEEyZ02in6-PuL2gU,948
pip/_vendor/html5lib/filters/base.py,sha256=6D2t423hbOLtjnvAAOrs1mWX1vsabMLBrWQF67ITPho,298
pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=J-W5X3LyosH1sUipiHU1x-2ocd7g9JSudpIek_QlCUU,3018
pip/_vendor/html5lib/filters/lint.py,sha256=O6sK29HXXW02Nv-EIEOfGvdQMuXxWvBePu2sQ2ecbJc,3736
pip/_vendor/html5lib/filters/optionaltags.py,sha256=IVHcJ35kr6_MYBqahFMIK-Gel-ALLUk6Wk9X-or_yXk,10795
pip/_vendor/html5lib/filters/sanitizer.py,sha256=UKpPV0sataiAlCrJqhO_nsVJklP95_ZeV9F-NWFhJl8,27144
pip/_vendor/html5lib/filters/whitespace.py,sha256=bCC0mMQZicbq8HCg67pip_oScN5Fz_KkkvldfE137Kw,1252
pip/_vendor/html5lib/treeadapters/__init__.py,sha256=76InX2oJAx-C4rGAJziZsoE_CHI8_3thl6TeMgP-ypk,709
pip/_vendor/html5lib/treeadapters/genshi.py,sha256=nQHNa4Hu0IMpu4bqHbJJS3_Cd1pKXgDO1pgMZ6gADDg,1769
pip/_vendor/html5lib/treeadapters/sax.py,sha256=PAmV6NG9BSpfMHUY72bDbXwAe6Q2tPn1BC2yAD-K1G0,1826
pip/_vendor/html5lib/treebuilders/__init__.py,sha256=zfrXDjeqDo2M7cJFax6hRJs70Az4pfHFiZbuLOZ9YE4,3680
pip/_vendor/html5lib/treebuilders/base.py,sha256=0eFyXVYMz-T5N2CvlteLdu9oFi8Vr_fzHh_sVlf1bn0,14996
pip/_vendor/html5lib/treebuilders/dom.py,sha256=t8MSFOSsFZwZuBpziGKBb-lmiqOUHXoAZx35qG4mG7Q,9071
pip/_vendor/html5lib/treebuilders/etree.py,sha256=7h-CRMmkQ4V2jlcJvPYfBFeYyBZ1zViTxyqyZ7isu5Y,13104
pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=umqJTOUZWm7r0s-YtD5q6SkSqx0GobwVKQoVQf9OYaQ,14488
pip/_vendor/html5lib/treewalkers/__init__.py,sha256=GmI7wgPftMdv1QD7zgnQ9B7Gl-uq6hwE4A79zkxj7gw,5868
pip/_vendor/html5lib/treewalkers/base.py,sha256=g-cLq7VStBtpZZZ1v_Tbwp3GhJjQ2oG5njgeHVhAaXE,7728
pip/_vendor/html5lib/treewalkers/dom.py,sha256=fBJht3gn5a6y1WN2KE9gsUru158yTQ0KikT3vOM7Xc4,1456
pip/_vendor/html5lib/treewalkers/etree.py,sha256=VuzZ0UoL2bBvTqhsFIDzUUaZ4zVtm5TLpA2YZXjeoJE,4680
pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=tfNrv3kswPqAaggOB-2dlb-1qCwtUIR80gNDrysrQYI,6522
pip/_vendor/html5lib/treewalkers/genshi.py,sha256=P_2Tnc2GkbWJfuodXN9oYIg6kN9E26aWXXe9iL0_eX4,2378
pip/_vendor/idna/__init__.py,sha256=_0n4R0OXufy1HIcXEOxgJCUCHGDqtazhMdYBVIXc320,60
pip/_vendor/idna/codec.py,sha256=NDQdy95NUcd00WV5Qh0QOpZvYJzIpaMVb9ME0hKuQ80,3417
pip/_vendor/idna/compat.py,sha256=QPaSi9bWqUO7OAXmC0brJFYc1zweHI3JnA7HiM2BlQA,244
pip/_vendor/idna/core.py,sha256=h71HqE4Uatoa0tuv4ZLcGQkGsiio2YFM5eMoFP49Ucw,11777
pip/_vendor/idna/idnadata.py,sha256=QzJoJWVfKZz9lmbSL352eQ-aAz8wWV1Mmle_xpHWwQo,34584
pip/_vendor/idna/intranges.py,sha256=K5VTgP3Cn6UOQwinqj0O2stySFQoTb8xrLFKyg-hulg,1802
pip/_vendor/idna/package_data.py,sha256=8oZdkdEfFSvy0GFwp7FEW2c8LYizacCoMxJ1kOfiaK4,23
pip/_vendor/idna/uts46data.py,sha256=NiMrqRILhA-TY24j9FSrKHTbAImnH6XNYjr3e3CuK28,192578
pip/_vendor/lockfile/__init__.py,sha256=0L3coX3n75LdlVoaqx7miFcPQu8QkK96tNBj3l3G0To,9718
pip/_vendor/lockfile/linklockfile.py,sha256=KSuiHUZTLHZA21uINfNp6u3hmf2oPbZICJqMtBE5psQ,2725
pip/_vendor/lockfile/mkdirlockfile.py,sha256=fhUNnWvRrWFuUoFTAR_u6rKUPD3LcnC8gsNAVPOuP_A,3180
pip/_vendor/lockfile/pidlockfile.py,sha256=T4s8zw9w50AcRIP24iNQDMW72lqwOemY3WjzxObi3RU,6280
pip/_vendor/lockfile/sqlitelockfile.py,sha256=EsQuCc7jY2OkxH_VtTcVvMmh0WqM4t5THW8YTAKwMQE,5662
pip/_vendor/lockfile/symlinklockfile.py,sha256=z1OZoyjGaSRhHdvY1P3fnFJnMMzlAkVUqtuMXS9r-58,2686
pip/_vendor/msgpack/__init__.py,sha256=zR7vdPYrBXCdepgdVJ2QfmRZRSIY6mSgWR80n69hDas,1743
pip/_vendor/msgpack/_version.py,sha256=POm-iSTNxNW5sad41qA2730FUnysX8YK355itzer7W4,21
pip/_vendor/msgpack/exceptions.py,sha256=RyRn_K51HUOdHHqj009FJX1GNG53zXXgDJoKP2VHj4I,1097
pip/_vendor/msgpack/fallback.py,sha256=OBhNyNg9w0WLlohyc-cIOOrkvxtm4yCqqynrRCNZdgY,37388
pip/_vendor/packaging/__about__.py,sha256=odsXiEJE2jtkyh_shxz3_7OatrWwz-_gIGamccRsga4,741
pip/_vendor/packaging/__init__.py,sha256=C3OqRc9ZY_RX9Xqn9bEUNGPWZfHYn2jma09g56Vm5zc,527
pip/_vendor/packaging/_compat.py,sha256=SGlGKDzqD3XlaWy8KpxqFpno7iL89C2DXbbS74KTFtY,890
pip/_vendor/packaging/_structures.py,sha256=fUkh4B9_x5gvKZ2upn4d6OWyaknJHS5MADtTB6NvxYY,1488
pip/_vendor/packaging/markers.py,sha256=oWCQ3Gnu_1i2brmgB9IjRuLX7BR0FXW5T4LAVdE590w,8522
pip/_vendor/packaging/requirements.py,sha256=NjxC5jc8R-REVY9b7wKUVkfEvI6WnHZXUGuA2BX0aNM,4571
pip/_vendor/packaging/specifiers.py,sha256=IuuvPJWMU5P8BF39wP1YEHqmreWOVT6jpv7ktpAJC6E,28800
pip/_vendor/packaging/utils.py,sha256=NWMGNYzo1QNuzvCq3aSJrTNvZRya6pWIjwJLbN6OHOI,1643
pip/_vendor/packaging/version.py,sha256=n1XXikr4f8Qhn60lLZf7IBjdLRXFC3RMCWVSMKdMX1c,12660
pip/_vendor/pkg_resources/__init__.py,sha256=pHrCKMoBv2wg1sJnvFoA5OLo-Oy8Vy2RWaPzrLUp9vA,106604
pip/_vendor/pkg_resources/py31compat.py,sha256=Z-1_GSMguagCRvkGzDS-JCl_WVMkKsXss8ZTujmDu7Q,622
pip/_vendor/progress/__init__.py,sha256=xAeSvVj-sqgxs5EQ9QQrc9Bi8dRSrrgkO9kKH1cU7zc,3315
pip/_vendor/progress/bar.py,sha256=mTafSoOmjwpjoPbMp1iUGpNb-39esXByST7J2W8VyV4,2924
pip/_vendor/progress/counter.py,sha256=JAtmG0NSbHwcfUoC6qP_MqfnEcPRgoO-qD1c1PJDIHM,1576
pip/_vendor/progress/helpers.py,sha256=kzd7NtwigwIqvhYQvtTh8mSQUiFZ0bkIWh0WHJ7fQPY,2945
pip/_vendor/progress/spinner.py,sha256=yrYKBBsswArohmg7esPBKFiPvGsisEa6DJqrEYYuHuA,1483
pip/_vendor/pytoml/__init__.py,sha256=PLFK235q-7F9Mmelsr_7IcAIWebDo3W9Hq_T1Vz54KA,95
pip/_vendor/pytoml/core.py,sha256=W8BqMPwcme5HkPBtxkQz9VJBvhkrELje94Dh1iUfFaI,522
pip/_vendor/pytoml/parser.py,sha256=awre-bIQXv0-gUYWzHaGO2diB7b3JNoH9ryJR3gh498,10916
pip/_vendor/pytoml/writer.py,sha256=nf-DAzJl_-rXx2-ElWbUyOqyz5vhe8U1nfVzw9J5N2s,3942
pip/_vendor/requests/__init__.py,sha256=VaN258Yd3AsoxqDFQPEdD7fbQxWmHJ-QJDKnVpaWBlc,3765
pip/_vendor/requests/__version__.py,sha256=55GrYwgz00HNchocTGNgu0C45FFSIGvt6bG03JxdI54,450
pip/_vendor/requests/_internal_utils.py,sha256=zDALdxFfs4pAp4CME_TTw2rGyYR2EGBpSehYHgfn8o0,1138
pip/_vendor/requests/adapters.py,sha256=v99RMxr14jFWuJDjJx1wFy48QLVyatYVn0h6z_7h9ss,21541
pip/_vendor/requests/api.py,sha256=MLNvyq433Usebv0qJ3iqPyWw7EaRXvP0AA3EhP69u6Q,6389
pip/_vendor/requests/auth.py,sha256=oiFJBIY2TLaRS9Q5tqhX864xwSg700d0NqjHe4PXL6M,10021
pip/_vendor/requests/certs.py,sha256=fFBPJjnP90gWELetFYPbzrsfZgSZopej7XhlkrnVVec,483
pip/_vendor/requests/compat.py,sha256=RXnp8IWkk9x0WI01rpmDgbRke38K4C2m07gKE3_o-Qo,1943
pip/_vendor/requests/cookies.py,sha256=RZsnbFuCZbg9_x2kUqG-LxE6ag_o3P7qutTGDPJ2tXY,18750
pip/_vendor/requests/exceptions.py,sha256=MgjuNuYzlEaQSr0gYcZsrHOQS94DioiN-tNjJetz90g,3237
pip/_vendor/requests/help.py,sha256=UzahIUhIPZsrHUdN7s7i6npseJyBkFhk14Rniid4yS0,3787
pip/_vendor/requests/hooks.py,sha256=O6Bq6nBlEOvESY9vNYI8XxPZcr8j7rpW63TaIGYS6ZE,801
pip/_vendor/requests/models.py,sha256=KcMA_uvBv1ob02OUHZk-HEpbo-G0JUWn6hr9GIs9nbg,35016
pip/_vendor/requests/packages.py,sha256=ry2VlKGoCDdr8ZJyNCXxDcAF1HfENfmoylCK-_VzXh0,711
pip/_vendor/requests/sessions.py,sha256=YLbQOFObuQWJ8uJGgncMsYWcBqueRGWqaSxl8qiLK3I,28283
pip/_vendor/requests/status_codes.py,sha256=qcAG-f5Aty7LBfAIetNch3iSFxy-lHNnpxjK089KwaI,3414
pip/_vendor/requests/structures.py,sha256=fyd9UjYd61TU-xNlsIzswA6TA0hFbWQz4RLhPnhXwh0,3117
pip/_vendor/requests/utils.py,sha256=tRCh5BKG0mV_EmRe-9apaMLvP6LLmyZt6KGfpRvmnQY,28556
pip/_vendor/urllib3/__init__.py,sha256=eUbFXyueA6UDT6UhLW4bKRzwwUMAMij3ngS_-1YyIyk,2950
pip/_vendor/urllib3/_collections.py,sha256=SOoOxhnf3qV7bjT8euFfaf0XmGG7D9TDMt_0K1WyfKo,10523
pip/_vendor/urllib3/connection.py,sha256=s5mL_MPFMgVm0p12dmPSEB3k6wNDqJjURvXVBKtAatk,13376
pip/_vendor/urllib3/connectionpool.py,sha256=FCbqrfrpOwxUGSb1Vb5MT9__t_faupuOzap6RGz2YNY,36263
pip/_vendor/urllib3/exceptions.py,sha256=Thyo48MhmG_I3N7pYlFklWrScB3BL_JaWqOdE_TTw2w,6849
pip/_vendor/urllib3/fields.py,sha256=Z4nrtz2cAM-CoOFzeiapbEUhWQb6UF27mLlMZ9ixvjo,6121
pip/_vendor/urllib3/filepost.py,sha256=LADqnU5Cv7kE-IbXHshOL8w9ELTB9T3v7BTOHPs6Hzk,2415
pip/_vendor/urllib3/poolmanager.py,sha256=jbIvksgTNHsFsppt7Gc3ONaodf1HbeYgw2hluocBiak,16785
pip/_vendor/urllib3/request.py,sha256=igm_4K9Pl5m4s4UDTZhykIEiCH1XJjwwCM7utw-pldE,6094
pip/_vendor/urllib3/response.py,sha256=Au8uQnlOaxnmCDE0xqjGs0c225ctF6A4q9-sh-Fercc,23529
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/urllib3/contrib/appengine.py,sha256=kxXiAF8woZVVw4UoeDueqZTzQaFuxZAE9vcUhL2DX3o,11185
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=YPml98tDEed6IB4zJinHz9s8Pml_tQwET3MMQQJlMvY,4590
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=_eNGwUSOGQ0gH42vKKzbXH6lSNVR0WdlGjw6_CYqW-Q,15826
pip/_vendor/urllib3/contrib/securetransport.py,sha256=2kMhRPWPSMHW1LMF3cNlP5Bma25ang52aLc5G4Dqsps,31311
pip/_vendor/urllib3/contrib/socks.py,sha256=TFbwYnvVqcYEQpryNJUE21O58a64wo1eFni2U-AO42A,6383
pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=lBmVv2L6jPrkcSSB7HZhTdpCKWeabkFbOdPkauPIk0g,18153
pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=enHnjmNdGsbVIELgK-vYnqVZwnszZE8srZU0_SHf74Y,12405
pip/_vendor/urllib3/packages/__init__.py,sha256=gKFqcXJ8LRVrzvIrDp1NtEG0C3G5x5k9BDaJy_ZHrWM,114
pip/_vendor/urllib3/packages/ordered_dict.py,sha256=dbnZZ3wH-RWx9SSvCCmGhIAfUPN6L7C55wYkUC5XA2c,9194
pip/_vendor/urllib3/packages/six.py,sha256=dCw7sqQpOJ_L3ssF_TrmqYiNnLnnMVOtA4-TAU7eyd0,30966
pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
pip/_vendor/urllib3/packages/backports/makefile.py,sha256=DJvigopntDsoZ8PHUZ7FqjQHEvZOeuX-nKn83oVTwGA,1514
pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=9qJkL_ZBallrIGgSkZ3WWFhBnskjgsHw11o-DXGdua8,707
pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=bmjfWqkCXSfykgrsf6EszPzuu_kI2HMEkijjfwX1yfc,5876
pip/_vendor/urllib3/util/__init__.py,sha256=aHNNBJDY0LXT8fIJGvaimxo4M1yq87CMLt-pq2tJ5lc,1098
pip/_vendor/urllib3/util/connection.py,sha256=IkRhyJKTNo0vg6LSjZaH1x9p-mt9_KDMM8Z3ves0p8s,4367
pip/_vendor/urllib3/util/request.py,sha256=6Z9yV2XHdzb3YK1lVZgEw6PfYcUxtKuHrRmBIFWrfgA,3823
pip/_vendor/urllib3/util/response.py,sha256=zS8uNkrLuM1vVRsV46i51mfbJG-Y3-wsqQw8EB8EU4c,2424
pip/_vendor/urllib3/util/retry.py,sha256=ZKskgGn4XAor1ceSOcoGGFumHFXzun38-jUCeEJmI6I,15002
pip/_vendor/urllib3/util/selectors.py,sha256=ygw9CJs0yChlyVwD40mJ1LIwbNaKpzYo8Vg74vYemgc,21728
pip/_vendor/urllib3/util/ssl_.py,sha256=sp4YBfpJ7F1TEhnafRmvpc89DVquMGb61WLo3XevcG4,12561
pip/_vendor/urllib3/util/timeout.py,sha256=aTFA7xp2UHmpAuyHbC5iCySPr4iEc8-YTZvCiad2X0g,9999
pip/_vendor/urllib3/util/url.py,sha256=lsU39rCqfddTelBSvteq4uT-LI3WtkCEeGS2jqRp08s,6717
pip/_vendor/urllib3/util/wait.py,sha256=J94ZLK8TURoIWyCinTcqwCU3n-SYzeOZCzI0svttXrY,1491
pip/_vendor/webencodings/__init__.py,sha256=kG5cBDbIrAtrrdU-h1iSPVYq10ayTFldU1CTRcb1ym4,10921
pip/_vendor/webencodings/labels.py,sha256=e9gPVTA1XNYalJMVVX7lXvb52Kurc4UdnXFJDPcBXFE,9210
pip/_vendor/webencodings/mklabels.py,sha256=tyhoDDc-TC6kjJY25Qn5TlsyMs2_IyPf_rfh4L6nSrg,1364
pip/_vendor/webencodings/tests.py,sha256=7J6TdufKEml8sQSWcYEsl-e73QXtPmsIHF6pPT0sq08,6716
pip/_vendor/webencodings/x_user_defined.py,sha256=CMn5bx2ccJ4y3Bsqf3xC24bYO4ONC3ZY_lv5vrqhKAY,4632
pip-10.0.1.dist-info/LICENSE.txt,sha256=vphq0X7zpPm3cGDzp-hfRTuAI4-5iSx9gxQW2xgY2Pc,1110
pip-10.0.1.dist-info/METADATA,sha256=EzjmH1-bJksGOXBg4G0Im1UADPT2IGcApslzIUSZPkQ,2859
pip-10.0.1.dist-info/RECORD,,
pip-10.0.1.dist-info/WHEEL,sha256=saUSQBLOUjf5ACZdNkhQ0lB6XrHU-l4vpzxq_W1n_AY,116
pip-10.0.1.dist-info/entry_points.txt,sha256=VQWeNvELfCZUrbgKimd04NWN7Dh_XRL8uR4dANlO4qQ,98
pip-10.0.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
../../../bin/pip,sha256=tRPL8LMLps2ROQk2H4yHPZGAw9hrrO-t6G0Lu-oRnPs,277
../../../bin/pip3,sha256=tRPL8LMLps2ROQk2H4yHPZGAw9hrrO-t6G0Lu-oRnPs,277
../../../bin/pip3.7,sha256=tRPL8LMLps2ROQk2H4yHPZGAw9hrrO-t6G0Lu-oRnPs,277
pip-10.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc,,
pip/_internal/utils/__pycache__/logging.cpython-37.pyc,,
pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc,,
pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc,,
pip/_internal/utils/__pycache__/glibc.cpython-37.pyc,,
pip/_internal/utils/__pycache__/outdated.cpython-37.pyc,,
pip/_internal/utils/__pycache__/hashes.cpython-37.pyc,,
pip/_internal/utils/__pycache__/encoding.cpython-37.pyc,,
pip/_internal/utils/__pycache__/typing.cpython-37.pyc,,
pip/_internal/utils/__pycache__/packaging.cpython-37.pyc,,
pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc,,
pip/_internal/utils/__pycache__/ui.cpython-37.pyc,,
pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc,,
pip/_internal/utils/__pycache__/__init__.cpython-37.pyc,,
pip/_internal/utils/__pycache__/misc.cpython-37.pyc,,
pip/_internal/models/__pycache__/index.cpython-37.pyc,,
pip/_internal/models/__pycache__/__init__.cpython-37.pyc,,
pip/_internal/__pycache__/build_env.cpython-37.pyc,,
pip/_internal/__pycache__/wheel.cpython-37.pyc,,
pip/_internal/__pycache__/exceptions.cpython-37.pyc,,
pip/_internal/__pycache__/status_codes.cpython-37.pyc,,
pip/_internal/__pycache__/index.cpython-37.pyc,,
pip/_internal/__pycache__/resolve.cpython-37.pyc,,
pip/_internal/__pycache__/download.cpython-37.pyc,,
pip/_internal/__pycache__/locations.cpython-37.pyc,,
pip/_internal/__pycache__/basecommand.cpython-37.pyc,,
pip/_internal/__pycache__/compat.cpython-37.pyc,,
pip/_internal/__pycache__/pep425tags.cpython-37.pyc,,
pip/_internal/__pycache__/cache.cpython-37.pyc,,
pip/_internal/__pycache__/configuration.cpython-37.pyc,,
pip/_internal/__pycache__/__init__.cpython-37.pyc,,
pip/_internal/__pycache__/cmdoptions.cpython-37.pyc,,
pip/_internal/__pycache__/baseparser.cpython-37.pyc,,
pip/_internal/operations/__pycache__/prepare.cpython-37.pyc,,
pip/_internal/operations/__pycache__/check.cpython-37.pyc,,
pip/_internal/operations/__pycache__/freeze.cpython-37.pyc,,
pip/_internal/operations/__pycache__/__init__.cpython-37.pyc,,
pip/_internal/req/__pycache__/req_set.cpython-37.pyc,,
pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc,,
pip/_internal/req/__pycache__/req_install.cpython-37.pyc,,
pip/_internal/req/__pycache__/req_file.cpython-37.pyc,,
pip/_internal/req/__pycache__/__init__.cpython-37.pyc,,
pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc,,
pip/_internal/vcs/__pycache__/git.cpython-37.pyc,,
pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc,,
pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc,,
pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc,,
pip/_internal/commands/__pycache__/show.cpython-37.pyc,,
pip/_internal/commands/__pycache__/help.cpython-37.pyc,,
pip/_internal/commands/__pycache__/wheel.cpython-37.pyc,,
pip/_internal/commands/__pycache__/completion.cpython-37.pyc,,
pip/_internal/commands/__pycache__/download.cpython-37.pyc,,
pip/_internal/commands/__pycache__/check.cpython-37.pyc,,
pip/_internal/commands/__pycache__/list.cpython-37.pyc,,
pip/_internal/commands/__pycache__/hash.cpython-37.pyc,,
pip/_internal/commands/__pycache__/search.cpython-37.pyc,,
pip/_internal/commands/__pycache__/install.cpython-37.pyc,,
pip/_internal/commands/__pycache__/configuration.cpython-37.pyc,,
pip/_internal/commands/__pycache__/freeze.cpython-37.pyc,,
pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc,,
pip/_internal/commands/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/version.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,,
pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc,,
pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc,,
pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc,,
pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc,,
pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc,,
pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc,,
pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/version.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc,,
pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc,,
pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc,,
pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc,,
pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc,,
pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc,,
pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc,,
pip/_vendor/progress/__pycache__/bar.cpython-37.pyc,,
pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc,,
pip/_vendor/progress/__pycache__/counter.cpython-37.pyc,,
pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc,,
pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc,,
pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc,,
pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc,,
pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/util.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/database.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/version.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/index.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc,,
pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc,,
pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc,,
pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc,,
pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc,,
pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc,,
pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc,,
pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc,,
pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc,,
pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc,,
pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc,,
pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc,,
pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc,,
pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc,,
pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/codec.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/compat.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/core.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc,,
pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/__pycache__/appdirs.cpython-37.pyc,,
pip/_vendor/__pycache__/ipaddress.cpython-37.pyc,,
pip/_vendor/__pycache__/six.cpython-37.pyc,,
pip/_vendor/__pycache__/retrying.cpython-37.pyc,,
pip/_vendor/__pycache__/distro.cpython-37.pyc,,
pip/_vendor/__pycache__/pyparsing.cpython-37.pyc,,
pip/_vendor/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/help.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/structures.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/certs.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/models.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/compat.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/packages.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/auth.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/utils.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/api.cpython-37.pyc,,
pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc,,
pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc,,
pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc,,
pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc,,
pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc,,
pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc,,
pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc,,
pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc,,
pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc,,
pip/_vendor/certifi/__pycache__/core.cpython-37.pyc,,
pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/selectors.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc,,
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc,,
pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc,,
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc,,
pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc,,
pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc,,
pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc,,
pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc,,
pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc,,
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc,,
pip/__pycache__/__main__.cpython-37.pyc,,
pip/__pycache__/__init__.cpython-37.pyc,,

@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.31.0)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

@ -0,0 +1,5 @@
[console_scripts]
pip = pip._internal:main
pip3 = pip._internal:main
pip3.6 = pip._internal:main

@ -0,0 +1 @@
__version__ = "10.0.1"

@ -0,0 +1,19 @@
from __future__ import absolute_import
import os
import sys
# If we are running from a wheel, add the wheel to sys.path
# This allows the usage python pip-*.whl/pip install pip-*.whl
if __package__ == '':
# __file__ is pip-*.whl/pip/__main__.py
# first dirname call strips of '/__main__.py', second strips off '/pip'
# Resulting path is the name of the wheel itself
# Add that to sys.path so we can import pip
path = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, path)
from pip._internal import main as _main # noqa
if __name__ == '__main__':
sys.exit(_main())

@ -0,0 +1,246 @@
#!/usr/bin/env python
from __future__ import absolute_import
import locale
import logging
import os
import optparse
import warnings
import sys
# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks,
# but if invoked (i.e. imported), it will issue a warning to stderr if socks
# isn't available. requests unconditionally imports urllib3's socks contrib
# module, triggering this warning. The warning breaks DEP-8 tests (because of
# the stderr output) and is just plain annoying in normal usage. I don't want
# to add socks as yet another dependency for pip, nor do I want to allow-stder
# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to
# be done before the import of pip.vcs.
from pip._vendor.urllib3.exceptions import DependencyWarning
warnings.filterwarnings("ignore", category=DependencyWarning) # noqa
# We want to inject the use of SecureTransport as early as possible so that any
# references or sessions or what have you are ensured to have it, however we
# only want to do this in the case that we're running on macOS and the linked
# OpenSSL is too old to handle TLSv1.2
try:
import ssl
except ImportError:
pass
else:
# Checks for OpenSSL 1.0.1 on MacOS
if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f:
try:
from pip._vendor.urllib3.contrib import securetransport
except (ImportError, OSError):
pass
else:
securetransport.inject_into_urllib3()
from pip import __version__
from pip._internal import cmdoptions
from pip._internal.exceptions import CommandError, PipError
from pip._internal.utils.misc import get_installed_distributions, get_prog
from pip._internal.utils import deprecation
from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa
from pip._internal.baseparser import (
ConfigOptionParser, UpdatingDefaultsHelpFormatter,
)
from pip._internal.commands import get_summaries, get_similar_commands
from pip._internal.commands import commands_dict
from pip._vendor.urllib3.exceptions import InsecureRequestWarning
logger = logging.getLogger(__name__)
# Hide the InsecureRequestWarning from urllib3
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
def autocomplete():
"""Command and option completion for the main option parser (and options)
and its subcommands (and options).
Enable by sourcing one of the completion shell scripts (bash, zsh or fish).
"""
# Don't complete if user hasn't sourced bash_completion file.
if 'PIP_AUTO_COMPLETE' not in os.environ:
return
cwords = os.environ['COMP_WORDS'].split()[1:]
cword = int(os.environ['COMP_CWORD'])
try:
current = cwords[cword - 1]
except IndexError:
current = ''
subcommands = [cmd for cmd, summary in get_summaries()]
options = []
# subcommand
try:
subcommand_name = [w for w in cwords if w in subcommands][0]
except IndexError:
subcommand_name = None
parser = create_main_parser()
# subcommand options
if subcommand_name:
# special case: 'help' subcommand has no options
if subcommand_name == 'help':
sys.exit(1)
# special case: list locally installed dists for show and uninstall
should_list_installed = (
subcommand_name in ['show', 'uninstall'] and
not current.startswith('-')
)
if should_list_installed:
installed = []
lc = current.lower()
for dist in get_installed_distributions(local_only=True):
if dist.key.startswith(lc) and dist.key not in cwords[1:]:
installed.append(dist.key)
# if there are no dists installed, fall back to option completion
if installed:
for dist in installed:
print(dist)
sys.exit(1)
subcommand = commands_dict[subcommand_name]()
for opt in subcommand.parser.option_list_all:
if opt.help != optparse.SUPPRESS_HELP:
for opt_str in opt._long_opts + opt._short_opts:
options.append((opt_str, opt.nargs))
# filter out previously specified options from available options
prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]]
options = [(x, v) for (x, v) in options if x not in prev_opts]
# filter options by current input
options = [(k, v) for k, v in options if k.startswith(current)]
for option in options:
opt_label = option[0]
# append '=' to options which require args
if option[1] and option[0][:2] == "--":
opt_label += '='
print(opt_label)
else:
# show main parser options only when necessary
if current.startswith('-') or current.startswith('--'):
opts = [i.option_list for i in parser.option_groups]
opts.append(parser.option_list)
opts = (o for it in opts for o in it)
for opt in opts:
if opt.help != optparse.SUPPRESS_HELP:
subcommands += opt._long_opts + opt._short_opts
print(' '.join([x for x in subcommands if x.startswith(current)]))
sys.exit(1)
def create_main_parser():
parser_kw = {
'usage': '\n%prog <command> [options]',
'add_help_option': False,
'formatter': UpdatingDefaultsHelpFormatter(),
'name': 'global',
'prog': get_prog(),
}
parser = ConfigOptionParser(**parser_kw)
parser.disable_interspersed_args()
pip_pkg_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
parser.version = 'pip %s from %s (python %s)' % (
__version__, pip_pkg_dir, sys.version[:3],
)
# add the general options
gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
parser.add_option_group(gen_opts)
parser.main = True # so the help formatter knows
# create command listing for description
command_summaries = get_summaries()
description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries]
parser.description = '\n'.join(description)
return parser
def parseopts(args):
parser = create_main_parser()
# Note: parser calls disable_interspersed_args(), so the result of this
# call is to split the initial args into the general options before the
# subcommand and everything else.
# For example:
# args: ['--timeout=5', 'install', '--user', 'INITools']
# general_options: ['--timeout==5']
# args_else: ['install', '--user', 'INITools']
general_options, args_else = parser.parse_args(args)
# --version
if general_options.version:
sys.stdout.write(parser.version)
sys.stdout.write(os.linesep)
sys.exit()
# pip || pip help -> print_help()
if not args_else or (args_else[0] == 'help' and len(args_else) == 1):
parser.print_help()
sys.exit()
# the subcommand name
cmd_name = args_else[0]
if cmd_name not in commands_dict:
guess = get_similar_commands(cmd_name)
msg = ['unknown command "%s"' % cmd_name]
if guess:
msg.append('maybe you meant "%s"' % guess)
raise CommandError(' - '.join(msg))
# all the args without the subcommand
cmd_args = args[:]
cmd_args.remove(cmd_name)
return cmd_name, cmd_args
def check_isolated(args):
isolated = False
if "--isolated" in args:
isolated = True
return isolated
def main(args=None):
if args is None:
args = sys.argv[1:]
# Configure our deprecation warnings to be sent through loggers
deprecation.install_warning_logger()
autocomplete()
try:
cmd_name, cmd_args = parseopts(args)
except PipError as exc:
sys.stderr.write("ERROR: %s" % exc)
sys.stderr.write(os.linesep)
sys.exit(1)
# Needed for locale.getpreferredencoding(False) to work
# in pip._internal.utils.encoding.auto_decode
try:
locale.setlocale(locale.LC_ALL, '')
except locale.Error as e:
# setlocale can apparently crash if locale are uninitialized
logger.debug("Ignoring error %s when setting locale", e)
command = commands_dict[cmd_name](isolated=check_isolated(cmd_args))
return command.main(cmd_args)

@ -0,0 +1,373 @@
"""Base Command class, and related routines"""
from __future__ import absolute_import
import logging
import logging.config
import optparse
import os
import sys
import warnings
from pip._internal import cmdoptions
from pip._internal.baseparser import (
ConfigOptionParser, UpdatingDefaultsHelpFormatter,
)
from pip._internal.compat import WINDOWS
from pip._internal.download import PipSession
from pip._internal.exceptions import (
BadCommand, CommandError, InstallationError, PreviousBuildDirError,
UninstallationError,
)
from pip._internal.index import PackageFinder
from pip._internal.locations import running_under_virtualenv
from pip._internal.req.req_file import parse_requirements
from pip._internal.req.req_install import InstallRequirement
from pip._internal.status_codes import (
ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR,
VIRTUALENV_NOT_FOUND,
)
from pip._internal.utils import deprecation
from pip._internal.utils.logging import IndentingFormatter
from pip._internal.utils.misc import get_prog, normalize_path
from pip._internal.utils.outdated import pip_version_check
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
if MYPY_CHECK_RUNNING:
from typing import Optional
__all__ = ['Command']
logger = logging.getLogger(__name__)
class Command(object):
name = None # type: Optional[str]
usage = None # type: Optional[str]
hidden = False # type: bool
ignore_require_venv = False # type: bool
log_streams = ("ext://sys.stdout", "ext://sys.stderr")
def __init__(self, isolated=False):
parser_kw = {
'usage': self.usage,
'prog': '%s %s' % (get_prog(), self.name),
'formatter': UpdatingDefaultsHelpFormatter(),
'add_help_option': False,
'name': self.name,
'description': self.__doc__,
'isolated': isolated,
}
self.parser = ConfigOptionParser(**parser_kw)
# Commands should add options to this option group
optgroup_name = '%s Options' % self.name.capitalize()
self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
# Add the general options
gen_opts = cmdoptions.make_option_group(
cmdoptions.general_group,
self.parser,
)
self.parser.add_option_group(gen_opts)
def _build_session(self, options, retries=None, timeout=None):
session = PipSession(
cache=(
normalize_path(os.path.join(options.cache_dir, "http"))
if options.cache_dir else None
),
retries=retries if retries is not None else options.retries,
insecure_hosts=options.trusted_hosts,
)
# Handle custom ca-bundles from the user
if options.cert:
session.verify = options.cert
# Handle SSL client certificate
if options.client_cert:
session.cert = options.client_cert
# Handle timeouts
if options.timeout or timeout:
session.timeout = (
timeout if timeout is not None else options.timeout
)
# Handle configured proxies
if options.proxy:
session.proxies = {
"http": options.proxy,
"https": options.proxy,
}
# Determine if we can prompt the user for authentication or not
session.auth.prompting = not options.no_input
return session
def parse_args(self, args):
# factored out for testability
return self.parser.parse_args(args)
def main(self, args):
options, args = self.parse_args(args)
# Set verbosity so that it can be used elsewhere.
self.verbosity = options.verbose - options.quiet
if self.verbosity >= 1:
level = "DEBUG"
elif self.verbosity == -1:
level = "WARNING"
elif self.verbosity == -2:
level = "ERROR"
elif self.verbosity <= -3:
level = "CRITICAL"
else:
level = "INFO"
# The root logger should match the "console" level *unless* we
# specified "--log" to send debug logs to a file.
root_level = level
if options.log:
root_level = "DEBUG"
logger_class = "pip._internal.utils.logging.ColorizedStreamHandler"
handler_class = "pip._internal.utils.logging.BetterRotatingFileHandler"
logging.config.dictConfig({
"version": 1,
"disable_existing_loggers": False,
"filters": {
"exclude_warnings": {
"()": "pip._internal.utils.logging.MaxLevelFilter",
"level": logging.WARNING,
},
},
"formatters": {
"indent": {
"()": IndentingFormatter,
"format": "%(message)s",
},
},
"handlers": {
"console": {
"level": level,
"class": logger_class,
"no_color": options.no_color,
"stream": self.log_streams[0],
"filters": ["exclude_warnings"],
"formatter": "indent",
},
"console_errors": {
"level": "WARNING",
"class": logger_class,
"no_color": options.no_color,
"stream": self.log_streams[1],
"formatter": "indent",
},
"user_log": {
"level": "DEBUG",
"class": handler_class,
"filename": options.log or "/dev/null",
"delay": True,
"formatter": "indent",
},
},
"root": {
"level": root_level,
"handlers": list(filter(None, [
"console",
"console_errors",
"user_log" if options.log else None,
])),
},
# Disable any logging besides WARNING unless we have DEBUG level
# logging enabled. These use both pip._vendor and the bare names
# for the case where someone unbundles our libraries.
"loggers": {
name: {
"level": (
"WARNING" if level in ["INFO", "ERROR"] else "DEBUG"
)
} for name in [
"pip._vendor", "distlib", "requests", "urllib3"
]
},
})
if sys.version_info[:2] == (3, 3):
warnings.warn(
"Python 3.3 supported has been deprecated and support for it "
"will be dropped in the future. Please upgrade your Python.",
deprecation.RemovedInPip11Warning,
)
# TODO: try to get these passing down from the command?
# without resorting to os.environ to hold these.
if options.no_input:
os.environ['PIP_NO_INPUT'] = '1'
if options.exists_action:
os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action)
if options.require_venv and not self.ignore_require_venv:
# If a venv is required check if it can really be found
if not running_under_virtualenv():
logger.critical(
'Could not find an activated virtualenv (required).'
)
sys.exit(VIRTUALENV_NOT_FOUND)
original_root_handlers = set(logging.root.handlers)
try:
status = self.run(options, args)
# FIXME: all commands should return an exit status
# and when it is done, isinstance is not needed anymore
if isinstance(status, int):
return status
except PreviousBuildDirError as exc:
logger.critical(str(exc))
logger.debug('Exception information:', exc_info=True)
return PREVIOUS_BUILD_DIR_ERROR
except (InstallationError, UninstallationError, BadCommand) as exc:
logger.critical(str(exc))
logger.debug('Exception information:', exc_info=True)
return ERROR
except CommandError as exc:
logger.critical('ERROR: %s', exc)
logger.debug('Exception information:', exc_info=True)
return ERROR
except KeyboardInterrupt:
logger.critical('Operation cancelled by user')
logger.debug('Exception information:', exc_info=True)
return ERROR
except:
logger.critical('Exception:', exc_info=True)
return UNKNOWN_ERROR
finally:
# Check if we're using the latest version of pip available
if (not options.disable_pip_version_check and not
getattr(options, "no_index", False)):
with self._build_session(
options,
retries=0,
timeout=min(5, options.timeout)) as session:
pip_version_check(session, options)
# Avoid leaking loggers
for handler in set(logging.root.handlers) - original_root_handlers:
# this method benefit from the Logger class internal lock
logging.root.removeHandler(handler)
return SUCCESS
class RequirementCommand(Command):
@staticmethod
def populate_requirement_set(requirement_set, args, options, finder,
session, name, wheel_cache):
"""
Marshal cmd line args into a requirement set.
"""
# NOTE: As a side-effect, options.require_hashes and
# requirement_set.require_hashes may be updated
for filename in options.constraints:
for req_to_add in parse_requirements(
filename,
constraint=True, finder=finder, options=options,
session=session, wheel_cache=wheel_cache):
req_to_add.is_direct = True
requirement_set.add_requirement(req_to_add)
for req in args:
req_to_add = InstallRequirement.from_line(
req, None, isolated=options.isolated_mode,
wheel_cache=wheel_cache
)
req_to_add.is_direct = True
requirement_set.add_requirement(req_to_add)
for req in options.editables:
req_to_add = InstallRequirement.from_editable(
req,
isolated=options.isolated_mode,
wheel_cache=wheel_cache
)
req_to_add.is_direct = True
requirement_set.add_requirement(req_to_add)
for filename in options.requirements:
for req_to_add in parse_requirements(
filename,
finder=finder, options=options, session=session,
wheel_cache=wheel_cache):
req_to_add.is_direct = True
requirement_set.add_requirement(req_to_add)
# If --require-hashes was a line in a requirements file, tell
# RequirementSet about it:
requirement_set.require_hashes = options.require_hashes
if not (args or options.editables or options.requirements):
opts = {'name': name}
if options.find_links:
raise CommandError(
'You must give at least one requirement to %(name)s '
'(maybe you meant "pip %(name)s %(links)s"?)' %
dict(opts, links=' '.join(options.find_links)))
else:
raise CommandError(
'You must give at least one requirement to %(name)s '
'(see "pip help %(name)s")' % opts)
# On Windows, any operation modifying pip should be run as:
# python -m pip ...
# See https://github.com/pypa/pip/issues/1299 for more discussion
should_show_use_python_msg = (
WINDOWS and
requirement_set.has_requirement("pip") and
os.path.basename(sys.argv[0]).startswith("pip")
)
if should_show_use_python_msg:
new_command = [
sys.executable, "-m", "pip"
] + sys.argv[1:]
raise CommandError(
'To modify pip, please run the following command:\n{}'
.format(" ".join(new_command))
)
def _build_package_finder(self, options, session,
platform=None, python_versions=None,
abi=None, implementation=None):
"""
Create a package finder appropriate to this requirement command.
"""
index_urls = [options.index_url] + options.extra_index_urls
if options.no_index:
logger.debug('Ignoring indexes: %s', ','.join(index_urls))
index_urls = []
return PackageFinder(
find_links=options.find_links,
format_control=options.format_control,
index_urls=index_urls,
trusted_hosts=options.trusted_hosts,
allow_all_prereleases=options.pre,
process_dependency_links=options.process_dependency_links,
session=session,
platform=platform,
versions=python_versions,
abi=abi,
implementation=implementation,
)

@ -0,0 +1,240 @@
"""Base option parser setup"""
from __future__ import absolute_import
import logging
import optparse
import sys
import textwrap
from distutils.util import strtobool
from pip._vendor.six import string_types
from pip._internal.compat import get_terminal_size
from pip._internal.configuration import Configuration, ConfigurationError
logger = logging.getLogger(__name__)
class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
"""A prettier/less verbose help formatter for optparse."""
def __init__(self, *args, **kwargs):
# help position must be aligned with __init__.parseopts.description
kwargs['max_help_position'] = 30
kwargs['indent_increment'] = 1
kwargs['width'] = get_terminal_size()[0] - 2
optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs)
def format_option_strings(self, option):
return self._format_option_strings(option, ' <%s>', ', ')
def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '):
"""
Return a comma-separated list of option strings and metavars.
:param option: tuple of (short opt, long opt), e.g: ('-f', '--format')
:param mvarfmt: metavar format string - evaluated as mvarfmt % metavar
:param optsep: separator
"""
opts = []
if option._short_opts:
opts.append(option._short_opts[0])
if option._long_opts:
opts.append(option._long_opts[0])
if len(opts) > 1:
opts.insert(1, optsep)
if option.takes_value():
metavar = option.metavar or option.dest.lower()
opts.append(mvarfmt % metavar.lower())
return ''.join(opts)
def format_heading(self, heading):
if heading == 'Options':
return ''
return heading + ':\n'
def format_usage(self, usage):
"""
Ensure there is only one newline between usage and the first heading
if there is no description.
"""
msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ")
return msg
def format_description(self, description):
# leave full control over description to us
if description:
if hasattr(self.parser, 'main'):
label = 'Commands'
else:
label = 'Description'
# some doc strings have initial newlines, some don't
description = description.lstrip('\n')
# some doc strings have final newlines and spaces, some don't
description = description.rstrip()
# dedent, then reindent
description = self.indent_lines(textwrap.dedent(description), " ")
description = '%s:\n%s\n' % (label, description)
return description
else:
return ''
def format_epilog(self, epilog):
# leave full control over epilog to us
if epilog:
return epilog
else:
return ''
def indent_lines(self, text, indent):
new_lines = [indent + line for line in text.split('\n')]
return "\n".join(new_lines)
class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
"""Custom help formatter for use in ConfigOptionParser.
This is updates the defaults before expanding them, allowing
them to show up correctly in the help listing.
"""
def expand_default(self, option):
if self.parser is not None:
self.parser._update_defaults(self.parser.defaults)
return optparse.IndentedHelpFormatter.expand_default(self, option)
class CustomOptionParser(optparse.OptionParser):
def insert_option_group(self, idx, *args, **kwargs):
"""Insert an OptionGroup at a given position."""
group = self.add_option_group(*args, **kwargs)
self.option_groups.pop()
self.option_groups.insert(idx, group)
return group
@property
def option_list_all(self):
"""Get a list of all options, including those in option groups."""
res = self.option_list[:]
for i in self.option_groups:
res.extend(i.option_list)
return res
class ConfigOptionParser(CustomOptionParser):
"""Custom option parser which updates its defaults by checking the
configuration files and environmental variables"""
def __init__(self, *args, **kwargs):
self.name = kwargs.pop('name')
isolated = kwargs.pop("isolated", False)
self.config = Configuration(isolated)
assert self.name
optparse.OptionParser.__init__(self, *args, **kwargs)
def check_default(self, option, key, val):
try:
return option.check_value(key, val)
except optparse.OptionValueError as exc:
print("An error occurred during configuration: %s" % exc)
sys.exit(3)
def _get_ordered_configuration_items(self):
# Configuration gives keys in an unordered manner. Order them.
override_order = ["global", self.name, ":env:"]
# Pool the options into different groups
section_items = {name: [] for name in override_order}
for section_key, val in self.config.items():
# ignore empty values
if not val:
logger.debug(
"Ignoring configuration key '%s' as it's value is empty.",
section_key
)
continue
section, key = section_key.split(".", 1)
if section in override_order:
section_items[section].append((key, val))
# Yield each group in their override order
for section in override_order:
for key, val in section_items[section]:
yield key, val
def _update_defaults(self, defaults):
"""Updates the given defaults with values from the config files and
the environ. Does a little special handling for certain types of
options (lists)."""
# Accumulate complex default state.
self.values = optparse.Values(self.defaults)
late_eval = set()
# Then set the options with those values
for key, val in self._get_ordered_configuration_items():
# '--' because configuration supports only long names
option = self.get_option('--' + key)
# Ignore options not present in this parser. E.g. non-globals put
# in [global] by users that want them to apply to all applicable
# commands.
if option is None:
continue
if option.action in ('store_true', 'store_false', 'count'):
val = strtobool(val)
elif option.action == 'append':
val = val.split()
val = [self.check_default(option, key, v) for v in val]
elif option.action == 'callback':
late_eval.add(option.dest)
opt_str = option.get_opt_string()
val = option.convert_value(opt_str, val)
# From take_action
args = option.callback_args or ()
kwargs = option.callback_kwargs or {}
option.callback(option, opt_str, val, self, *args, **kwargs)
else:
val = self.check_default(option, key, val)
defaults[option.dest] = val
for key in late_eval:
defaults[key] = getattr(self.values, key)
self.values = None
return defaults
def get_default_values(self):
"""Overriding to make updating the defaults after instantiation of
the option parser possible, _update_defaults() does the dirty work."""
if not self.process_default_values:
# Old, pre-Optik 1.5 behaviour.
return optparse.Values(self.defaults)
# Load the configuration, or error out in case of an error
try:
self.config.load()
except ConfigurationError as err:
self.exit(2, err.args[0])
defaults = self._update_defaults(self.defaults.copy()) # ours
for option in self._get_all_options():
default = defaults.get(option.dest)
if isinstance(default, string_types):
opt_str = option.get_opt_string()
defaults[option.dest] = option.check_value(opt_str, default)
return optparse.Values(defaults)
def error(self, msg):
self.print_usage(sys.stderr)
self.exit(2, "%s\n" % msg)

@ -0,0 +1,92 @@
"""Build Environment used for isolation during sdist building
"""
import os
from distutils.sysconfig import get_python_lib
from sysconfig import get_paths
from pip._internal.utils.temp_dir import TempDirectory
class BuildEnvironment(object):
"""Creates and manages an isolated environment to install build deps
"""
def __init__(self, no_clean):
self._temp_dir = TempDirectory(kind="build-env")
self._no_clean = no_clean
@property
def path(self):
return self._temp_dir.path
def __enter__(self):
self._temp_dir.create()
self.save_path = os.environ.get('PATH', None)
self.save_pythonpath = os.environ.get('PYTHONPATH', None)
self.save_nousersite = os.environ.get('PYTHONNOUSERSITE', None)
install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix'
install_dirs = get_paths(install_scheme, vars={
'base': self.path,
'platbase': self.path,
})
scripts = install_dirs['scripts']
if self.save_path:
os.environ['PATH'] = scripts + os.pathsep + self.save_path
else:
os.environ['PATH'] = scripts + os.pathsep + os.defpath
# Note: prefer distutils' sysconfig to get the
# library paths so PyPy is correctly supported.
purelib = get_python_lib(plat_specific=0, prefix=self.path)
platlib = get_python_lib(plat_specific=1, prefix=self.path)
if purelib == platlib:
lib_dirs = purelib
else:
lib_dirs = purelib + os.pathsep + platlib
if self.save_pythonpath:
os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \
self.save_pythonpath
else:
os.environ['PYTHONPATH'] = lib_dirs
os.environ['PYTHONNOUSERSITE'] = '1'
return self.path
def __exit__(self, exc_type, exc_val, exc_tb):
if not self._no_clean:
self._temp_dir.cleanup()
def restore_var(varname, old_value):
if old_value is None:
os.environ.pop(varname, None)
else:
os.environ[varname] = old_value
restore_var('PATH', self.save_path)
restore_var('PYTHONPATH', self.save_pythonpath)
restore_var('PYTHONNOUSERSITE', self.save_nousersite)
def cleanup(self):
self._temp_dir.cleanup()
class NoOpBuildEnvironment(BuildEnvironment):
"""A no-op drop-in replacement for BuildEnvironment
"""
def __init__(self, no_clean):
pass
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def cleanup(self):
pass

@ -0,0 +1,202 @@
"""Cache Management
"""
import errno
import hashlib
import logging
import os
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal import index
from pip._internal.compat import expanduser
from pip._internal.download import path_to_url
from pip._internal.utils.temp_dir import TempDirectory
from pip._internal.wheel import InvalidWheelFilename, Wheel
logger = logging.getLogger(__name__)
class Cache(object):
"""An abstract class - provides cache directories for data from links
:param cache_dir: The root of the cache.
:param format_control: A pip.index.FormatControl object to limit
binaries being read from the cache.
:param allowed_formats: which formats of files the cache should store.
('binary' and 'source' are the only allowed values)
"""
def __init__(self, cache_dir, format_control, allowed_formats):
super(Cache, self).__init__()
self.cache_dir = expanduser(cache_dir) if cache_dir else None
self.format_control = format_control
self.allowed_formats = allowed_formats
_valid_formats = {"source", "binary"}
assert self.allowed_formats.union(_valid_formats) == _valid_formats
def _get_cache_path_parts(self, link):
"""Get parts of part that must be os.path.joined with cache_dir
"""
# We want to generate an url to use as our cache key, we don't want to
# just re-use the URL because it might have other items in the fragment
# and we don't care about those.
key_parts = [link.url_without_fragment]
if link.hash_name is not None and link.hash is not None:
key_parts.append("=".join([link.hash_name, link.hash]))
key_url = "#".join(key_parts)
# Encode our key url with sha224, we'll use this because it has similar
# security properties to sha256, but with a shorter total output (and
# thus less secure). However the differences don't make a lot of
# difference for our use case here.
hashed = hashlib.sha224(key_url.encode()).hexdigest()
# We want to nest the directories some to prevent having a ton of top
# level directories where we might run out of sub directories on some
# FS.
parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
return parts
def _get_candidates(self, link, package_name):
can_not_cache = (
not self.cache_dir or
not package_name or
not link
)
if can_not_cache:
return []
canonical_name = canonicalize_name(package_name)
formats = index.fmt_ctl_formats(
self.format_control, canonical_name
)
if not self.allowed_formats.intersection(formats):
return []
root = self.get_path_for_link(link)
try:
return os.listdir(root)
except OSError as err:
if err.errno in {errno.ENOENT, errno.ENOTDIR}:
return []
raise
def get_path_for_link(self, link):
"""Return a directory to store cached items in for link.
"""
raise NotImplementedError()
def get(self, link, package_name):
"""Returns a link to a cached item if it exists, otherwise returns the
passed link.
"""
raise NotImplementedError()
def _link_for_candidate(self, link, candidate):
root = self.get_path_for_link(link)
path = os.path.join(root, candidate)
return index.Link(path_to_url(path))
def cleanup(self):
pass
class SimpleWheelCache(Cache):
"""A cache of wheels for future installs.
"""
def __init__(self, cache_dir, format_control):
super(SimpleWheelCache, self).__init__(
cache_dir, format_control, {"binary"}
)
def get_path_for_link(self, link):
"""Return a directory to store cached wheels for link
Because there are M wheels for any one sdist, we provide a directory
to cache them in, and then consult that directory when looking up
cache hits.
We only insert things into the cache if they have plausible version
numbers, so that we don't contaminate the cache with things that were
not unique. E.g. ./package might have dozens of installs done for it
and build a version of 0.0...and if we built and cached a wheel, we'd
end up using the same wheel even if the source has been edited.
:param link: The link of the sdist for which this will cache wheels.
"""
parts = self._get_cache_path_parts(link)
# Store wheels within the root cache_dir
return os.path.join(self.cache_dir, "wheels", *parts)
def get(self, link, package_name):
candidates = []
for wheel_name in self._get_candidates(link, package_name):
try:
wheel = Wheel(wheel_name)
except InvalidWheelFilename:
continue
if not wheel.supported():
# Built for a different python/arch/etc
continue
candidates.append((wheel.support_index_min(), wheel_name))
if not candidates:
return link
return self._link_for_candidate(link, min(candidates)[1])
class EphemWheelCache(SimpleWheelCache):
"""A SimpleWheelCache that creates it's own temporary cache directory
"""
def __init__(self, format_control):
self._temp_dir = TempDirectory(kind="ephem-wheel-cache")
self._temp_dir.create()
super(EphemWheelCache, self).__init__(
self._temp_dir.path, format_control
)
def cleanup(self):
self._temp_dir.cleanup()
class WheelCache(Cache):
"""Wraps EphemWheelCache and SimpleWheelCache into a single Cache
This Cache allows for gracefully degradation, using the ephem wheel cache
when a certain link is not found in the simple wheel cache first.
"""
def __init__(self, cache_dir, format_control):
super(WheelCache, self).__init__(
cache_dir, format_control, {'binary'}
)
self._wheel_cache = SimpleWheelCache(cache_dir, format_control)
self._ephem_cache = EphemWheelCache(format_control)
def get_path_for_link(self, link):
return self._wheel_cache.get_path_for_link(link)
def get_ephem_path_for_link(self, link):
return self._ephem_cache.get_path_for_link(link)
def get(self, link, package_name):
retval = self._wheel_cache.get(link, package_name)
if retval is link:
retval = self._ephem_cache.get(link, package_name)
return retval
def cleanup(self):
self._wheel_cache.cleanup()
self._ephem_cache.cleanup()

@ -0,0 +1,609 @@
"""
shared options and groups
The principle here is to define options once, but *not* instantiate them
globally. One reason being that options with action='append' can carry state
between parses. pip parses general options twice internally, and shouldn't
pass on state. To be consistent, all options will follow this design.
"""
from __future__ import absolute_import
import warnings
from functools import partial
from optparse import SUPPRESS_HELP, Option, OptionGroup
from pip._internal.index import (
FormatControl, fmt_ctl_handle_mutual_exclude, fmt_ctl_no_binary,
)
from pip._internal.locations import USER_CACHE_DIR, src_prefix
from pip._internal.models import PyPI
from pip._internal.utils.hashes import STRONG_HASHES
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from pip._internal.utils.ui import BAR_TYPES
if MYPY_CHECK_RUNNING:
from typing import Any
def make_option_group(group, parser):
"""
Return an OptionGroup object
group -- assumed to be dict with 'name' and 'options' keys
parser -- an optparse Parser
"""
option_group = OptionGroup(parser, group['name'])
for option in group['options']:
option_group.add_option(option())
return option_group
def check_install_build_global(options, check_options=None):
"""Disable wheels if per-setup.py call options are set.
:param options: The OptionParser options to update.
:param check_options: The options to check, if not supplied defaults to
options.
"""
if check_options is None:
check_options = options
def getname(n):
return getattr(check_options, n, None)
names = ["build_options", "global_options", "install_options"]
if any(map(getname, names)):
control = options.format_control
fmt_ctl_no_binary(control)
warnings.warn(
'Disabling all use of wheels due to the use of --build-options '
'/ --global-options / --install-options.', stacklevel=2,
)
###########
# options #
###########
help_ = partial(
Option,
'-h', '--help',
dest='help',
action='help',
help='Show help.',
) # type: Any
isolated_mode = partial(
Option,
"--isolated",
dest="isolated_mode",
action="store_true",
default=False,
help=(
"Run pip in an isolated mode, ignoring environment variables and user "
"configuration."
),
)
require_virtualenv = partial(
Option,
# Run only if inside a virtualenv, bail if not.
'--require-virtualenv', '--require-venv',
dest='require_venv',
action='store_true',
default=False,
help=SUPPRESS_HELP
) # type: Any
verbose = partial(
Option,
'-v', '--verbose',
dest='verbose',
action='count',
default=0,
help='Give more output. Option is additive, and can be used up to 3 times.'
)
no_color = partial(
Option,
'--no-color',
dest='no_color',
action='store_true',
default=False,
help="Suppress colored output",
)
version = partial(
Option,
'-V', '--version',
dest='version',
action='store_true',
help='Show version and exit.',
) # type: Any
quiet = partial(
Option,
'-q', '--quiet',
dest='quiet',
action='count',
default=0,
help=(
'Give less output. Option is additive, and can be used up to 3'
' times (corresponding to WARNING, ERROR, and CRITICAL logging'
' levels).'
),
) # type: Any
progress_bar = partial(
Option,
'--progress-bar',
dest='progress_bar',
type='choice',
choices=list(BAR_TYPES.keys()),
default='on',
help=(
'Specify type of progress to be displayed [' +
'|'.join(BAR_TYPES.keys()) + '] (default: %default)'
),
) # type: Any
log = partial(
Option,
"--log", "--log-file", "--local-log",
dest="log",
metavar="path",
help="Path to a verbose appending log."
) # type: Any
no_input = partial(
Option,
# Don't ask for input
'--no-input',
dest='no_input',
action='store_true',
default=False,
help=SUPPRESS_HELP
) # type: Any
proxy = partial(
Option,
'--proxy',
dest='proxy',
type='str',
default='',
help="Specify a proxy in the form [user:passwd@]proxy.server:port."
) # type: Any
retries = partial(
Option,
'--retries',
dest='retries',
type='int',
default=5,
help="Maximum number of retries each connection should attempt "
"(default %default times).",
) # type: Any
timeout = partial(
Option,
'--timeout', '--default-timeout',
metavar='sec',
dest='timeout',
type='float',
default=15,
help='Set the socket timeout (default %default seconds).',
) # type: Any
skip_requirements_regex = partial(
Option,
# A regex to be used to skip requirements
'--skip-requirements-regex',
dest='skip_requirements_regex',
type='str',
default='',
help=SUPPRESS_HELP,
) # type: Any
def exists_action():
return Option(
# Option when path already exist
'--exists-action',
dest='exists_action',
type='choice',
choices=['s', 'i', 'w', 'b', 'a'],
default=[],
action='append',
metavar='action',
help="Default action when a path already exists: "
"(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).",
)
cert = partial(
Option,
'--cert',
dest='cert',
type='str',
metavar='path',
help="Path to alternate CA bundle.",
) # type: Any
client_cert = partial(
Option,
'--client-cert',
dest='client_cert',
type='str',
default=None,
metavar='path',
help="Path to SSL client certificate, a single file containing the "
"private key and the certificate in PEM format.",
) # type: Any
index_url = partial(
Option,
'-i', '--index-url', '--pypi-url',
dest='index_url',
metavar='URL',
default=PyPI.simple_url,
help="Base URL of Python Package Index (default %default). "
"This should point to a repository compliant with PEP 503 "
"(the simple repository API) or a local directory laid out "
"in the same format.",
) # type: Any
def extra_index_url():
return Option(
'--extra-index-url',
dest='extra_index_urls',
metavar='URL',
action='append',
default=[],
help="Extra URLs of package indexes to use in addition to "
"--index-url. Should follow the same rules as "
"--index-url.",
)
no_index = partial(
Option,
'--no-index',
dest='no_index',
action='store_true',
default=False,
help='Ignore package index (only looking at --find-links URLs instead).',
) # type: Any
def find_links():
return Option(
'-f', '--find-links',
dest='find_links',
action='append',
default=[],
metavar='url',
help="If a url or path to an html file, then parse for links to "
"archives. If a local path or file:// url that's a directory, "
"then look for archives in the directory listing.",
)
def trusted_host():
return Option(
"--trusted-host",
dest="trusted_hosts",
action="append",
metavar="HOSTNAME",
default=[],
help="Mark this host as trusted, even though it does not have valid "
"or any HTTPS.",
)
# Remove after 1.5
process_dependency_links = partial(
Option,
"--process-dependency-links",
dest="process_dependency_links",
action="store_true",
default=False,
help="Enable the processing of dependency links.",
) # type: Any
def constraints():
return Option(
'-c', '--constraint',
dest='constraints',
action='append',
default=[],
metavar='file',
help='Constrain versions using the given constraints file. '
'This option can be used multiple times.'
)
def requirements():
return Option(
'-r', '--requirement',
dest='requirements',
action='append',
default=[],
metavar='file',
help='Install from the given requirements file. '
'This option can be used multiple times.'
)
def editable():
return Option(
'-e', '--editable',
dest='editables',
action='append',
default=[],
metavar='path/url',
help=('Install a project in editable mode (i.e. setuptools '
'"develop mode") from a local project path or a VCS url.'),
)
src = partial(
Option,
'--src', '--source', '--source-dir', '--source-directory',
dest='src_dir',
metavar='dir',
default=src_prefix,
help='Directory to check out editable projects into. '
'The default in a virtualenv is "<venv path>/src". '
'The default for global installs is "<current dir>/src".'
) # type: Any
def _get_format_control(values, option):
"""Get a format_control object."""
return getattr(values, option.dest)
def _handle_no_binary(option, opt_str, value, parser):
existing = getattr(parser.values, option.dest)
fmt_ctl_handle_mutual_exclude(
value, existing.no_binary, existing.only_binary,
)
def _handle_only_binary(option, opt_str, value, parser):
existing = getattr(parser.values, option.dest)
fmt_ctl_handle_mutual_exclude(
value, existing.only_binary, existing.no_binary,
)
def no_binary():
return Option(
"--no-binary", dest="format_control", action="callback",
callback=_handle_no_binary, type="str",
default=FormatControl(set(), set()),
help="Do not use binary packages. Can be supplied multiple times, and "
"each time adds to the existing value. Accepts either :all: to "
"disable all binary packages, :none: to empty the set, or one or "
"more package names with commas between them. Note that some "
"packages are tricky to compile and may fail to install when "
"this option is used on them.",
)
def only_binary():
return Option(
"--only-binary", dest="format_control", action="callback",
callback=_handle_only_binary, type="str",
default=FormatControl(set(), set()),
help="Do not use source packages. Can be supplied multiple times, and "
"each time adds to the existing value. Accepts either :all: to "
"disable all source packages, :none: to empty the set, or one or "
"more package names with commas between them. Packages without "
"binary distributions will fail to install when this option is "
"used on them.",
)
cache_dir = partial(
Option,
"--cache-dir",
dest="cache_dir",
default=USER_CACHE_DIR,
metavar="dir",
help="Store the cache data in <dir>."
)
no_cache = partial(
Option,
"--no-cache-dir",
dest="cache_dir",
action="store_false",
help="Disable the cache.",
)
no_deps = partial(
Option,
'--no-deps', '--no-dependencies',
dest='ignore_dependencies',
action='store_true',
default=False,
help="Don't install package dependencies.",
) # type: Any
build_dir = partial(
Option,
'-b', '--build', '--build-dir', '--build-directory',
dest='build_dir',
metavar='dir',
help='Directory to unpack packages into and build in. Note that '
'an initial build still takes place in a temporary directory. '
'The location of temporary directories can be controlled by setting '
'the TMPDIR environment variable (TEMP on Windows) appropriately. '
'When passed, build directories are not cleaned in case of failures.'
) # type: Any
ignore_requires_python = partial(
Option,
'--ignore-requires-python',
dest='ignore_requires_python',
action='store_true',
help='Ignore the Requires-Python information.'
) # type: Any
no_build_isolation = partial(
Option,
'--no-build-isolation',
dest='build_isolation',
action='store_false',
default=True,
help='Disable isolation when building a modern source distribution. '
'Build dependencies specified by PEP 518 must be already installed '
'if this option is used.'
) # type: Any
install_options = partial(
Option,
'--install-option',
dest='install_options',
action='append',
metavar='options',
help="Extra arguments to be supplied to the setup.py install "
"command (use like --install-option=\"--install-scripts=/usr/local/"
"bin\"). Use multiple --install-option options to pass multiple "
"options to setup.py install. If you are using an option with a "
"directory path, be sure to use absolute path.",
) # type: Any
global_options = partial(
Option,
'--global-option',
dest='global_options',
action='append',
metavar='options',
help="Extra global options to be supplied to the setup.py "
"call before the install command.",
) # type: Any
no_clean = partial(
Option,
'--no-clean',
action='store_true',
default=False,
help="Don't clean up build directories)."
) # type: Any
pre = partial(
Option,
'--pre',
action='store_true',
default=False,
help="Include pre-release and development versions. By default, "
"pip only finds stable versions.",
) # type: Any
disable_pip_version_check = partial(
Option,
"--disable-pip-version-check",
dest="disable_pip_version_check",
action="store_true",
default=False,
help="Don't periodically check PyPI to determine whether a new version "
"of pip is available for download. Implied with --no-index.",
) # type: Any
# Deprecated, Remove later
always_unzip = partial(
Option,
'-Z', '--always-unzip',
dest='always_unzip',
action='store_true',
help=SUPPRESS_HELP,
) # type: Any
def _merge_hash(option, opt_str, value, parser):
"""Given a value spelled "algo:digest", append the digest to a list
pointed to in a dict by the algo name."""
if not parser.values.hashes:
parser.values.hashes = {}
try:
algo, digest = value.split(':', 1)
except ValueError:
parser.error('Arguments to %s must be a hash name '
'followed by a value, like --hash=sha256:abcde...' %
opt_str)
if algo not in STRONG_HASHES:
parser.error('Allowed hash algorithms for %s are %s.' %
(opt_str, ', '.join(STRONG_HASHES)))
parser.values.hashes.setdefault(algo, []).append(digest)
hash = partial(
Option,
'--hash',
# Hash values eventually end up in InstallRequirement.hashes due to
# __dict__ copying in process_line().
dest='hashes',
action='callback',
callback=_merge_hash,
type='string',
help="Verify that the package's archive matches this "
'hash before installing. Example: --hash=sha256:abcdef...',
) # type: Any
require_hashes = partial(
Option,
'--require-hashes',
dest='require_hashes',
action='store_true',
default=False,
help='Require a hash to check each requirement against, for '
'repeatable installs. This option is implied when any package in a '
'requirements file has a --hash option.',
) # type: Any
##########
# groups #
##########
general_group = {
'name': 'General Options',
'options': [
help_,
isolated_mode,
require_virtualenv,
verbose,
version,
quiet,
log,
no_input,
proxy,
retries,
timeout,
skip_requirements_regex,
exists_action,
trusted_host,
cert,
client_cert,
cache_dir,
no_cache,
disable_pip_version_check,
no_color,
]
}
index_group = {
'name': 'Package Index Options',
'options': [
index_url,
extra_index_url,
no_index,
find_links,
process_dependency_links,
]
}

@ -0,0 +1,79 @@
"""
Package containing all pip commands
"""
from __future__ import absolute_import
from pip._internal.commands.completion import CompletionCommand
from pip._internal.commands.configuration import ConfigurationCommand
from pip._internal.commands.download import DownloadCommand
from pip._internal.commands.freeze import FreezeCommand
from pip._internal.commands.hash import HashCommand
from pip._internal.commands.help import HelpCommand
from pip._internal.commands.list import ListCommand
from pip._internal.commands.check import CheckCommand
from pip._internal.commands.search import SearchCommand
from pip._internal.commands.show import ShowCommand
from pip._internal.commands.install import InstallCommand
from pip._internal.commands.uninstall import UninstallCommand
from pip._internal.commands.wheel import WheelCommand
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
if MYPY_CHECK_RUNNING:
from typing import List, Type
from pip._internal.basecommand import Command
commands_order = [
InstallCommand,
DownloadCommand,
UninstallCommand,
FreezeCommand,
ListCommand,
ShowCommand,
CheckCommand,
ConfigurationCommand,
SearchCommand,
WheelCommand,
HashCommand,
CompletionCommand,
HelpCommand,
] # type: List[Type[Command]]
commands_dict = {c.name: c for c in commands_order}
def get_summaries(ordered=True):
"""Yields sorted (command name, command summary) tuples."""
if ordered:
cmditems = _sort_commands(commands_dict, commands_order)
else:
cmditems = commands_dict.items()
for name, command_class in cmditems:
yield (name, command_class.summary)
def get_similar_commands(name):
"""Command name auto-correct."""
from difflib import get_close_matches
name = name.lower()
close_commands = get_close_matches(name, commands_dict.keys())
if close_commands:
return close_commands[0]
else:
return False
def _sort_commands(cmddict, order):
def keyfn(key):
try:
return order.index(key[1])
except ValueError:
# unordered items should come last
return 0xff
return sorted(cmddict.items(), key=keyfn)

@ -0,0 +1,42 @@
import logging
from pip._internal.basecommand import Command
from pip._internal.operations.check import (
check_package_set, create_package_set_from_installed,
)
from pip._internal.utils.misc import get_installed_distributions
logger = logging.getLogger(__name__)
class CheckCommand(Command):
"""Verify installed packages have compatible dependencies."""
name = 'check'
usage = """
%prog [options]"""
summary = 'Verify installed packages have compatible dependencies.'
def run(self, options, args):
package_set = create_package_set_from_installed()
missing, conflicting = check_package_set(package_set)
for project_name in missing:
version = package_set[project_name].version
for dependency in missing[project_name]:
logger.info(
"%s %s requires %s, which is not installed.",
project_name, version, dependency[0],
)
for project_name in conflicting:
version = package_set[project_name].version
for dep_name, dep_version, req in conflicting[project_name]:
logger.info(
"%s %s has requirement %s, but you have %s %s.",
project_name, version, req, dep_name, dep_version,
)
if missing or conflicting:
return 1
else:
logger.info("No broken requirements found.")

@ -0,0 +1,94 @@
from __future__ import absolute_import
import sys
import textwrap
from pip._internal.basecommand import Command
from pip._internal.utils.misc import get_prog
BASE_COMPLETION = """
# pip %(shell)s completion start%(script)s# pip %(shell)s completion end
"""
COMPLETION_SCRIPTS = {
'bash': """
_pip_completion()
{
COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\
COMP_CWORD=$COMP_CWORD \\
PIP_AUTO_COMPLETE=1 $1 ) )
}
complete -o default -F _pip_completion %(prog)s
""",
'zsh': """
function _pip_completion {
local words cword
read -Ac words
read -cn cword
reply=( $( COMP_WORDS="$words[*]" \\
COMP_CWORD=$(( cword-1 )) \\
PIP_AUTO_COMPLETE=1 $words[1] ) )
}
compctl -K _pip_completion %(prog)s
""",
'fish': """
function __fish_complete_pip
set -lx COMP_WORDS (commandline -o) ""
set -lx COMP_CWORD ( \\
math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
)
set -lx PIP_AUTO_COMPLETE 1
string split \\ -- (eval $COMP_WORDS[1])
end
complete -fa "(__fish_complete_pip)" -c %(prog)s
""",
}
class CompletionCommand(Command):
"""A helper command to be used for command completion."""
name = 'completion'
summary = 'A helper command used for command completion.'
ignore_require_venv = True
def __init__(self, *args, **kw):
super(CompletionCommand, self).__init__(*args, **kw)
cmd_opts = self.cmd_opts
cmd_opts.add_option(
'--bash', '-b',
action='store_const',
const='bash',
dest='shell',
help='Emit completion code for bash')
cmd_opts.add_option(
'--zsh', '-z',
action='store_const',
const='zsh',
dest='shell',
help='Emit completion code for zsh')
cmd_opts.add_option(
'--fish', '-f',
action='store_const',
const='fish',
dest='shell',
help='Emit completion code for fish')
self.parser.insert_option_group(0, cmd_opts)
def run(self, options, args):
"""Prints the completion code of the given shell"""
shells = COMPLETION_SCRIPTS.keys()
shell_options = ['--' + shell for shell in sorted(shells)]
if options.shell in shells:
script = textwrap.dedent(
COMPLETION_SCRIPTS.get(options.shell, '') % {
'prog': get_prog(),
}
)
print(BASE_COMPLETION % {'script': script, 'shell': options.shell})
else:
sys.stderr.write(
'ERROR: You must pass %s\n' % ' or '.join(shell_options)
)

@ -0,0 +1,227 @@
import logging
import os
import subprocess
from pip._internal.basecommand import Command
from pip._internal.configuration import Configuration, kinds
from pip._internal.exceptions import PipError
from pip._internal.locations import venv_config_file
from pip._internal.status_codes import ERROR, SUCCESS
from pip._internal.utils.misc import get_prog
logger = logging.getLogger(__name__)
class ConfigurationCommand(Command):
"""Manage local and global configuration.
Subcommands:
list: List the active configuration (or from the file specified)
edit: Edit the configuration file in an editor
get: Get the value associated with name
set: Set the name=value
unset: Unset the value associated with name
If none of --user, --global and --venv are passed, a virtual
environment configuration file is used if one is active and the file
exists. Otherwise, all modifications happen on the to the user file by
default.
"""
name = 'config'
usage = """
%prog [<file-option>] list
%prog [<file-option>] [--editor <editor-path>] edit
%prog [<file-option>] get name
%prog [<file-option>] set name value
%prog [<file-option>] unset name
"""
summary = "Manage local and global configuration."
def __init__(self, *args, **kwargs):
super(ConfigurationCommand, self).__init__(*args, **kwargs)
self.configuration = None
self.cmd_opts.add_option(
'--editor',
dest='editor',
action='store',
default=None,
help=(
'Editor to use to edit the file. Uses VISUAL or EDITOR '
'environment variables if not provided.'
)
)
self.cmd_opts.add_option(
'--global',
dest='global_file',
action='store_true',
default=False,
help='Use the system-wide configuration file only'
)
self.cmd_opts.add_option(
'--user',
dest='user_file',
action='store_true',
default=False,
help='Use the user configuration file only'
)
self.cmd_opts.add_option(
'--venv',
dest='venv_file',
action='store_true',
default=False,
help='Use the virtualenv configuration file only'
)
self.parser.insert_option_group(0, self.cmd_opts)
def run(self, options, args):
handlers = {
"list": self.list_values,
"edit": self.open_in_editor,
"get": self.get_name,
"set": self.set_name_value,
"unset": self.unset_name
}
# Determine action
if not args or args[0] not in handlers:
logger.error("Need an action ({}) to perform.".format(
", ".join(sorted(handlers)))
)
return ERROR
action = args[0]
# Determine which configuration files are to be loaded
# Depends on whether the command is modifying.
try:
load_only = self._determine_file(
options, need_value=(action in ["get", "set", "unset", "edit"])
)
except PipError as e:
logger.error(e.args[0])
return ERROR
# Load a new configuration
self.configuration = Configuration(
isolated=options.isolated_mode, load_only=load_only
)
self.configuration.load()
# Error handling happens here, not in the action-handlers.
try:
handlers[action](options, args[1:])
except PipError as e:
logger.error(e.args[0])
return ERROR
return SUCCESS
def _determine_file(self, options, need_value):
file_options = {
kinds.USER: options.user_file,
kinds.GLOBAL: options.global_file,
kinds.VENV: options.venv_file
}
if sum(file_options.values()) == 0:
if not need_value:
return None
# Default to user, unless there's a virtualenv file.
elif os.path.exists(venv_config_file):
return kinds.VENV
else:
return kinds.USER
elif sum(file_options.values()) == 1:
# There's probably a better expression for this.
return [key for key in file_options if file_options[key]][0]
raise PipError(
"Need exactly one file to operate upon "
"(--user, --venv, --global) to perform."
)
def list_values(self, options, args):
self._get_n_args(args, "list", n=0)
for key, value in sorted(self.configuration.items()):
logger.info("%s=%r", key, value)
def get_name(self, options, args):
key = self._get_n_args(args, "get [name]", n=1)
value = self.configuration.get_value(key)
logger.info("%s", value)
def set_name_value(self, options, args):
key, value = self._get_n_args(args, "set [name] [value]", n=2)
self.configuration.set_value(key, value)
self._save_configuration()
def unset_name(self, options, args):
key = self._get_n_args(args, "unset [name]", n=1)
self.configuration.unset_value(key)
self._save_configuration()
def open_in_editor(self, options, args):
editor = self._determine_editor(options)
fname = self.configuration.get_file_to_edit()
if fname is None:
raise PipError("Could not determine appropriate file.")
try:
subprocess.check_call([editor, fname])
except subprocess.CalledProcessError as e:
raise PipError(
"Editor Subprocess exited with exit code {}"
.format(e.returncode)
)
def _get_n_args(self, args, example, n):
"""Helper to make sure the command got the right number of arguments
"""
if len(args) != n:
msg = (
'Got unexpected number of arguments, expected {}. '
'(example: "{} config {}")'
).format(n, get_prog(), example)
raise PipError(msg)
if n == 1:
return args[0]
else:
return args
def _save_configuration(self):
# We successfully ran a modifying command. Need to save the
# configuration.
try:
self.configuration.save()
except Exception:
logger.error(
"Unable to save configuration. Please report this as a bug.",
exc_info=1
)
raise PipError("Internal Error.")
def _determine_editor(self, options):
if options.editor is not None:
return options.editor
elif "VISUAL" in os.environ:
return os.environ["VISUAL"]
elif "EDITOR" in os.environ:
return os.environ["EDITOR"]
else:
raise PipError("Could not determine editor to use.")

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save