Code import
This commit is contained in:
5
config.cfg
Normal file
5
config.cfg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
DEBUG=False
|
||||||
|
HOST="0.0.0.0"
|
||||||
|
PORT=8000
|
||||||
|
DB_DELAY=30
|
||||||
|
SECRET_KEY='\x1e\xa6\xe6\x06\x89\xb2\xb2\xb9M\xc7\xe3\x04[\x8c\x82\x8c\x99\xd5\x9d\xf4T\xb8\xc8\xf5'
|
||||||
18
requirements.txt
Normal file
18
requirements.txt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
certifi==2017.4.17
|
||||||
|
chardet==3.0.4
|
||||||
|
click==6.7
|
||||||
|
enum-compat==0.0.2
|
||||||
|
enum34==1.1.6
|
||||||
|
eventlet==0.21.0
|
||||||
|
Flask==0.12.2
|
||||||
|
greenlet==0.4.12
|
||||||
|
idna==2.5
|
||||||
|
itsdangerous==0.24
|
||||||
|
Jinja2==2.9.6
|
||||||
|
MarkupSafe==1.0
|
||||||
|
python-engineio==1.7.0
|
||||||
|
python-socketio==1.7.6
|
||||||
|
requests==2.18.1
|
||||||
|
six==1.10.0
|
||||||
|
urllib3==1.21.1
|
||||||
|
Werkzeug==0.12.2
|
||||||
150
server.py
Executable file
150
server.py
Executable file
@@ -0,0 +1,150 @@
|
|||||||
|
#!./venv/bin/python
|
||||||
|
from flask import Flask, request, jsonify, g
|
||||||
|
import json, logging, requests, sqlite3, datetime
|
||||||
|
import socketio
|
||||||
|
|
||||||
|
sio = socketio.Server(logger=True, async_mode=None)
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.config.from_pyfile('config.cfg')
|
||||||
|
app.wsgi_app = socketio.Middleware(sio, app.wsgi_app)
|
||||||
|
|
||||||
|
debug_var = None
|
||||||
|
|
||||||
|
def get_db():
|
||||||
|
db = getattr(g, '_database', None)
|
||||||
|
if db is None:
|
||||||
|
db = g._database = sqlite3.connect('logs.db')
|
||||||
|
return db
|
||||||
|
|
||||||
|
@app.teardown_appcontext
|
||||||
|
def close_connection(exception):
|
||||||
|
db = getattr(g, '_database', None)
|
||||||
|
if db is not None:
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
return "Telemetry API v1"
|
||||||
|
|
||||||
|
@sio.on('my event')
|
||||||
|
def test_message(sid, message):
|
||||||
|
print("SOCKET MESSAGE:" + message['data'])
|
||||||
|
sio.emit('my response', {'data': message['data']})
|
||||||
|
|
||||||
|
def get_location(request):
|
||||||
|
if request.headers.getlist("X-Forwarded-For"):
|
||||||
|
ip = request.headers.getlist("X-Forwarded-For")[0]
|
||||||
|
else:
|
||||||
|
ip = request.remote_addr
|
||||||
|
send_url = 'http://freegeoip.net/json/' + ip
|
||||||
|
j = json.loads(requests.get(send_url).text)
|
||||||
|
location = {
|
||||||
|
'lat' : j['latitude'],
|
||||||
|
'lon' : j['longitude'],
|
||||||
|
'country_code' : j['country_code'],
|
||||||
|
'country_name' : j['country_name'],
|
||||||
|
'region_code' : j['region_code'],
|
||||||
|
'region_name': j['region_name'],
|
||||||
|
'city' : j['city']
|
||||||
|
}
|
||||||
|
return location
|
||||||
|
|
||||||
|
@app.route( '/event/<string:event_type>', methods=['POST'] )
|
||||||
|
def trigger_event(event_type):
|
||||||
|
global debug_var
|
||||||
|
debug_var = request.args.get('uid')
|
||||||
|
print(request)
|
||||||
|
print("-------"+datetime.datetime.now().strftime('%H:%M:%S')+"--------")
|
||||||
|
content = request.get_json()
|
||||||
|
return_debug = int(content.get('debug', 0))
|
||||||
|
user_id = content['uid']
|
||||||
|
app_name = content['app']
|
||||||
|
json_data = content['json']
|
||||||
|
if not isinstance(json_data, dict):
|
||||||
|
json_data = json.loads(json_data)
|
||||||
|
print(type(json_data))
|
||||||
|
location = get_location(request)
|
||||||
|
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
re = "Event(%s) from %s, running %s in %s/%s \n" % (event_type, user_id,app_name, location['country_code'], location['region_code'] )
|
||||||
|
db = get_db()
|
||||||
|
last_entry = db.cursor().execute('SELECT * FROM events WHERE app LIKE ? AND type LIKE ? AND user LIKE ? ORDER BY dt DESC LIMIT 1 ', \
|
||||||
|
(app_name, event_type, user_id, )).fetchall()
|
||||||
|
last_timestamp = datetime.datetime.now()
|
||||||
|
if len(last_entry) >= 1 :
|
||||||
|
last_timestamp = datetime.datetime.strptime(last_entry[0][5], '%Y-%m-%d %H:%M:%S')
|
||||||
|
diff = ((datetime.datetime.now() - last_timestamp).total_seconds())/60
|
||||||
|
if len(last_entry) <= 0 or (diff) > app.config['DB_DELAY'] : #30 min db entry diff
|
||||||
|
db.cursor().execute('INSERT INTO events VALUES (?, ?, ?, ?, ?, ?)', (event_type,user_id, app_name, str(location), str(json_data), timestamp,) )
|
||||||
|
result = db.commit()
|
||||||
|
re += "DB Record created\n" #SCHEMA: events (type text, user text, app text, json text, dt datetime)
|
||||||
|
else: re += "Event skipped, last db record added %.2f min ago\n" % (diff)
|
||||||
|
print(re)
|
||||||
|
#re = jsonify(re)
|
||||||
|
io_response = {'event_type' : event_type,
|
||||||
|
'user_id' : user_id,
|
||||||
|
'app_name' : app_name,
|
||||||
|
'json_data' : json_data,
|
||||||
|
'location': location,
|
||||||
|
'timestamp': timestamp}
|
||||||
|
|
||||||
|
sio.emit('event', {'data': io_response })
|
||||||
|
return jsonify("true") if return_debug == 0 else re
|
||||||
|
|
||||||
|
@app.route('/get/types')
|
||||||
|
def get_type_list():
|
||||||
|
db = get_db()
|
||||||
|
data = db.cursor().execute('SELECT DISTINCT type FROM events ').fetchall()
|
||||||
|
return jsonify(data)
|
||||||
|
|
||||||
|
@app.route('/get/events/<string:appfilter>', methods=['GET'])
|
||||||
|
def get_all_events(appfilter):
|
||||||
|
db = get_db()
|
||||||
|
appfilter = "%" if appfilter == "all" else appfilter
|
||||||
|
fromfilter = request.args.get("from") or "%" #start date
|
||||||
|
tofilter = request.args.get("to") or datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') #end date
|
||||||
|
typefilter = request.args.get("type") or "%"
|
||||||
|
userfilter = request.args.get("userid") or "%"
|
||||||
|
data = db.cursor().execute('SELECT * FROM events WHERE app LIKE ? AND dt BETWEEN ? and ? AND type LIKE ? AND user LIKE ? ', \
|
||||||
|
(appfilter, fromfilter, tofilter, typefilter, userfilter, )).fetchall()
|
||||||
|
result = {'events' : {}}
|
||||||
|
for i, event in enumerate(data):
|
||||||
|
result['events'][i] = { "type" : event[0], "user_id" : event[1], "app" : event[2], "location": event[3], "json" : event[4], "timestamp" : event[5] }
|
||||||
|
return jsonify(result)
|
||||||
|
|
||||||
|
|
||||||
|
#if __name__ == "__main__" :
|
||||||
|
# app.run(host=app.config['HOST'], port=app.config['PORT'])
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if sio.async_mode == 'threading':
|
||||||
|
print("threading(werkzeug)")
|
||||||
|
# deploy with Werkzeug
|
||||||
|
app.run(threaded=True, port=app.config['PORT'])
|
||||||
|
elif sio.async_mode == 'eventlet':
|
||||||
|
print("eventlet")
|
||||||
|
# deploy with eventlet
|
||||||
|
import eventlet
|
||||||
|
import eventlet.wsgi
|
||||||
|
eventlet.wsgi.server(eventlet.listen((app.config['HOST'], app.config['PORT'])), app)
|
||||||
|
elif sio.async_mode == 'gevent':
|
||||||
|
print("GEVENT")
|
||||||
|
# deploy with gevent
|
||||||
|
from gevent import pywsgi
|
||||||
|
try:
|
||||||
|
from geventwebsocket.handler import WebSocketHandler
|
||||||
|
websocket = True
|
||||||
|
except ImportError:
|
||||||
|
websocket = False
|
||||||
|
if websocket:
|
||||||
|
pywsgi.WSGIServer(('', app.config['PORT']), app,
|
||||||
|
handler_class=WebSocketHandler).serve_forever()
|
||||||
|
else:
|
||||||
|
print("PYWSGI")
|
||||||
|
pywsgi.WSGIServer(('', app.config['PORT']), app).serve_forever()
|
||||||
|
elif sio.async_mode == 'gevent_uwsgi':
|
||||||
|
print('Start the application through the uwsgi server. Example:')
|
||||||
|
print('uwsgi --http :5000 --gevent 1000 --http-websockets --master '
|
||||||
|
'--wsgi-file app.py --callable app')
|
||||||
|
else:
|
||||||
|
print('Unknown async_mode: ' + sio.async_mode)
|
||||||
78
venv/bin/activate
Normal file
78
venv/bin/activate
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# This file must be used with "source bin/activate" *from bash*
|
||||||
|
# you cannot run it directly
|
||||||
|
|
||||||
|
deactivate () {
|
||||||
|
unset -f pydoc >/dev/null 2>&1
|
||||||
|
|
||||||
|
# reset old environment variables
|
||||||
|
# ! [ -z ${VAR+_} ] returns true if VAR is declared at all
|
||||||
|
if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then
|
||||||
|
PATH="$_OLD_VIRTUAL_PATH"
|
||||||
|
export PATH
|
||||||
|
unset _OLD_VIRTUAL_PATH
|
||||||
|
fi
|
||||||
|
if ! [ -z "${_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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
|
||||||
|
hash -r 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -z "${_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="/home/minzkraut/python/telemetry/venv"
|
||||||
|
export VIRTUAL_ENV
|
||||||
|
|
||||||
|
_OLD_VIRTUAL_PATH="$PATH"
|
||||||
|
PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
# unset PYTHONHOME if set
|
||||||
|
if ! [ -z "${PYTHONHOME+_}" ] ; then
|
||||||
|
_OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
|
||||||
|
unset PYTHONHOME
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
|
||||||
|
_OLD_VIRTUAL_PS1="$PS1"
|
||||||
|
if [ "x" != x ] ; then
|
||||||
|
PS1="$PS1"
|
||||||
|
else
|
||||||
|
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
|
||||||
|
fi
|
||||||
|
export PS1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure to unalias pydoc if it's already there
|
||||||
|
alias pydoc 2>/dev/null >/dev/null && unalias pydoc
|
||||||
|
|
||||||
|
pydoc () {
|
||||||
|
python -m pydoc "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
|
||||||
|
hash -r 2>/dev/null
|
||||||
|
fi
|
||||||
36
venv/bin/activate.csh
Normal file
36
venv/bin/activate.csh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# 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>.
|
||||||
|
|
||||||
|
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 && unalias pydoc'
|
||||||
|
|
||||||
|
# Unset irrelevant variables.
|
||||||
|
deactivate nondestructive
|
||||||
|
|
||||||
|
setenv VIRTUAL_ENV "/home/minzkraut/python/telemetry/venv"
|
||||||
|
|
||||||
|
set _OLD_VIRTUAL_PATH="$PATH"
|
||||||
|
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ("" != "") then
|
||||||
|
set env_name = ""
|
||||||
|
else
|
||||||
|
set env_name = `basename "$VIRTUAL_ENV"`
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Could be in a non-interactive environment,
|
||||||
|
# in which case, $prompt is undefined and we wouldn't
|
||||||
|
# care about the prompt anyway.
|
||||||
|
if ( $?prompt ) then
|
||||||
|
set _OLD_VIRTUAL_PROMPT="$prompt"
|
||||||
|
set prompt = "[$env_name] $prompt"
|
||||||
|
endif
|
||||||
|
|
||||||
|
unset env_name
|
||||||
|
|
||||||
|
alias pydoc python -m pydoc
|
||||||
|
|
||||||
|
rehash
|
||||||
|
|
||||||
76
venv/bin/activate.fish
Normal file
76
venv/bin/activate.fish
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*.
|
||||||
|
# Do not run it directly.
|
||||||
|
|
||||||
|
function deactivate -d 'Exit virtualenv mode and return to the normal 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"
|
||||||
|
# Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`.
|
||||||
|
set -l fish_function_path
|
||||||
|
|
||||||
|
# Erase virtualenv's `fish_prompt` and restore the original.
|
||||||
|
functions -e fish_prompt
|
||||||
|
functions -c _old_fish_prompt fish_prompt
|
||||||
|
functions -e _old_fish_prompt
|
||||||
|
set -e _OLD_FISH_PROMPT_OVERRIDE
|
||||||
|
end
|
||||||
|
|
||||||
|
set -e VIRTUAL_ENV
|
||||||
|
|
||||||
|
if test "$argv[1]" != 'nondestructive'
|
||||||
|
# Self-destruct!
|
||||||
|
functions -e pydoc
|
||||||
|
functions -e deactivate
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Unset irrelevant variables.
|
||||||
|
deactivate nondestructive
|
||||||
|
|
||||||
|
set -gx VIRTUAL_ENV "/home/minzkraut/python/telemetry/venv"
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
function pydoc
|
||||||
|
python -m pydoc $argv
|
||||||
|
end
|
||||||
|
|
||||||
|
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
||||||
|
# Copy the current `fish_prompt` function as `_old_fish_prompt`.
|
||||||
|
functions -c fish_prompt _old_fish_prompt
|
||||||
|
|
||||||
|
function fish_prompt
|
||||||
|
# Save the current $status, for fish_prompts that display it.
|
||||||
|
set -l old_status $status
|
||||||
|
|
||||||
|
# Prompt override provided?
|
||||||
|
# If not, just prepend the environment name.
|
||||||
|
if test -n ""
|
||||||
|
printf '%s%s' "" (set_color normal)
|
||||||
|
else
|
||||||
|
printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Restore the original $status
|
||||||
|
echo "exit $old_status" | source
|
||||||
|
_old_fish_prompt
|
||||||
|
end
|
||||||
|
|
||||||
|
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
||||||
|
end
|
||||||
34
venv/bin/activate_this.py
Normal file
34
venv/bin/activate_this.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
"""By using execfile(this_file, dict(__file__=this_file)) you will
|
||||||
|
activate this virtualenv environment.
|
||||||
|
|
||||||
|
This can be used when you must use an existing Python interpreter, not
|
||||||
|
the virtualenv bin/python
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
__file__
|
||||||
|
except NameError:
|
||||||
|
raise AssertionError(
|
||||||
|
"You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
old_os_path = os.environ.get('PATH', '')
|
||||||
|
os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
|
||||||
|
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
site_packages = os.path.join(base, 'Lib', 'site-packages')
|
||||||
|
else:
|
||||||
|
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
|
||||||
|
prev_sys_path = list(sys.path)
|
||||||
|
import site
|
||||||
|
site.addsitedir(site_packages)
|
||||||
|
sys.real_prefix = sys.prefix
|
||||||
|
sys.prefix = base
|
||||||
|
# Move the added items to the front of the path:
|
||||||
|
new_sys_path = []
|
||||||
|
for item in list(sys.path):
|
||||||
|
if item not in prev_sys_path:
|
||||||
|
new_sys_path.append(item)
|
||||||
|
sys.path.remove(item)
|
||||||
|
sys.path[:0] = new_sys_path
|
||||||
11
venv/bin/chardetect
Executable file
11
venv/bin/chardetect
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from chardet.cli.chardetect import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
11
venv/bin/easy_install
Executable file
11
venv/bin/easy_install
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from setuptools.command.easy_install import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
11
venv/bin/easy_install-2.7
Executable file
11
venv/bin/easy_install-2.7
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from setuptools.command.easy_install import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
11
venv/bin/flask
Executable file
11
venv/bin/flask
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from flask.cli import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
11
venv/bin/pip
Executable file
11
venv/bin/pip
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pip import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
11
venv/bin/pip2
Executable file
11
venv/bin/pip2
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pip import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
11
venv/bin/pip2.7
Executable file
11
venv/bin/pip2.7
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pip import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
BIN
venv/bin/python
Executable file
BIN
venv/bin/python
Executable file
Binary file not shown.
78
venv/bin/python-config
Executable file
78
venv/bin/python-config
Executable file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import getopt
|
||||||
|
import sysconfig
|
||||||
|
|
||||||
|
valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
|
||||||
|
'ldflags', 'help']
|
||||||
|
|
||||||
|
if sys.version_info >= (3, 2):
|
||||||
|
valid_opts.insert(-1, 'extension-suffix')
|
||||||
|
valid_opts.append('abiflags')
|
||||||
|
if sys.version_info >= (3, 3):
|
||||||
|
valid_opts.append('configdir')
|
||||||
|
|
||||||
|
|
||||||
|
def exit_with_usage(code=1):
|
||||||
|
sys.stderr.write("Usage: {0} [{1}]\n".format(
|
||||||
|
sys.argv[0], '|'.join('--'+opt for opt in valid_opts)))
|
||||||
|
sys.exit(code)
|
||||||
|
|
||||||
|
try:
|
||||||
|
opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
|
||||||
|
except getopt.error:
|
||||||
|
exit_with_usage()
|
||||||
|
|
||||||
|
if not opts:
|
||||||
|
exit_with_usage()
|
||||||
|
|
||||||
|
pyver = sysconfig.get_config_var('VERSION')
|
||||||
|
getvar = sysconfig.get_config_var
|
||||||
|
|
||||||
|
opt_flags = [flag for (flag, val) in opts]
|
||||||
|
|
||||||
|
if '--help' in opt_flags:
|
||||||
|
exit_with_usage(code=0)
|
||||||
|
|
||||||
|
for opt in opt_flags:
|
||||||
|
if opt == '--prefix':
|
||||||
|
print(sysconfig.get_config_var('prefix'))
|
||||||
|
|
||||||
|
elif opt == '--exec-prefix':
|
||||||
|
print(sysconfig.get_config_var('exec_prefix'))
|
||||||
|
|
||||||
|
elif opt in ('--includes', '--cflags'):
|
||||||
|
flags = ['-I' + sysconfig.get_path('include'),
|
||||||
|
'-I' + sysconfig.get_path('platinclude')]
|
||||||
|
if opt == '--cflags':
|
||||||
|
flags.extend(getvar('CFLAGS').split())
|
||||||
|
print(' '.join(flags))
|
||||||
|
|
||||||
|
elif opt in ('--libs', '--ldflags'):
|
||||||
|
abiflags = getattr(sys, 'abiflags', '')
|
||||||
|
libs = ['-lpython' + pyver + abiflags]
|
||||||
|
libs += getvar('LIBS').split()
|
||||||
|
libs += getvar('SYSLIBS').split()
|
||||||
|
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
|
||||||
|
# shared library in prefix/lib/.
|
||||||
|
if opt == '--ldflags':
|
||||||
|
if not getvar('Py_ENABLE_SHARED'):
|
||||||
|
libs.insert(0, '-L' + getvar('LIBPL'))
|
||||||
|
if not getvar('PYTHONFRAMEWORK'):
|
||||||
|
libs.extend(getvar('LINKFORSHARED').split())
|
||||||
|
print(' '.join(libs))
|
||||||
|
|
||||||
|
elif opt == '--extension-suffix':
|
||||||
|
ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
|
||||||
|
if ext_suffix is None:
|
||||||
|
ext_suffix = sysconfig.get_config_var('SO')
|
||||||
|
print(ext_suffix)
|
||||||
|
|
||||||
|
elif opt == '--abiflags':
|
||||||
|
if not getattr(sys, 'abiflags', None):
|
||||||
|
exit_with_usage()
|
||||||
|
print(sys.abiflags)
|
||||||
|
|
||||||
|
elif opt == '--configdir':
|
||||||
|
print(sysconfig.get_config_var('LIBPL'))
|
||||||
1
venv/bin/python2
Symbolic link
1
venv/bin/python2
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
python
|
||||||
1
venv/bin/python2.7
Symbolic link
1
venv/bin/python2.7
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
python
|
||||||
11
venv/bin/wheel
Executable file
11
venv/bin/wheel
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/home/minzkraut/python/telemetry/venv/bin/python
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from wheel.tool import main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
|
sys.exit(main())
|
||||||
1
venv/include/python2.7
Symbolic link
1
venv/include/python2.7
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/include/python2.7
|
||||||
148
venv/include/site/python2.7/greenlet/greenlet.h
Normal file
148
venv/include/site/python2.7/greenlet/greenlet.h
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
/* vim:set noet ts=8 sw=8 : */
|
||||||
|
|
||||||
|
/* Greenlet object interface */
|
||||||
|
|
||||||
|
#ifndef Py_GREENLETOBJECT_H
|
||||||
|
#define Py_GREENLETOBJECT_H
|
||||||
|
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GREENLET_VERSION "0.4.12"
|
||||||
|
|
||||||
|
typedef struct _greenlet {
|
||||||
|
PyObject_HEAD
|
||||||
|
char* stack_start;
|
||||||
|
char* stack_stop;
|
||||||
|
char* stack_copy;
|
||||||
|
intptr_t stack_saved;
|
||||||
|
struct _greenlet* stack_prev;
|
||||||
|
struct _greenlet* parent;
|
||||||
|
PyObject* run_info;
|
||||||
|
struct _frame* top_frame;
|
||||||
|
int recursion_depth;
|
||||||
|
PyObject* weakreflist;
|
||||||
|
PyObject* exc_type;
|
||||||
|
PyObject* exc_value;
|
||||||
|
PyObject* exc_traceback;
|
||||||
|
PyObject* dict;
|
||||||
|
} PyGreenlet;
|
||||||
|
|
||||||
|
#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type)
|
||||||
|
#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*) -1)
|
||||||
|
#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL)
|
||||||
|
#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL)
|
||||||
|
#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent)
|
||||||
|
|
||||||
|
#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 1) || PY_MAJOR_VERSION > 3
|
||||||
|
#define GREENLET_USE_PYCAPSULE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* C API functions */
|
||||||
|
|
||||||
|
/* Total number of symbols that are exported */
|
||||||
|
#define PyGreenlet_API_pointers 8
|
||||||
|
|
||||||
|
#define PyGreenlet_Type_NUM 0
|
||||||
|
#define PyExc_GreenletError_NUM 1
|
||||||
|
#define PyExc_GreenletExit_NUM 2
|
||||||
|
|
||||||
|
#define PyGreenlet_New_NUM 3
|
||||||
|
#define PyGreenlet_GetCurrent_NUM 4
|
||||||
|
#define PyGreenlet_Throw_NUM 5
|
||||||
|
#define PyGreenlet_Switch_NUM 6
|
||||||
|
#define PyGreenlet_SetParent_NUM 7
|
||||||
|
|
||||||
|
#ifndef GREENLET_MODULE
|
||||||
|
/* This section is used by modules that uses the greenlet C API */
|
||||||
|
static void **_PyGreenlet_API = NULL;
|
||||||
|
|
||||||
|
#define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM])
|
||||||
|
|
||||||
|
#define PyExc_GreenletError \
|
||||||
|
((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM])
|
||||||
|
|
||||||
|
#define PyExc_GreenletExit \
|
||||||
|
((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM])
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PyGreenlet_New(PyObject *args)
|
||||||
|
*
|
||||||
|
* greenlet.greenlet(run, parent=None)
|
||||||
|
*/
|
||||||
|
#define PyGreenlet_New \
|
||||||
|
(* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \
|
||||||
|
_PyGreenlet_API[PyGreenlet_New_NUM])
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PyGreenlet_GetCurrent(void)
|
||||||
|
*
|
||||||
|
* greenlet.getcurrent()
|
||||||
|
*/
|
||||||
|
#define PyGreenlet_GetCurrent \
|
||||||
|
(* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PyGreenlet_Throw(
|
||||||
|
* PyGreenlet *greenlet,
|
||||||
|
* PyObject *typ,
|
||||||
|
* PyObject *val,
|
||||||
|
* PyObject *tb)
|
||||||
|
*
|
||||||
|
* g.throw(...)
|
||||||
|
*/
|
||||||
|
#define PyGreenlet_Throw \
|
||||||
|
(* (PyObject * (*) \
|
||||||
|
(PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \
|
||||||
|
_PyGreenlet_API[PyGreenlet_Throw_NUM])
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
|
||||||
|
*
|
||||||
|
* g.switch(*args, **kwargs)
|
||||||
|
*/
|
||||||
|
#define PyGreenlet_Switch \
|
||||||
|
(* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \
|
||||||
|
_PyGreenlet_API[PyGreenlet_Switch_NUM])
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
|
||||||
|
*
|
||||||
|
* g.parent = new_parent
|
||||||
|
*/
|
||||||
|
#define PyGreenlet_SetParent \
|
||||||
|
(* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \
|
||||||
|
_PyGreenlet_API[PyGreenlet_SetParent_NUM])
|
||||||
|
|
||||||
|
/* Macro that imports greenlet and initializes C API */
|
||||||
|
#ifdef GREENLET_USE_PYCAPSULE
|
||||||
|
#define PyGreenlet_Import() \
|
||||||
|
{ \
|
||||||
|
_PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define PyGreenlet_Import() \
|
||||||
|
{ \
|
||||||
|
PyObject *module = PyImport_ImportModule("greenlet"); \
|
||||||
|
if (module != NULL) { \
|
||||||
|
PyObject *c_api_object = PyObject_GetAttrString( \
|
||||||
|
module, "_C_API"); \
|
||||||
|
if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \
|
||||||
|
_PyGreenlet_API = \
|
||||||
|
(void **) PyCObject_AsVoidPtr(c_api_object); \
|
||||||
|
Py_DECREF(c_api_object); \
|
||||||
|
} \
|
||||||
|
Py_DECREF(module); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* GREENLET_MODULE */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_GREENLETOBJECT_H */
|
||||||
1
venv/lib/python2.7/UserDict.py
Symbolic link
1
venv/lib/python2.7/UserDict.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/UserDict.py
|
||||||
BIN
venv/lib/python2.7/UserDict.pyc
Normal file
BIN
venv/lib/python2.7/UserDict.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/_abcoll.py
Symbolic link
1
venv/lib/python2.7/_abcoll.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/_abcoll.py
|
||||||
BIN
venv/lib/python2.7/_abcoll.pyc
Normal file
BIN
venv/lib/python2.7/_abcoll.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/_weakrefset.py
Symbolic link
1
venv/lib/python2.7/_weakrefset.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/_weakrefset.py
|
||||||
BIN
venv/lib/python2.7/_weakrefset.pyc
Normal file
BIN
venv/lib/python2.7/_weakrefset.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/abc.py
Symbolic link
1
venv/lib/python2.7/abc.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/abc.py
|
||||||
BIN
venv/lib/python2.7/abc.pyc
Normal file
BIN
venv/lib/python2.7/abc.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/codecs.py
Symbolic link
1
venv/lib/python2.7/codecs.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/codecs.py
|
||||||
BIN
venv/lib/python2.7/codecs.pyc
Normal file
BIN
venv/lib/python2.7/codecs.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/copy_reg.py
Symbolic link
1
venv/lib/python2.7/copy_reg.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/copy_reg.py
|
||||||
BIN
venv/lib/python2.7/copy_reg.pyc
Normal file
BIN
venv/lib/python2.7/copy_reg.pyc
Normal file
Binary file not shown.
101
venv/lib/python2.7/distutils/__init__.py
Normal file
101
venv/lib/python2.7/distutils/__init__.py
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import warnings
|
||||||
|
import imp
|
||||||
|
import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib
|
||||||
|
# Important! To work on pypy, this must be a module that resides in the
|
||||||
|
# lib-python/modified-x.y.z directory
|
||||||
|
|
||||||
|
dirname = os.path.dirname
|
||||||
|
|
||||||
|
distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils')
|
||||||
|
if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)):
|
||||||
|
warnings.warn(
|
||||||
|
"The virtualenv distutils package at %s appears to be in the same location as the system distutils?")
|
||||||
|
else:
|
||||||
|
__path__.insert(0, distutils_path)
|
||||||
|
real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY))
|
||||||
|
# Copy the relevant attributes
|
||||||
|
try:
|
||||||
|
__revision__ = real_distutils.__revision__
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
__version__ = real_distutils.__version__
|
||||||
|
|
||||||
|
from distutils import dist, sysconfig
|
||||||
|
|
||||||
|
try:
|
||||||
|
basestring
|
||||||
|
except NameError:
|
||||||
|
basestring = str
|
||||||
|
|
||||||
|
## patch build_ext (distutils doesn't know how to get the libs directory
|
||||||
|
## path on windows - it hardcodes the paths around the patched sys.prefix)
|
||||||
|
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
from distutils.command.build_ext import build_ext as old_build_ext
|
||||||
|
class build_ext(old_build_ext):
|
||||||
|
def finalize_options (self):
|
||||||
|
if self.library_dirs is None:
|
||||||
|
self.library_dirs = []
|
||||||
|
elif isinstance(self.library_dirs, basestring):
|
||||||
|
self.library_dirs = self.library_dirs.split(os.pathsep)
|
||||||
|
|
||||||
|
self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs"))
|
||||||
|
old_build_ext.finalize_options(self)
|
||||||
|
|
||||||
|
from distutils.command import build_ext as build_ext_module
|
||||||
|
build_ext_module.build_ext = build_ext
|
||||||
|
|
||||||
|
## distutils.dist patches:
|
||||||
|
|
||||||
|
old_find_config_files = dist.Distribution.find_config_files
|
||||||
|
def find_config_files(self):
|
||||||
|
found = old_find_config_files(self)
|
||||||
|
system_distutils = os.path.join(distutils_path, 'distutils.cfg')
|
||||||
|
#if os.path.exists(system_distutils):
|
||||||
|
# found.insert(0, system_distutils)
|
||||||
|
# What to call the per-user config file
|
||||||
|
if os.name == 'posix':
|
||||||
|
user_filename = ".pydistutils.cfg"
|
||||||
|
else:
|
||||||
|
user_filename = "pydistutils.cfg"
|
||||||
|
user_filename = os.path.join(sys.prefix, user_filename)
|
||||||
|
if os.path.isfile(user_filename):
|
||||||
|
for item in list(found):
|
||||||
|
if item.endswith('pydistutils.cfg'):
|
||||||
|
found.remove(item)
|
||||||
|
found.append(user_filename)
|
||||||
|
return found
|
||||||
|
dist.Distribution.find_config_files = find_config_files
|
||||||
|
|
||||||
|
## distutils.sysconfig patches:
|
||||||
|
|
||||||
|
old_get_python_inc = sysconfig.get_python_inc
|
||||||
|
def sysconfig_get_python_inc(plat_specific=0, prefix=None):
|
||||||
|
if prefix is None:
|
||||||
|
prefix = sys.real_prefix
|
||||||
|
return old_get_python_inc(plat_specific, prefix)
|
||||||
|
sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__
|
||||||
|
sysconfig.get_python_inc = sysconfig_get_python_inc
|
||||||
|
|
||||||
|
old_get_python_lib = sysconfig.get_python_lib
|
||||||
|
def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||||
|
if standard_lib and prefix is None:
|
||||||
|
prefix = sys.real_prefix
|
||||||
|
return old_get_python_lib(plat_specific, standard_lib, prefix)
|
||||||
|
sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__
|
||||||
|
sysconfig.get_python_lib = sysconfig_get_python_lib
|
||||||
|
|
||||||
|
old_get_config_vars = sysconfig.get_config_vars
|
||||||
|
def sysconfig_get_config_vars(*args):
|
||||||
|
real_vars = old_get_config_vars(*args)
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
lib_dir = os.path.join(sys.real_prefix, "libs")
|
||||||
|
if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars:
|
||||||
|
real_vars['LIBDIR'] = lib_dir # asked for all
|
||||||
|
elif isinstance(real_vars, list) and 'LIBDIR' in args:
|
||||||
|
real_vars = real_vars + [lib_dir] # asked for list
|
||||||
|
return real_vars
|
||||||
|
sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__
|
||||||
|
sysconfig.get_config_vars = sysconfig_get_config_vars
|
||||||
BIN
venv/lib/python2.7/distutils/__init__.pyc
Normal file
BIN
venv/lib/python2.7/distutils/__init__.pyc
Normal file
Binary file not shown.
6
venv/lib/python2.7/distutils/distutils.cfg
Normal file
6
venv/lib/python2.7/distutils/distutils.cfg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# This is a config file local to this virtualenv installation
|
||||||
|
# You may include options that will be used by all distutils commands,
|
||||||
|
# and by easy_install. For instance:
|
||||||
|
#
|
||||||
|
# [easy_install]
|
||||||
|
# find_links = http://mylocalsite
|
||||||
1
venv/lib/python2.7/encodings
Symbolic link
1
venv/lib/python2.7/encodings
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/encodings
|
||||||
1
venv/lib/python2.7/fnmatch.py
Symbolic link
1
venv/lib/python2.7/fnmatch.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/fnmatch.py
|
||||||
BIN
venv/lib/python2.7/fnmatch.pyc
Normal file
BIN
venv/lib/python2.7/fnmatch.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/genericpath.py
Symbolic link
1
venv/lib/python2.7/genericpath.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/genericpath.py
|
||||||
BIN
venv/lib/python2.7/genericpath.pyc
Normal file
BIN
venv/lib/python2.7/genericpath.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/lib-dynload
Symbolic link
1
venv/lib/python2.7/lib-dynload
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/lib-dynload
|
||||||
1
venv/lib/python2.7/linecache.py
Symbolic link
1
venv/lib/python2.7/linecache.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/linecache.py
|
||||||
BIN
venv/lib/python2.7/linecache.pyc
Normal file
BIN
venv/lib/python2.7/linecache.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/locale.py
Symbolic link
1
venv/lib/python2.7/locale.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/locale.py
|
||||||
BIN
venv/lib/python2.7/locale.pyc
Normal file
BIN
venv/lib/python2.7/locale.pyc
Normal file
Binary file not shown.
0
venv/lib/python2.7/no-global-site-packages.txt
Normal file
0
venv/lib/python2.7/no-global-site-packages.txt
Normal file
1
venv/lib/python2.7/ntpath.py
Symbolic link
1
venv/lib/python2.7/ntpath.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/ntpath.py
|
||||||
1
venv/lib/python2.7/orig-prefix.txt
Normal file
1
venv/lib/python2.7/orig-prefix.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/usr
|
||||||
1
venv/lib/python2.7/os.py
Symbolic link
1
venv/lib/python2.7/os.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/os.py
|
||||||
BIN
venv/lib/python2.7/os.pyc
Normal file
BIN
venv/lib/python2.7/os.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/posixpath.py
Symbolic link
1
venv/lib/python2.7/posixpath.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/posixpath.py
|
||||||
BIN
venv/lib/python2.7/posixpath.pyc
Normal file
BIN
venv/lib/python2.7/posixpath.pyc
Normal file
Binary file not shown.
1
venv/lib/python2.7/re.py
Symbolic link
1
venv/lib/python2.7/re.py
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
/usr/lib/python2.7/re.py
|
||||||
BIN
venv/lib/python2.7/re.pyc
Normal file
BIN
venv/lib/python2.7/re.pyc
Normal file
Binary file not shown.
@@ -0,0 +1,46 @@
|
|||||||
|
Flask
|
||||||
|
-----
|
||||||
|
|
||||||
|
Flask is a microframework for Python based on Werkzeug, Jinja 2 and good
|
||||||
|
intentions. And before you ask: It's BSD licensed!
|
||||||
|
|
||||||
|
Flask is Fun
|
||||||
|
````````````
|
||||||
|
|
||||||
|
Save in a hello.py:
|
||||||
|
|
||||||
|
.. code:: python
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def hello():
|
||||||
|
return "Hello World!"
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run()
|
||||||
|
|
||||||
|
And Easy to Setup
|
||||||
|
`````````````````
|
||||||
|
|
||||||
|
And run it:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ pip install Flask
|
||||||
|
$ python hello.py
|
||||||
|
* Running on http://localhost:5000/
|
||||||
|
|
||||||
|
Ready for production? `Read this first <http://flask.pocoo.org/docs/deploying/>`.
|
||||||
|
|
||||||
|
Links
|
||||||
|
`````
|
||||||
|
|
||||||
|
* `website <http://flask.pocoo.org/>`_
|
||||||
|
* `documentation <http://flask.pocoo.org/docs/>`_
|
||||||
|
* `development version
|
||||||
|
<http://github.com/pallets/flask/zipball/master#egg=Flask-dev>`_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
pip
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
Copyright (c) 2015 by Armin Ronacher and contributors. See AUTHORS
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
Some rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms of the software as well
|
||||||
|
as documentation, with or without modification, are permitted provided
|
||||||
|
that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* The names of the contributors may not be used to endorse or
|
||||||
|
promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGE.
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
Metadata-Version: 2.0
|
||||||
|
Name: Flask
|
||||||
|
Version: 0.12.2
|
||||||
|
Summary: A microframework based on Werkzeug, Jinja2 and good intentions
|
||||||
|
Home-page: http://github.com/pallets/flask/
|
||||||
|
Author: Armin Ronacher
|
||||||
|
Author-email: armin.ronacher@active-4.com
|
||||||
|
License: BSD
|
||||||
|
Platform: any
|
||||||
|
Classifier: Development Status :: 4 - Beta
|
||||||
|
Classifier: Environment :: Web Environment
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: License :: OSI Approved :: BSD License
|
||||||
|
Classifier: Operating System :: OS Independent
|
||||||
|
Classifier: Programming Language :: Python
|
||||||
|
Classifier: Programming Language :: Python :: 2
|
||||||
|
Classifier: Programming Language :: Python :: 2.6
|
||||||
|
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: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||||
|
Requires-Dist: Jinja2 (>=2.4)
|
||||||
|
Requires-Dist: Werkzeug (>=0.7)
|
||||||
|
Requires-Dist: click (>=2.0)
|
||||||
|
Requires-Dist: itsdangerous (>=0.21)
|
||||||
|
|
||||||
|
Flask
|
||||||
|
-----
|
||||||
|
|
||||||
|
Flask is a microframework for Python based on Werkzeug, Jinja 2 and good
|
||||||
|
intentions. And before you ask: It's BSD licensed!
|
||||||
|
|
||||||
|
Flask is Fun
|
||||||
|
````````````
|
||||||
|
|
||||||
|
Save in a hello.py:
|
||||||
|
|
||||||
|
.. code:: python
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def hello():
|
||||||
|
return "Hello World!"
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run()
|
||||||
|
|
||||||
|
And Easy to Setup
|
||||||
|
`````````````````
|
||||||
|
|
||||||
|
And run it:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ pip install Flask
|
||||||
|
$ python hello.py
|
||||||
|
* Running on http://localhost:5000/
|
||||||
|
|
||||||
|
Ready for production? `Read this first <http://flask.pocoo.org/docs/deploying/>`.
|
||||||
|
|
||||||
|
Links
|
||||||
|
`````
|
||||||
|
|
||||||
|
* `website <http://flask.pocoo.org/>`_
|
||||||
|
* `documentation <http://flask.pocoo.org/docs/>`_
|
||||||
|
* `development version
|
||||||
|
<http://github.com/pallets/flask/zipball/master#egg=Flask-dev>`_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
Flask-0.12.2.dist-info/DESCRIPTION.rst,sha256=DmJm8IBlBjl3wkm0Ly23jYvWbvK_mCuE5oUseYCijbI,810
|
||||||
|
Flask-0.12.2.dist-info/LICENSE.txt,sha256=hLgKluMRHSnxG-L0EmrqjmKgG5cHlff6pIh3rCNINeI,1582
|
||||||
|
Flask-0.12.2.dist-info/METADATA,sha256=OgSkJQ_kmrz4qEkS-OzYtL75uZmXAThymkOcGR4kXRQ,1948
|
||||||
|
Flask-0.12.2.dist-info/RECORD,,
|
||||||
|
Flask-0.12.2.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
||||||
|
Flask-0.12.2.dist-info/entry_points.txt,sha256=jzk2Wy2h30uEcqqzd4CVnlzsMXB-vaD5GXjuPMXmTmI,60
|
||||||
|
Flask-0.12.2.dist-info/metadata.json,sha256=By8kZ1vY9lLEAGnRiWNBhudqKvLPo0HkZVXTYECyPKk,1389
|
||||||
|
Flask-0.12.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
|
||||||
|
flask/__init__.py,sha256=sHdK1v6WRbVmCN0fEv990EE7rOT2UlamQkSof2d0Dt0,1673
|
||||||
|
flask/__main__.py,sha256=cldbNi5zpjE68XzIWI8uYHNWwBHHVJmwtlXWk6P4CO4,291
|
||||||
|
flask/_compat.py,sha256=VlfjUuLjufsTHJIjr_ZsnnOesSbAXIslBBgRe5tfOok,2802
|
||||||
|
flask/app.py,sha256=6DPjtb5jUJWgL5fXksG5boA49EB3l-k9pWyftitbNNk,83169
|
||||||
|
flask/blueprints.py,sha256=6HVasMcPcaq7tk36kCrgX4bnhTkky4G5WIWCyyJL8HY,16872
|
||||||
|
flask/cli.py,sha256=2NXEdCOu5-4ymklxX4Lf6bjb-89I4VHYeP6xScR3i8E,18328
|
||||||
|
flask/config.py,sha256=Ym5Jenyu6zAZ1fdVLeKekY9-EsKmq8183qnRgauwCMY,9905
|
||||||
|
flask/ctx.py,sha256=UPA0YwoIlHP0txOGanC9lQLSGv6eCqV5Fmw2cVJRmgQ,14739
|
||||||
|
flask/debughelpers.py,sha256=z-uQavKIymOZl0WQDLXsnacA00ERIlCx3S3Tnb_OYsE,6024
|
||||||
|
flask/exthook.py,sha256=SvXs5jwpcOjogwJ7SNquiWTxowoN1-MHFoqAejWnk2o,5762
|
||||||
|
flask/globals.py,sha256=I3m_4RssLhWW1R11zuEI8oFryHUHX3NQwjMkGXOZzg8,1645
|
||||||
|
flask/helpers.py,sha256=KrsQ2Yo3lOVHvBTgQCLvpubgmTOpQdTTyiCOOYlwDuQ,38452
|
||||||
|
flask/json.py,sha256=1zPM-NPLiWoOfGd0P14FxnEkeKtjtUZxMC9pyYyDBYI,9183
|
||||||
|
flask/logging.py,sha256=UG-77jPkRClk9w1B-_ArjjXPuj9AmZz9mG0IRGvptW0,2751
|
||||||
|
flask/sessions.py,sha256=QBKXVYKJ-HKbx9m6Yb5yan_EPq84a5yevVLgAzNKFQY,14394
|
||||||
|
flask/signals.py,sha256=MfZk5qTRj_R_O3aGYlTEnx2g3SvlZncz8Ii73eKK59g,2209
|
||||||
|
flask/templating.py,sha256=u7FbN6j56H_q6CrdJJyJ6gZtqaMa0vh1_GP12gEHRQQ,4912
|
||||||
|
flask/testing.py,sha256=II8EO_NjOT1LvL8Hh_SdIFL_BdlwVPcB9yot5pbltxE,5630
|
||||||
|
flask/views.py,sha256=6OPv7gwu3h14JhqpeeMRWwrxoGHsUr4_nOGSyTRAxAI,5630
|
||||||
|
flask/wrappers.py,sha256=1S_5mmuA1Tlx7D9lXV6xMblrg-PdAauNWahe-henMEE,7612
|
||||||
|
flask/ext/__init__.py,sha256=UEezCApsG4ZJWqwUnX9YmWcNN4OVENgph_9L05n0eOM,842
|
||||||
|
../../../bin/flask,sha256=decc9nyJg2jlLTCBhy85E58V-rv48FPO_vNHhztm2uo,244
|
||||||
|
Flask-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
flask/config.pyc,,
|
||||||
|
flask/testing.pyc,,
|
||||||
|
flask/wrappers.pyc,,
|
||||||
|
flask/views.pyc,,
|
||||||
|
flask/logging.pyc,,
|
||||||
|
flask/json.pyc,,
|
||||||
|
flask/helpers.pyc,,
|
||||||
|
flask/__main__.pyc,,
|
||||||
|
flask/blueprints.pyc,,
|
||||||
|
flask/signals.pyc,,
|
||||||
|
flask/__init__.pyc,,
|
||||||
|
flask/exthook.pyc,,
|
||||||
|
flask/debughelpers.pyc,,
|
||||||
|
flask/templating.pyc,,
|
||||||
|
flask/ctx.pyc,,
|
||||||
|
flask/cli.pyc,,
|
||||||
|
flask/_compat.pyc,,
|
||||||
|
flask/app.pyc,,
|
||||||
|
flask/globals.pyc,,
|
||||||
|
flask/ext/__init__.pyc,,
|
||||||
|
flask/sessions.pyc,,
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.29.0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py2-none-any
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
[console_scripts]
|
||||||
|
flask=flask.cli:main
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"classifiers": ["Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.commands": {"wrap_console": {"flask": "flask.cli:main"}}, "python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/pallets/flask/"}}, "python.exports": {"console_scripts": {"flask": "flask.cli:main"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask", "platform": "any", "run_requires": [{"requires": ["Jinja2 (>=2.4)", "Werkzeug (>=0.7)", "click (>=2.0)", "itsdangerous (>=0.21)"]}], "summary": "A microframework based on Werkzeug, Jinja2 and good intentions", "version": "0.12.2"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
flask
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
Jinja2
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Jinja2 is a template engine written in pure Python. It provides a
|
||||||
|
`Django`_ inspired non-XML syntax but supports inline expressions and
|
||||||
|
an optional `sandboxed`_ environment.
|
||||||
|
|
||||||
|
Nutshell
|
||||||
|
--------
|
||||||
|
|
||||||
|
Here a small example of a Jinja template::
|
||||||
|
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block title %}Memberlist{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<ul>
|
||||||
|
{% for user in users %}
|
||||||
|
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
Philosophy
|
||||||
|
----------
|
||||||
|
|
||||||
|
Application logic is for the controller but don't try to make the life
|
||||||
|
for the template designer too hard by giving him too few functionality.
|
||||||
|
|
||||||
|
For more informations visit the new `Jinja2 webpage`_ and `documentation`_.
|
||||||
|
|
||||||
|
.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security)
|
||||||
|
.. _Django: http://www.djangoproject.com/
|
||||||
|
.. _Jinja2 webpage: http://jinja.pocoo.org/
|
||||||
|
.. _documentation: http://jinja.pocoo.org/2/documentation/
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
pip
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details.
|
||||||
|
|
||||||
|
Some rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* The names of the contributors may not be used to endorse or
|
||||||
|
promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
Metadata-Version: 2.0
|
||||||
|
Name: Jinja2
|
||||||
|
Version: 2.9.6
|
||||||
|
Summary: A small but fast and easy to use stand-alone template engine written in pure python.
|
||||||
|
Home-page: http://jinja.pocoo.org/
|
||||||
|
Author: Armin Ronacher
|
||||||
|
Author-email: armin.ronacher@active-4.com
|
||||||
|
License: BSD
|
||||||
|
Platform: UNKNOWN
|
||||||
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
|
Classifier: Environment :: Web Environment
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: License :: OSI Approved :: BSD License
|
||||||
|
Classifier: Operating System :: OS Independent
|
||||||
|
Classifier: Programming Language :: Python
|
||||||
|
Classifier: Programming Language :: Python :: 2
|
||||||
|
Classifier: Programming Language :: Python :: 2.6
|
||||||
|
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: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||||
|
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||||
|
Requires-Dist: MarkupSafe (>=0.23)
|
||||||
|
Provides-Extra: i18n
|
||||||
|
Requires-Dist: Babel (>=0.8); extra == 'i18n'
|
||||||
|
|
||||||
|
Jinja2
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Jinja2 is a template engine written in pure Python. It provides a
|
||||||
|
`Django`_ inspired non-XML syntax but supports inline expressions and
|
||||||
|
an optional `sandboxed`_ environment.
|
||||||
|
|
||||||
|
Nutshell
|
||||||
|
--------
|
||||||
|
|
||||||
|
Here a small example of a Jinja template::
|
||||||
|
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block title %}Memberlist{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<ul>
|
||||||
|
{% for user in users %}
|
||||||
|
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
Philosophy
|
||||||
|
----------
|
||||||
|
|
||||||
|
Application logic is for the controller but don't try to make the life
|
||||||
|
for the template designer too hard by giving him too few functionality.
|
||||||
|
|
||||||
|
For more informations visit the new `Jinja2 webpage`_ and `documentation`_.
|
||||||
|
|
||||||
|
.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security)
|
||||||
|
.. _Django: http://www.djangoproject.com/
|
||||||
|
.. _Jinja2 webpage: http://jinja.pocoo.org/
|
||||||
|
.. _documentation: http://jinja.pocoo.org/2/documentation/
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
jinja2/__init__.py,sha256=Cx_UnJO4i_GqvKQsOu__mvGE_eMJSsBqITa26irtg5A,2565
|
||||||
|
jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596
|
||||||
|
jinja2/_stringdefs.py,sha256=PYtqTmmWIhjXlFBoH-eE6fJkQvlu7nxUyQ2YlFB97VA,589381
|
||||||
|
jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144
|
||||||
|
jinja2/asyncsupport.py,sha256=ZJO1Fdd9R93sDLrk6TZNuMQGgtuDmpTlENNRkLwZF7c,7765
|
||||||
|
jinja2/bccache.py,sha256=0xoVw0R9nj3vtzPl9g-zB5BKTLFJ7FFMq2ABbn1IkCI,12793
|
||||||
|
jinja2/compiler.py,sha256=lE5owyPwT1cGGZxWyzQtZLW7Uj1g3Vw1oVtBU8Uc_uM,62929
|
||||||
|
jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626
|
||||||
|
jinja2/debug.py,sha256=UqEbKb4zofBABwvyA77Kr0-5IAQawKqC9t8ZeTIzpGU,12038
|
||||||
|
jinja2/defaults.py,sha256=GvVEQqIRvRMCbQF2NZSr0mlEN8lxvGixU5wIIAeRe1A,1323
|
||||||
|
jinja2/environment.py,sha256=z91L_efdYs-KNs6DBxQWDyYncOwOqn_0J4M5CfFj0Q8,50848
|
||||||
|
jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428
|
||||||
|
jinja2/ext.py,sha256=9xq8fd_QPBIe4Z7hE1XawB7f1EDHrVZjpb2JiRTiG94,23867
|
||||||
|
jinja2/filters.py,sha256=1OYGhyN84yVmFUIOwJNRV_StqTCfPhnRLfJTmWbEe_8,33424
|
||||||
|
jinja2/idtracking.py,sha256=HHcCOMsQhCrrjwYAmikKqq_XetXLovCjXAThh9WbRAc,8760
|
||||||
|
jinja2/lexer.py,sha256=W4A830e-fj12zRT6rL7H91F4D6xwED5LjR8iMxjWuVQ,28238
|
||||||
|
jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382
|
||||||
|
jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340
|
||||||
|
jinja2/nodes.py,sha256=4_Ucxbkohtj4BAlpV0w_MpVmIxJNaVXDTBb4EHBA2JI,29392
|
||||||
|
jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722
|
||||||
|
jinja2/parser.py,sha256=3tc82qO1Ovs9och_PjirbAmnWNT77n4wWjIQ8pEVKvU,35465
|
||||||
|
jinja2/runtime.py,sha256=axkTQXg2-oc_Cm35NEMDDas3Jbq3ATxNrDOEa5v3wIw,26835
|
||||||
|
jinja2/sandbox.py,sha256=Jx4MTxly8KvdkSWyui_kHY1_ZZ0RAQL4ojAy1KDRyK0,16707
|
||||||
|
jinja2/tests.py,sha256=iFuUTbUYv7TFffq2aTswCRdIhQ6wyrby1YevChVPqkE,4428
|
||||||
|
jinja2/utils.py,sha256=BIFqeXXsCUSjWx6MEwYhY6V4tXzVNs9WRXfB60MA9HY,19941
|
||||||
|
jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316
|
||||||
|
Jinja2-2.9.6.dist-info/DESCRIPTION.rst,sha256=CXIS1UnPSk5_lZBS6Lb8ko-3lqGfjsiUwNBLXCTj2lc,975
|
||||||
|
Jinja2-2.9.6.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72
|
||||||
|
Jinja2-2.9.6.dist-info/LICENSE.txt,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554
|
||||||
|
Jinja2-2.9.6.dist-info/METADATA,sha256=53LSXlqC86JTyLSPsDyAOmyV4pXIzzmmZoUXz7ogytA,2172
|
||||||
|
Jinja2-2.9.6.dist-info/metadata.json,sha256=vzvX25T4hwMOe1EIOBo9rpfiZerOB_KVLcplGG_qYtE,1394
|
||||||
|
Jinja2-2.9.6.dist-info/RECORD,,
|
||||||
|
Jinja2-2.9.6.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
|
||||||
|
Jinja2-2.9.6.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110
|
||||||
|
Jinja2-2.9.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
jinja2/_compat.pyc,,
|
||||||
|
jinja2/sandbox.pyc,,
|
||||||
|
jinja2/_stringdefs.pyc,,
|
||||||
|
jinja2/environment.pyc,,
|
||||||
|
jinja2/runtime.pyc,,
|
||||||
|
jinja2/utils.pyc,,
|
||||||
|
jinja2/parser.pyc,,
|
||||||
|
jinja2/debug.pyc,,
|
||||||
|
jinja2/bccache.pyc,,
|
||||||
|
jinja2/defaults.pyc,,
|
||||||
|
jinja2/visitor.pyc,,
|
||||||
|
jinja2/nodes.pyc,,
|
||||||
|
jinja2/compiler.pyc,,
|
||||||
|
jinja2/exceptions.pyc,,
|
||||||
|
jinja2/__init__.pyc,,
|
||||||
|
jinja2/meta.pyc,,
|
||||||
|
jinja2/loaders.pyc,,
|
||||||
|
jinja2/lexer.pyc,,
|
||||||
|
jinja2/ext.pyc,,
|
||||||
|
jinja2/idtracking.pyc,,
|
||||||
|
jinja2/optimizer.pyc,,
|
||||||
|
jinja2/filters.pyc,,
|
||||||
|
jinja2/tests.pyc,,
|
||||||
|
jinja2/constants.pyc,,
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.24.0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py2-none-any
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
[babel.extractors]
|
||||||
|
jinja2 = jinja2.ext:babel_extract[i18n]
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"license": "BSD", "name": "Jinja2", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "A small but fast and easy to use stand-alone template engine written in pure python.", "run_requires": [{"requires": ["Babel (>=0.8)"], "extra": "i18n"}, {"requires": ["MarkupSafe (>=0.23)"]}], "version": "2.9.6", "extensions": {"python.details": {"project_urls": {"Home": "http://jinja.pocoo.org/"}, "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "contacts": [{"role": "author", "email": "armin.ronacher@active-4.com", "name": "Armin Ronacher"}]}, "python.exports": {"babel.extractors": {"jinja2": "jinja2.ext:babel_extract [i18n]"}}}, "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "extras": ["i18n"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
jinja2
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
MarkupSafe
|
||||||
|
==========
|
||||||
|
|
||||||
|
Implements a unicode subclass that supports HTML strings:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> from markupsafe import Markup, escape
|
||||||
|
>>> escape("<script>alert(document.cookie);</script>")
|
||||||
|
Markup(u'<script>alert(document.cookie);</script>')
|
||||||
|
>>> tmpl = Markup("<em>%s</em>")
|
||||||
|
>>> tmpl % "Peter > Lustig"
|
||||||
|
Markup(u'<em>Peter > Lustig</em>')
|
||||||
|
|
||||||
|
If you want to make an object unicode that is not yet unicode
|
||||||
|
but don't want to lose the taint information, you can use the
|
||||||
|
``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which
|
||||||
|
is a different name for the same function).
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> from markupsafe import soft_unicode
|
||||||
|
>>> soft_unicode(42)
|
||||||
|
u'42'
|
||||||
|
>>> soft_unicode(Markup('foo'))
|
||||||
|
Markup(u'foo')
|
||||||
|
|
||||||
|
HTML Representations
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Objects can customize their HTML markup equivalent by overriding
|
||||||
|
the ``__html__`` function:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> class Foo(object):
|
||||||
|
... def __html__(self):
|
||||||
|
... return '<strong>Nice</strong>'
|
||||||
|
...
|
||||||
|
>>> escape(Foo())
|
||||||
|
Markup(u'<strong>Nice</strong>')
|
||||||
|
>>> Markup(Foo())
|
||||||
|
Markup(u'<strong>Nice</strong>')
|
||||||
|
|
||||||
|
Silent Escapes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Since MarkupSafe 0.10 there is now also a separate escape function
|
||||||
|
called ``escape_silent`` that returns an empty string for ``None`` for
|
||||||
|
consistency with other systems that return empty strings for ``None``
|
||||||
|
when escaping (for instance Pylons' webhelpers).
|
||||||
|
|
||||||
|
If you also want to use this for the escape method of the Markup
|
||||||
|
object, you can create your own subclass that does that:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from markupsafe import Markup, escape_silent as escape
|
||||||
|
|
||||||
|
class SilentMarkup(Markup):
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def escape(cls, s):
|
||||||
|
return cls(escape(s))
|
||||||
|
|
||||||
|
New-Style String Formatting
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and
|
||||||
|
3.x are now fully supported. Previously the escape behavior of those
|
||||||
|
functions was spotty at best. The new implementations operates under the
|
||||||
|
following algorithm:
|
||||||
|
|
||||||
|
1. if an object has an ``__html_format__`` method it is called as
|
||||||
|
replacement for ``__format__`` with the format specifier. It either
|
||||||
|
has to return a string or markup object.
|
||||||
|
2. if an object has an ``__html__`` method it is called.
|
||||||
|
3. otherwise the default format system of Python kicks in and the result
|
||||||
|
is HTML escaped.
|
||||||
|
|
||||||
|
Here is how you can implement your own formatting:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class User(object):
|
||||||
|
|
||||||
|
def __init__(self, id, username):
|
||||||
|
self.id = id
|
||||||
|
self.username = username
|
||||||
|
|
||||||
|
def __html_format__(self, format_spec):
|
||||||
|
if format_spec == 'link':
|
||||||
|
return Markup('<a href="/user/{0}">{1}</a>').format(
|
||||||
|
self.id,
|
||||||
|
self.__html__(),
|
||||||
|
)
|
||||||
|
elif format_spec:
|
||||||
|
raise ValueError('Invalid format spec')
|
||||||
|
return self.__html__()
|
||||||
|
|
||||||
|
def __html__(self):
|
||||||
|
return Markup('<span class=user>{0}</span>').format(self.username)
|
||||||
|
|
||||||
|
And to format that user:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> user = User(1, 'foo')
|
||||||
|
>>> Markup('<p>User: {0:link}').format(user)
|
||||||
|
Markup(u'<p>User: <a href="/user/1"><span class=user>foo</span></a>')
|
||||||
|
|
||||||
|
Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher.
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
pip
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
Some rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms of the software as well
|
||||||
|
as documentation, with or without modification, are permitted provided
|
||||||
|
that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* The names of the contributors may not be used to endorse or
|
||||||
|
promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGE.
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
Metadata-Version: 2.0
|
||||||
|
Name: MarkupSafe
|
||||||
|
Version: 1.0
|
||||||
|
Summary: Implements a XML/HTML/XHTML Markup safe string for Python
|
||||||
|
Home-page: http://github.com/pallets/markupsafe
|
||||||
|
Author: Armin Ronacher
|
||||||
|
Author-email: armin.ronacher@active-4.com
|
||||||
|
License: BSD
|
||||||
|
Platform: UNKNOWN
|
||||||
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
|
Classifier: Environment :: Web Environment
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: License :: OSI Approved :: BSD License
|
||||||
|
Classifier: Operating System :: OS Independent
|
||||||
|
Classifier: Programming Language :: Python
|
||||||
|
Classifier: Programming Language :: Python :: 3
|
||||||
|
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||||
|
Classifier: Topic :: Text Processing :: Markup :: HTML
|
||||||
|
|
||||||
|
MarkupSafe
|
||||||
|
==========
|
||||||
|
|
||||||
|
Implements a unicode subclass that supports HTML strings:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> from markupsafe import Markup, escape
|
||||||
|
>>> escape("<script>alert(document.cookie);</script>")
|
||||||
|
Markup(u'<script>alert(document.cookie);</script>')
|
||||||
|
>>> tmpl = Markup("<em>%s</em>")
|
||||||
|
>>> tmpl % "Peter > Lustig"
|
||||||
|
Markup(u'<em>Peter > Lustig</em>')
|
||||||
|
|
||||||
|
If you want to make an object unicode that is not yet unicode
|
||||||
|
but don't want to lose the taint information, you can use the
|
||||||
|
``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which
|
||||||
|
is a different name for the same function).
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> from markupsafe import soft_unicode
|
||||||
|
>>> soft_unicode(42)
|
||||||
|
u'42'
|
||||||
|
>>> soft_unicode(Markup('foo'))
|
||||||
|
Markup(u'foo')
|
||||||
|
|
||||||
|
HTML Representations
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Objects can customize their HTML markup equivalent by overriding
|
||||||
|
the ``__html__`` function:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> class Foo(object):
|
||||||
|
... def __html__(self):
|
||||||
|
... return '<strong>Nice</strong>'
|
||||||
|
...
|
||||||
|
>>> escape(Foo())
|
||||||
|
Markup(u'<strong>Nice</strong>')
|
||||||
|
>>> Markup(Foo())
|
||||||
|
Markup(u'<strong>Nice</strong>')
|
||||||
|
|
||||||
|
Silent Escapes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Since MarkupSafe 0.10 there is now also a separate escape function
|
||||||
|
called ``escape_silent`` that returns an empty string for ``None`` for
|
||||||
|
consistency with other systems that return empty strings for ``None``
|
||||||
|
when escaping (for instance Pylons' webhelpers).
|
||||||
|
|
||||||
|
If you also want to use this for the escape method of the Markup
|
||||||
|
object, you can create your own subclass that does that:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from markupsafe import Markup, escape_silent as escape
|
||||||
|
|
||||||
|
class SilentMarkup(Markup):
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def escape(cls, s):
|
||||||
|
return cls(escape(s))
|
||||||
|
|
||||||
|
New-Style String Formatting
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and
|
||||||
|
3.x are now fully supported. Previously the escape behavior of those
|
||||||
|
functions was spotty at best. The new implementations operates under the
|
||||||
|
following algorithm:
|
||||||
|
|
||||||
|
1. if an object has an ``__html_format__`` method it is called as
|
||||||
|
replacement for ``__format__`` with the format specifier. It either
|
||||||
|
has to return a string or markup object.
|
||||||
|
2. if an object has an ``__html__`` method it is called.
|
||||||
|
3. otherwise the default format system of Python kicks in and the result
|
||||||
|
is HTML escaped.
|
||||||
|
|
||||||
|
Here is how you can implement your own formatting:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
class User(object):
|
||||||
|
|
||||||
|
def __init__(self, id, username):
|
||||||
|
self.id = id
|
||||||
|
self.username = username
|
||||||
|
|
||||||
|
def __html_format__(self, format_spec):
|
||||||
|
if format_spec == 'link':
|
||||||
|
return Markup('<a href="/user/{0}">{1}</a>').format(
|
||||||
|
self.id,
|
||||||
|
self.__html__(),
|
||||||
|
)
|
||||||
|
elif format_spec:
|
||||||
|
raise ValueError('Invalid format spec')
|
||||||
|
return self.__html__()
|
||||||
|
|
||||||
|
def __html__(self):
|
||||||
|
return Markup('<span class=user>{0}</span>').format(self.username)
|
||||||
|
|
||||||
|
And to format that user:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
>>> user = User(1, 'foo')
|
||||||
|
>>> Markup('<p>User: {0:link}').format(user)
|
||||||
|
Markup(u'<p>User: <a href="/user/1"><span class=user>foo</span></a>')
|
||||||
|
|
||||||
|
Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher.
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
MarkupSafe-1.0.dist-info/DESCRIPTION.rst,sha256=3B3J0YLzzmJQVaWQ_XlVMhGeHA_DvBqysABvul_5fko,3397
|
||||||
|
MarkupSafe-1.0.dist-info/LICENSE.txt,sha256=C76IIo_WPSDsCX9k5Y1aCkZRI64TkUChjUBsYLSIJLU,1582
|
||||||
|
MarkupSafe-1.0.dist-info/METADATA,sha256=EUwvRzJbtRP3hBMc8Z2TDT44TBDeZdIurbGzIc7FOkg,4182
|
||||||
|
MarkupSafe-1.0.dist-info/RECORD,,
|
||||||
|
MarkupSafe-1.0.dist-info/WHEEL,sha256=LgENoDL_AkiRWbJ7HCJLnTXVvHl9ZtXZ7UZmjmcCeN0,105
|
||||||
|
MarkupSafe-1.0.dist-info/metadata.json,sha256=fQYPE0HEQTuDqIQMBMJTqDCbYC1ILBGiHDpEuVVn4rw,924
|
||||||
|
MarkupSafe-1.0.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
|
||||||
|
markupsafe/__init__.py,sha256=xtkRdxhzJzgp65wUo1D4DjnazxHU88pPldaAuDekBeY,10697
|
||||||
|
markupsafe/_compat.py,sha256=r1HE0CpcAZeb-AiTV9wITR91PeLHn0CzZ_XHkYoozpI,565
|
||||||
|
markupsafe/_constants.py,sha256=U_xybFQsyXKCgHSfranJnFzo-z9nn9fuBeSk243sE5Q,4795
|
||||||
|
markupsafe/_native.py,sha256=E2Un1ysOf-w45d18YCj8UelT5UP7Vt__IuFPYJ7YRIs,1187
|
||||||
|
markupsafe/_speedups.c,sha256=B6Mf6Fn33WqkagfwY7q5ZBSm_vJoHDYxDB0Jp_DP7Jw,5936
|
||||||
|
markupsafe/_speedups.so,sha256=WjpbJ5bkdxAmZelEwe5PhbMVTyGQzGNpqlOPmEKiBNo,35672
|
||||||
|
MarkupSafe-1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
markupsafe/_native.pyc,,
|
||||||
|
markupsafe/_constants.pyc,,
|
||||||
|
markupsafe/__init__.pyc,,
|
||||||
|
markupsafe/_compat.pyc,,
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.29.0)
|
||||||
|
Root-Is-Purelib: false
|
||||||
|
Tag: cp27-cp27mu-linux_x86_64
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/pallets/markupsafe"}}}, "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "MarkupSafe", "summary": "Implements a XML/HTML/XHTML Markup safe string for Python", "version": "1.0"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
markupsafe
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
Werkzeug
|
||||||
|
========
|
||||||
|
|
||||||
|
Werkzeug started as simple collection of various utilities for WSGI
|
||||||
|
applications and has become one of the most advanced WSGI utility
|
||||||
|
modules. It includes a powerful debugger, full featured request and
|
||||||
|
response objects, HTTP utilities to handle entity tags, cache control
|
||||||
|
headers, HTTP dates, cookie handling, file uploads, a powerful URL
|
||||||
|
routing system and a bunch of community contributed addon modules.
|
||||||
|
|
||||||
|
Werkzeug is unicode aware and doesn't enforce a specific template
|
||||||
|
engine, database adapter or anything else. It doesn't even enforce
|
||||||
|
a specific way of handling requests and leaves all that up to the
|
||||||
|
developer. It's most useful for end user applications which should work
|
||||||
|
on as many server environments as possible (such as blogs, wikis,
|
||||||
|
bulletin boards, etc.).
|
||||||
|
|
||||||
|
Details and example applications are available on the
|
||||||
|
`Werkzeug website <http://werkzeug.pocoo.org/>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
- unicode awareness
|
||||||
|
|
||||||
|
- request and response objects
|
||||||
|
|
||||||
|
- various utility functions for dealing with HTTP headers such as
|
||||||
|
`Accept` and `Cache-Control` headers.
|
||||||
|
|
||||||
|
- thread local objects with proper cleanup at request end
|
||||||
|
|
||||||
|
- an interactive debugger
|
||||||
|
|
||||||
|
- A simple WSGI server with support for threading and forking
|
||||||
|
with an automatic reloader.
|
||||||
|
|
||||||
|
- a flexible URL routing system with REST support.
|
||||||
|
|
||||||
|
- fully WSGI compatible
|
||||||
|
|
||||||
|
|
||||||
|
Development Version
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The Werkzeug development version can be installed by cloning the git
|
||||||
|
repository from `github`_::
|
||||||
|
|
||||||
|
git clone git@github.com:pallets/werkzeug.git
|
||||||
|
|
||||||
|
.. _github: http://github.com/pallets/werkzeug
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
pip
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
Copyright (c) 2014 by the Werkzeug Team, see AUTHORS for more details.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* The names of the contributors may not be used to endorse or
|
||||||
|
promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
Metadata-Version: 2.0
|
||||||
|
Name: Werkzeug
|
||||||
|
Version: 0.12.2
|
||||||
|
Summary: The Swiss Army knife of Python web development
|
||||||
|
Home-page: http://werkzeug.pocoo.org/
|
||||||
|
Author: Armin Ronacher
|
||||||
|
Author-email: armin.ronacher@active-4.com
|
||||||
|
License: BSD
|
||||||
|
Platform: any
|
||||||
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
|
Classifier: Environment :: Web Environment
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: License :: OSI Approved :: BSD License
|
||||||
|
Classifier: Operating System :: OS Independent
|
||||||
|
Classifier: Programming Language :: Python
|
||||||
|
Classifier: Programming Language :: Python :: 2
|
||||||
|
Classifier: Programming Language :: Python :: 2.6
|
||||||
|
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: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||||||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||||||
|
Provides-Extra: termcolor
|
||||||
|
Requires-Dist: termcolor; extra == 'termcolor'
|
||||||
|
Provides-Extra: watchdog
|
||||||
|
Requires-Dist: watchdog; extra == 'watchdog'
|
||||||
|
|
||||||
|
Werkzeug
|
||||||
|
========
|
||||||
|
|
||||||
|
Werkzeug started as simple collection of various utilities for WSGI
|
||||||
|
applications and has become one of the most advanced WSGI utility
|
||||||
|
modules. It includes a powerful debugger, full featured request and
|
||||||
|
response objects, HTTP utilities to handle entity tags, cache control
|
||||||
|
headers, HTTP dates, cookie handling, file uploads, a powerful URL
|
||||||
|
routing system and a bunch of community contributed addon modules.
|
||||||
|
|
||||||
|
Werkzeug is unicode aware and doesn't enforce a specific template
|
||||||
|
engine, database adapter or anything else. It doesn't even enforce
|
||||||
|
a specific way of handling requests and leaves all that up to the
|
||||||
|
developer. It's most useful for end user applications which should work
|
||||||
|
on as many server environments as possible (such as blogs, wikis,
|
||||||
|
bulletin boards, etc.).
|
||||||
|
|
||||||
|
Details and example applications are available on the
|
||||||
|
`Werkzeug website <http://werkzeug.pocoo.org/>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
- unicode awareness
|
||||||
|
|
||||||
|
- request and response objects
|
||||||
|
|
||||||
|
- various utility functions for dealing with HTTP headers such as
|
||||||
|
`Accept` and `Cache-Control` headers.
|
||||||
|
|
||||||
|
- thread local objects with proper cleanup at request end
|
||||||
|
|
||||||
|
- an interactive debugger
|
||||||
|
|
||||||
|
- A simple WSGI server with support for threading and forking
|
||||||
|
with an automatic reloader.
|
||||||
|
|
||||||
|
- a flexible URL routing system with REST support.
|
||||||
|
|
||||||
|
- fully WSGI compatible
|
||||||
|
|
||||||
|
|
||||||
|
Development Version
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The Werkzeug development version can be installed by cloning the git
|
||||||
|
repository from `github`_::
|
||||||
|
|
||||||
|
git clone git@github.com:pallets/werkzeug.git
|
||||||
|
|
||||||
|
.. _github: http://github.com/pallets/werkzeug
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519
|
||||||
|
werkzeug/security.py,sha256=Z0v0ojdo7T4FNyfIjx86BFQKwasy3ZR9euikIJDQYP8,9191
|
||||||
|
werkzeug/__init__.py,sha256=NDY8HsYsT3dguTLu4MhuH-GpQE5XS9aKhrdfwHnzOEk,6864
|
||||||
|
werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396
|
||||||
|
werkzeug/http.py,sha256=nrk-ASJzcKOuoBEz274TWA8jKt0CQSOBZuP_A0UASTA,36658
|
||||||
|
werkzeug/routing.py,sha256=g25wg0GNfff8WcfRlc1ZxTGvz1KbVj09w2S7wxopseQ,66746
|
||||||
|
werkzeug/utils.py,sha256=lkybtv_mq35zV1qhelvEcILTzrMUwZ9yon6E8XwapJE,22972
|
||||||
|
werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505
|
||||||
|
werkzeug/_reloader.py,sha256=NkIXQCTa6b22wWLpXob_jIVUxux8LtAsfWehLkKt0iM,8816
|
||||||
|
werkzeug/formparser.py,sha256=DxN53eOCb6i7PxqtldrF2Kv9Mx00BqW297N4t-RxkWE,21241
|
||||||
|
werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311
|
||||||
|
werkzeug/datastructures.py,sha256=rq0zICISMUetS3xvUVvrhIvyue9oUzrs_NU3b83zwuQ,89066
|
||||||
|
werkzeug/wrappers.py,sha256=wceh1RhvhIZVzKuok3XMQ5jqjYYCEYv5JqKY3Nc_oRY,82986
|
||||||
|
werkzeug/test.py,sha256=xnabNSpty66ftZiXHcoZaYFP1E4WUNxydw5Oe8Mjhoo,34795
|
||||||
|
werkzeug/urls.py,sha256=fSbI4Gb29_p02Zk21VAZQRN1QdOVY9CNTgpb2rbajNQ,36710
|
||||||
|
werkzeug/script.py,sha256=Jh9OAktqjLNc_IBBUatVM7uP5LDcbxaYA8n2ObnS4bo,11666
|
||||||
|
werkzeug/useragents.py,sha256=Ck3G977Y0Rzdk9wFcLpL0PyOrONtdK1_d2Zexb78cX4,5640
|
||||||
|
werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553
|
||||||
|
werkzeug/serving.py,sha256=aAS3EgiD-VjemsYfSf1yqdjaGEfpB4I3M4PKlLotJLo,29069
|
||||||
|
werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175
|
||||||
|
werkzeug/wsgi.py,sha256=TjPo5ups3NI1RVVGdMvd3XaceqFtqlMX5X169gWWFrQ,42838
|
||||||
|
werkzeug/_internal.py,sha256=sE2JbLnMzN9mRI1iipTYWrFAGEWaZVECqtHAiNEhqUE,13841
|
||||||
|
werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179
|
||||||
|
werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334
|
||||||
|
werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623
|
||||||
|
werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453
|
||||||
|
werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814
|
||||||
|
werkzeug/contrib/cache.py,sha256=nyUUxsS0MTHiFmu-481y9PHd8NvWH5pzCoEX1yA0mHY,30341
|
||||||
|
werkzeug/contrib/securecookie.py,sha256=bDsAJmslkwmXjycnPjEjWtfLBvhz0ud4z3k7tdezUVs,12174
|
||||||
|
werkzeug/contrib/lint.py,sha256=qZlmqiWJ5tQJOEzLnPmHWA8eUEpcBIWkAb_V2RKJg4o,12558
|
||||||
|
werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151
|
||||||
|
werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398
|
||||||
|
werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575
|
||||||
|
werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564
|
||||||
|
werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577
|
||||||
|
werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607
|
||||||
|
werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340
|
||||||
|
werkzeug/debug/__init__.py,sha256=GTsOsjE3PqUAlsUVm2Mgc_KWA2kjjSsUz0JsM7Qu41w,17266
|
||||||
|
werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451
|
||||||
|
werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191
|
||||||
|
werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818
|
||||||
|
werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264
|
||||||
|
werkzeug/debug/shared/style.css,sha256=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270
|
||||||
|
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
|
||||||
|
werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673
|
||||||
|
werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957
|
||||||
|
werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220
|
||||||
|
werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200
|
||||||
|
Werkzeug-0.12.2.dist-info/DESCRIPTION.rst,sha256=z9r9xqJ0fYSAn1Tz7KRBdFGDerL2y4pHWSW_72pUgTc,1591
|
||||||
|
Werkzeug-0.12.2.dist-info/metadata.json,sha256=6taKobd3cQ5zOY5MVKlvuCJGaX7VPLaHYuRwzwwkORI,1276
|
||||||
|
Werkzeug-0.12.2.dist-info/RECORD,,
|
||||||
|
Werkzeug-0.12.2.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9
|
||||||
|
Werkzeug-0.12.2.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110
|
||||||
|
Werkzeug-0.12.2.dist-info/LICENSE.txt,sha256=F84h8-PZAuC-Hq-_252D3yhH6mqIc-WUbXUPbfOtjXM,1532
|
||||||
|
Werkzeug-0.12.2.dist-info/METADATA,sha256=SphYykCCskmOJK7mV1-M2T1PTOrx5K3DJ8n3E5jA298,2738
|
||||||
|
Werkzeug-0.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
werkzeug/_reloader.pyc,,
|
||||||
|
werkzeug/filesystem.pyc,,
|
||||||
|
werkzeug/contrib/testtools.pyc,,
|
||||||
|
werkzeug/formparser.pyc,,
|
||||||
|
werkzeug/_compat.pyc,,
|
||||||
|
werkzeug/posixemulation.pyc,,
|
||||||
|
werkzeug/wsgi.pyc,,
|
||||||
|
werkzeug/serving.pyc,,
|
||||||
|
werkzeug/contrib/__init__.pyc,,
|
||||||
|
werkzeug/contrib/iterio.pyc,,
|
||||||
|
werkzeug/datastructures.pyc,,
|
||||||
|
werkzeug/__init__.pyc,,
|
||||||
|
werkzeug/contrib/limiter.pyc,,
|
||||||
|
werkzeug/debug/tbtools.pyc,,
|
||||||
|
werkzeug/contrib/sessions.pyc,,
|
||||||
|
werkzeug/exceptions.pyc,,
|
||||||
|
werkzeug/local.pyc,,
|
||||||
|
werkzeug/utils.pyc,,
|
||||||
|
werkzeug/contrib/lint.pyc,,
|
||||||
|
werkzeug/security.pyc,,
|
||||||
|
werkzeug/contrib/cache.pyc,,
|
||||||
|
werkzeug/contrib/securecookie.pyc,,
|
||||||
|
werkzeug/script.pyc,,
|
||||||
|
werkzeug/routing.pyc,,
|
||||||
|
werkzeug/wrappers.pyc,,
|
||||||
|
werkzeug/contrib/jsrouting.pyc,,
|
||||||
|
werkzeug/contrib/fixers.pyc,,
|
||||||
|
werkzeug/contrib/profiler.pyc,,
|
||||||
|
werkzeug/debug/console.pyc,,
|
||||||
|
werkzeug/debug/__init__.pyc,,
|
||||||
|
werkzeug/test.pyc,,
|
||||||
|
werkzeug/http.pyc,,
|
||||||
|
werkzeug/urls.pyc,,
|
||||||
|
werkzeug/useragents.pyc,,
|
||||||
|
werkzeug/_internal.pyc,,
|
||||||
|
werkzeug/contrib/wrappers.pyc,,
|
||||||
|
werkzeug/contrib/atom.pyc,,
|
||||||
|
werkzeug/testapp.pyc,,
|
||||||
|
werkzeug/debug/repr.pyc,,
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.24.0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py2-none-any
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"license": "BSD", "name": "Werkzeug", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "The Swiss Army knife of Python web development", "platform": "any", "run_requires": [{"requires": ["watchdog"], "extra": "watchdog"}, {"requires": ["termcolor"], "extra": "termcolor"}], "version": "0.12.2", "extensions": {"python.details": {"project_urls": {"Home": "http://werkzeug.pocoo.org/"}, "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "contacts": [{"role": "author", "email": "armin.ronacher@active-4.com", "name": "Armin Ronacher"}]}}, "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extras": ["termcolor", "watchdog"]}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
werkzeug
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
Certifi: Python SSL Certificates
|
||||||
|
================================
|
||||||
|
|
||||||
|
`Certifi`_ is a carefully curated collection of Root Certificates for
|
||||||
|
validating the trustworthiness of SSL certificates while verifying the identity
|
||||||
|
of TLS hosts. It has been extracted from the `Requests`_ project.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
``certifi`` is available on PyPI. Simply install it with ``pip``::
|
||||||
|
|
||||||
|
$ pip install certifi
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
To reference the installed certificate authority (CA) bundle, you can use the
|
||||||
|
built-in function::
|
||||||
|
|
||||||
|
>>> import certifi
|
||||||
|
|
||||||
|
>>> certifi.where()
|
||||||
|
'/usr/local/lib/python2.7/site-packages/certifi/cacert.pem'
|
||||||
|
|
||||||
|
Enjoy!
|
||||||
|
|
||||||
|
1024-bit Root Certificates
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Browsers and certificate authorities have concluded that 1024-bit keys are
|
||||||
|
unacceptably weak for certificates, particularly root certificates. For this
|
||||||
|
reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its
|
||||||
|
bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key)
|
||||||
|
certificate from the same CA. Because Mozilla removed these certificates from
|
||||||
|
its bundle, ``certifi`` removed them as well.
|
||||||
|
|
||||||
|
Unfortunately, old versions of OpenSSL (less than 1.0.2) sometimes fail to
|
||||||
|
validate certificate chains that use the strong roots. For this reason, if you
|
||||||
|
fail to validate a certificate using the ``certifi.where()`` mechanism, you can
|
||||||
|
intentionally re-add the 1024-bit roots back into your bundle by calling
|
||||||
|
``certifi.old_where()`` instead. This is not recommended in production: if at
|
||||||
|
all possible you should upgrade to a newer OpenSSL. However, if you have no
|
||||||
|
other option, this may work for you.
|
||||||
|
|
||||||
|
.. _`Certifi`: http://certifi.io/en/latest/
|
||||||
|
.. _`Requests`: http://docs.python-requests.org/en/latest/
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
pip
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
Metadata-Version: 2.0
|
||||||
|
Name: certifi
|
||||||
|
Version: 2017.4.17
|
||||||
|
Summary: Python package for providing Mozilla's CA Bundle.
|
||||||
|
Home-page: http://certifi.io/
|
||||||
|
Author: Kenneth Reitz
|
||||||
|
Author-email: me@kennethreitz.com
|
||||||
|
License: ISC
|
||||||
|
Platform: UNKNOWN
|
||||||
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
|
Classifier: Intended Audience :: Developers
|
||||||
|
Classifier: Natural Language :: English
|
||||||
|
Classifier: Programming Language :: Python
|
||||||
|
Classifier: Programming Language :: Python :: 2.6
|
||||||
|
Classifier: Programming Language :: Python :: 2.7
|
||||||
|
Classifier: Programming Language :: Python :: 3.3
|
||||||
|
Classifier: Programming Language :: Python :: 3.4
|
||||||
|
Classifier: Programming Language :: Python :: 3.5
|
||||||
|
|
||||||
|
Certifi: Python SSL Certificates
|
||||||
|
================================
|
||||||
|
|
||||||
|
`Certifi`_ is a carefully curated collection of Root Certificates for
|
||||||
|
validating the trustworthiness of SSL certificates while verifying the identity
|
||||||
|
of TLS hosts. It has been extracted from the `Requests`_ project.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
``certifi`` is available on PyPI. Simply install it with ``pip``::
|
||||||
|
|
||||||
|
$ pip install certifi
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
To reference the installed certificate authority (CA) bundle, you can use the
|
||||||
|
built-in function::
|
||||||
|
|
||||||
|
>>> import certifi
|
||||||
|
|
||||||
|
>>> certifi.where()
|
||||||
|
'/usr/local/lib/python2.7/site-packages/certifi/cacert.pem'
|
||||||
|
|
||||||
|
Enjoy!
|
||||||
|
|
||||||
|
1024-bit Root Certificates
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Browsers and certificate authorities have concluded that 1024-bit keys are
|
||||||
|
unacceptably weak for certificates, particularly root certificates. For this
|
||||||
|
reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its
|
||||||
|
bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key)
|
||||||
|
certificate from the same CA. Because Mozilla removed these certificates from
|
||||||
|
its bundle, ``certifi`` removed them as well.
|
||||||
|
|
||||||
|
Unfortunately, old versions of OpenSSL (less than 1.0.2) sometimes fail to
|
||||||
|
validate certificate chains that use the strong roots. For this reason, if you
|
||||||
|
fail to validate a certificate using the ``certifi.where()`` mechanism, you can
|
||||||
|
intentionally re-add the 1024-bit roots back into your bundle by calling
|
||||||
|
``certifi.old_where()`` instead. This is not recommended in production: if at
|
||||||
|
all possible you should upgrade to a newer OpenSSL. However, if you have no
|
||||||
|
other option, this may work for you.
|
||||||
|
|
||||||
|
.. _`Certifi`: http://certifi.io/en/latest/
|
||||||
|
.. _`Requests`: http://docs.python-requests.org/en/latest/
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
certifi/__init__.py,sha256=fygqpMx6KPrCIRMY4qcO5Zo60MDyQCYtNaI5BbgZyqE,63
|
||||||
|
certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41
|
||||||
|
certifi/cacert.pem,sha256=UgTuBXP5FC1mKK2skamUrJKyL8RVMmtUTKJZpTSFn_U,321422
|
||||||
|
certifi/core.py,sha256=DqvIINYNNXsp3Srlk_NRaiizaww8po3l8t8ksz-Xt6Q,716
|
||||||
|
certifi/old_root.pem,sha256=HT0KIfaM83q0XHFqGEesiGyfmlSWuD2RI0-AVIS2srY,25626
|
||||||
|
certifi/weak.pem,sha256=LGe1E3ewgvNAs_yRA9ZKBN6C5KV2Cx34iJFMPi8_hyo,347048
|
||||||
|
certifi-2017.4.17.dist-info/DESCRIPTION.rst,sha256=wVWYoH3eovdWFPZnYU2NT4itGRx3eN5C_s1IuNm4qF4,1731
|
||||||
|
certifi-2017.4.17.dist-info/METADATA,sha256=ZzDLL1LWFj2SDbZdV_QZ-ZNWd_UDw_NXGbARLwgLYdg,2396
|
||||||
|
certifi-2017.4.17.dist-info/RECORD,,
|
||||||
|
certifi-2017.4.17.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113
|
||||||
|
certifi-2017.4.17.dist-info/metadata.json,sha256=8MYPZlDmqjogcs0bl7CuyQwwrSvqaFjpGMYsjFBQBlw,790
|
||||||
|
certifi-2017.4.17.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8
|
||||||
|
certifi-2017.4.17.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
|
certifi/__main__.pyc,,
|
||||||
|
certifi/core.pyc,,
|
||||||
|
certifi/__init__.pyc,,
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.30.0.a0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py2-none-any
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "ISC", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2017.4.17"}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
certifi
|
||||||
3
venv/lib/python2.7/site-packages/certifi/__init__.py
Normal file
3
venv/lib/python2.7/site-packages/certifi/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from .core import where, old_where
|
||||||
|
|
||||||
|
__version__ = "2017.04.17"
|
||||||
BIN
venv/lib/python2.7/site-packages/certifi/__init__.pyc
Normal file
BIN
venv/lib/python2.7/site-packages/certifi/__init__.pyc
Normal file
Binary file not shown.
2
venv/lib/python2.7/site-packages/certifi/__main__.py
Normal file
2
venv/lib/python2.7/site-packages/certifi/__main__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from certifi import where
|
||||||
|
print(where())
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user