parent
7401445928
commit
ad49ea81fa
@ -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 |
@ -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> |
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' |
||||
}) |
@ -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()) |
@ -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()) |
@ -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()) |
@ -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()) |
@ -0,0 +1 @@ |
||||
python3.7 |
@ -0,0 +1 @@ |
||||
python3.7 |
@ -0,0 +1 @@ |
||||
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 |
Binary file not shown.
@ -0,0 +1,5 @@ |
||||
"""Run the EasyInstall command""" |
||||
|
||||
if __name__ == '__main__': |
||||
from setuptools.command.easy_install import main |
||||
main() |
@ -0,0 +1 @@ |
||||
pip |
@ -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 @@ |
||||
pip |
@ -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()) |
Binary file not shown.
Binary file not shown.
@ -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) |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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) |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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…
Reference in new issue