diff --git a/project/__pycache__/app.cpython-37.pyc b/project/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000..3186d87 Binary files /dev/null and b/project/__pycache__/app.cpython-37.pyc differ diff --git a/project/__pycache__/listings.cpython-37.pyc b/project/__pycache__/listings.cpython-37.pyc new file mode 100644 index 0000000..2459f4c Binary files /dev/null and b/project/__pycache__/listings.cpython-37.pyc differ diff --git a/project/__pycache__/main.cpython-37.pyc b/project/__pycache__/main.cpython-37.pyc new file mode 100644 index 0000000..19f177a Binary files /dev/null and b/project/__pycache__/main.cpython-37.pyc differ diff --git a/project/app.py b/project/app.py new file mode 100644 index 0000000..58940d1 --- /dev/null +++ b/project/app.py @@ -0,0 +1,201 @@ +from flask import Flask, render_template,redirect,request,url_for,flash +import sqlite3 as db +import feedparser +from indicoio import config, text_tags +from bs4 import BeautifulSoup as bs +import requests + +config.api_key = "cfa7082e0a98abd1aaf9f085f9a850b1" + +app = Flask(__name__) +app.debug = True + +feedt = "https://www.sciencedaily.com/rss/top/technology.xml" +feedh = "http://feeds.bbci.co.uk/news/health/rss.xml" +feede = "http://feeds.bbci.co.uk/news/science_and_environment/rss.xml" +feedsp = "https://www.sciencedaily.com/rss/space_time.xml" + +# login_manager = LoginManager() +# login_manager.init_app(app) + + + +def sql_query(query): + connection = db.connect("brainmap.db") + connection.row_factory =db.Row + cursor = connection.cursor() + cursor.execute(query) + rows = cursor.fetchall() + connection.close() + return rows + +def sql_insert(name,username,password,emailid,h,s,t,e): + connection = db.connect("brainmap.db") + connection.row_factory =db.Row + cursor = connection.cursor() + cursor.execute('''INSERT INTO User (Name,Emailid,Username,Password,Space,Technology,Environment,Healthcare,Credits) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ''',(name,emailid,username,password,s,t,e,h,30)) + connection.commit() + + connection.close() + return 1 + + + + + + + +def thresholded(tags, minimum): + """ + Remove all tags with probability less than `minimum` + """ + return dict((category, prob) for category, prob in tags.items() + if prob > minimum) + +def likely_tag(tags, minimum=0.1): + """ + Threshold tags, then get the tag with the highest probability. + If no tag probability exceeds the minimum, return the string 'none' + """ + trimmed = thresholded(tags, minimum) or {'none': 0} + return max(trimmed, key=lambda key: trimmed[key]) + +def parsed(entry): + """ + Strip unnecessary content from the return of feedparser, + and augment with the output of indico's `text_tags` API + """ + return { + 'title': entry['title'], + 'link': entry['link'], + 'tag': likely_tag(entry['tags']) + } + +@app.route('/') +def main(): + entries = [] + entry = get_feeds(feede) + entries.extend(entry) + entry = get_feeds(feedsp) + entries.extend(entry) + entry = get_feeds(feedt) + entries.extend(entry) + entry = get_feeds(feedh) + entries.extend(entry) + return render_template('index.html', entries=entries) + + +@app.route('/about') +def about_us(): + return render_template('about.html') + +@app.route('/contact') +def contact(): + return render_template('contact.html') + + + + + + + +@app.route('/log',methods=['GET','POST']) +def log(): + if(request.method=="GET"): + res = sql_query('''SELECT *FROM User''') + msg = 'SELECT * FROM User' + return render_template('log.html',data = res,msg = msg) + +@app.route('/signup/',methods=['GET','POST']) +def signup(): + # if(request.method=="POST"): + return render_template('signup.html') + + +def get_feeds(feed): + entries = feedparser.parse(feed)['entries'] + titles = [entry.get('title') for entry in entries] + #title_tags = text_tags(titles) + for entry, tags in zip(entries, titles): + entry['tags'] = tags + entries = [entry for entry in entries] + return entries + + +@app.route('/signed_in',methods=['GET','POST']) +def signed_in(): + if(request.method=="POST"): + name = request.form['name'] + username = request.form['username'] + emailid = request.form['email'] + password = request.form['password'] + checklist = request.form.getlist('preference') + h = 0 + s = 0 + t= 0 + e = 0 + if 'envi' in checklist: + e = 1 + if 'space' in checklist: + s = 1 + if 'tech' in checklist: + t = 1 + if 'health' in checklist: + h = 1 + sql_insert(name,username,password,emailid,h,s,t,e) + print(checklist) + entries = [] + if(e==1): + print("feed env") + entry = get_feeds(feede) + entries.extend(entry) + if(s==1): + print("feed space") + entry = get_feeds(feedsp) + entries.extend(entry) + if(t==1): + print("feed tech") + entry = get_feeds(feedt) + entries.extend(entry) + if(h==1): + print("feed health") + entry = get_feeds(feedh) + entries.extend(entry) + + return render_template('index.html',entries=entries) + +@app.route('/tech') +def tech(): + return render_template('tech.html') + +@app.route('/envi') +def envi(): + return render_template('envi.html') + + +@app.route('/page3/') +def page3(topicName): + base = "https://www.youtube.com/results?search_query=" + qstring = topicName + + r = requests.get(base+qstring) + print(r) + page = r.text + soup=bs(page,'html.parser') + + vids = soup.findAll('a',attrs={'class':'yt-uix-tile-link'}) + print(vids) + videolist=[] + c = 0 + for v in vids: + if(c<6): + tmp = 'https://www.youtube.com' + v['href'] + tmp = tmp.replace("watch?v=", "embed/") + videolist.append(tmp) + c = c+1 + return render_template('page3.html',video1 = videolist,topicName = topicName) + +if __name__ == '__main__': + app.run() diff --git a/project/brain1.sqlite3 b/project/brain1.sqlite3 new file mode 100644 index 0000000..5e1ea81 Binary files /dev/null and b/project/brain1.sqlite3 differ diff --git a/project/brainmap.db b/project/brainmap.db new file mode 100644 index 0000000..fe87e52 Binary files /dev/null and b/project/brainmap.db differ diff --git a/project/database.py b/project/database.py new file mode 100644 index 0000000..c173720 --- /dev/null +++ b/project/database.py @@ -0,0 +1,27 @@ +import sqlite3 as db +connection = db.connect("brainmap.db") +cursor = connection.cursor() + +cursor.execute('''CREATE TABLE User + (Name TEXT, + Emailid TEXT, + Username TEXT, + Password TEXT, + Space INT, + Technology INT, + Environment INT, + Healthcare INT, + Credits INT, + PRIMARY KEY(Username) + ) + ''') + + +cursor.execute('''INSERT INTO User (Name,Emailid,Username,Password,Space,Technology,Environment,Healthcare,Credits) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ''',['Joe','joe6161@gmail.com','joe','abc',1,1,0,0,30]) + +connection.commit() + + +connection.close() diff --git a/project/env/bin/activate b/project/env/bin/activate new file mode 100644 index 0000000..29506d0 --- /dev/null +++ b/project/env/bin/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +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/miriam-john/Documents/tutorilals/extrastuff/flask/env" +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 || true + +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 diff --git a/project/env/bin/activate.csh b/project/env/bin/activate.csh new file mode 100644 index 0000000..9beebcd --- /dev/null +++ b/project/env/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/miriam-john/Documents/tutorilals/extrastuff/flask/env" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # 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:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/project/env/bin/activate.fish b/project/env/bin/activate.fish new file mode 100644 index 0000000..2ecad27 --- /dev/null +++ b/project/env/bin/activate.fish @@ -0,0 +1,102 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + 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" + and functions -q _old_fish_prompt + # 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 + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/miriam-john/Documents/tutorilals/extrastuff/flask/env" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +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 diff --git a/project/env/bin/activate.ps1 b/project/env/bin/activate.ps1 new file mode 100644 index 0000000..95504d3 --- /dev/null +++ b/project/env/bin/activate.ps1 @@ -0,0 +1,60 @@ +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) { + if (Test-Path variable:_OLD_VIRTUAL_PATH) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global + } + + if (Test-Path function:_old_virtual_prompt) { + $function:prompt = $function:_old_virtual_prompt + Remove-Item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue + } + + if (!$NonDestructive) { + # Self destruct! + Remove-Item function:deactivate + Remove-Item function:pydoc + } +} + +function global:pydoc { + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH + +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { + "" + } + $function:_old_virtual_prompt = $function:prompt + + if ("" -ne "") { + function global:prompt { + # Add the custom prefix to the existing prompt + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/project/env/bin/activate.xsh b/project/env/bin/activate.xsh new file mode 100644 index 0000000..67e8d9c --- /dev/null +++ b/project/env/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/home/miriam-john/Documents/tutorilals/extrastuff/flask/env" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/project/env/bin/activate_this.py b/project/env/bin/activate_this.py new file mode 100644 index 0000000..aa96457 --- /dev/null +++ b/project/env/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}.{}".format(*sys.version_info), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/project/env/bin/easy_install b/project/env/bin/easy_install new file mode 100644 index 0000000..eeb543c --- /dev/null +++ b/project/env/bin/easy_install @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/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()) diff --git a/project/env/bin/easy_install-3.7 b/project/env/bin/easy_install-3.7 new file mode 100644 index 0000000..eeb543c --- /dev/null +++ b/project/env/bin/easy_install-3.7 @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/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()) diff --git a/project/env/bin/flask b/project/env/bin/flask new file mode 100644 index 0000000..6d9c75c --- /dev/null +++ b/project/env/bin/flask @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/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()) diff --git a/project/env/bin/pip b/project/env/bin/pip new file mode 100644 index 0000000..0f16fa4 --- /dev/null +++ b/project/env/bin/pip @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/project/env/bin/pip3 b/project/env/bin/pip3 new file mode 100644 index 0000000..0f16fa4 --- /dev/null +++ b/project/env/bin/pip3 @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/project/env/bin/pip3.7 b/project/env/bin/pip3.7 new file mode 100644 index 0000000..0f16fa4 --- /dev/null +++ b/project/env/bin/pip3.7 @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/project/env/bin/python b/project/env/bin/python new file mode 100644 index 0000000..bc20342 Binary files /dev/null and b/project/env/bin/python differ diff --git a/project/env/bin/python-config b/project/env/bin/python-config new file mode 100644 index 0000000..4878706 --- /dev/null +++ b/project/env/bin/python-config @@ -0,0 +1,78 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/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')) diff --git a/project/env/bin/python3 b/project/env/bin/python3 new file mode 100644 index 0000000..d8654aa --- /dev/null +++ b/project/env/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/project/env/bin/python3.7 b/project/env/bin/python3.7 new file mode 100644 index 0000000..d8654aa --- /dev/null +++ b/project/env/bin/python3.7 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/project/env/bin/wheel b/project/env/bin/wheel new file mode 100644 index 0000000..e678d2f --- /dev/null +++ b/project/env/bin/wheel @@ -0,0 +1,10 @@ +#!/home/miriam-john/Documents/tutorilals/extrastuff/flask/env/bin/python +# -*- coding: utf-8 -*- +import re +import sys + +from wheel.cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/project/env/lib/python3.7/LICENSE.txt b/project/env/lib/python3.7/LICENSE.txt new file mode 100644 index 0000000..38dd903 --- /dev/null +++ b/project/env/lib/python3.7/LICENSE.txt @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/LICENSE.txt \ No newline at end of file diff --git a/project/env/lib/python3.7/__future__.py b/project/env/lib/python3.7/__future__.py new file mode 100644 index 0000000..9c28bf2 --- /dev/null +++ b/project/env/lib/python3.7/__future__.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/__future__.py \ No newline at end of file diff --git a/project/env/lib/python3.7/__pycache__/__future__.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/__future__.cpython-37.pyc new file mode 100644 index 0000000..456ecdb Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/__future__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc new file mode 100644 index 0000000..d6a61ea Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc new file mode 100644 index 0000000..5d1784d Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc new file mode 100644 index 0000000..6d43758 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/abc.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/abc.cpython-37.pyc new file mode 100644 index 0000000..c4c0122 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/abc.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/base64.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/base64.cpython-37.pyc new file mode 100644 index 0000000..43a6652 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/base64.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/bisect.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/bisect.cpython-37.pyc new file mode 100644 index 0000000..b29065a Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/bisect.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc new file mode 100644 index 0000000..a394c22 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/copy.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/copy.cpython-37.pyc new file mode 100644 index 0000000..2aaccd4 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/copy.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/copyreg.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/copyreg.cpython-37.pyc new file mode 100644 index 0000000..5e64ebc Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/copyreg.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/enum.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/enum.cpython-37.pyc new file mode 100644 index 0000000..728d3a8 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/enum.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc new file mode 100644 index 0000000..3503aa0 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/functools.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/functools.cpython-37.pyc new file mode 100644 index 0000000..ba0113f Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/functools.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc new file mode 100644 index 0000000..363c068 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/hashlib.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/hashlib.cpython-37.pyc new file mode 100644 index 0000000..d9fb799 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/hashlib.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc new file mode 100644 index 0000000..13c14ec Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000..e4d476f Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/imp.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/imp.cpython-37.pyc new file mode 100644 index 0000000..8b3297f Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/imp.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/io.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/io.cpython-37.pyc new file mode 100644 index 0000000..fcc6ee3 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/io.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc new file mode 100644 index 0000000..21c1a4e Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc new file mode 100644 index 0000000..f1e3e3d Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/locale.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/locale.cpython-37.pyc new file mode 100644 index 0000000..c3ba00e Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/locale.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/ntpath.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/ntpath.cpython-37.pyc new file mode 100644 index 0000000..0f1b283 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/ntpath.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/operator.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000..a4b9ffa Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/operator.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/os.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/os.cpython-37.pyc new file mode 100644 index 0000000..4b1196a Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/os.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/posixpath.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/posixpath.cpython-37.pyc new file mode 100644 index 0000000..f068c8d Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/posixpath.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/random.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/random.cpython-37.pyc new file mode 100644 index 0000000..e58624f Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/random.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/re.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/re.cpython-37.pyc new file mode 100644 index 0000000..6a9776d Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/re.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/reprlib.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/reprlib.cpython-37.pyc new file mode 100644 index 0000000..e1bbff8 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/reprlib.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/rlcompleter.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/rlcompleter.cpython-37.pyc new file mode 100644 index 0000000..c99a79f Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/rlcompleter.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000..dfa6e3c Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/site.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/site.cpython-37.pyc new file mode 100644 index 0000000..f15fbc9 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/site.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc new file mode 100644 index 0000000..5174859 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc new file mode 100644 index 0000000..7162ba8 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000..3f34156 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/stat.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/stat.cpython-37.pyc new file mode 100644 index 0000000..a96e14b Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/stat.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/struct.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/struct.cpython-37.pyc new file mode 100644 index 0000000..c0f9932 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/struct.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc new file mode 100644 index 0000000..da5c9f3 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/tempfile.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/tempfile.cpython-37.pyc new file mode 100644 index 0000000..07db466 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/tempfile.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/token.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/token.cpython-37.pyc new file mode 100644 index 0000000..ed8a47a Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/token.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc new file mode 100644 index 0000000..06a4c0d Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/types.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000..0aee3d7 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/types.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/warnings.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/warnings.cpython-37.pyc new file mode 100644 index 0000000..0bfb5db Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/warnings.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/__pycache__/weakref.cpython-37.pyc b/project/env/lib/python3.7/__pycache__/weakref.cpython-37.pyc new file mode 100644 index 0000000..b00af47 Binary files /dev/null and b/project/env/lib/python3.7/__pycache__/weakref.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/_bootlocale.py b/project/env/lib/python3.7/_bootlocale.py new file mode 100644 index 0000000..54532b0 --- /dev/null +++ b/project/env/lib/python3.7/_bootlocale.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/_bootlocale.py \ No newline at end of file diff --git a/project/env/lib/python3.7/_collections_abc.py b/project/env/lib/python3.7/_collections_abc.py new file mode 100644 index 0000000..13df00b --- /dev/null +++ b/project/env/lib/python3.7/_collections_abc.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/_collections_abc.py \ No newline at end of file diff --git a/project/env/lib/python3.7/_dummy_thread.py b/project/env/lib/python3.7/_dummy_thread.py new file mode 100644 index 0000000..53b8909 --- /dev/null +++ b/project/env/lib/python3.7/_dummy_thread.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/_dummy_thread.py \ No newline at end of file diff --git a/project/env/lib/python3.7/_weakrefset.py b/project/env/lib/python3.7/_weakrefset.py new file mode 100644 index 0000000..a76b9a7 --- /dev/null +++ b/project/env/lib/python3.7/_weakrefset.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/_weakrefset.py \ No newline at end of file diff --git a/project/env/lib/python3.7/abc.py b/project/env/lib/python3.7/abc.py new file mode 100644 index 0000000..063d140 --- /dev/null +++ b/project/env/lib/python3.7/abc.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/abc.py \ No newline at end of file diff --git a/project/env/lib/python3.7/base64.py b/project/env/lib/python3.7/base64.py new file mode 100644 index 0000000..bea8bf2 --- /dev/null +++ b/project/env/lib/python3.7/base64.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/base64.py \ No newline at end of file diff --git a/project/env/lib/python3.7/bisect.py b/project/env/lib/python3.7/bisect.py new file mode 100644 index 0000000..a2629ce --- /dev/null +++ b/project/env/lib/python3.7/bisect.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/bisect.py \ No newline at end of file diff --git a/project/env/lib/python3.7/codecs.py b/project/env/lib/python3.7/codecs.py new file mode 100644 index 0000000..6ea4589 --- /dev/null +++ b/project/env/lib/python3.7/codecs.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/codecs.py \ No newline at end of file diff --git a/project/env/lib/python3.7/collections b/project/env/lib/python3.7/collections new file mode 100644 index 0000000..d92f038 --- /dev/null +++ b/project/env/lib/python3.7/collections @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/collections \ No newline at end of file diff --git a/project/env/lib/python3.7/config-3.7m-x86_64-linux-gnu b/project/env/lib/python3.7/config-3.7m-x86_64-linux-gnu new file mode 100644 index 0000000..099277d --- /dev/null +++ b/project/env/lib/python3.7/config-3.7m-x86_64-linux-gnu @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/config-3.7m-x86_64-linux-gnu \ No newline at end of file diff --git a/project/env/lib/python3.7/copy.py b/project/env/lib/python3.7/copy.py new file mode 100644 index 0000000..aef048d --- /dev/null +++ b/project/env/lib/python3.7/copy.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/copy.py \ No newline at end of file diff --git a/project/env/lib/python3.7/copyreg.py b/project/env/lib/python3.7/copyreg.py new file mode 100644 index 0000000..02db61a --- /dev/null +++ b/project/env/lib/python3.7/copyreg.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/copyreg.py \ No newline at end of file diff --git a/project/env/lib/python3.7/distutils/__init__.py b/project/env/lib/python3.7/distutils/__init__.py new file mode 100644 index 0000000..b9b0f24 --- /dev/null +++ b/project/env/lib/python3.7/distutils/__init__.py @@ -0,0 +1,134 @@ +import os +import sys +import warnings + +# 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 +import opcode + +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) # noqa: F821 + if sys.version_info < (3, 4): + import imp + + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + else: + import importlib.machinery + + distutils_path = os.path.join(distutils_path, "__init__.py") + loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) + if sys.version_info < (3, 5): + import types + + real_distutils = types.ModuleType(loader.name) + else: + import importlib.util + + spec = importlib.util.spec_from_loader(loader.name, loader) + real_distutils = importlib.util.module_from_spec(spec) + loader.exec_module(real_distutils) + + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +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) + 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 diff --git a/project/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc b/project/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..87dda6a Binary files /dev/null and b/project/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/distutils/distutils.cfg b/project/env/lib/python3.7/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/project/env/lib/python3.7/distutils/distutils.cfg @@ -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 diff --git a/project/env/lib/python3.7/encodings b/project/env/lib/python3.7/encodings new file mode 100644 index 0000000..9ce19e2 --- /dev/null +++ b/project/env/lib/python3.7/encodings @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/encodings \ No newline at end of file diff --git a/project/env/lib/python3.7/enum.py b/project/env/lib/python3.7/enum.py new file mode 100644 index 0000000..85e6216 --- /dev/null +++ b/project/env/lib/python3.7/enum.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/enum.py \ No newline at end of file diff --git a/project/env/lib/python3.7/fnmatch.py b/project/env/lib/python3.7/fnmatch.py new file mode 100644 index 0000000..5603223 --- /dev/null +++ b/project/env/lib/python3.7/fnmatch.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/fnmatch.py \ No newline at end of file diff --git a/project/env/lib/python3.7/functools.py b/project/env/lib/python3.7/functools.py new file mode 100644 index 0000000..4743d8b --- /dev/null +++ b/project/env/lib/python3.7/functools.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/functools.py \ No newline at end of file diff --git a/project/env/lib/python3.7/genericpath.py b/project/env/lib/python3.7/genericpath.py new file mode 100644 index 0000000..c9188a2 --- /dev/null +++ b/project/env/lib/python3.7/genericpath.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/genericpath.py \ No newline at end of file diff --git a/project/env/lib/python3.7/hashlib.py b/project/env/lib/python3.7/hashlib.py new file mode 100644 index 0000000..239d95a --- /dev/null +++ b/project/env/lib/python3.7/hashlib.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/hashlib.py \ No newline at end of file diff --git a/project/env/lib/python3.7/heapq.py b/project/env/lib/python3.7/heapq.py new file mode 100644 index 0000000..3f3e353 --- /dev/null +++ b/project/env/lib/python3.7/heapq.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/heapq.py \ No newline at end of file diff --git a/project/env/lib/python3.7/hmac.py b/project/env/lib/python3.7/hmac.py new file mode 100644 index 0000000..ec095e4 --- /dev/null +++ b/project/env/lib/python3.7/hmac.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/hmac.py \ No newline at end of file diff --git a/project/env/lib/python3.7/imp.py b/project/env/lib/python3.7/imp.py new file mode 100644 index 0000000..06fa370 --- /dev/null +++ b/project/env/lib/python3.7/imp.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/imp.py \ No newline at end of file diff --git a/project/env/lib/python3.7/importlib b/project/env/lib/python3.7/importlib new file mode 100644 index 0000000..f1fc545 --- /dev/null +++ b/project/env/lib/python3.7/importlib @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/importlib \ No newline at end of file diff --git a/project/env/lib/python3.7/io.py b/project/env/lib/python3.7/io.py new file mode 100644 index 0000000..b801269 --- /dev/null +++ b/project/env/lib/python3.7/io.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/io.py \ No newline at end of file diff --git a/project/env/lib/python3.7/keyword.py b/project/env/lib/python3.7/keyword.py new file mode 100644 index 0000000..c6e7e63 --- /dev/null +++ b/project/env/lib/python3.7/keyword.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/keyword.py \ No newline at end of file diff --git a/project/env/lib/python3.7/lib-dynload b/project/env/lib/python3.7/lib-dynload new file mode 100644 index 0000000..ab20fd2 --- /dev/null +++ b/project/env/lib/python3.7/lib-dynload @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/lib-dynload \ No newline at end of file diff --git a/project/env/lib/python3.7/linecache.py b/project/env/lib/python3.7/linecache.py new file mode 100644 index 0000000..e350116 --- /dev/null +++ b/project/env/lib/python3.7/linecache.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/linecache.py \ No newline at end of file diff --git a/project/env/lib/python3.7/locale.py b/project/env/lib/python3.7/locale.py new file mode 100644 index 0000000..2bf8913 --- /dev/null +++ b/project/env/lib/python3.7/locale.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/locale.py \ No newline at end of file diff --git a/project/env/lib/python3.7/no-global-site-packages.txt b/project/env/lib/python3.7/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/project/env/lib/python3.7/ntpath.py b/project/env/lib/python3.7/ntpath.py new file mode 100644 index 0000000..6807b4e --- /dev/null +++ b/project/env/lib/python3.7/ntpath.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/ntpath.py \ No newline at end of file diff --git a/project/env/lib/python3.7/operator.py b/project/env/lib/python3.7/operator.py new file mode 100644 index 0000000..fd3e275 --- /dev/null +++ b/project/env/lib/python3.7/operator.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/operator.py \ No newline at end of file diff --git a/project/env/lib/python3.7/orig-prefix.txt b/project/env/lib/python3.7/orig-prefix.txt new file mode 100644 index 0000000..537bef1 --- /dev/null +++ b/project/env/lib/python3.7/orig-prefix.txt @@ -0,0 +1 @@ +/home/miriam-john/anaconda3 \ No newline at end of file diff --git a/project/env/lib/python3.7/os.py b/project/env/lib/python3.7/os.py new file mode 100644 index 0000000..aeb542d --- /dev/null +++ b/project/env/lib/python3.7/os.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/os.py \ No newline at end of file diff --git a/project/env/lib/python3.7/posixpath.py b/project/env/lib/python3.7/posixpath.py new file mode 100644 index 0000000..65478b3 --- /dev/null +++ b/project/env/lib/python3.7/posixpath.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/posixpath.py \ No newline at end of file diff --git a/project/env/lib/python3.7/random.py b/project/env/lib/python3.7/random.py new file mode 100644 index 0000000..b298d8f --- /dev/null +++ b/project/env/lib/python3.7/random.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/random.py \ No newline at end of file diff --git a/project/env/lib/python3.7/re.py b/project/env/lib/python3.7/re.py new file mode 100644 index 0000000..1ad4e1d --- /dev/null +++ b/project/env/lib/python3.7/re.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/re.py \ No newline at end of file diff --git a/project/env/lib/python3.7/reprlib.py b/project/env/lib/python3.7/reprlib.py new file mode 100644 index 0000000..27ecc38 --- /dev/null +++ b/project/env/lib/python3.7/reprlib.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/reprlib.py \ No newline at end of file diff --git a/project/env/lib/python3.7/rlcompleter.py b/project/env/lib/python3.7/rlcompleter.py new file mode 100644 index 0000000..b215334 --- /dev/null +++ b/project/env/lib/python3.7/rlcompleter.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/rlcompleter.py \ No newline at end of file diff --git a/project/env/lib/python3.7/shutil.py b/project/env/lib/python3.7/shutil.py new file mode 100644 index 0000000..1e7a15e --- /dev/null +++ b/project/env/lib/python3.7/shutil.py @@ -0,0 +1 @@ +/home/miriam-john/anaconda3/lib/python3.7/shutil.py \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/LICENSE.txt b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..87ce152 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/LICENSE.txt @@ -0,0 +1,39 @@ +Copyright © 2014 by the Pallets team. + +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. + +- Neither the name of the copyright holder nor the names of its + contributors may 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 HOLDER 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. + +---- + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright © 2001-2006 Gregory P. Ward. All rights reserved. +Copyright © 2002-2006 Python Software Foundation. All rights reserved. diff --git a/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/METADATA new file mode 100644 index 0000000..625bdad --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/METADATA @@ -0,0 +1,121 @@ +Metadata-Version: 2.1 +Name: Click +Version: 7.0 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/click +Project-URL: Issue tracker, https://github.com/pallets/click/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +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.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install click + +Click supports Python 3.4 and newer, Python 2.7, and PyPy. + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +A Simple Example +---------------- + +What does it look like? Here is an example of a simple Click program: + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", + help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo("Hello, %s!" % name) + + if __name__ == '__main__': + hello() + +And what it looks like when run: + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/click/ +* Documentation: https://click.palletsprojects.com/ +* License: `BSD `_ +* Releases: https://pypi.org/project/click/ +* Code: https://github.com/pallets/click +* Issue tracker: https://github.com/pallets/click/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/click + * Windows: https://ci.appveyor.com/project/pallets/click + +* Test coverage: https://codecov.io/gh/pallets/click + + diff --git a/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/RECORD new file mode 100644 index 0000000..ecf17c1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/RECORD @@ -0,0 +1,40 @@ +Click-7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Click-7.0.dist-info/LICENSE.txt,sha256=4hIxn676T0Wcisk3_chVcECjyrivKTZsoqSNI5AlIlw,1876 +Click-7.0.dist-info/METADATA,sha256=-r8jeke3Zer4diRvT1MjFZuiJ6yTT_qFP39svLqdaLI,3516 +Click-7.0.dist-info/RECORD,, +Click-7.0.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 +Click-7.0.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=HjGThQ7tef9kkwCV371TBnrf0SAi6fKfU_jtEnbYTvQ,2789 +click/__pycache__/__init__.cpython-37.pyc,, +click/__pycache__/_bashcomplete.cpython-37.pyc,, +click/__pycache__/_compat.cpython-37.pyc,, +click/__pycache__/_termui_impl.cpython-37.pyc,, +click/__pycache__/_textwrap.cpython-37.pyc,, +click/__pycache__/_unicodefun.cpython-37.pyc,, +click/__pycache__/_winconsole.cpython-37.pyc,, +click/__pycache__/core.cpython-37.pyc,, +click/__pycache__/decorators.cpython-37.pyc,, +click/__pycache__/exceptions.cpython-37.pyc,, +click/__pycache__/formatting.cpython-37.pyc,, +click/__pycache__/globals.cpython-37.pyc,, +click/__pycache__/parser.cpython-37.pyc,, +click/__pycache__/termui.cpython-37.pyc,, +click/__pycache__/testing.cpython-37.pyc,, +click/__pycache__/types.cpython-37.pyc,, +click/__pycache__/utils.cpython-37.pyc,, +click/_bashcomplete.py,sha256=iaNUmtxag0YPfxba3TDYCNietiTMQIrvhRLj-H8okFU,11014 +click/_compat.py,sha256=vYmvoj4opPxo-c-2GMQQjYT_r_QkOKybkfGoeVrt0dA,23399 +click/_termui_impl.py,sha256=xHmLtOJhKUCVD6168yucJ9fknUJPAMs0eUTPgVUO-GQ,19611 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=QHy2_5jYlX-36O-JVrTHNnHOqg8tquUR0HmQFev7Ics,4364 +click/_winconsole.py,sha256=PPWVak8Iikm_gAPsxMrzwsVFCvHgaW3jPaDWZ1JBl3U,8965 +click/core.py,sha256=q8FLcDZsagBGSRe5Y9Hi_FGvAeZvusNfoO5EkhkSQ8Y,75305 +click/decorators.py,sha256=idKt6duLUUfAFftrHoREi8MJSd39XW36pUVHthdglwk,11226 +click/exceptions.py,sha256=CNpAjBAE7qjaV4WChxQeak95e5yUOau8AsvT-8m6wss,7663 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=oQkou3ZQ5DgrbVM6BwIBirwiqozbjfirzsLGAlLRRdg,1514 +click/parser.py,sha256=m-nGZz4VwprM42_qtFlWFGo7yRJQxkBlRcZodoH593Y,15510 +click/termui.py,sha256=o_ZXB2jyvL2Rce7P_bFGq452iyBq9ykJyRApIPMCZO0,23207 +click/testing.py,sha256=aYGqY_iWLu2p4k7lkuJ6t3fqpf6aPGqTsyLzNY_ngKg,13062 +click/types.py,sha256=2Q929p-aBP_ZYuMFJqJR-Ipucofv3fmDc5JzBDPmzJU,23287 +click/utils.py,sha256=6-D0WkAxvv9FkgHXSHwDIv0l9Gdx9Mm6Z5vuKNLIfZI,15763 diff --git a/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/WHEEL new file mode 100644 index 0000000..1316c41 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Click-7.0.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/LICENSE.rst b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may 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 +HOLDER 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. diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..08fcc91 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/METADATA @@ -0,0 +1,134 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 1.1.1 +Summary: A simple framework for building complex web applications. +Home-page: https://palletsprojects.com/p/flask/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/flask +Project-URL: Issue tracker, https://github.com/pallets/flask/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +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.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* +Requires-Dist: Werkzeug (>=0.15) +Requires-Dist: Jinja2 (>=2.10.1) +Requires-Dist: itsdangerous (>=0.24) +Requires-Dist: click (>=5.1) +Provides-Extra: dev +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pallets-sphinx-themes ; extra == 'dev' +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'dev' +Requires-Dist: sphinx-issues ; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: pallets-sphinx-themes ; extra == 'docs' +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'docs' +Requires-Dist: sphinx-issues ; extra == 'docs' +Provides-Extra: dotenv +Requires-Dist: python-dotenv ; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Flask + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ env FLASK_APP=hello.py flask run + * Serving Flask app "hello" + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/master/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20 + + +Links +----- + +* Website: https://palletsprojects.com/p/flask/ +* Documentation: https://flask.palletsprojects.com/ +* Releases: https://pypi.org/project/Flask/ +* Code: https://github.com/pallets/flask +* Issue tracker: https://github.com/pallets/flask/issues +* Test status: https://dev.azure.com/pallets/flask/_build +* Official chat: https://discord.gg/t6rrQZH + +.. _WSGI: https://wsgi.readthedocs.io +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..b9939e6 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/RECORD @@ -0,0 +1,48 @@ +../../../bin/flask,sha256=A90buy50Hmjb_Z0a3rreqVZoeo4HYyNSwIcWo8gh8n0,265 +Flask-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-1.1.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask-1.1.1.dist-info/METADATA,sha256=Ht4R6TpTKOaXOmmQHhEF3A0Obpzde2Ai0kzNdu6-VWQ,4400 +Flask-1.1.1.dist-info/RECORD,, +Flask-1.1.1.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 +Flask-1.1.1.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-1.1.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=qaBW4gy9Xxmdc3ygYO0_H214H1VpF7fq8xRR4XbqRjE,1894 +flask/__main__.py,sha256=fjVtt3QTANXlpJCOv3Ha7d5H-76MwzSIOab7SFD9TEk,254 +flask/__pycache__/__init__.cpython-37.pyc,, +flask/__pycache__/__main__.cpython-37.pyc,, +flask/__pycache__/_compat.cpython-37.pyc,, +flask/__pycache__/app.cpython-37.pyc,, +flask/__pycache__/blueprints.cpython-37.pyc,, +flask/__pycache__/cli.cpython-37.pyc,, +flask/__pycache__/config.cpython-37.pyc,, +flask/__pycache__/ctx.cpython-37.pyc,, +flask/__pycache__/debughelpers.cpython-37.pyc,, +flask/__pycache__/globals.cpython-37.pyc,, +flask/__pycache__/helpers.cpython-37.pyc,, +flask/__pycache__/logging.cpython-37.pyc,, +flask/__pycache__/sessions.cpython-37.pyc,, +flask/__pycache__/signals.cpython-37.pyc,, +flask/__pycache__/templating.cpython-37.pyc,, +flask/__pycache__/testing.cpython-37.pyc,, +flask/__pycache__/views.cpython-37.pyc,, +flask/__pycache__/wrappers.cpython-37.pyc,, +flask/_compat.py,sha256=8KPT54Iig96TuLipdogLRHNYToIcg-xPhnSV5VRERnw,4099 +flask/app.py,sha256=gLZInxueeQ9dkBo1wrntZ-bZqiDT4rYxy_AQ1xraFDc,98066 +flask/blueprints.py,sha256=vkdm8NusGsfZUeIfPdCluj733QFmiQcT4Sk1tuZLUjw,21400 +flask/cli.py,sha256=_WhPG1bggNdrP0QO95Vex6VJpDqTsVK0z54Y5poljKU,30933 +flask/config.py,sha256=3dejvQRYfNHw_V7dCLMxU8UNFpL34xIKemN7gHZIZ8Y,10052 +flask/ctx.py,sha256=cks-omGedkxawHFo6bKIrdOHsJCAgg1i_NWw_htxb5U,16724 +flask/debughelpers.py,sha256=-whvPKuAoU8AZ9c1z_INuOeBgfYDqE1J2xNBsoriugU,6475 +flask/globals.py,sha256=OgcHb6_NCyX6-TldciOdKcyj4PNfyQwClxdMhvov6aA,1637 +flask/helpers.py,sha256=x2Pa85R5dV6uA5f5423JTb6x4u6ZaMGf8sfosUZ76dQ,43004 +flask/json/__init__.py,sha256=6nITbZYiYOPB8Qfi1-dvsblwn01KRz8VOsMBIZyaYek,11988 +flask/json/__pycache__/__init__.cpython-37.pyc,, +flask/json/__pycache__/tag.cpython-37.pyc,, +flask/json/tag.py,sha256=vq9GOllg_0kTWKuVFrwmkeOQzR-jdBD23x-89JyCCQI,8306 +flask/logging.py,sha256=WcY5UkqTysGfmosyygSlXyZYGwOp3y-VsE6ehoJ48dk,3250 +flask/sessions.py,sha256=G0KsEkr_i1LG_wOINwFSOW3ts7Xbv4bNgEZKc7TRloc,14360 +flask/signals.py,sha256=yYLOed2x8WnQ7pirGalQYfpYpCILJ0LJhmNSrnWvjqw,2212 +flask/templating.py,sha256=F8E_IZXn9BGsjMzUJ5N_ACMyZdiFBp_SSEaUunvfZ7g,4939 +flask/testing.py,sha256=b0QaEejx0UcXqfSFP43k5W57bTVeDyrNK3uPD8JUpCk,10146 +flask/views.py,sha256=eeWnadLAj0QdQPLtjKipDetRZyG62CT2y7fNOFDJz0g,5802 +flask/wrappers.py,sha256=kgsvtZuMM6RQaDqhRbc5Pcj9vqTnaERl2pmXcdGL7LU,4736 diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..1eb0252 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0-py3.5-nspkg.pth b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0-py3.5-nspkg.pth new file mode 100644 index 0000000..1d5f762 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0-py3.5-nspkg.pth @@ -0,0 +1 @@ +import sys, types, os;p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('flaskext',));ie = os.path.exists(os.path.join(p,'__init__.py'));m = not ie and sys.modules.setdefault('flaskext', types.ModuleType('flaskext'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/DESCRIPTION.rst b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..e118723 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/METADATA new file mode 100644 index 0000000..2b12195 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/METADATA @@ -0,0 +1,22 @@ +Metadata-Version: 2.0 +Name: Flask-MySQL +Version: 1.4.0 +Summary: Flask simple mysql client +Home-page: https://github.com/cyberdelia/flask-mysql/ +Author: Timothee Peignier +Author-email: timothee.peignier@tryphon.org +License: BSD +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask +Requires-Dist: PyMySQL + +UNKNOWN + + diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/RECORD new file mode 100644 index 0000000..e98f1d0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/RECORD @@ -0,0 +1,11 @@ +Flask_MySQL-1.4.0-py3.5-nspkg.pth,sha256=EeZ4hQUDEBialcqeB87lbn5_483GBDzD0L8Bw4I-RN8,311 +Flask_MySQL-1.4.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +Flask_MySQL-1.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_MySQL-1.4.0.dist-info/METADATA,sha256=pTm4V4IufGreVNIM7X10lQ88mayOBdXF8gP8OkA6LDk,658 +Flask_MySQL-1.4.0.dist-info/RECORD,, +Flask_MySQL-1.4.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +Flask_MySQL-1.4.0.dist-info/metadata.json,sha256=UrdD5sIfmpXj9Zb_taHzKMNGoWvfW3409yibKHYiLrY,835 +Flask_MySQL-1.4.0.dist-info/namespace_packages.txt,sha256=sDykeTRvfOFUilDHB-wFtTprzo_CvEQ6bWUUGF_DTA0,9 +Flask_MySQL-1.4.0.dist-info/top_level.txt,sha256=sDykeTRvfOFUilDHB-wFtTprzo_CvEQ6bWUUGF_DTA0,9 +flaskext/__pycache__/mysql.cpython-37.pyc,, +flaskext/mysql.py,sha256=gOc4PVdixYzAth1of6KmHRWnosZjDPCC1SqM9f41zLY,2686 diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/WHEEL @@ -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 + diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/metadata.json b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/metadata.json new file mode 100644 index 0000000..ef05b6b --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.details": {"contacts": [{"email": "timothee.peignier@tryphon.org", "name": "Timothee Peignier", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/cyberdelia/flask-mysql/"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask-MySQL", "platform": "any", "run_requires": [{"requires": ["Flask", "PyMySQL"]}], "summary": "Flask simple mysql client", "version": "1.4.0"} \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/namespace_packages.txt b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/namespace_packages.txt new file mode 100644 index 0000000..cbcdbd5 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/namespace_packages.txt @@ -0,0 +1 @@ +flaskext diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..cbcdbd5 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQL-1.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flaskext diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/METADATA new file mode 100644 index 0000000..d52a1e9 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/METADATA @@ -0,0 +1,28 @@ +Metadata-Version: 2.1 +Name: Flask-MySQLdb +Version: 0.2.0 +Summary: MySQLdb extension for Flask +Home-page: https://github.com/admiralobvious/flask-mysqldb +Author: Alexandre Ferland +Author-email: aferlandqc@gmail.com +License: MIT +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +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: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask (>=0.10) +Requires-Dist: mysqlclient + + +Flask-MySQLdb +---------------- + +MySQLdb extension for Flask + + diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/RECORD new file mode 100644 index 0000000..07705cf --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/RECORD @@ -0,0 +1,8 @@ +Flask_MySQLdb-0.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_MySQLdb-0.2.0.dist-info/METADATA,sha256=u7_B181tHoEGg2XTMLy94UaelI0JzOSF94dK73e9O7g,820 +Flask_MySQLdb-0.2.0.dist-info/RECORD,, +Flask_MySQLdb-0.2.0.dist-info/WHEEL,sha256=wYBY2EO50FhAcckpWmO3c3Zwk2MALACx6lPAl6gVKnE,93 +Flask_MySQLdb-0.2.0.dist-info/pbr.json,sha256=_qBDSNZxJ5WQuyu06cjODPDLLyDsB_dL9c4a5g6lAOE,47 +Flask_MySQLdb-0.2.0.dist-info/top_level.txt,sha256=G7cQGSsq4VqniHIv9Z7r6OEI-gQHh14xKXrQkSrlgLU,14 +flask_mysqldb/__init__.py,sha256=F5D_l3BUBirjjOQrsyvXesNppTH2NILQj8MPAXOGBrk,3492 +flask_mysqldb/__pycache__/__init__.cpython-37.pyc,, diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/WHEEL new file mode 100644 index 0000000..3b24cd6 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: cp37-none-any + diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/pbr.json b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/pbr.json new file mode 100644 index 0000000..08050c9 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "1bc8de9"} \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/top_level.txt new file mode 100644 index 0000000..bf68360 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_MySQLdb-0.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_mysqldb diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE new file mode 100644 index 0000000..344b3c1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2017, Dan Crosta +All 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. + +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 HOLDER 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. diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA new file mode 100644 index 0000000..60703fa --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA @@ -0,0 +1,43 @@ +Metadata-Version: 2.1 +Name: Flask-PyMongo +Version: 2.3.0 +Summary: PyMongo support for Flask applications +Home-page: http://flask-pymongo.readthedocs.org/ +Author: Dan Crosta +Author-email: dcrosta@late.am +License: BSD +Download-URL: https://github.com/dcrosta/flask-pymongo/tags +Platform: any +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask (>=0.11) +Requires-Dist: PyMongo (>=3.3) + + +Flask-PyMongo +------------- + +MongoDB support for Flask applications. + +Flask-PyMongo is pip-installable: + + $ pip install Flask-PyMongo + +Documentation for Flask-PyMongo is available on `ReadTheDocs +`_. + +Source code is hosted on `GitHub `_. +Contributions are welcome! + + diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD new file mode 100644 index 0000000..5c9f477 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD @@ -0,0 +1,25 @@ +Flask_PyMongo-2.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_PyMongo-2.3.0.dist-info/LICENSE,sha256=Ap8d3yrzplSqXFfool6NTo87qPxXRHk_ikV97lurKvY,1298 +Flask_PyMongo-2.3.0.dist-info/METADATA,sha256=YAaRh_44jnKkfE9PdipsdhwJeAFMSYdvHBcC0_Uz0Ok,1356 +Flask_PyMongo-2.3.0.dist-info/RECORD,, +Flask_PyMongo-2.3.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Flask_PyMongo-2.3.0.dist-info/pbr.json,sha256=Uog-jmFMzzyMUmvHpecWUp8hrfTHUIL8FHdBBkk0P6k,47 +Flask_PyMongo-2.3.0.dist-info/top_level.txt,sha256=D0YaRrox4mkWzPhTMnqwIP_A_L1SRd9krRPQCU3dDQU,14 +flask_pymongo/__init__.py,sha256=iiavXfDPhz37a1rM1XsyFn0XBdG4ykgdTsYUKLl9lCY,8968 +flask_pymongo/__pycache__/__init__.cpython-37.pyc,, +flask_pymongo/__pycache__/_version.cpython-37.pyc,, +flask_pymongo/__pycache__/wrappers.cpython-37.pyc,, +flask_pymongo/_version.py,sha256=wB_e6iDNGYA2lGSf9Do9xoBiacRXeGfjda4PNVbM_jk,122 +flask_pymongo/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_pymongo/tests/__pycache__/__init__.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_config.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_gridfs.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_url_converter.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_wrappers.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/util.cpython-37.pyc,, +flask_pymongo/tests/test_config.py,sha256=P6Fw10liyMYUz78e9U4I1ir0Wb-ltxYtdTWYr8WPrSM,3363 +flask_pymongo/tests/test_gridfs.py,sha256=sc70aukyMW9erW0pZZaZoEBKi3dfp1w-AW8OnCR5EDw,3039 +flask_pymongo/tests/test_url_converter.py,sha256=u1Avnps0Cgr6UG0akZnD8mPScJEVfJSvjLVziIouUfY,605 +flask_pymongo/tests/test_wrappers.py,sha256=c-NCD3xuuM5hWyCBlbMIEW9bkOVTTITHegf7AO-UOig,1212 +flask_pymongo/tests/util.py,sha256=XB7xxpDDPRkxYH4gA6v-FtAOo7IGnE8NubAYoDtlZWA,1087 +flask_pymongo/wrappers.py,sha256=A24URUPDchBNiY7qfRO9PKc9UGi6eMzB-FqbHVeChNY,4269 diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json new file mode 100644 index 0000000..e83a7d2 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "775c8c3"} \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt new file mode 100644 index 0000000..1748c74 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_pymongo diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/DESCRIPTION.rst b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..e118723 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/METADATA new file mode 100644 index 0000000..44a450b --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/METADATA @@ -0,0 +1,29 @@ +Metadata-Version: 2.0 +Name: Flask-RESTful +Version: 0.3.7 +Summary: Simple framework for creating REST APIs +Home-page: https://www.github.com/flask-restful/flask-restful/ +Author: Twilio API Team +Author-email: help@twilio.com +License: BSD +Platform: any +Classifier: Framework :: Flask +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: License :: OSI Approved :: BSD License +Provides-Extra: docs +Requires-Dist: aniso8601 (>=0.82) +Requires-Dist: Flask (>=0.8) +Requires-Dist: six (>=1.3.0) +Requires-Dist: pytz +Provides-Extra: docs +Requires-Dist: sphinx; extra == 'docs' + +UNKNOWN + + diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/RECORD new file mode 100644 index 0000000..a5c2e44 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/RECORD @@ -0,0 +1,27 @@ +Flask_RESTful-0.3.7.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +Flask_RESTful-0.3.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_RESTful-0.3.7.dist-info/METADATA,sha256=-rTvfEneMaSF6ZIm4oNeD1Imo4E7IkciGy2RnM0xmKo,882 +Flask_RESTful-0.3.7.dist-info/RECORD,, +Flask_RESTful-0.3.7.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +Flask_RESTful-0.3.7.dist-info/metadata.json,sha256=st4vJ82R36oCTXb65zhhaMR8wgqJ1EIvxfc21jdukow,1064 +Flask_RESTful-0.3.7.dist-info/top_level.txt,sha256=lNpWPlejgBAtMhCUwz_FTyJH12ul1mBZ-Uv3ZK1HiGg,14 +flask_restful/__init__.py,sha256=VRwraEsTs-kJdByT8bMHC5Iy7sxzTx3sZQyAKrOFzGo,27502 +flask_restful/__pycache__/__init__.cpython-37.pyc,, +flask_restful/__pycache__/__version__.cpython-37.pyc,, +flask_restful/__pycache__/fields.cpython-37.pyc,, +flask_restful/__pycache__/inputs.cpython-37.pyc,, +flask_restful/__pycache__/reqparse.cpython-37.pyc,, +flask_restful/__version__.py,sha256=KRsKKlxa0W81N7sVaSIcQp7Z_ymI-7V2rOBm1rOTCEE,45 +flask_restful/fields.py,sha256=_aO-5n5vn_tLYkxw8rQhAqzPXQRvfumvz_M9HJUL99c,13069 +flask_restful/inputs.py,sha256=AOBF_1BpB8snY3XJT_vca_uWYzkCP2nla01lFU7xqLE,9114 +flask_restful/representations/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +flask_restful/representations/__pycache__/__init__.cpython-37.pyc,, +flask_restful/representations/__pycache__/json.cpython-37.pyc,, +flask_restful/representations/json.py,sha256=swKwnbt7v2ioHfHkqhqbzIu_yrcP0ComlSl49IGFJOo,873 +flask_restful/reqparse.py,sha256=2BYZmrS5SYf74UVK5FlJxihkh-YduzknbiXNJnsOYfI,14606 +flask_restful/utils/__init__.py,sha256=Qh5pyCIT2dfHmrUdS6lsMbBLjZmAhz1fl7vWyJ_n4XQ,719 +flask_restful/utils/__pycache__/__init__.cpython-37.pyc,, +flask_restful/utils/__pycache__/cors.cpython-37.pyc,, +flask_restful/utils/__pycache__/crypto.cpython-37.pyc,, +flask_restful/utils/cors.py,sha256=cZiqaHhIn0w66spRoSIdC-jIn4X_b6OlVms5eGF4Ess,2084 +flask_restful/utils/crypto.py,sha256=q3PBvAYMJYybbqqQlKNF_Pqeyo9h3x5jFJuVqtEA5bA,996 diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/WHEEL new file mode 100644 index 0000000..7332a41 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/metadata.json b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/metadata.json new file mode 100644 index 0000000..005040e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Framework :: Flask", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "License :: OSI Approved :: BSD License"], "extensions": {"python.details": {"contacts": [{"email": "help@twilio.com", "name": "Twilio API Team", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://www.github.com/flask-restful/flask-restful/"}}}, "extras": ["docs"], "generator": "bdist_wheel (0.30.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask-RESTful", "platform": "any", "run_requires": [{"requires": ["Flask (>=0.8)", "aniso8601 (>=0.82)", "pytz", "six (>=1.3.0)"]}, {"extra": "docs", "requires": ["sphinx"]}], "summary": "Simple framework for creating REST APIs", "test_requires": [{"requires": ["Flask-RESTful", "blinker", "mock (>=0.8)"]}], "version": "0.3.7"} \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/top_level.txt new file mode 100644 index 0000000..f7b8527 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_RESTful-0.3.7.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_restful diff --git a/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/LICENSE.rst b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may 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 +HOLDER 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. diff --git a/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/METADATA new file mode 100644 index 0000000..8e988ca --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/METADATA @@ -0,0 +1,94 @@ +Metadata-Version: 2.1 +Name: Flask-SQLAlchemy +Version: 2.4.0 +Summary: Adds SQLAlchemy support to your Flask application. +Home-page: https://github.com/pallets/flask-sqlalchemy +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://flask-sqlalchemy.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/flask-sqlalchemy +Project-URL: Issue tracker, https://github.com/pallets/flask-sqlalchemy/issues +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.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.* +Requires-Dist: Flask (>=0.10) +Requires-Dist: SQLAlchemy (>=0.8.0) + +Flask-SQLAlchemy +================ + +Flask-SQLAlchemy is an extension for `Flask`_ that adds support for +`SQLAlchemy`_ to your application. It aims to simplify using SQLAlchemy +with Flask by providing useful defaults and extra helpers that make it +easier to accomplish common tasks. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask-SQLAlchemy + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + from flask_sqlalchemy import SQLAlchemy + + app = Flask(__name__) + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///example.sqlite" + db = SQLAlchemy(app) + + + class User(db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String, unique=True, nullable=False) + email = db.Column(db.String, unique=True, nullable=False) + + + db.session.add(User(name="Flask", email="example@example.com")) + db.session.commit() + + users = User.query.all() + + +Links +----- + +- Documentation: https://flask-sqlalchemy.palletsprojects.com/ +- Releases: https://pypi.org/project/Flask-SQLAlchemy/ +- Code: https://github.com/pallets/flask-sqlalchemy +- Issue tracker: https://github.com/pallets/flask-sqlalchemy/issues +- Test status: https://travis-ci.org/pallets/flask-sqlalchemy +- Test coverage: https://codecov.io/gh/pallets/flask-sqlalchemy + +.. _Flask: https://palletsprojects.com/p/flask/ +.. _SQLAlchemy: https://www.sqlalchemy.org +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/RECORD new file mode 100644 index 0000000..9aaa150 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/RECORD @@ -0,0 +1,14 @@ +Flask_SQLAlchemy-2.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_SQLAlchemy-2.4.0.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask_SQLAlchemy-2.4.0.dist-info/METADATA,sha256=uvOSlKcGx935ng3QL57DdBnd612KPhCt5dhDX0TBizI,3128 +Flask_SQLAlchemy-2.4.0.dist-info/RECORD,, +Flask_SQLAlchemy-2.4.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Flask_SQLAlchemy-2.4.0.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17 +flask_sqlalchemy/__init__.py,sha256=8H9-MlSbJjS69CBV8UYNYpDn3EkkU4S3wc7JouFz4eg,39027 +flask_sqlalchemy/__pycache__/__init__.cpython-37.pyc,, +flask_sqlalchemy/__pycache__/_compat.cpython-37.pyc,, +flask_sqlalchemy/__pycache__/model.cpython-37.pyc,, +flask_sqlalchemy/__pycache__/utils.cpython-37.pyc,, +flask_sqlalchemy/_compat.py,sha256=yua0ZSgVWwi56QpEgwaPInzkNQ9PFb7YQdvEk3dImXo,821 +flask_sqlalchemy/model.py,sha256=7CTvGxxKmLscwcwq9mVT5ny_w301QZvTVjSqMoMx6DI,4974 +flask_sqlalchemy/utils.py,sha256=4eHqAbYElnJ3NbSAHhuINckoAHDABoxjleMJD0iKgyg,1390 diff --git a/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..8a5538e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Flask_SQLAlchemy-2.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_sqlalchemy diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE new file mode 100644 index 0000000..31bf900 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE @@ -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. diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA new file mode 100644 index 0000000..fb4a867 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA @@ -0,0 +1,67 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 2.10.1 +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: Programming Language :: Python :: 3.6 +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 %} + + {% 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: https://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: https://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD new file mode 100644 index 0000000..1507ef1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.10.1.dist-info/LICENSE,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 +Jinja2-2.10.1.dist-info/METADATA,sha256=rx0eN8lX8iq8-YVppmCzV1Qx4y3Pj9IWi08mXUCrewI,2227 +Jinja2-2.10.1.dist-info/RECORD,, +Jinja2-2.10.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Jinja2-2.10.1.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 +Jinja2-2.10.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=V1D-JHQKklZseXOMA-uAW7-BeKe_TfPpOFi9-dV04ZA,2616 +jinja2/__pycache__/__init__.cpython-37.pyc,, +jinja2/__pycache__/_compat.cpython-37.pyc,, +jinja2/__pycache__/_identifier.cpython-37.pyc,, +jinja2/__pycache__/asyncfilters.cpython-37.pyc,, +jinja2/__pycache__/asyncsupport.cpython-37.pyc,, +jinja2/__pycache__/bccache.cpython-37.pyc,, +jinja2/__pycache__/compiler.cpython-37.pyc,, +jinja2/__pycache__/constants.cpython-37.pyc,, +jinja2/__pycache__/debug.cpython-37.pyc,, +jinja2/__pycache__/defaults.cpython-37.pyc,, +jinja2/__pycache__/environment.cpython-37.pyc,, +jinja2/__pycache__/exceptions.cpython-37.pyc,, +jinja2/__pycache__/ext.cpython-37.pyc,, +jinja2/__pycache__/filters.cpython-37.pyc,, +jinja2/__pycache__/idtracking.cpython-37.pyc,, +jinja2/__pycache__/lexer.cpython-37.pyc,, +jinja2/__pycache__/loaders.cpython-37.pyc,, +jinja2/__pycache__/meta.cpython-37.pyc,, +jinja2/__pycache__/nativetypes.cpython-37.pyc,, +jinja2/__pycache__/nodes.cpython-37.pyc,, +jinja2/__pycache__/optimizer.cpython-37.pyc,, +jinja2/__pycache__/parser.cpython-37.pyc,, +jinja2/__pycache__/runtime.cpython-37.pyc,, +jinja2/__pycache__/sandbox.cpython-37.pyc,, +jinja2/__pycache__/tests.cpython-37.pyc,, +jinja2/__pycache__/utils.cpython-37.pyc,, +jinja2/__pycache__/visitor.cpython-37.pyc,, +jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596 +jinja2/_identifier.py,sha256=W1QBSY-iJsyt6oR_nKSuNNCzV95vLIOYgUNPUI1d5gU,1726 +jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 +jinja2/asyncsupport.py,sha256=UErQ3YlTLaSjFb94P4MVn08-aVD9jJxty2JVfMRb-1M,7878 +jinja2/bccache.py,sha256=nQldx0ZRYANMyfvOihRoYFKSlUdd5vJkS7BjxNwlOZM,12794 +jinja2/compiler.py,sha256=BqC5U6JxObSRhblyT_a6Tp5GtEU5z3US1a4jLQaxxgo,65386 +jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 +jinja2/debug.py,sha256=WTVeUFGUa4v6ReCsYv-iVPa3pkNB75OinJt3PfxNdXs,12045 +jinja2/defaults.py,sha256=Em-95hmsJxIenDCZFB1YSvf9CNhe9rBmytN3yUrBcWA,1400 +jinja2/environment.py,sha256=VnkAkqw8JbjZct4tAyHlpBrka2vqB-Z58RAP-32P1ZY,50849 +jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 +jinja2/ext.py,sha256=atMQydEC86tN1zUsdQiHw5L5cF62nDbqGue25Yiu3N4,24500 +jinja2/filters.py,sha256=yOAJk0MsH-_gEC0i0U6NweVQhbtYaC-uE8xswHFLF4w,36528 +jinja2/idtracking.py,sha256=2GbDSzIvGArEBGLkovLkqEfmYxmWsEf8c3QZwM4uNsw,9197 +jinja2/lexer.py,sha256=ySEPoXd1g7wRjsuw23uimS6nkGN5aqrYwcOKxCaVMBQ,28559 +jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 +jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 +jinja2/nativetypes.py,sha256=_sJhS8f-8Q0QMIC0dm1YEdLyxEyoO-kch8qOL5xUDfE,7308 +jinja2/nodes.py,sha256=L10L_nQDfubLhO3XjpF9qz46FSh2clL-3e49ogVlMmA,30853 +jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 +jinja2/parser.py,sha256=lPzTEbcpTRBLw8ii6OYyExHeAhaZLMA05Hpv4ll3ULk,35875 +jinja2/runtime.py,sha256=DHdD38Pq8gj7uWQC5usJyWFoNWL317A9AvXOW_CLB34,27755 +jinja2/sandbox.py,sha256=UmX8hVjdaERCbA3RXBwrV1f-beA23KmijG5kzPJyU4A,17106 +jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237 +jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt new file mode 100644 index 0000000..32e6b75 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [babel.extractors] + jinja2 = jinja2.ext:babel_extract[i18n] + \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may 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 +HOLDER 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. diff --git a/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..b208d93 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.1.1 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: The Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/markupsafe +Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues +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.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + >>> # escape replaces special characters and wraps in Markup + >>> escape('') + Markup(u'<script>alert(document.cookie);</script>') + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup('Hello') + Markup('hello') + >>> escape(Markup('Hello')) + Markup('hello') + >>> # Markup is a text subclass (str on Python 3, unicode on Python 2) + >>> # methods and operators escape their arguments + >>> template = Markup("Hello %s") + >>> template % '"World"' + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +libraries that use it. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/markupsafe/ +* Documentation: https://markupsafe.palletsprojects.com/ +* License: `BSD-3-Clause `_ +* Releases: https://pypi.org/project/MarkupSafe/ +* Code: https://github.com/pallets/markupsafe +* Issue tracker: https://github.com/pallets/markupsafe/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/markupsafe + * Windows: https://ci.appveyor.com/project/pallets/markupsafe + +* Test coverage: https://codecov.io/gh/pallets/markupsafe + + diff --git a/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..8bc4604 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/RECORD @@ -0,0 +1,16 @@ +MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-1.1.1.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-1.1.1.dist-info/METADATA,sha256=nJHwJ4_4ka-V39QH883jPrslj6inNdyyNASBXbYgHXQ,3570 +MarkupSafe-1.1.1.dist-info/RECORD,, +MarkupSafe-1.1.1.dist-info/WHEEL,sha256=AhV6RMqZ2IDfreRJKo44QWYxYeP-0Jr0bezzBLQ1eog,109 +MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126 +markupsafe/__pycache__/__init__.cpython-37.pyc,, +markupsafe/__pycache__/_compat.cpython-37.pyc,, +markupsafe/__pycache__/_constants.cpython-37.pyc,, +markupsafe/__pycache__/_native.cpython-37.pyc,, +markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558 +markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690 +markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873 +markupsafe/_speedups.c,sha256=k0fzEIK3CP6MmMqeY0ob43TP90mVN0DTyn7BAl3RqSg,9884 +markupsafe/_speedups.cpython-37m-x86_64-linux-gnu.so,sha256=pz-ucGdAq6kJtq9lEY1kY2Ed6LQjbRrIicdu_i4HFqU,38875 diff --git a/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..697e432 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: false +Tag: cp37-cp37m-manylinux1_x86_64 + diff --git a/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__init__.py b/project/env/lib/python3.7/site-packages/MySQLdb/__init__.py new file mode 100644 index 0000000..d4c7fa5 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/__init__.py @@ -0,0 +1,98 @@ +""" +MySQLdb - A DB API v2.0 compatible interface to MySQL. + +This package is a wrapper around _mysql, which mostly implements the +MySQL C API. + +connect() -- connects to server + +See the C API specification and the MySQL documentation for more info +on other items. + +For information on how MySQLdb handles type conversion, see the +MySQLdb.converters module. +""" + +from MySQLdb.release import __version__, version_info, __author__ + +from . import _mysql + +if version_info != _mysql.version_info: + raise ImportError("this is MySQLdb version %s, but _mysql is version %r" % + (version_info, _mysql.version_info)) + +threadsafety = 1 +apilevel = "2.0" +paramstyle = "format" + +from ._mysql import * +from MySQLdb.compat import PY2 +from MySQLdb.constants import FIELD_TYPE +from MySQLdb.times import Date, Time, Timestamp, \ + DateFromTicks, TimeFromTicks, TimestampFromTicks + +try: + frozenset +except NameError: + from sets import ImmutableSet as frozenset + +class DBAPISet(frozenset): + """A special type of set for which A == x is true if A is a + DBAPISet and x is a member of that set.""" + + def __eq__(self, other): + if isinstance(other, DBAPISet): + return not self.difference(other) + return other in self + + +STRING = DBAPISet([FIELD_TYPE.ENUM, FIELD_TYPE.STRING, + FIELD_TYPE.VAR_STRING]) +BINARY = DBAPISet([FIELD_TYPE.BLOB, FIELD_TYPE.LONG_BLOB, + FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.TINY_BLOB]) +NUMBER = DBAPISet([FIELD_TYPE.DECIMAL, FIELD_TYPE.DOUBLE, FIELD_TYPE.FLOAT, + FIELD_TYPE.INT24, FIELD_TYPE.LONG, FIELD_TYPE.LONGLONG, + FIELD_TYPE.TINY, FIELD_TYPE.YEAR, FIELD_TYPE.NEWDECIMAL]) +DATE = DBAPISet([FIELD_TYPE.DATE]) +TIME = DBAPISet([FIELD_TYPE.TIME]) +TIMESTAMP = DBAPISet([FIELD_TYPE.TIMESTAMP, FIELD_TYPE.DATETIME]) +DATETIME = TIMESTAMP +ROWID = DBAPISet() + +def test_DBAPISet_set_equality(): + assert STRING == STRING + +def test_DBAPISet_set_inequality(): + assert STRING != NUMBER + +def test_DBAPISet_set_equality_membership(): + assert FIELD_TYPE.VAR_STRING == STRING + +def test_DBAPISet_set_inequality_membership(): + assert FIELD_TYPE.DATE != STRING + +if PY2: + def Binary(x): + return bytearray(x) +else: + def Binary(x): + return bytes(x) + +def Connect(*args, **kwargs): + """Factory function for connections.Connection.""" + from MySQLdb.connections import Connection + return Connection(*args, **kwargs) + +connect = Connection = Connect + +__all__ = [ 'BINARY', 'Binary', 'Connect', 'Connection', 'DATE', + 'Date', 'Time', 'Timestamp', 'DateFromTicks', 'TimeFromTicks', + 'TimestampFromTicks', 'DataError', 'DatabaseError', 'Error', + 'FIELD_TYPE', 'IntegrityError', 'InterfaceError', 'InternalError', + 'MySQLError', 'NUMBER', 'NotSupportedError', 'DBAPISet', + 'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'TIME', + 'TIMESTAMP', 'Warning', 'apilevel', 'connect', 'connections', + 'constants', 'converters', 'cursors', 'debug', 'escape', + 'escape_string', 'get_client_info', + 'paramstyle', 'string_literal', 'threadsafety', 'version_info'] + diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/__init__.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..91561d2 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/__init__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/_exceptions.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/_exceptions.cpython-37.pyc new file mode 100644 index 0000000..fc096f9 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/_exceptions.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/compat.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000..c5b34bd Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/compat.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/connections.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/connections.cpython-37.pyc new file mode 100644 index 0000000..501b11e Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/connections.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/converters.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/converters.cpython-37.pyc new file mode 100644 index 0000000..aca894b Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/converters.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/cursors.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/cursors.cpython-37.pyc new file mode 100644 index 0000000..c7e06b0 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/cursors.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/release.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/release.cpython-37.pyc new file mode 100644 index 0000000..94d6f9e Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/release.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/times.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/times.cpython-37.pyc new file mode 100644 index 0000000..eafae7f Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/__pycache__/times.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/_exceptions.py b/project/env/lib/python3.7/site-packages/MySQLdb/_exceptions.py new file mode 100644 index 0000000..0f14f3b --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/_exceptions.py @@ -0,0 +1,70 @@ +"""Exception classes for _mysql and MySQLdb. + +These classes are dictated by the DB API v2.0: + + https://www.python.org/dev/peps/pep-0249/ +""" +from .compat import StandardError + + +class MySQLError(StandardError): + """Exception related to operation with MySQL.""" + + +class Warning(Warning, MySQLError): + """Exception raised for important warnings like data truncations + while inserting, etc.""" + + +class Error(MySQLError): + """Exception that is the base class of all other error exceptions + (not Warning).""" + + +class InterfaceError(Error): + """Exception raised for errors that are related to the database + interface rather than the database itself.""" + + +class DatabaseError(Error): + """Exception raised for errors that are related to the + database.""" + + +class DataError(DatabaseError): + """Exception raised for errors that are due to problems with the + processed data like division by zero, numeric value out of range, + etc.""" + + +class OperationalError(DatabaseError): + """Exception raised for errors that are related to the database's + operation and not necessarily under the control of the programmer, + e.g. an unexpected disconnect occurs, the data source name is not + found, a transaction could not be processed, a memory allocation + error occurred during processing, etc.""" + + +class IntegrityError(DatabaseError): + """Exception raised when the relational integrity of the database + is affected, e.g. a foreign key check fails, duplicate key, + etc.""" + + +class InternalError(DatabaseError): + """Exception raised when the database encounters an internal + error, e.g. the cursor is not valid anymore, the transaction is + out of sync, etc.""" + + +class ProgrammingError(DatabaseError): + """Exception raised for programming errors, e.g. table not found + or already exists, syntax error in the SQL statement, wrong number + of parameters specified, etc.""" + + +class NotSupportedError(DatabaseError): + """Exception raised in case a method or database API was used + which is not supported by the database, e.g. requesting a + .rollback() on a connection that does not support transaction or + has transactions turned off.""" diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-x86_64-linux-gnu.so b/project/env/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-x86_64-linux-gnu.so new file mode 100644 index 0000000..2a59565 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-x86_64-linux-gnu.so differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/compat.py b/project/env/lib/python3.7/site-packages/MySQLdb/compat.py new file mode 100644 index 0000000..f8d98ac --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/compat.py @@ -0,0 +1,14 @@ +import sys + +if sys.version_info[0] == 2: + PY2 = True + unicode = unicode + unichr = unichr + long = long + StandardError = StandardError +else: + PY2 = False + unicode = str + unichr = chr + long = int + StandardError = Exception diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/connections.py b/project/env/lib/python3.7/site-packages/MySQLdb/connections.py new file mode 100644 index 0000000..5c5e6d4 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/connections.py @@ -0,0 +1,331 @@ +""" +This module implements connections for MySQLdb. Presently there is +only one class: Connection. Others are unlikely. However, you might +want to make your own subclasses. In most cases, you will probably +override Connection.default_cursor with a non-standard Cursor class. +""" +import re +import sys + +from MySQLdb import cursors, _mysql +from MySQLdb.compat import unicode, PY2 +from MySQLdb._exceptions import ( + Warning, Error, InterfaceError, DataError, + DatabaseError, OperationalError, IntegrityError, InternalError, + NotSupportedError, ProgrammingError, +) + + +re_numeric_part = re.compile(r"^(\d+)") + +def numeric_part(s): + """Returns the leading numeric part of a string. + + >>> numeric_part("20-alpha") + 20 + >>> numeric_part("foo") + >>> numeric_part("16b") + 16 + """ + + m = re_numeric_part.match(s) + if m: + return int(m.group(1)) + return None + + +class Connection(_mysql.connection): + """MySQL Database Connection Object""" + + default_cursor = cursors.Cursor + + def __init__(self, *args, **kwargs): + """ + Create a connection to the database. It is strongly recommended + that you only use keyword parameters. Consult the MySQL C API + documentation for more information. + + :param str host: host to connect + :param str user: user to connect as + :param str password: password to use + :param str passwd: alias of password, for backward compatibility + :param str database: database to use + :param str db: alias of database, for backward compatibility + :param int port: TCP/IP port to connect to + :param str unix_socket: location of unix_socket to use + :param dict conv: conversion dictionary, see MySQLdb.converters + :param int connect_timeout: + number of seconds to wait before the connection attempt fails. + + :param bool compress: if set, compression is enabled + :param str named_pipe: if set, a named pipe is used to connect (Windows only) + :param str init_command: + command which is run once the connection is created + + :param str read_default_file: + file from which default client values are read + + :param str read_default_group: + configuration group to use from the default file + + :param type cursorclass: + class object, used to create cursors (keyword only) + + :param bool use_unicode: + If True, text-like columns are returned as unicode objects + using the connection's character set. Otherwise, text-like + columns are returned as bytes. Unicode objects will always + be encoded to the connection's character set regardless of + this setting. + Default to False on Python 2 and True on Python 3 + so that you can always get python `str` object by default. + + :param str charset: + If supplied, the connection character set will be changed + to this character set. + On Python 2, this option changes default value of `use_unicode` + option from False to True. + + :param str sql_mode: + If supplied, the session SQL mode will be changed to this + setting. + For more details and legal values, see the MySQL documentation. + + :param int client_flag: + flags to use or 0 (see MySQL docs or constants/CLIENTS.py) + + :param dict ssl: + dictionary or mapping contains SSL connection parameters; + see the MySQL documentation for more details + (mysql_ssl_set()). If this is set, and the client does not + support SSL, NotSupportedError will be raised. + + :param bool local_infile: + enables LOAD LOCAL INFILE; zero disables + + :param bool autocommit: + If False (default), autocommit is disabled. + If True, autocommit is enabled. + If None, autocommit isn't set and server default is used. + + :param bool binary_prefix: + If set, the '_binary' prefix will be used for raw byte query + arguments (e.g. Binary). This is disabled by default. + + There are a number of undocumented, non-standard methods. See the + documentation for the MySQL C API for some hints on what they do. + """ + from MySQLdb.constants import CLIENT, FIELD_TYPE + from MySQLdb.converters import conversions, _bytes_or_str + from weakref import proxy + + kwargs2 = kwargs.copy() + + if 'database' in kwargs2: + kwargs2['db'] = kwargs2.pop('database') + if 'password' in kwargs2: + kwargs2['passwd'] = kwargs2.pop('password') + + if 'conv' in kwargs: + conv = kwargs['conv'] + else: + conv = conversions + + conv2 = {} + for k, v in conv.items(): + if isinstance(k, int) and isinstance(v, list): + conv2[k] = v[:] + else: + conv2[k] = v + kwargs2['conv'] = conv2 + + cursorclass = kwargs2.pop('cursorclass', self.default_cursor) + charset = kwargs2.get('charset', '') + + if charset or not PY2: + use_unicode = True + else: + use_unicode = False + + use_unicode = kwargs2.pop('use_unicode', use_unicode) + sql_mode = kwargs2.pop('sql_mode', '') + self._binary_prefix = kwargs2.pop('binary_prefix', False) + + client_flag = kwargs.get('client_flag', 0) + client_version = tuple([ numeric_part(n) for n in _mysql.get_client_info().split('.')[:2] ]) + if client_version >= (4, 1): + client_flag |= CLIENT.MULTI_STATEMENTS + if client_version >= (5, 0): + client_flag |= CLIENT.MULTI_RESULTS + + kwargs2['client_flag'] = client_flag + + # PEP-249 requires autocommit to be initially off + autocommit = kwargs2.pop('autocommit', False) + + super(Connection, self).__init__(*args, **kwargs2) + self.cursorclass = cursorclass + self.encoders = dict([ (k, v) for k, v in conv.items() + if type(k) is not int ]) + + # XXX THIS IS GARBAGE: While this is just a garbage and undocumented, + # Django 1.11 depends on it. And they don't fix it because + # they are in security-only fix mode. + # So keep this garbage for now. This will be removed in 1.5. + # See PyMySQL/mysqlclient-python#306 + self.encoders[bytes] = bytes + + self._server_version = tuple([ numeric_part(n) for n in self.get_server_info().split('.')[:2] ]) + + self.encoding = 'ascii' # overridden in set_character_set() + db = proxy(self) + + def unicode_literal(u, dummy=None): + return db.string_literal(u.encode(db.encoding)) + + if not charset: + charset = self.character_set_name() + self.set_character_set(charset) + + if sql_mode: + self.set_sql_mode(sql_mode) + + if use_unicode: + for t in (FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING, FIELD_TYPE.VARCHAR, FIELD_TYPE.TINY_BLOB, + FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.LONG_BLOB, FIELD_TYPE.BLOB): + self.converter[t] = _bytes_or_str + # Unlike other string/blob types, JSON is always text. + # MySQL may return JSON with charset==binary. + self.converter[FIELD_TYPE.JSON] = unicode + + self.encoders[unicode] = unicode_literal + self._transactional = self.server_capabilities & CLIENT.TRANSACTIONS + if self._transactional: + if autocommit is not None: + self.autocommit(autocommit) + self.messages = [] + + def autocommit(self, on): + on = bool(on) + if self.get_autocommit() != on: + _mysql.connection.autocommit(self, on) + + def cursor(self, cursorclass=None): + """ + Create a cursor on which queries may be performed. The + optional cursorclass parameter is used to create the + Cursor. By default, self.cursorclass=cursors.Cursor is + used. + """ + return (cursorclass or self.cursorclass)(self) + + def query(self, query): + # Since _mysql releases GIL while querying, we need immutable buffer. + if isinstance(query, bytearray): + query = bytes(query) + _mysql.connection.query(self, query) + + def _bytes_literal(self, bs): + assert isinstance(bs, (bytes, bytearray)) + x = self.string_literal(bs) # x is escaped and quoted bytes + if self._binary_prefix: + return b'_binary' + x + return x + + def _tuple_literal(self, t): + return b"(%s)" % (b','.join(map(self.literal, t))) + + def literal(self, o): + """If o is a single object, returns an SQL literal as a string. + If o is a non-string sequence, the items of the sequence are + converted and returned as a sequence. + + Non-standard. For internal use; do not use this in your + applications. + """ + if isinstance(o, unicode): + s = self.string_literal(o.encode(self.encoding)) + elif isinstance(o, bytearray): + s = self._bytes_literal(o) + elif isinstance(o, bytes): + if PY2: + s = self.string_literal(o) + else: + s = self._bytes_literal(o) + elif isinstance(o, (tuple, list)): + s = self._tuple_literal(o) + else: + s = self.escape(o, self.encoders) + if isinstance(s, unicode): + s = s.encode(self.encoding) + assert isinstance(s, bytes) + return s + + def begin(self): + """Explicitly begin a connection. + + This method is not used when autocommit=False (default). + """ + self.query(b"BEGIN") + + if not hasattr(_mysql.connection, 'warning_count'): + + def warning_count(self): + """Return the number of warnings generated from the + last query. This is derived from the info() method.""" + info = self.info() + if info: + return int(info.split()[-1]) + else: + return 0 + + def set_character_set(self, charset): + """Set the connection character set to charset. The character + set can only be changed in MySQL-4.1 and newer. If you try + to change the character set from the current value in an + older version, NotSupportedError will be raised.""" + if charset in ("utf8mb4", "utf8mb3"): + py_charset = "utf8" + else: + py_charset = charset + if self.character_set_name() != charset: + try: + super(Connection, self).set_character_set(charset) + except AttributeError: + if self._server_version < (4, 1): + raise NotSupportedError("server is too old to set charset") + self.query('SET NAMES %s' % charset) + self.store_result() + self.encoding = py_charset + + def set_sql_mode(self, sql_mode): + """Set the connection sql_mode. See MySQL documentation for + legal values.""" + if self._server_version < (4, 1): + raise NotSupportedError("server is too old to set sql_mode") + self.query("SET SESSION sql_mode='%s'" % sql_mode) + self.store_result() + + def show_warnings(self): + """Return detailed information about warnings as a + sequence of tuples of (Level, Code, Message). This + is only supported in MySQL-4.1 and up. If your server + is an earlier version, an empty sequence is returned.""" + if self._server_version < (4,1): return () + self.query("SHOW WARNINGS") + r = self.store_result() + warnings = r.fetch_row(0) + return warnings + + Warning = Warning + Error = Error + InterfaceError = InterfaceError + DatabaseError = DatabaseError + DataError = DataError + OperationalError = OperationalError + IntegrityError = IntegrityError + InternalError = InternalError + ProgrammingError = ProgrammingError + NotSupportedError = NotSupportedError + +# vim: colorcolumn=100 diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/CLIENT.py b/project/env/lib/python3.7/site-packages/MySQLdb/constants/CLIENT.py new file mode 100644 index 0000000..6559917 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/constants/CLIENT.py @@ -0,0 +1,29 @@ +"""MySQL CLIENT constants + +These constants are used when creating the connection. Use bitwise-OR +(|) to combine options together, and pass them as the client_flags +parameter to MySQLdb.Connection. For more information on these flags, +see the MySQL C API documentation for mysql_real_connect(). + +""" + +LONG_PASSWORD = 1 +FOUND_ROWS = 2 +LONG_FLAG = 4 +CONNECT_WITH_DB = 8 +NO_SCHEMA = 16 +COMPRESS = 32 +ODBC = 64 +LOCAL_FILES = 128 +IGNORE_SPACE = 256 +CHANGE_USER = 512 +INTERACTIVE = 1024 +SSL = 2048 +IGNORE_SIGPIPE = 4096 +TRANSACTIONS = 8192 # mysql_com.h was WRONG prior to 3.23.35 +RESERVED = 16384 +SECURE_CONNECTION = 32768 +MULTI_STATEMENTS = 65536 +MULTI_RESULTS = 131072 + + diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/CR.py b/project/env/lib/python3.7/site-packages/MySQLdb/constants/CR.py new file mode 100644 index 0000000..753408e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/constants/CR.py @@ -0,0 +1,103 @@ +"""MySQL Connection Errors + +Nearly all of these raise OperationalError. COMMANDS_OUT_OF_SYNC +raises ProgrammingError. + +""" + +if __name__ == "__main__": + """ + Usage: python CR.py [/path/to/mysql/errmsg.h ...] >> CR.py + """ + import fileinput, re + data = {} + error_last = None + for line in fileinput.input(): + line = re.sub(r'/\*.*?\*/', '', line) + m = re.match(r'^\s*#define\s+CR_([A-Z0-9_]+)\s+(\d+)(\s.*|$)', line) + if m: + name = m.group(1) + value = int(m.group(2)) + if name == 'ERROR_LAST': + if error_last is None or error_last < value: + error_last = value + continue + if value not in data: + data[value] = set() + data[value].add(name) + for value, names in sorted(data.items()): + for name in sorted(names): + print('%s = %s' % (name, value)) + if error_last is not None: + print('ERROR_LAST = %s' % error_last) + + +ERROR_FIRST = 2000 +MIN_ERROR = 2000 +UNKNOWN_ERROR = 2000 +SOCKET_CREATE_ERROR = 2001 +CONNECTION_ERROR = 2002 +CONN_HOST_ERROR = 2003 +IPSOCK_ERROR = 2004 +UNKNOWN_HOST = 2005 +SERVER_GONE_ERROR = 2006 +VERSION_ERROR = 2007 +OUT_OF_MEMORY = 2008 +WRONG_HOST_INFO = 2009 +LOCALHOST_CONNECTION = 2010 +TCP_CONNECTION = 2011 +SERVER_HANDSHAKE_ERR = 2012 +SERVER_LOST = 2013 +COMMANDS_OUT_OF_SYNC = 2014 +NAMEDPIPE_CONNECTION = 2015 +NAMEDPIPEWAIT_ERROR = 2016 +NAMEDPIPEOPEN_ERROR = 2017 +NAMEDPIPESETSTATE_ERROR = 2018 +CANT_READ_CHARSET = 2019 +NET_PACKET_TOO_LARGE = 2020 +EMBEDDED_CONNECTION = 2021 +PROBE_SLAVE_STATUS = 2022 +PROBE_SLAVE_HOSTS = 2023 +PROBE_SLAVE_CONNECT = 2024 +PROBE_MASTER_CONNECT = 2025 +SSL_CONNECTION_ERROR = 2026 +MALFORMED_PACKET = 2027 +WRONG_LICENSE = 2028 +NULL_POINTER = 2029 +NO_PREPARE_STMT = 2030 +PARAMS_NOT_BOUND = 2031 +DATA_TRUNCATED = 2032 +NO_PARAMETERS_EXISTS = 2033 +INVALID_PARAMETER_NO = 2034 +INVALID_BUFFER_USE = 2035 +UNSUPPORTED_PARAM_TYPE = 2036 +SHARED_MEMORY_CONNECTION = 2037 +SHARED_MEMORY_CONNECT_REQUEST_ERROR = 2038 +SHARED_MEMORY_CONNECT_ANSWER_ERROR = 2039 +SHARED_MEMORY_CONNECT_FILE_MAP_ERROR = 2040 +SHARED_MEMORY_CONNECT_MAP_ERROR = 2041 +SHARED_MEMORY_FILE_MAP_ERROR = 2042 +SHARED_MEMORY_MAP_ERROR = 2043 +SHARED_MEMORY_EVENT_ERROR = 2044 +SHARED_MEMORY_CONNECT_ABANDONED_ERROR = 2045 +SHARED_MEMORY_CONNECT_SET_ERROR = 2046 +CONN_UNKNOW_PROTOCOL = 2047 +INVALID_CONN_HANDLE = 2048 +UNUSED_1 = 2049 +FETCH_CANCELED = 2050 +NO_DATA = 2051 +NO_STMT_METADATA = 2052 +NO_RESULT_SET = 2053 +NOT_IMPLEMENTED = 2054 +SERVER_LOST_EXTENDED = 2055 +STMT_CLOSED = 2056 +NEW_STMT_METADATA = 2057 +ALREADY_CONNECTED = 2058 +AUTH_PLUGIN_CANNOT_LOAD = 2059 +DUPLICATE_CONNECTION_ATTR = 2060 +AUTH_PLUGIN_ERR = 2061 +INSECURE_API_ERR = 2062 +FILE_NAME_TOO_LONG = 2063 +SSL_FIPS_MODE_ERR = 2064 +MAX_ERROR = 2999 +ERROR_LAST = 2064 diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/ER.py b/project/env/lib/python3.7/site-packages/MySQLdb/constants/ER.py new file mode 100644 index 0000000..2e623b5 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/constants/ER.py @@ -0,0 +1,825 @@ +"""MySQL ER Constants + +These constants are error codes for the bulk of the error conditions +that may occur. +""" + +if __name__ == "__main__": + """ + Usage: python ER.py [/path/to/mysql/mysqld_error.h ...] >> ER.py + """ + import fileinput, re + data = {} + error_last = None + for line in fileinput.input(): + line = re.sub(r'/\*.*?\*/', '', line) + m = re.match(r'^\s*#define\s+((ER|WARN)_[A-Z0-9_]+)\s+(\d+)\s*', line) + if m: + name = m.group(1) + if name.startswith('ER_'): + name = name[3:] + value = int(m.group(3)) + if name == 'ERROR_LAST': + if error_last is None or error_last < value: + error_last = value + continue + if value not in data: + data[value] = set() + data[value].add(name) + for value, names in sorted(data.items()): + for name in sorted(names): + print('%s = %s' % (name, value)) + if error_last is not None: + print('ERROR_LAST = %s' % error_last) + + +ERROR_FIRST = 1000 +NO = 1002 +YES = 1003 +CANT_CREATE_FILE = 1004 +CANT_CREATE_TABLE = 1005 +CANT_CREATE_DB = 1006 +DB_CREATE_EXISTS = 1007 +DB_DROP_EXISTS = 1008 +DB_DROP_RMDIR = 1010 +CANT_FIND_SYSTEM_REC = 1012 +CANT_GET_STAT = 1013 +CANT_LOCK = 1015 +CANT_OPEN_FILE = 1016 +FILE_NOT_FOUND = 1017 +CANT_READ_DIR = 1018 +CHECKREAD = 1020 +DUP_KEY = 1022 +ERROR_ON_READ = 1024 +ERROR_ON_RENAME = 1025 +ERROR_ON_WRITE = 1026 +FILE_USED = 1027 +FILSORT_ABORT = 1028 +GET_ERRNO = 1030 +ILLEGAL_HA = 1031 +KEY_NOT_FOUND = 1032 +NOT_FORM_FILE = 1033 +NOT_KEYFILE = 1034 +OLD_KEYFILE = 1035 +OPEN_AS_READONLY = 1036 +OUTOFMEMORY = 1037 +OUT_OF_SORTMEMORY = 1038 +CON_COUNT_ERROR = 1040 +OUT_OF_RESOURCES = 1041 +BAD_HOST_ERROR = 1042 +HANDSHAKE_ERROR = 1043 +DBACCESS_DENIED_ERROR = 1044 +ACCESS_DENIED_ERROR = 1045 +NO_DB_ERROR = 1046 +UNKNOWN_COM_ERROR = 1047 +BAD_NULL_ERROR = 1048 +BAD_DB_ERROR = 1049 +TABLE_EXISTS_ERROR = 1050 +BAD_TABLE_ERROR = 1051 +NON_UNIQ_ERROR = 1052 +SERVER_SHUTDOWN = 1053 +BAD_FIELD_ERROR = 1054 +WRONG_FIELD_WITH_GROUP = 1055 +WRONG_GROUP_FIELD = 1056 +WRONG_SUM_SELECT = 1057 +WRONG_VALUE_COUNT = 1058 +TOO_LONG_IDENT = 1059 +DUP_FIELDNAME = 1060 +DUP_KEYNAME = 1061 +DUP_ENTRY = 1062 +WRONG_FIELD_SPEC = 1063 +PARSE_ERROR = 1064 +EMPTY_QUERY = 1065 +NONUNIQ_TABLE = 1066 +INVALID_DEFAULT = 1067 +MULTIPLE_PRI_KEY = 1068 +TOO_MANY_KEYS = 1069 +TOO_MANY_KEY_PARTS = 1070 +TOO_LONG_KEY = 1071 +KEY_COLUMN_DOES_NOT_EXITS = 1072 +BLOB_USED_AS_KEY = 1073 +TOO_BIG_FIELDLENGTH = 1074 +WRONG_AUTO_KEY = 1075 +READY = 1076 +SHUTDOWN_COMPLETE = 1079 +FORCING_CLOSE = 1080 +IPSOCK_ERROR = 1081 +NO_SUCH_INDEX = 1082 +WRONG_FIELD_TERMINATORS = 1083 +BLOBS_AND_NO_TERMINATED = 1084 +TEXTFILE_NOT_READABLE = 1085 +FILE_EXISTS_ERROR = 1086 +LOAD_INFO = 1087 +ALTER_INFO = 1088 +WRONG_SUB_KEY = 1089 +CANT_REMOVE_ALL_FIELDS = 1090 +CANT_DROP_FIELD_OR_KEY = 1091 +INSERT_INFO = 1092 +UPDATE_TABLE_USED = 1093 +NO_SUCH_THREAD = 1094 +KILL_DENIED_ERROR = 1095 +NO_TABLES_USED = 1096 +TOO_BIG_SET = 1097 +NO_UNIQUE_LOGFILE = 1098 +TABLE_NOT_LOCKED_FOR_WRITE = 1099 +TABLE_NOT_LOCKED = 1100 +BLOB_CANT_HAVE_DEFAULT = 1101 +WRONG_DB_NAME = 1102 +WRONG_TABLE_NAME = 1103 +TOO_BIG_SELECT = 1104 +UNKNOWN_ERROR = 1105 +UNKNOWN_PROCEDURE = 1106 +WRONG_PARAMCOUNT_TO_PROCEDURE = 1107 +WRONG_PARAMETERS_TO_PROCEDURE = 1108 +UNKNOWN_TABLE = 1109 +FIELD_SPECIFIED_TWICE = 1110 +INVALID_GROUP_FUNC_USE = 1111 +UNSUPPORTED_EXTENSION = 1112 +TABLE_MUST_HAVE_COLUMNS = 1113 +RECORD_FILE_FULL = 1114 +UNKNOWN_CHARACTER_SET = 1115 +TOO_MANY_TABLES = 1116 +TOO_MANY_FIELDS = 1117 +TOO_BIG_ROWSIZE = 1118 +STACK_OVERRUN = 1119 +WRONG_OUTER_JOIN_UNUSED = 1120 +NULL_COLUMN_IN_INDEX = 1121 +CANT_FIND_UDF = 1122 +CANT_INITIALIZE_UDF = 1123 +UDF_NO_PATHS = 1124 +UDF_EXISTS = 1125 +CANT_OPEN_LIBRARY = 1126 +CANT_FIND_DL_ENTRY = 1127 +FUNCTION_NOT_DEFINED = 1128 +HOST_IS_BLOCKED = 1129 +HOST_NOT_PRIVILEGED = 1130 +PASSWORD_ANONYMOUS_USER = 1131 +PASSWORD_NOT_ALLOWED = 1132 +PASSWORD_NO_MATCH = 1133 +UPDATE_INFO = 1134 +CANT_CREATE_THREAD = 1135 +WRONG_VALUE_COUNT_ON_ROW = 1136 +CANT_REOPEN_TABLE = 1137 +INVALID_USE_OF_NULL = 1138 +REGEXP_ERROR = 1139 +MIX_OF_GROUP_FUNC_AND_FIELDS = 1140 +NONEXISTING_GRANT = 1141 +TABLEACCESS_DENIED_ERROR = 1142 +COLUMNACCESS_DENIED_ERROR = 1143 +ILLEGAL_GRANT_FOR_TABLE = 1144 +GRANT_WRONG_HOST_OR_USER = 1145 +NO_SUCH_TABLE = 1146 +NONEXISTING_TABLE_GRANT = 1147 +NOT_ALLOWED_COMMAND = 1148 +SYNTAX_ERROR = 1149 +ABORTING_CONNECTION = 1152 +NET_PACKET_TOO_LARGE = 1153 +NET_READ_ERROR_FROM_PIPE = 1154 +NET_FCNTL_ERROR = 1155 +NET_PACKETS_OUT_OF_ORDER = 1156 +NET_UNCOMPRESS_ERROR = 1157 +NET_READ_ERROR = 1158 +NET_READ_INTERRUPTED = 1159 +NET_ERROR_ON_WRITE = 1160 +NET_WRITE_INTERRUPTED = 1161 +TOO_LONG_STRING = 1162 +TABLE_CANT_HANDLE_BLOB = 1163 +TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164 +WRONG_COLUMN_NAME = 1166 +WRONG_KEY_COLUMN = 1167 +WRONG_MRG_TABLE = 1168 +DUP_UNIQUE = 1169 +BLOB_KEY_WITHOUT_LENGTH = 1170 +PRIMARY_CANT_HAVE_NULL = 1171 +TOO_MANY_ROWS = 1172 +REQUIRES_PRIMARY_KEY = 1173 +UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175 +KEY_DOES_NOT_EXITS = 1176 +CHECK_NO_SUCH_TABLE = 1177 +CHECK_NOT_IMPLEMENTED = 1178 +CANT_DO_THIS_DURING_AN_TRANSACTION = 1179 +ERROR_DURING_COMMIT = 1180 +ERROR_DURING_ROLLBACK = 1181 +ERROR_DURING_FLUSH_LOGS = 1182 +NEW_ABORTING_CONNECTION = 1184 +MASTER = 1188 +MASTER_NET_READ = 1189 +MASTER_NET_WRITE = 1190 +FT_MATCHING_KEY_NOT_FOUND = 1191 +LOCK_OR_ACTIVE_TRANSACTION = 1192 +UNKNOWN_SYSTEM_VARIABLE = 1193 +CRASHED_ON_USAGE = 1194 +CRASHED_ON_REPAIR = 1195 +WARNING_NOT_COMPLETE_ROLLBACK = 1196 +TRANS_CACHE_FULL = 1197 +SLAVE_NOT_RUNNING = 1199 +BAD_SLAVE = 1200 +MASTER_INFO = 1201 +SLAVE_THREAD = 1202 +TOO_MANY_USER_CONNECTIONS = 1203 +SET_CONSTANTS_ONLY = 1204 +LOCK_WAIT_TIMEOUT = 1205 +LOCK_TABLE_FULL = 1206 +READ_ONLY_TRANSACTION = 1207 +WRONG_ARGUMENTS = 1210 +NO_PERMISSION_TO_CREATE_USER = 1211 +LOCK_DEADLOCK = 1213 +TABLE_CANT_HANDLE_FT = 1214 +CANNOT_ADD_FOREIGN = 1215 +NO_REFERENCED_ROW = 1216 +ROW_IS_REFERENCED = 1217 +CONNECT_TO_MASTER = 1218 +ERROR_WHEN_EXECUTING_COMMAND = 1220 +WRONG_USAGE = 1221 +WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222 +CANT_UPDATE_WITH_READLOCK = 1223 +MIXING_NOT_ALLOWED = 1224 +DUP_ARGUMENT = 1225 +USER_LIMIT_REACHED = 1226 +SPECIFIC_ACCESS_DENIED_ERROR = 1227 +LOCAL_VARIABLE = 1228 +GLOBAL_VARIABLE = 1229 +NO_DEFAULT = 1230 +WRONG_VALUE_FOR_VAR = 1231 +WRONG_TYPE_FOR_VAR = 1232 +VAR_CANT_BE_READ = 1233 +CANT_USE_OPTION_HERE = 1234 +NOT_SUPPORTED_YET = 1235 +MASTER_FATAL_ERROR_READING_BINLOG = 1236 +SLAVE_IGNORED_TABLE = 1237 +INCORRECT_GLOBAL_LOCAL_VAR = 1238 +WRONG_FK_DEF = 1239 +KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240 +OPERAND_COLUMNS = 1241 +SUBQUERY_NO_1_ROW = 1242 +UNKNOWN_STMT_HANDLER = 1243 +CORRUPT_HELP_DB = 1244 +AUTO_CONVERT = 1246 +ILLEGAL_REFERENCE = 1247 +DERIVED_MUST_HAVE_ALIAS = 1248 +SELECT_REDUCED = 1249 +TABLENAME_NOT_ALLOWED_HERE = 1250 +NOT_SUPPORTED_AUTH_MODE = 1251 +SPATIAL_CANT_HAVE_NULL = 1252 +COLLATION_CHARSET_MISMATCH = 1253 +TOO_BIG_FOR_UNCOMPRESS = 1256 +ZLIB_Z_MEM_ERROR = 1257 +ZLIB_Z_BUF_ERROR = 1258 +ZLIB_Z_DATA_ERROR = 1259 +CUT_VALUE_GROUP_CONCAT = 1260 +WARN_TOO_FEW_RECORDS = 1261 +WARN_TOO_MANY_RECORDS = 1262 +WARN_NULL_TO_NOTNULL = 1263 +WARN_DATA_OUT_OF_RANGE = 1264 +WARN_DATA_TRUNCATED = 1265 +WARN_USING_OTHER_HANDLER = 1266 +CANT_AGGREGATE_2COLLATIONS = 1267 +REVOKE_GRANTS = 1269 +CANT_AGGREGATE_3COLLATIONS = 1270 +CANT_AGGREGATE_NCOLLATIONS = 1271 +VARIABLE_IS_NOT_STRUCT = 1272 +UNKNOWN_COLLATION = 1273 +SLAVE_IGNORED_SSL_PARAMS = 1274 +SERVER_IS_IN_SECURE_AUTH_MODE = 1275 +WARN_FIELD_RESOLVED = 1276 +BAD_SLAVE_UNTIL_COND = 1277 +MISSING_SKIP_SLAVE = 1278 +UNTIL_COND_IGNORED = 1279 +WRONG_NAME_FOR_INDEX = 1280 +WRONG_NAME_FOR_CATALOG = 1281 +BAD_FT_COLUMN = 1283 +UNKNOWN_KEY_CACHE = 1284 +WARN_HOSTNAME_WONT_WORK = 1285 +UNKNOWN_STORAGE_ENGINE = 1286 +WARN_DEPRECATED_SYNTAX = 1287 +NON_UPDATABLE_TABLE = 1288 +FEATURE_DISABLED = 1289 +OPTION_PREVENTS_STATEMENT = 1290 +DUPLICATED_VALUE_IN_TYPE = 1291 +TRUNCATED_WRONG_VALUE = 1292 +INVALID_ON_UPDATE = 1294 +UNSUPPORTED_PS = 1295 +GET_ERRMSG = 1296 +GET_TEMPORARY_ERRMSG = 1297 +UNKNOWN_TIME_ZONE = 1298 +WARN_INVALID_TIMESTAMP = 1299 +INVALID_CHARACTER_STRING = 1300 +WARN_ALLOWED_PACKET_OVERFLOWED = 1301 +CONFLICTING_DECLARATIONS = 1302 +SP_NO_RECURSIVE_CREATE = 1303 +SP_ALREADY_EXISTS = 1304 +SP_DOES_NOT_EXIST = 1305 +SP_DROP_FAILED = 1306 +SP_STORE_FAILED = 1307 +SP_LILABEL_MISMATCH = 1308 +SP_LABEL_REDEFINE = 1309 +SP_LABEL_MISMATCH = 1310 +SP_UNINIT_VAR = 1311 +SP_BADSELECT = 1312 +SP_BADRETURN = 1313 +SP_BADSTATEMENT = 1314 +UPDATE_LOG_DEPRECATED_IGNORED = 1315 +UPDATE_LOG_DEPRECATED_TRANSLATED = 1316 +QUERY_INTERRUPTED = 1317 +SP_WRONG_NO_OF_ARGS = 1318 +SP_COND_MISMATCH = 1319 +SP_NORETURN = 1320 +SP_NORETURNEND = 1321 +SP_BAD_CURSOR_QUERY = 1322 +SP_BAD_CURSOR_SELECT = 1323 +SP_CURSOR_MISMATCH = 1324 +SP_CURSOR_ALREADY_OPEN = 1325 +SP_CURSOR_NOT_OPEN = 1326 +SP_UNDECLARED_VAR = 1327 +SP_WRONG_NO_OF_FETCH_ARGS = 1328 +SP_FETCH_NO_DATA = 1329 +SP_DUP_PARAM = 1330 +SP_DUP_VAR = 1331 +SP_DUP_COND = 1332 +SP_DUP_CURS = 1333 +SP_CANT_ALTER = 1334 +SP_SUBSELECT_NYI = 1335 +STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336 +SP_VARCOND_AFTER_CURSHNDLR = 1337 +SP_CURSOR_AFTER_HANDLER = 1338 +SP_CASE_NOT_FOUND = 1339 +FPARSER_TOO_BIG_FILE = 1340 +FPARSER_BAD_HEADER = 1341 +FPARSER_EOF_IN_COMMENT = 1342 +FPARSER_ERROR_IN_PARAMETER = 1343 +FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344 +VIEW_NO_EXPLAIN = 1345 +WRONG_OBJECT = 1347 +NONUPDATEABLE_COLUMN = 1348 +VIEW_SELECT_CLAUSE = 1350 +VIEW_SELECT_VARIABLE = 1351 +VIEW_SELECT_TMPTABLE = 1352 +VIEW_WRONG_LIST = 1353 +WARN_VIEW_MERGE = 1354 +WARN_VIEW_WITHOUT_KEY = 1355 +VIEW_INVALID = 1356 +SP_NO_DROP_SP = 1357 +TRG_ALREADY_EXISTS = 1359 +TRG_DOES_NOT_EXIST = 1360 +TRG_ON_VIEW_OR_TEMP_TABLE = 1361 +TRG_CANT_CHANGE_ROW = 1362 +TRG_NO_SUCH_ROW_IN_TRG = 1363 +NO_DEFAULT_FOR_FIELD = 1364 +DIVISION_BY_ZERO = 1365 +TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366 +ILLEGAL_VALUE_FOR_TYPE = 1367 +VIEW_NONUPD_CHECK = 1368 +VIEW_CHECK_FAILED = 1369 +PROCACCESS_DENIED_ERROR = 1370 +RELAY_LOG_FAIL = 1371 +UNKNOWN_TARGET_BINLOG = 1373 +IO_ERR_LOG_INDEX_READ = 1374 +BINLOG_PURGE_PROHIBITED = 1375 +FSEEK_FAIL = 1376 +BINLOG_PURGE_FATAL_ERR = 1377 +LOG_IN_USE = 1378 +LOG_PURGE_UNKNOWN_ERR = 1379 +RELAY_LOG_INIT = 1380 +NO_BINARY_LOGGING = 1381 +RESERVED_SYNTAX = 1382 +PS_MANY_PARAM = 1390 +KEY_PART_0 = 1391 +VIEW_CHECKSUM = 1392 +VIEW_MULTIUPDATE = 1393 +VIEW_NO_INSERT_FIELD_LIST = 1394 +VIEW_DELETE_MERGE_VIEW = 1395 +CANNOT_USER = 1396 +XAER_NOTA = 1397 +XAER_INVAL = 1398 +XAER_RMFAIL = 1399 +XAER_OUTSIDE = 1400 +XAER_RMERR = 1401 +XA_RBROLLBACK = 1402 +NONEXISTING_PROC_GRANT = 1403 +PROC_AUTO_GRANT_FAIL = 1404 +PROC_AUTO_REVOKE_FAIL = 1405 +DATA_TOO_LONG = 1406 +SP_BAD_SQLSTATE = 1407 +STARTUP = 1408 +LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409 +CANT_CREATE_USER_WITH_GRANT = 1410 +WRONG_VALUE_FOR_TYPE = 1411 +TABLE_DEF_CHANGED = 1412 +SP_DUP_HANDLER = 1413 +SP_NOT_VAR_ARG = 1414 +SP_NO_RETSET = 1415 +CANT_CREATE_GEOMETRY_OBJECT = 1416 +BINLOG_UNSAFE_ROUTINE = 1418 +BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419 +STMT_HAS_NO_OPEN_CURSOR = 1421 +COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422 +NO_DEFAULT_FOR_VIEW_FIELD = 1423 +SP_NO_RECURSION = 1424 +TOO_BIG_SCALE = 1425 +TOO_BIG_PRECISION = 1426 +M_BIGGER_THAN_D = 1427 +WRONG_LOCK_OF_SYSTEM_TABLE = 1428 +CONNECT_TO_FOREIGN_DATA_SOURCE = 1429 +QUERY_ON_FOREIGN_DATA_SOURCE = 1430 +FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431 +FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432 +FOREIGN_DATA_STRING_INVALID = 1433 +TRG_IN_WRONG_SCHEMA = 1435 +STACK_OVERRUN_NEED_MORE = 1436 +TOO_LONG_BODY = 1437 +WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438 +TOO_BIG_DISPLAYWIDTH = 1439 +XAER_DUPID = 1440 +DATETIME_FUNCTION_OVERFLOW = 1441 +CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442 +VIEW_PREVENT_UPDATE = 1443 +PS_NO_RECURSION = 1444 +SP_CANT_SET_AUTOCOMMIT = 1445 +VIEW_FRM_NO_USER = 1447 +VIEW_OTHER_USER = 1448 +NO_SUCH_USER = 1449 +FORBID_SCHEMA_CHANGE = 1450 +ROW_IS_REFERENCED_2 = 1451 +NO_REFERENCED_ROW_2 = 1452 +SP_BAD_VAR_SHADOW = 1453 +TRG_NO_DEFINER = 1454 +OLD_FILE_FORMAT = 1455 +SP_RECURSION_LIMIT = 1456 +SP_WRONG_NAME = 1458 +TABLE_NEEDS_UPGRADE = 1459 +SP_NO_AGGREGATE = 1460 +MAX_PREPARED_STMT_COUNT_REACHED = 1461 +VIEW_RECURSIVE = 1462 +NON_GROUPING_FIELD_USED = 1463 +TABLE_CANT_HANDLE_SPKEYS = 1464 +NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465 +REMOVED_SPACES = 1466 +AUTOINC_READ_FAILED = 1467 +USERNAME = 1468 +HOSTNAME = 1469 +WRONG_STRING_LENGTH = 1470 +NON_INSERTABLE_TABLE = 1471 +ADMIN_WRONG_MRG_TABLE = 1472 +TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473 +NAME_BECOMES_EMPTY = 1474 +AMBIGUOUS_FIELD_TERM = 1475 +FOREIGN_SERVER_EXISTS = 1476 +FOREIGN_SERVER_DOESNT_EXIST = 1477 +ILLEGAL_HA_CREATE_OPTION = 1478 +PARTITION_REQUIRES_VALUES_ERROR = 1479 +PARTITION_WRONG_VALUES_ERROR = 1480 +PARTITION_MAXVALUE_ERROR = 1481 +PARTITION_WRONG_NO_PART_ERROR = 1484 +PARTITION_WRONG_NO_SUBPART_ERROR = 1485 +WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486 +FIELD_NOT_FOUND_PART_ERROR = 1488 +INCONSISTENT_PARTITION_INFO_ERROR = 1490 +PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491 +PARTITIONS_MUST_BE_DEFINED_ERROR = 1492 +RANGE_NOT_INCREASING_ERROR = 1493 +INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494 +MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495 +PARTITION_ENTRY_ERROR = 1496 +MIX_HANDLER_ERROR = 1497 +PARTITION_NOT_DEFINED_ERROR = 1498 +TOO_MANY_PARTITIONS_ERROR = 1499 +SUBPARTITION_ERROR = 1500 +CANT_CREATE_HANDLER_FILE = 1501 +BLOB_FIELD_IN_PART_FUNC_ERROR = 1502 +UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503 +NO_PARTS_ERROR = 1504 +PARTITION_MGMT_ON_NONPARTITIONED = 1505 +FOREIGN_KEY_ON_PARTITIONED = 1506 +DROP_PARTITION_NON_EXISTENT = 1507 +DROP_LAST_PARTITION = 1508 +COALESCE_ONLY_ON_HASH_PARTITION = 1509 +REORG_HASH_ONLY_ON_SAME_NO = 1510 +REORG_NO_PARAM_ERROR = 1511 +ONLY_ON_RANGE_LIST_PARTITION = 1512 +ADD_PARTITION_SUBPART_ERROR = 1513 +ADD_PARTITION_NO_NEW_PARTITION = 1514 +COALESCE_PARTITION_NO_PARTITION = 1515 +REORG_PARTITION_NOT_EXIST = 1516 +SAME_NAME_PARTITION = 1517 +NO_BINLOG_ERROR = 1518 +CONSECUTIVE_REORG_PARTITIONS = 1519 +REORG_OUTSIDE_RANGE = 1520 +PARTITION_FUNCTION_FAILURE = 1521 +LIMITED_PART_RANGE = 1523 +PLUGIN_IS_NOT_LOADED = 1524 +WRONG_VALUE = 1525 +NO_PARTITION_FOR_GIVEN_VALUE = 1526 +FILEGROUP_OPTION_ONLY_ONCE = 1527 +CREATE_FILEGROUP_FAILED = 1528 +DROP_FILEGROUP_FAILED = 1529 +TABLESPACE_AUTO_EXTEND_ERROR = 1530 +WRONG_SIZE_NUMBER = 1531 +SIZE_OVERFLOW_ERROR = 1532 +ALTER_FILEGROUP_FAILED = 1533 +BINLOG_ROW_LOGGING_FAILED = 1534 +EVENT_ALREADY_EXISTS = 1537 +EVENT_DOES_NOT_EXIST = 1539 +EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542 +EVENT_ENDS_BEFORE_STARTS = 1543 +EVENT_EXEC_TIME_IN_THE_PAST = 1544 +EVENT_SAME_NAME = 1551 +DROP_INDEX_FK = 1553 +WARN_DEPRECATED_SYNTAX_WITH_VER = 1554 +CANT_LOCK_LOG_TABLE = 1556 +FOREIGN_DUPLICATE_KEY_OLD_UNUSED = 1557 +COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558 +TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559 +STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560 +PARTITION_NO_TEMPORARY = 1562 +PARTITION_CONST_DOMAIN_ERROR = 1563 +PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564 +NULL_IN_VALUES_LESS_THAN = 1566 +WRONG_PARTITION_NAME = 1567 +CANT_CHANGE_TX_CHARACTERISTICS = 1568 +DUP_ENTRY_AUTOINCREMENT_CASE = 1569 +EVENT_SET_VAR_ERROR = 1571 +PARTITION_MERGE_ERROR = 1572 +BASE64_DECODE_ERROR = 1575 +EVENT_RECURSION_FORBIDDEN = 1576 +ONLY_INTEGERS_ALLOWED = 1578 +UNSUPORTED_LOG_ENGINE = 1579 +BAD_LOG_STATEMENT = 1580 +CANT_RENAME_LOG_TABLE = 1581 +WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582 +WRONG_PARAMETERS_TO_NATIVE_FCT = 1583 +WRONG_PARAMETERS_TO_STORED_FCT = 1584 +NATIVE_FCT_NAME_COLLISION = 1585 +DUP_ENTRY_WITH_KEY_NAME = 1586 +BINLOG_PURGE_EMFILE = 1587 +EVENT_CANNOT_CREATE_IN_THE_PAST = 1588 +EVENT_CANNOT_ALTER_IN_THE_PAST = 1589 +NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591 +BINLOG_UNSAFE_STATEMENT = 1592 +BINLOG_FATAL_ERROR = 1593 +BINLOG_LOGGING_IMPOSSIBLE = 1598 +VIEW_NO_CREATION_CTX = 1599 +VIEW_INVALID_CREATION_CTX = 1600 +TRG_CORRUPTED_FILE = 1602 +TRG_NO_CREATION_CTX = 1603 +TRG_INVALID_CREATION_CTX = 1604 +EVENT_INVALID_CREATION_CTX = 1605 +TRG_CANT_OPEN_TABLE = 1606 +NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609 +SLAVE_CORRUPT_EVENT = 1610 +LOG_PURGE_NO_FILE = 1612 +XA_RBTIMEOUT = 1613 +XA_RBDEADLOCK = 1614 +NEED_REPREPARE = 1615 +WARN_NO_MASTER_INFO = 1617 +WARN_OPTION_IGNORED = 1618 +PLUGIN_DELETE_BUILTIN = 1619 +WARN_PLUGIN_BUSY = 1620 +VARIABLE_IS_READONLY = 1621 +WARN_ENGINE_TRANSACTION_ROLLBACK = 1622 +SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624 +NDB_REPLICATION_SCHEMA_ERROR = 1625 +CONFLICT_FN_PARSE_ERROR = 1626 +EXCEPTIONS_WRITE_ERROR = 1627 +TOO_LONG_TABLE_COMMENT = 1628 +TOO_LONG_FIELD_COMMENT = 1629 +FUNC_INEXISTENT_NAME_COLLISION = 1630 +DATABASE_NAME = 1631 +TABLE_NAME = 1632 +PARTITION_NAME = 1633 +SUBPARTITION_NAME = 1634 +TEMPORARY_NAME = 1635 +RENAMED_NAME = 1636 +TOO_MANY_CONCURRENT_TRXS = 1637 +WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638 +DEBUG_SYNC_TIMEOUT = 1639 +DEBUG_SYNC_HIT_LIMIT = 1640 +DUP_SIGNAL_SET = 1641 +SIGNAL_WARN = 1642 +SIGNAL_NOT_FOUND = 1643 +SIGNAL_EXCEPTION = 1644 +RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645 +SIGNAL_BAD_CONDITION_TYPE = 1646 +WARN_COND_ITEM_TRUNCATED = 1647 +COND_ITEM_TOO_LONG = 1648 +UNKNOWN_LOCALE = 1649 +SLAVE_IGNORE_SERVER_IDS = 1650 +SAME_NAME_PARTITION_FIELD = 1652 +PARTITION_COLUMN_LIST_ERROR = 1653 +WRONG_TYPE_COLUMN_VALUE_ERROR = 1654 +TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655 +MAXVALUE_IN_VALUES_IN = 1656 +TOO_MANY_VALUES_ERROR = 1657 +ROW_SINGLE_PARTITION_FIELD_ERROR = 1658 +FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659 +PARTITION_FIELDS_TOO_LONG = 1660 +BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661 +BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662 +BINLOG_UNSAFE_AND_STMT_ENGINE = 1663 +BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664 +BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665 +BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666 +BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667 +BINLOG_UNSAFE_LIMIT = 1668 +BINLOG_UNSAFE_SYSTEM_TABLE = 1670 +BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671 +BINLOG_UNSAFE_UDF = 1672 +BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673 +BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674 +BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675 +MESSAGE_AND_STATEMENT = 1676 +SLAVE_CANT_CREATE_CONVERSION = 1678 +INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679 +PATH_LENGTH = 1680 +WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681 +WRONG_NATIVE_TABLE_STRUCTURE = 1682 +WRONG_PERFSCHEMA_USAGE = 1683 +WARN_I_S_SKIPPED_TABLE = 1684 +INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685 +STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686 +SPATIAL_MUST_HAVE_GEOM_COL = 1687 +TOO_LONG_INDEX_COMMENT = 1688 +LOCK_ABORTED = 1689 +DATA_OUT_OF_RANGE = 1690 +WRONG_SPVAR_TYPE_IN_LIMIT = 1691 +BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692 +BINLOG_UNSAFE_MIXED_STATEMENT = 1693 +INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694 +STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695 +FAILED_READ_FROM_PAR_FILE = 1696 +VALUES_IS_NOT_INT_TYPE_ERROR = 1697 +ACCESS_DENIED_NO_PASSWORD_ERROR = 1698 +SET_PASSWORD_AUTH_PLUGIN = 1699 +TRUNCATE_ILLEGAL_FK = 1701 +PLUGIN_IS_PERMANENT = 1702 +SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703 +SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704 +STMT_CACHE_FULL = 1705 +MULTI_UPDATE_KEY_CONFLICT = 1706 +TABLE_NEEDS_REBUILD = 1707 +WARN_OPTION_BELOW_LIMIT = 1708 +INDEX_COLUMN_TOO_LONG = 1709 +ERROR_IN_TRIGGER_BODY = 1710 +ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711 +INDEX_CORRUPT = 1712 +UNDO_RECORD_TOO_BIG = 1713 +BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714 +BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715 +BINLOG_UNSAFE_REPLACE_SELECT = 1716 +BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717 +BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718 +BINLOG_UNSAFE_UPDATE_IGNORE = 1719 +PLUGIN_NO_UNINSTALL = 1720 +PLUGIN_NO_INSTALL = 1721 +BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722 +BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723 +BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724 +TABLE_IN_FK_CHECK = 1725 +UNSUPPORTED_ENGINE = 1726 +BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727 +CANNOT_LOAD_FROM_TABLE_V2 = 1728 +MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729 +ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730 +PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731 +PARTITION_EXCHANGE_PART_TABLE = 1732 +PARTITION_EXCHANGE_TEMP_TABLE = 1733 +PARTITION_INSTEAD_OF_SUBPARTITION = 1734 +UNKNOWN_PARTITION = 1735 +TABLES_DIFFERENT_METADATA = 1736 +ROW_DOES_NOT_MATCH_PARTITION = 1737 +BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738 +WARN_INDEX_NOT_APPLICABLE = 1739 +PARTITION_EXCHANGE_FOREIGN_KEY = 1740 +RPL_INFO_DATA_TOO_LONG = 1742 +BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745 +CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746 +PARTITION_CLAUSE_ON_NONPARTITIONED = 1747 +ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748 +CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750 +WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751 +WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752 +MTS_FEATURE_IS_NOT_SUPPORTED = 1753 +MTS_UPDATED_DBS_GREATER_MAX = 1754 +MTS_CANT_PARALLEL = 1755 +MTS_INCONSISTENT_DATA = 1756 +FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757 +DA_INVALID_CONDITION_NUMBER = 1758 +INSECURE_PLAIN_TEXT = 1759 +INSECURE_CHANGE_MASTER = 1760 +FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761 +FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762 +SQLTHREAD_WITH_SECURE_SLAVE = 1763 +TABLE_HAS_NO_FT = 1764 +VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765 +VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766 +SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769 +GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770 +MALFORMED_GTID_SET_SPECIFICATION = 1772 +MALFORMED_GTID_SET_ENCODING = 1773 +MALFORMED_GTID_SPECIFICATION = 1774 +GNO_EXHAUSTED = 1775 +BAD_SLAVE_AUTO_POSITION = 1776 +AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777 +CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778 +GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779 +CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781 +CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782 +CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783 +GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785 +GTID_UNSAFE_CREATE_SELECT = 1786 +GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787 +GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788 +MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789 +CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790 +UNKNOWN_EXPLAIN_FORMAT = 1791 +CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792 +TOO_LONG_TABLE_PARTITION_COMMENT = 1793 +SLAVE_CONFIGURATION = 1794 +INNODB_FT_LIMIT = 1795 +INNODB_NO_FT_TEMP_TABLE = 1796 +INNODB_FT_WRONG_DOCID_COLUMN = 1797 +INNODB_FT_WRONG_DOCID_INDEX = 1798 +INNODB_ONLINE_LOG_TOO_BIG = 1799 +UNKNOWN_ALTER_ALGORITHM = 1800 +UNKNOWN_ALTER_LOCK = 1801 +MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802 +MTS_RECOVERY_FAILURE = 1803 +MTS_RESET_WORKERS = 1804 +COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805 +SLAVE_SILENT_RETRY_TRANSACTION = 1806 +DISCARD_FK_CHECKS_RUNNING = 1807 +TABLE_SCHEMA_MISMATCH = 1808 +TABLE_IN_SYSTEM_TABLESPACE = 1809 +IO_READ_ERROR = 1810 +IO_WRITE_ERROR = 1811 +TABLESPACE_MISSING = 1812 +TABLESPACE_EXISTS = 1813 +TABLESPACE_DISCARDED = 1814 +INTERNAL_ERROR = 1815 +INNODB_IMPORT_ERROR = 1816 +INNODB_INDEX_CORRUPT = 1817 +INVALID_YEAR_COLUMN_LENGTH = 1818 +NOT_VALID_PASSWORD = 1819 +MUST_CHANGE_PASSWORD = 1820 +FK_NO_INDEX_CHILD = 1821 +FK_NO_INDEX_PARENT = 1822 +FK_FAIL_ADD_SYSTEM = 1823 +FK_CANNOT_OPEN_PARENT = 1824 +FK_INCORRECT_OPTION = 1825 +FK_DUP_NAME = 1826 +PASSWORD_FORMAT = 1827 +FK_COLUMN_CANNOT_DROP = 1828 +FK_COLUMN_CANNOT_DROP_CHILD = 1829 +FK_COLUMN_NOT_NULL = 1830 +DUP_INDEX = 1831 +FK_COLUMN_CANNOT_CHANGE = 1832 +FK_COLUMN_CANNOT_CHANGE_CHILD = 1833 +MALFORMED_PACKET = 1835 +READ_ONLY_MODE = 1836 +GTID_NEXT_TYPE_UNDEFINED_GTID = 1837 +VARIABLE_NOT_SETTABLE_IN_SP = 1838 +CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840 +CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841 +GTID_PURGED_WAS_CHANGED = 1842 +GTID_EXECUTED_WAS_CHANGED = 1843 +BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844 +ALTER_OPERATION_NOT_SUPPORTED = 1845 +ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846 +ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847 +ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848 +ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849 +ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850 +ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851 +ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853 +ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854 +ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855 +ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856 +ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857 +SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858 +DUP_UNKNOWN_IN_INDEX = 1859 +IDENT_CAUSES_TOO_LONG_PATH = 1860 +ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861 +MUST_CHANGE_PASSWORD_LOGIN = 1862 +ROW_IN_WRONG_PARTITION = 1863 +MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864 +BINLOG_LOGICAL_CORRUPTION = 1866 +WARN_PURGE_LOG_IN_USE = 1867 +WARN_PURGE_LOG_IS_ACTIVE = 1868 +AUTO_INCREMENT_CONFLICT = 1869 +WARN_ON_BLOCKHOLE_IN_RBR = 1870 +SLAVE_MI_INIT_REPOSITORY = 1871 +SLAVE_RLI_INIT_REPOSITORY = 1872 +ACCESS_DENIED_CHANGE_USER_ERROR = 1873 +INNODB_READ_ONLY = 1874 +STOP_SLAVE_SQL_THREAD_TIMEOUT = 1875 +STOP_SLAVE_IO_THREAD_TIMEOUT = 1876 +TABLE_CORRUPT = 1877 +TEMP_FILE_WRITE_FAILURE = 1878 +INNODB_FT_AUX_NOT_HEX_ID = 1879 +OLD_TEMPORALS_UPGRADED = 1880 +INNODB_FORCED_RECOVERY = 1881 +AES_INVALID_IV = 1882 +PLUGIN_CANNOT_BE_UNINSTALLED = 1883 +GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_ASSIGNED_GTID = 1884 +SLAVE_HAS_MORE_GTIDS_THAN_MASTER = 1885 +MISSING_KEY = 1886 +ERROR_LAST = 1973 diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/FIELD_TYPE.py b/project/env/lib/python3.7/site-packages/MySQLdb/constants/FIELD_TYPE.py new file mode 100644 index 0000000..3c4eca9 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/constants/FIELD_TYPE.py @@ -0,0 +1,40 @@ +"""MySQL FIELD_TYPE Constants + +These constants represent the various column (field) types that are +supported by MySQL. +""" + +DECIMAL = 0 +TINY = 1 +SHORT = 2 +LONG = 3 +FLOAT = 4 +DOUBLE = 5 +NULL = 6 +TIMESTAMP = 7 +LONGLONG = 8 +INT24 = 9 +DATE = 10 +TIME = 11 +DATETIME = 12 +YEAR = 13 +# NEWDATE = 14 # Internal to MySQL. +VARCHAR = 15 +BIT = 16 +# TIMESTAMP2 = 17 +# DATETIME2 = 18 +# TIME2 = 19 +JSON = 245 +NEWDECIMAL = 246 +ENUM = 247 +SET = 248 +TINY_BLOB = 249 +MEDIUM_BLOB = 250 +LONG_BLOB = 251 +BLOB = 252 +VAR_STRING = 253 +STRING = 254 +GEOMETRY = 255 + +CHAR = TINY +INTERVAL = ENUM diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/FLAG.py b/project/env/lib/python3.7/site-packages/MySQLdb/constants/FLAG.py new file mode 100644 index 0000000..00e6c7c --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/constants/FLAG.py @@ -0,0 +1,23 @@ +"""MySQL FLAG Constants + +These flags are used along with the FIELD_TYPE to indicate various +properties of columns in a result set. + +""" + +NOT_NULL = 1 +PRI_KEY = 2 +UNIQUE_KEY = 4 +MULTIPLE_KEY = 8 +BLOB = 16 +UNSIGNED = 32 +ZEROFILL = 64 +BINARY = 128 +ENUM = 256 +AUTO_INCREMENT = 512 +TIMESTAMP = 1024 +SET = 2048 +NUM = 32768 +PART_KEY = 16384 +GROUP = 32768 +UNIQUE = 65536 diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__init__.py b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__init__.py new file mode 100644 index 0000000..3e774cd --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__init__.py @@ -0,0 +1 @@ +__all__ = ['CR', 'FIELD_TYPE','CLIENT','ER','FLAG'] diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/CLIENT.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/CLIENT.cpython-37.pyc new file mode 100644 index 0000000..9b00372 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/CLIENT.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/CR.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/CR.cpython-37.pyc new file mode 100644 index 0000000..b72c09a Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/CR.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/ER.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/ER.cpython-37.pyc new file mode 100644 index 0000000..3376d97 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/ER.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/FIELD_TYPE.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/FIELD_TYPE.cpython-37.pyc new file mode 100644 index 0000000..23a6735 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/FIELD_TYPE.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/FLAG.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/FLAG.cpython-37.pyc new file mode 100644 index 0000000..e246e9e Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/FLAG.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/__init__.cpython-37.pyc b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..c849e1b Binary files /dev/null and b/project/env/lib/python3.7/site-packages/MySQLdb/constants/__pycache__/__init__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/converters.py b/project/env/lib/python3.7/site-packages/MySQLdb/converters.py new file mode 100644 index 0000000..645e378 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/converters.py @@ -0,0 +1,126 @@ +"""MySQLdb type conversion module + +This module handles all the type conversions for MySQL. If the default +type conversions aren't what you need, you can make your own. The +dictionary conversions maps some kind of type to a conversion function +which returns the corresponding value: + +Key: FIELD_TYPE.* (from MySQLdb.constants) + +Conversion function: + + Arguments: string + + Returns: Python object + +Key: Python type object (from types) or class + +Conversion function: + + Arguments: Python object of indicated type or class AND + conversion dictionary + + Returns: SQL literal value + + Notes: Most conversion functions can ignore the dictionary, but + it is a required parameter. It is necessary for converting + things like sequences and instances. + +Don't modify conversions if you can avoid it. Instead, make copies +(with the copy() method), modify the copies, and then pass them to +MySQL.connect(). +""" +from decimal import Decimal + +from MySQLdb._mysql import string_literal, escape +from MySQLdb.constants import FIELD_TYPE, FLAG +from MySQLdb.times import * +from MySQLdb.compat import PY2, long, unicode +from MySQLdb._exceptions import ProgrammingError + +NoneType = type(None) + +import array + +try: + ArrayType = array.ArrayType +except AttributeError: + ArrayType = array.array + + +def Bool2Str(s, d): + return b'1' if s else b'0' + +def Set2Str(s, d): + # Only support ascii string. Not tested. + return string_literal(','.join(s)) + +def Thing2Str(s, d): + """Convert something into a string via str().""" + return str(s) + +def Float2Str(o, d): + s = repr(o) + if s in ('inf', 'nan'): + raise ProgrammingError("%s can not be used with MySQL" % s) + if 'e' not in s: + s += 'e0' + return s + +def None2NULL(o, d): + """Convert None to NULL.""" + return b"NULL" + +def Thing2Literal(o, d): + """Convert something into a SQL string literal. If using + MySQL-3.23 or newer, string_literal() is a method of the + _mysql.MYSQL object, and this function will be overridden with + that method when the connection is created.""" + return string_literal(o) + +def Decimal2Literal(o, d): + return format(o, 'f') + +def array2Str(o, d): + return Thing2Literal(o.tostring(), d) + +# bytes or str regarding to BINARY_FLAG. +_bytes_or_str = ((FLAG.BINARY, bytes), (None, unicode)) + +conversions = { + int: Thing2Str, + long: Thing2Str, + float: Float2Str, + NoneType: None2NULL, + ArrayType: array2Str, + bool: Bool2Str, + Date: Thing2Literal, + DateTimeType: DateTime2literal, + DateTimeDeltaType: DateTimeDelta2literal, + set: Set2Str, + Decimal: Decimal2Literal, + + FIELD_TYPE.TINY: int, + FIELD_TYPE.SHORT: int, + FIELD_TYPE.LONG: int, + FIELD_TYPE.FLOAT: float, + FIELD_TYPE.DOUBLE: float, + FIELD_TYPE.DECIMAL: Decimal, + FIELD_TYPE.NEWDECIMAL: Decimal, + FIELD_TYPE.LONGLONG: int, + FIELD_TYPE.INT24: int, + FIELD_TYPE.YEAR: int, + FIELD_TYPE.TIMESTAMP: DateTime_or_None, + FIELD_TYPE.DATETIME: DateTime_or_None, + FIELD_TYPE.TIME: TimeDelta_or_None, + FIELD_TYPE.DATE: Date_or_None, + + FIELD_TYPE.TINY_BLOB: bytes, + FIELD_TYPE.MEDIUM_BLOB: bytes, + FIELD_TYPE.LONG_BLOB: bytes, + FIELD_TYPE.BLOB: bytes, + FIELD_TYPE.STRING: bytes, + FIELD_TYPE.VAR_STRING: bytes, + FIELD_TYPE.VARCHAR: bytes, + FIELD_TYPE.JSON: bytes, +} diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/cursors.py b/project/env/lib/python3.7/site-packages/MySQLdb/cursors.py new file mode 100644 index 0000000..ee834e4 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/cursors.py @@ -0,0 +1,490 @@ +"""MySQLdb Cursors + +This module implements Cursors of various types for MySQLdb. By +default, MySQLdb uses the Cursor class. +""" +from __future__ import print_function, absolute_import +from functools import partial +import re +import sys + +from .compat import unicode +from ._exceptions import ( + Warning, Error, InterfaceError, DataError, + DatabaseError, OperationalError, IntegrityError, InternalError, + NotSupportedError, ProgrammingError) + + +#: Regular expression for :meth:`Cursor.executemany`. +#: executemany only supports simple bulk insert. +#: You can use it to load large dataset. +RE_INSERT_VALUES = re.compile( + r"\s*((?:INSERT|REPLACE)\b.+\bVALUES?\s*)" + + r"(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))" + + r"(\s*(?:ON DUPLICATE.*)?);?\s*\Z", + re.IGNORECASE | re.DOTALL) + + +class BaseCursor(object): + """A base for Cursor classes. Useful attributes: + + description + A tuple of DB API 7-tuples describing the columns in + the last executed query; see PEP-249 for details. + + description_flags + Tuple of column flags for last query, one entry per column + in the result set. Values correspond to those in + MySQLdb.constants.FLAG. See MySQL documentation (C API) + for more information. Non-standard extension. + + arraysize + default number of rows fetchmany() will fetch + """ + + #: Max stetement size which :meth:`executemany` generates. + #: + #: Max size of allowed statement is max_allowed_packet - packet_header_size. + #: Default value of max_allowed_packet is 1048576. + max_stmt_length = 64*1024 + + from ._exceptions import ( + MySQLError, Warning, Error, InterfaceError, + DatabaseError, DataError, OperationalError, IntegrityError, + InternalError, ProgrammingError, NotSupportedError, + ) + + connection = None + + def __init__(self, connection): + self.connection = connection + self.description = None + self.description_flags = None + self.rowcount = -1 + self.arraysize = 1 + self._executed = None + + # XXX THIS IS GARBAGE: While this is totally garbage and private, + # Django 1.11 depends on it. And they don't fix it because + # they are in security-only fix mode. + # So keep this garbage for now. This will be removed in 1.5. + # See PyMySQL/mysqlclient-python#303 + self._last_executed = None + + self.lastrowid = None + self.messages = [] + self._result = None + self._warnings = None + self.rownumber = None + self._rows = None + + def close(self): + """Close the cursor. No further queries will be possible.""" + try: + if self.connection is None: + return + while self.nextset(): + pass + finally: + self.connection = None + self._result = None + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + del exc_info + self.close() + + def _escape_args(self, args, conn): + encoding = conn.encoding + literal = conn.literal + + def ensure_bytes(x): + if isinstance(x, unicode): + return x.encode(encoding) + elif isinstance(x, tuple): + return tuple(map(ensure_bytes, x)) + elif isinstance(x, list): + return list(map(ensure_bytes, x)) + return x + + if isinstance(args, (tuple, list)): + ret = tuple(literal(ensure_bytes(arg)) for arg in args) + elif isinstance(args, dict): + ret = {ensure_bytes(key): literal(ensure_bytes(val)) + for (key, val) in args.items()} + else: + # If it's not a dictionary let's try escaping it anyways. + # Worst case it will throw a Value error + ret = literal(ensure_bytes(args)) + + ensure_bytes = None # break circular reference + return ret + + def _check_executed(self): + if not self._executed: + raise ProgrammingError("execute() first") + + def nextset(self): + """Advance to the next result set. + + Returns None if there are no more result sets. + """ + if self._executed: + self.fetchall() + del self.messages[:] + + db = self._get_db() + nr = db.next_result() + if nr == -1: + return None + self._do_get_result(db) + self._post_get_result() + return 1 + + def _do_get_result(self, db): + self._result = result = self._get_result() + if result is None: + self.description = self.description_flags = None + else: + self.description = result.describe() + self.description_flags = result.field_flags() + + self.rowcount = db.affected_rows() + self.rownumber = 0 + self.lastrowid = db.insert_id() + self._warnings = None + + def _post_get_result(self): + pass + + def setinputsizes(self, *args): + """Does nothing, required by DB API.""" + + def setoutputsizes(self, *args): + """Does nothing, required by DB API.""" + + def _get_db(self): + con = self.connection + if con is None: + raise ProgrammingError("cursor closed") + return con + + def execute(self, query, args=None): + """Execute a query. + + query -- string, query to execute on server + args -- optional sequence or mapping, parameters to use with query. + + Note: If args is a sequence, then %s must be used as the + parameter placeholder in the query. If a mapping is used, + %(key)s must be used as the placeholder. + + Returns integer represents rows affected, if any + """ + while self.nextset(): + pass + db = self._get_db() + + if isinstance(query, unicode): + query = query.encode(db.encoding) + + if args is not None: + if isinstance(args, dict): + nargs = {} + for key, item in args.items(): + if isinstance(key, unicode): + key = key.encode(db.encoding) + nargs[key] = db.literal(item) + args = nargs + else: + args = tuple(map(db.literal, args)) + try: + query = query % args + except TypeError as m: + raise ProgrammingError(str(m)) + + assert isinstance(query, (bytes, bytearray)) + res = self._query(query) + return res + + def executemany(self, query, args): + # type: (str, list) -> int + """Execute a multi-row query. + + :param query: query to execute on server + :param args: Sequence of sequences or mappings. It is used as parameter. + :return: Number of rows affected, if any. + + This method improves performance on multiple-row INSERT and + REPLACE. Otherwise it is equivalent to looping over args with + execute(). + """ + del self.messages[:] + + if not args: + return + + m = RE_INSERT_VALUES.match(query) + if m: + q_prefix = m.group(1) % () + q_values = m.group(2).rstrip() + q_postfix = m.group(3) or '' + assert q_values[0] == '(' and q_values[-1] == ')' + return self._do_execute_many(q_prefix, q_values, q_postfix, args, + self.max_stmt_length, + self._get_db().encoding) + + self.rowcount = sum(self.execute(query, arg) for arg in args) + return self.rowcount + + def _do_execute_many(self, prefix, values, postfix, args, max_stmt_length, encoding): + conn = self._get_db() + escape = self._escape_args + if isinstance(prefix, unicode): + prefix = prefix.encode(encoding) + if isinstance(values, unicode): + values = values.encode(encoding) + if isinstance(postfix, unicode): + postfix = postfix.encode(encoding) + sql = bytearray(prefix) + args = iter(args) + v = values % escape(next(args), conn) + sql += v + rows = 0 + for arg in args: + v = values % escape(arg, conn) + if len(sql) + len(v) + len(postfix) + 1 > max_stmt_length: + rows += self.execute(sql + postfix) + sql = bytearray(prefix) + else: + sql += b',' + sql += v + rows += self.execute(sql + postfix) + self.rowcount = rows + return rows + + def callproc(self, procname, args=()): + """Execute stored procedure procname with args + + procname -- string, name of procedure to execute on server + + args -- Sequence of parameters to use with procedure + + Returns the original args. + + Compatibility warning: PEP-249 specifies that any modified + parameters must be returned. This is currently impossible + as they are only available by storing them in a server + variable and then retrieved by a query. Since stored + procedures return zero or more result sets, there is no + reliable way to get at OUT or INOUT parameters via callproc. + The server variables are named @_procname_n, where procname + is the parameter above and n is the position of the parameter + (from zero). Once all result sets generated by the procedure + have been fetched, you can issue a SELECT @_procname_0, ... + query using .execute() to get any OUT or INOUT values. + + Compatibility warning: The act of calling a stored procedure + itself creates an empty result set. This appears after any + result sets generated by the procedure. This is non-standard + behavior with respect to the DB-API. Be sure to use nextset() + to advance through all result sets; otherwise you may get + disconnected. + """ + db = self._get_db() + if isinstance(procname, unicode): + procname = procname.encode(db.encoding) + if args: + fmt = b'@_' + procname + b'_%d=%s' + q = b'SET %s' % b','.join(fmt % (index, db.literal(arg)) + for index, arg in enumerate(args)) + self._query(q) + self.nextset() + + q = b"CALL %s(%s)" % (procname, + b','.join([b'@_%s_%d' % (procname, i) + for i in range(len(args))])) + self._query(q) + return args + + def _query(self, q): + db = self._get_db() + self._result = None + db.query(q) + self._do_get_result(db) + self._post_get_result() + self._executed = q + self._last_executed = q # XXX THIS IS GARBAGE: See above. + return self.rowcount + + def _fetch_row(self, size=1): + if not self._result: + return () + return self._result.fetch_row(size, self._fetch_type) + + def __iter__(self): + return iter(self.fetchone, None) + + Warning = Warning + Error = Error + InterfaceError = InterfaceError + DatabaseError = DatabaseError + DataError = DataError + OperationalError = OperationalError + IntegrityError = IntegrityError + InternalError = InternalError + ProgrammingError = ProgrammingError + NotSupportedError = NotSupportedError + + +class CursorStoreResultMixIn(object): + """This is a MixIn class which causes the entire result set to be + stored on the client side, i.e. it uses mysql_store_result(). If the + result set can be very large, consider adding a LIMIT clause to your + query, or using CursorUseResultMixIn instead.""" + + def _get_result(self): + return self._get_db().store_result() + + def _post_get_result(self): + self._rows = self._fetch_row(0) + self._result = None + + def fetchone(self): + """Fetches a single row from the cursor. None indicates that + no more rows are available.""" + self._check_executed() + if self.rownumber >= len(self._rows): + return None + result = self._rows[self.rownumber] + self.rownumber = self.rownumber + 1 + return result + + def fetchmany(self, size=None): + """Fetch up to size rows from the cursor. Result set may be smaller + than size. If size is not defined, cursor.arraysize is used.""" + self._check_executed() + end = self.rownumber + (size or self.arraysize) + result = self._rows[self.rownumber:end] + self.rownumber = min(end, len(self._rows)) + return result + + def fetchall(self): + """Fetchs all available rows from the cursor.""" + self._check_executed() + if self.rownumber: + result = self._rows[self.rownumber:] + else: + result = self._rows + self.rownumber = len(self._rows) + return result + + def scroll(self, value, mode='relative'): + """Scroll the cursor in the result set to a new position according + to mode. + + If mode is 'relative' (default), value is taken as offset to + the current position in the result set, if set to 'absolute', + value states an absolute target position.""" + self._check_executed() + if mode == 'relative': + r = self.rownumber + value + elif mode == 'absolute': + r = value + else: + raise ProgrammingError("unknown scroll mode %s" % repr(mode)) + if r < 0 or r >= len(self._rows): + raise IndexError("out of range") + self.rownumber = r + + def __iter__(self): + self._check_executed() + result = self.rownumber and self._rows[self.rownumber:] or self._rows + return iter(result) + + +class CursorUseResultMixIn(object): + + """This is a MixIn class which causes the result set to be stored + in the server and sent row-by-row to client side, i.e. it uses + mysql_use_result(). You MUST retrieve the entire result set and + close() the cursor before additional queries can be performed on + the connection.""" + + def _get_result(self): + return self._get_db().use_result() + + def fetchone(self): + """Fetches a single row from the cursor.""" + self._check_executed() + r = self._fetch_row(1) + if not r: + return None + self.rownumber = self.rownumber + 1 + return r[0] + + def fetchmany(self, size=None): + """Fetch up to size rows from the cursor. Result set may be smaller + than size. If size is not defined, cursor.arraysize is used.""" + self._check_executed() + r = self._fetch_row(size or self.arraysize) + self.rownumber = self.rownumber + len(r) + return r + + def fetchall(self): + """Fetchs all available rows from the cursor.""" + self._check_executed() + r = self._fetch_row(0) + self.rownumber = self.rownumber + len(r) + return r + + def __iter__(self): + return self + + def next(self): + row = self.fetchone() + if row is None: + raise StopIteration + return row + + __next__ = next + + +class CursorTupleRowsMixIn(object): + """This is a MixIn class that causes all rows to be returned as tuples, + which is the standard form required by DB API.""" + + _fetch_type = 0 + + +class CursorDictRowsMixIn(object): + """This is a MixIn class that causes all rows to be returned as + dictionaries. This is a non-standard feature.""" + + _fetch_type = 1 + + +class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn, + BaseCursor): + """This is the standard Cursor class that returns rows as tuples + and stores the result set in the client.""" + + +class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn, + BaseCursor): + """This is a Cursor class that returns rows as dictionaries and + stores the result set in the client.""" + + +class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn, + BaseCursor): + """This is a Cursor class that returns rows as tuples and stores + the result set in the server.""" + + +class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn, + BaseCursor): + """This is a Cursor class that returns rows as dictionaries and + stores the result set in the server.""" diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/release.py b/project/env/lib/python3.7/site-packages/MySQLdb/release.py new file mode 100644 index 0000000..a9c5e35 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/release.py @@ -0,0 +1,4 @@ + +__author__ = "Inada Naoki " +version_info = (1,4,4,'final',0) +__version__ = "1.4.4" diff --git a/project/env/lib/python3.7/site-packages/MySQLdb/times.py b/project/env/lib/python3.7/site-packages/MySQLdb/times.py new file mode 100644 index 0000000..d47c8fb --- /dev/null +++ b/project/env/lib/python3.7/site-packages/MySQLdb/times.py @@ -0,0 +1,131 @@ +"""times module + +This module provides some Date and Time classes for dealing with MySQL data. + +Use Python datetime module to handle date and time columns. +""" +from time import localtime +from datetime import date, datetime, time, timedelta +from MySQLdb._mysql import string_literal + +Date = date +Time = time +TimeDelta = timedelta +Timestamp = datetime + +DateTimeDeltaType = timedelta +DateTimeType = datetime + +def DateFromTicks(ticks): + """Convert UNIX ticks into a date instance.""" + return date(*localtime(ticks)[:3]) + +def TimeFromTicks(ticks): + """Convert UNIX ticks into a time instance.""" + return time(*localtime(ticks)[3:6]) + +def TimestampFromTicks(ticks): + """Convert UNIX ticks into a datetime instance.""" + return datetime(*localtime(ticks)[:6]) + +format_TIME = format_DATE = str + +def format_TIMEDELTA(v): + seconds = int(v.seconds) % 60 + minutes = int(v.seconds // 60) % 60 + hours = int(v.seconds // 3600) % 24 + return '%d %d:%d:%d' % (v.days, hours, minutes, seconds) + +def format_TIMESTAMP(d): + """ + :type d: datetime.datetime + """ + if d.microsecond: + fmt = "{0.year:04}-{0.month:02}-{0.day:02} {0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}" + else: + fmt = "{0.year:04}-{0.month:02}-{0.day:02} {0.hour:02}:{0.minute:02}:{0.second:02}" + return fmt.format(d) + + +def DateTime_or_None(s): + try: + if len(s) < 11: + return Date_or_None(s) + + micros = s[20:] + + if len(micros) == 0: + # 12:00:00 + micros = 0 + elif len(micros) < 7: + # 12:00:00.123456 + micros = int(micros) * 10 ** (6 - len(micros)) + else: + return None + + return datetime( + int(s[:4]), # year + int(s[5:7]), # month + int(s[8:10]), # day + int(s[11:13] or 0), # hour + int(s[14:16] or 0), # minute + int(s[17:19] or 0), # second + micros, # microsecond + ) + except ValueError: + return None + +def TimeDelta_or_None(s): + try: + h, m, s = s.split(':') + if '.' in s: + s, ms = s.split('.') + ms = ms.ljust(6, '0') + else: + ms = 0 + if h[0] == '-': + negative = True + else: + negative = False + h, m, s, ms = abs(int(h)), int(m), int(s), int(ms) + td = timedelta(hours=h, minutes=m, seconds=s, + microseconds=ms) + if negative: + return -td + else: + return td + except ValueError: + # unpacking or int/float conversion failed + return None + +def Time_or_None(s): + try: + h, m, s = s.split(':') + if '.' in s: + s, ms = s.split('.') + ms = ms.ljust(6, '0') + else: + ms = 0 + h, m, s, ms = int(h), int(m), int(s), int(ms) + return time(hour=h, minute=m, second=s, + microsecond=ms) + except ValueError: + return None + +def Date_or_None(s): + try: + return date( + int(s[:4]), # year + int(s[5:7]), # month + int(s[8:10]), # day + ) + except ValueError: + return None + +def DateTime2literal(d, c): + """Format a DateTime object as an ISO timestamp.""" + return string_literal(format_TIMESTAMP(d)) + +def DateTimeDelta2literal(d, c): + """Format a DateTimeDelta object as a time.""" + return string_literal(format_TIMEDELTA(d)) diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/LICENSE b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/LICENSE new file mode 100644 index 0000000..86b18e1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010, 2013 PyMySQL contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/METADATA b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/METADATA new file mode 100644 index 0000000..deedc79 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/METADATA @@ -0,0 +1,181 @@ +Metadata-Version: 2.1 +Name: PyMySQL +Version: 0.9.3 +Summary: Pure Python MySQL Driver +Home-page: https://github.com/PyMySQL/PyMySQL/ +Author: yutaka.matsubara +Author-email: yutaka.matsubara@gmail.com +Maintainer: INADA Naoki +Maintainer-email: songofacandy@gmail.com +License: "MIT" +Project-URL: Documentation, https://pymysql.readthedocs.io/ +Keywords: MySQL +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Database +Provides-Extra: rsa +Requires-Dist: cryptography ; extra == 'rsa' + +.. image:: https://readthedocs.org/projects/pymysql/badge/?version=latest + :target: https://pymysql.readthedocs.io/ + :alt: Documentation Status + +.. image:: https://badge.fury.io/py/PyMySQL.svg + :target: https://badge.fury.io/py/PyMySQL + +.. image:: https://travis-ci.org/PyMySQL/PyMySQL.svg?branch=master + :target: https://travis-ci.org/PyMySQL/PyMySQL + +.. image:: https://coveralls.io/repos/PyMySQL/PyMySQL/badge.svg?branch=master&service=github + :target: https://coveralls.io/github/PyMySQL/PyMySQL?branch=master + +.. image:: https://img.shields.io/badge/license-MIT-blue.svg + :target: https://github.com/PyMySQL/PyMySQL/blob/master/LICENSE + + +PyMySQL +======= + +.. contents:: Table of Contents + :local: + +This package contains a pure-Python MySQL client library, based on `PEP 249`_. + +Most public APIs are compatible with mysqlclient and MySQLdb. + +NOTE: PyMySQL doesn't support low level APIs `_mysql` provides like `data_seek`, +`store_result`, and `use_result`. You should use high level APIs defined in `PEP 249`_. +But some APIs like `autocommit` and `ping` are supported because `PEP 249`_ doesn't cover +their usecase. + +.. _`PEP 249`: https://www.python.org/dev/peps/pep-0249/ + + +Requirements +------------- + +* Python -- one of the following: + + - CPython_ : 2.7 and >= 3.4 + - PyPy_ : Latest version + +* MySQL Server -- one of the following: + + - MySQL_ >= 5.5 + - MariaDB_ >= 5.5 + +.. _CPython: https://www.python.org/ +.. _PyPy: https://pypy.org/ +.. _MySQL: https://www.mysql.com/ +.. _MariaDB: https://mariadb.org/ + + +Installation +------------ + +Package is uploaded on `PyPI `_. + +You can install it with pip:: + + $ python3 -m pip install PyMySQL + +To use "sha256_password" or "caching_sha2_password" for authenticate, +you need to install additional dependency:: + + $ python3 -m pip install PyMySQL[rsa] + + +Documentation +------------- + +Documentation is available online: https://pymysql.readthedocs.io/ + +For support, please refer to the `StackOverflow +`_. + +Example +------- + +The following examples make use of a simple table + +.. code:: sql + + CREATE TABLE `users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `email` varchar(255) COLLATE utf8_bin NOT NULL, + `password` varchar(255) COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin + AUTO_INCREMENT=1 ; + + +.. code:: python + + import pymysql.cursors + + # Connect to the database + connection = pymysql.connect(host='localhost', + user='user', + password='passwd', + db='db', + charset='utf8mb4', + cursorclass=pymysql.cursors.DictCursor) + + try: + with connection.cursor() as cursor: + # Create a new record + sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)" + cursor.execute(sql, ('webmaster@python.org', 'very-secret')) + + # connection is not autocommit by default. So you must commit to save + # your changes. + connection.commit() + + with connection.cursor() as cursor: + # Read a single record + sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s" + cursor.execute(sql, ('webmaster@python.org',)) + result = cursor.fetchone() + print(result) + finally: + connection.close() + +This example will print: + +.. code:: python + + {'password': 'very-secret', 'id': 1} + + +Resources +--------- + +* DB-API 2.0: https://www.python.org/dev/peps/pep-0249/ + +* MySQL Reference Manuals: https://dev.mysql.com/doc/ + +* MySQL client/server protocol: + https://dev.mysql.com/doc/internals/en/client-server-protocol.html + +* "Connector" channel in MySQL Community Slack: + https://lefred.be/mysql-community-on-slack/ + +* PyMySQL mailing list: https://groups.google.com/forum/#!forum/pymysql-users + +License +------- + +PyMySQL is released under the MIT License. See LICENSE for more information. + + diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/RECORD b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/RECORD new file mode 100644 index 0000000..d6460e6 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/RECORD @@ -0,0 +1,49 @@ +PyMySQL-0.9.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyMySQL-0.9.3.dist-info/LICENSE,sha256=MUEg3GXwgA9ziksxQAx27hTezR--d86cNUCkIbhup7Y,1070 +PyMySQL-0.9.3.dist-info/METADATA,sha256=8_R1N3H_AmpUu72ctuiQVI1Pk2SMlb9sy1uGlnxXB4U,5212 +PyMySQL-0.9.3.dist-info/RECORD,, +PyMySQL-0.9.3.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 +PyMySQL-0.9.3.dist-info/pbr.json,sha256=Lqvh8-9N7qS6SLUlEJ5GDLWioQcvR9n1WWjMEfJ5mv8,47 +PyMySQL-0.9.3.dist-info/top_level.txt,sha256=IKlV-f4o90sOdnMd6HBvo0l2nqfJOGUzkwZeaEEGuRg,8 +pymysql/__init__.py,sha256=ESllVZVoMVkJ0w9FoaMMirjFbWNc6wmHEVHzGKEBefc,4732 +pymysql/__pycache__/__init__.cpython-37.pyc,, +pymysql/__pycache__/_auth.cpython-37.pyc,, +pymysql/__pycache__/_compat.cpython-37.pyc,, +pymysql/__pycache__/_socketio.cpython-37.pyc,, +pymysql/__pycache__/charset.cpython-37.pyc,, +pymysql/__pycache__/connections.cpython-37.pyc,, +pymysql/__pycache__/converters.cpython-37.pyc,, +pymysql/__pycache__/cursors.cpython-37.pyc,, +pymysql/__pycache__/err.cpython-37.pyc,, +pymysql/__pycache__/optionfile.cpython-37.pyc,, +pymysql/__pycache__/protocol.cpython-37.pyc,, +pymysql/__pycache__/times.cpython-37.pyc,, +pymysql/__pycache__/util.cpython-37.pyc,, +pymysql/_auth.py,sha256=X2AiuevuDaD2L4wJO5J7rymvJJZm6mND7WYmeIb7wEk,7720 +pymysql/_compat.py,sha256=DSxMV2ib-rhIuQIKiXX44yds_0bN2M_RddfYQiSdB6U,481 +pymysql/_socketio.py,sha256=smsw4wudNM4CKl85uis8QHfjDhz2iXQRvl8QV4TmB1w,4049 +pymysql/charset.py,sha256=tNeEkuzFXM5zeuOYm_XSM8zdt5P_paV2SyUB9B2ibqI,10330 +pymysql/connections.py,sha256=98DHxN-h3tupGBIReR98E7LSTR7-OIYh3tulXGlGdvc,49041 +pymysql/constants/CLIENT.py,sha256=cPMxnQQbBG6xqaEDwqzggTfWIuJQ1Oy7HrIgw_vgpo4,853 +pymysql/constants/COMMAND.py,sha256=ypGdEUmi8m9cdBZ3rDU6mb7bsIyu9ldCDvc4pNF7V70,680 +pymysql/constants/CR.py,sha256=5ojVkbisyw7Qo_cTNpnHYvV6xHRZXK39Qqv8tjGbIbg,2228 +pymysql/constants/ER.py,sha256=8q1PZOxezbXbRaPZrHrQebyLDx4CvAUkBArJ9xBuW0Y,12297 +pymysql/constants/FIELD_TYPE.py,sha256=yHZLSyQewMxTDx4PLrI1H_iwH2FnsrgBZFa56UG2HiQ,372 +pymysql/constants/FLAG.py,sha256=Fy-PrCLnUI7fx_o5WypYnUAzWAM0E9d5yL8fFRVKffY,214 +pymysql/constants/SERVER_STATUS.py,sha256=KogVCOrV-S5aAFwyVKeKgua13nwdt1WFyHagjCZbcpM,334 +pymysql/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pymysql/constants/__pycache__/CLIENT.cpython-37.pyc,, +pymysql/constants/__pycache__/COMMAND.cpython-37.pyc,, +pymysql/constants/__pycache__/CR.cpython-37.pyc,, +pymysql/constants/__pycache__/ER.cpython-37.pyc,, +pymysql/constants/__pycache__/FIELD_TYPE.cpython-37.pyc,, +pymysql/constants/__pycache__/FLAG.cpython-37.pyc,, +pymysql/constants/__pycache__/SERVER_STATUS.cpython-37.pyc,, +pymysql/constants/__pycache__/__init__.cpython-37.pyc,, +pymysql/converters.py,sha256=BWHMbquNFUKfFXyZh6Qwch6mYLyYSQeaeifL4VLuISc,12235 +pymysql/cursors.py,sha256=m6MhwWnm3CbTE4JAXzDuo6CYKC7W6JzsY4PN9eDmKJk,17238 +pymysql/err.py,sha256=PaXGLqOnDXJoeYjLbMZQE5UQ3MHFqiiHCzaDPP-_NJA,3716 +pymysql/optionfile.py,sha256=4yW8A7aAR2Aild7ibLOCzIlTCcYd90PtR8LRGJSZs8o,658 +pymysql/protocol.py,sha256=GH2yzGqPwqX2t2G87k3EJQt7bYQOLEN6QoN_m15c4Ak,12024 +pymysql/times.py,sha256=_qXgDaYwsHntvpIKSKXp1rrYIgtq6Z9pLyLnO2XNoL0,360 +pymysql/util.py,sha256=jKPts8cOMIXDndjsV3783VW-iq9uMxETWqfHP6Bd-Zo,180 diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/WHEEL new file mode 100644 index 0000000..c4bde30 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.3) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/pbr.json b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/pbr.json new file mode 100644 index 0000000..127ed08 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "08bac52"} \ No newline at end of file diff --git a/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/top_level.txt new file mode 100644 index 0000000..d4a7eda --- /dev/null +++ b/project/env/lib/python3.7/site-packages/PyMySQL-0.9.3.dist-info/top_level.txt @@ -0,0 +1 @@ +pymysql diff --git a/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/LICENSE b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/LICENSE new file mode 100644 index 0000000..974a9c3 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright 2005-2019 SQLAlchemy authors and contributors . + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/METADATA b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/METADATA new file mode 100644 index 0000000..332c815 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/METADATA @@ -0,0 +1,193 @@ +Metadata-Version: 2.1 +Name: SQLAlchemy +Version: 1.3.8 +Summary: Database Abstraction Library +Home-page: http://www.sqlalchemy.org +Author: Mike Bayer +Author-email: mike_mp@zzzcomputing.com +License: MIT +Project-URL: Documentation, https://docs.sqlalchemy.org +Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Database :: Front-Ends +Classifier: Operating System :: OS Independent +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: mssql +Requires-Dist: pyodbc ; extra == 'mssql' +Provides-Extra: mssql_pymssql +Requires-Dist: pymssql ; extra == 'mssql_pymssql' +Provides-Extra: mssql_pyodbc +Requires-Dist: pyodbc ; extra == 'mssql_pyodbc' +Provides-Extra: mysql +Requires-Dist: mysqlclient ; extra == 'mysql' +Provides-Extra: oracle +Requires-Dist: cx-oracle ; extra == 'oracle' +Provides-Extra: postgresql +Requires-Dist: psycopg2 ; extra == 'postgresql' +Provides-Extra: postgresql_pg8000 +Requires-Dist: pg8000 ; extra == 'postgresql_pg8000' +Provides-Extra: postgresql_psycopg2binary +Requires-Dist: psycopg2-binary ; extra == 'postgresql_psycopg2binary' +Provides-Extra: postgresql_psycopg2cffi +Requires-Dist: psycopg2cffi ; extra == 'postgresql_psycopg2cffi' +Provides-Extra: pymysql +Requires-Dist: pymysql ; extra == 'pymysql' + +SQLAlchemy +========== + +The Python SQL Toolkit and Object Relational Mapper + +Introduction +------------- + +SQLAlchemy is the Python SQL toolkit and Object Relational Mapper +that gives application developers the full power and +flexibility of SQL. SQLAlchemy provides a full suite +of well known enterprise-level persistence patterns, +designed for efficient and high-performing database +access, adapted into a simple and Pythonic domain +language. + +Major SQLAlchemy features include: + +* An industrial strength ORM, built + from the core on the identity map, unit of work, + and data mapper patterns. These patterns + allow transparent persistence of objects + using a declarative configuration system. + Domain models + can be constructed and manipulated naturally, + and changes are synchronized with the + current transaction automatically. +* A relationally-oriented query system, exposing + the full range of SQL's capabilities + explicitly, including joins, subqueries, + correlation, and most everything else, + in terms of the object model. + Writing queries with the ORM uses the same + techniques of relational composition you use + when writing SQL. While you can drop into + literal SQL at any time, it's virtually never + needed. +* A comprehensive and flexible system + of eager loading for related collections and objects. + Collections are cached within a session, + and can be loaded on individual access, all + at once using joins, or by query per collection + across the full result set. +* A Core SQL construction system and DBAPI + interaction layer. The SQLAlchemy Core is + separate from the ORM and is a full database + abstraction layer in its own right, and includes + an extensible Python-based SQL expression + language, schema metadata, connection pooling, + type coercion, and custom types. +* All primary and foreign key constraints are + assumed to be composite and natural. Surrogate + integer primary keys are of course still the + norm, but SQLAlchemy never assumes or hardcodes + to this model. +* Database introspection and generation. Database + schemas can be "reflected" in one step into + Python structures representing database metadata; + those same structures can then generate + CREATE statements right back out - all within + the Core, independent of the ORM. + +SQLAlchemy's philosophy: + +* SQL databases behave less and less like object + collections the more size and performance start to + matter; object collections behave less and less like + tables and rows the more abstraction starts to matter. + SQLAlchemy aims to accommodate both of these + principles. +* An ORM doesn't need to hide the "R". A relational + database provides rich, set-based functionality + that should be fully exposed. SQLAlchemy's + ORM provides an open-ended set of patterns + that allow a developer to construct a custom + mediation layer between a domain model and + a relational schema, turning the so-called + "object relational impedance" issue into + a distant memory. +* The developer, in all cases, makes all decisions + regarding the design, structure, and naming conventions + of both the object model as well as the relational + schema. SQLAlchemy only provides the means + to automate the execution of these decisions. +* With SQLAlchemy, there's no such thing as + "the ORM generated a bad query" - you + retain full control over the structure of + queries, including how joins are organized, + how subqueries and correlation is used, what + columns are requested. Everything SQLAlchemy + does is ultimately the result of a developer- + initiated decision. +* Don't use an ORM if the problem doesn't need one. + SQLAlchemy consists of a Core and separate ORM + component. The Core offers a full SQL expression + language that allows Pythonic construction + of SQL constructs that render directly to SQL + strings for a target database, returning + result sets that are essentially enhanced DBAPI + cursors. +* Transactions should be the norm. With SQLAlchemy's + ORM, nothing goes to permanent storage until + commit() is called. SQLAlchemy encourages applications + to create a consistent means of delineating + the start and end of a series of operations. +* Never render a literal value in a SQL statement. + Bound parameters are used to the greatest degree + possible, allowing query optimizers to cache + query plans effectively and making SQL injection + attacks a non-issue. + +Documentation +------------- + +Latest documentation is at: + +http://www.sqlalchemy.org/docs/ + +Installation / Requirements +--------------------------- + +Full documentation for installation is at +`Installation `_. + +Getting Help / Development / Bug reporting +------------------------------------------ + +Please refer to the `SQLAlchemy Community Guide `_. + +Code of Conduct +--------------- + +Above all, SQLAlchemy places great emphasis on polite, thoughtful, and +constructive communication between users and developers. +Please see our current Code of Conduct at +`Code of Conduct `_. + +License +------- + +SQLAlchemy is distributed under the `MIT license +`_. + + + diff --git a/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/RECORD b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/RECORD new file mode 100644 index 0000000..53cb7bd --- /dev/null +++ b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/RECORD @@ -0,0 +1,395 @@ +SQLAlchemy-1.3.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +SQLAlchemy-1.3.8.dist-info/LICENSE,sha256=Cs_6FfNCfpQBQjXjxEN29v5d8P9GGpOpEW7rzOdMBW4,1100 +SQLAlchemy-1.3.8.dist-info/METADATA,sha256=IjSKWIcNk-CL2qilcA0k41H5j84ty-Kc1SgXpvbFAFk,7240 +SQLAlchemy-1.3.8.dist-info/RECORD,, +SQLAlchemy-1.3.8.dist-info/WHEEL,sha256=pekZUv3iwxug3SJbgZzFF4L6FdcEDxd8w6YbmU8_qXM,104 +SQLAlchemy-1.3.8.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 +sqlalchemy/__init__.py,sha256=iZui2eps9tbtATL9wo9KEL0MbF-M2pv4HHoOLp1KEdY,4621 +sqlalchemy/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/__pycache__/events.cpython-37.pyc,, +sqlalchemy/__pycache__/exc.cpython-37.pyc,, +sqlalchemy/__pycache__/inspection.cpython-37.pyc,, +sqlalchemy/__pycache__/interfaces.cpython-37.pyc,, +sqlalchemy/__pycache__/log.cpython-37.pyc,, +sqlalchemy/__pycache__/processors.cpython-37.pyc,, +sqlalchemy/__pycache__/schema.cpython-37.pyc,, +sqlalchemy/__pycache__/types.cpython-37.pyc,, +sqlalchemy/connectors/__init__.py,sha256=PmO8JpjouRQDDgTZG6KMmkjuhjNaHKD_mVVmC7BIb3o,278 +sqlalchemy/connectors/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/connectors/__pycache__/mxodbc.cpython-37.pyc,, +sqlalchemy/connectors/__pycache__/pyodbc.cpython-37.pyc,, +sqlalchemy/connectors/__pycache__/zxJDBC.cpython-37.pyc,, +sqlalchemy/connectors/mxodbc.py,sha256=shvfYLXjpIfWhzgmAOAmLhgzRuh1cQBviFdlmqsanpQ,5352 +sqlalchemy/connectors/pyodbc.py,sha256=7xXTtBwpiInIZY7cHQrt2kdYMWL2wt0BaBpoPrTk6TY,5586 +sqlalchemy/connectors/zxJDBC.py,sha256=q_1nkGMdgfpdTirsOFPv5zUwvcLl3eFqPWX8kLlonIU,1878 +sqlalchemy/cprocessors.cpython-37m-x86_64-linux-gnu.so,sha256=OmmM18tSS8tXnGcpgG82v7uxZYBeBP8r0eQDgZNn6TA,42944 +sqlalchemy/cresultproxy.cpython-37m-x86_64-linux-gnu.so,sha256=nZkg9Xsr3wJhCc5eDZIvZ7a9yXrjRkwvuOmnaP-GAeM,63872 +sqlalchemy/cutils.cpython-37m-x86_64-linux-gnu.so,sha256=x10dlFXZiYhTrKS33OQaXFApfpXqWkkMe3gY4i4UjmU,29568 +sqlalchemy/databases/__init__.py,sha256=q48zKLOxc0QAoin17eb3uWgKj8ZKIUn3U-1yCIBxOiA,819 +sqlalchemy/databases/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/__init__.py,sha256=sLp-2CliXi_1-53Ocw3RecyguSFVNcgbnpGbQ_l79CE,1349 +sqlalchemy/dialects/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/firebird/__init__.py,sha256=DIDoybKRq57MbVzxGAEjhlUKOnMxqS_YtqHTqKEqbA8,1152 +sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/firebird/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-37.pyc,, +sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-37.pyc,, +sqlalchemy/dialects/firebird/base.py,sha256=4KqvtWGFrHKZCIInkSrmInyn_LNGT1gGQL1YbGE9FRU,30566 +sqlalchemy/dialects/firebird/fdb.py,sha256=cMR5lkee9uQUW4dLrFJGQwzTqwS0jF7VmFC2-1XHBa0,4071 +sqlalchemy/dialects/firebird/kinterbasdb.py,sha256=umuKwPP3yCApLlgP9nFQnAzM33Tfz6yggXTNfL9NJxg,6372 +sqlalchemy/dialects/mssql/__init__.py,sha256=M8BL-BWaD86dzXXWrvFx2r61fWV8eB38xfMnB_OOnGM,1812 +sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-37.pyc,, +sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-37.pyc,, +sqlalchemy/dialects/mssql/adodbapi.py,sha256=Xaz4YjlfJzA6ULH4G4qoS-hKviyJ7BZdh6w8KJEEUnE,2719 +sqlalchemy/dialects/mssql/base.py,sha256=owUaT0cWM_r61NQmpzUNNUz5H8UTYgUXGjRpiTAQ9BE,86293 +sqlalchemy/dialects/mssql/information_schema.py,sha256=hAcPUvSr39CTKQWM7eMXAX10sRRHdCTZktQYfu8I5xs,5343 +sqlalchemy/dialects/mssql/mxodbc.py,sha256=bWJLGOj1U58hBnM494NL2bL1xm1mMMe2c5Q4mQ20Pgs,4616 +sqlalchemy/dialects/mssql/pymssql.py,sha256=5recm4JtMHCGGycQ3q74eBRvYXXswpfXS8zZG-XuB8E,3913 +sqlalchemy/dialects/mssql/pyodbc.py,sha256=dxJb8z4NZX3Rc-yM4rUy3vJSchSSJRV_yuSO2kp067k,12284 +sqlalchemy/dialects/mssql/zxjdbc.py,sha256=WWK58AZg_5QvzdcMLYSQiKwkX8Pz0dpIJGFGQhca-ek,2311 +sqlalchemy/dialects/mysql/__init__.py,sha256=5sqAvOrhuLe7BUFzAMg7e-3CEh0ACsf6czm-TXHDvJg,2056 +sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/dml.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/json.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/types.cpython-37.pyc,, +sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-37.pyc,, +sqlalchemy/dialects/mysql/base.py,sha256=u8UkBw1JACKnILkfqYXDiO-acR37U1Amh0nxW4D5UKU,97424 +sqlalchemy/dialects/mysql/cymysql.py,sha256=HkQqKqxdxSPdZL4a99IDgEY0-CEVQUN6T9H5Lzji79U,2245 +sqlalchemy/dialects/mysql/dml.py,sha256=Anei51VB2wWAP3G1T4GN6tLh9j04l2aIyHeI9vk5CUs,4559 +sqlalchemy/dialects/mysql/enumerated.py,sha256=4knKAcM5JzfgUS15j3602esjLd3op85_DRwav_4Ogok,11307 +sqlalchemy/dialects/mysql/gaerdbms.py,sha256=JFtH8MmNcVR9D6kSqCgY4bgPQk8MR_ciO9WRPOzmNAo,3368 +sqlalchemy/dialects/mysql/json.py,sha256=mvbQip8qW6b0zs-Kx6JekcWmccqJp3Pt9En1_jsbCac,2050 +sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=y3VgZtlYUO2Mnf2XS86V83Zn8nPBF4AaDYkcKDkMdzc,7889 +sqlalchemy/dialects/mysql/mysqldb.py,sha256=a8gxsD5_1Jlq1XXegfFFOEHTiFJe5XAVM7Jw6T1H3GA,8383 +sqlalchemy/dialects/mysql/oursql.py,sha256=5zFpEY5j3_dg9lwqcAVG24Idv76NESS_BPgx0-T7L1k,8086 +sqlalchemy/dialects/mysql/pymysql.py,sha256=ZfTjzAWBchsP3uSzHH3gsOZAJDjEUy86CqLyHPbAfYk,2338 +sqlalchemy/dialects/mysql/pyodbc.py,sha256=Z-p_UAqzbdEFBeUYifN1LCfZn4MsQABkq__8Bek-7Sc,2691 +sqlalchemy/dialects/mysql/reflection.py,sha256=i4lgW19eafX1pjMz4RZ9Wjlvy1FPMEe5K24J4dvXAq8,17837 +sqlalchemy/dialects/mysql/types.py,sha256=vXCGrcs3ubhaGpO3ClHqJdjKlgkkFAKMdeepbgwheU4,24601 +sqlalchemy/dialects/mysql/zxjdbc.py,sha256=YwxhLeIHlxcozvo099_sNWl6bUmPK9LBivUQDTRJ6Vc,3970 +sqlalchemy/dialects/oracle/__init__.py,sha256=ISElqFGbFJyBKl00a9_eN_JXTOincncCGy0q7qC0Ia0,1257 +sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/oracle/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-37.pyc,, +sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-37.pyc,, +sqlalchemy/dialects/oracle/base.py,sha256=yPqjWLr1_K6RXFbU5VRLN7KCfDBhCbgw7Ip4ywEDFRQ,67114 +sqlalchemy/dialects/oracle/cx_oracle.py,sha256=eLKFR5uRhnbv1cxyQwu8olQtQ46FJ28CaNy5Eq4IN6c,40689 +sqlalchemy/dialects/oracle/zxjdbc.py,sha256=OOtJlVq3YPkQMrzy7QHUveuWw5fzffSx1SQ73sfh0TI,8207 +sqlalchemy/dialects/postgresql/__init__.py,sha256=ICu5C7h84FiVkO5cQp7-GT-a1-XfPagGZ3eV8vFNsws,2461 +sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/array.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/json.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-37.pyc,, +sqlalchemy/dialects/postgresql/array.py,sha256=9dd-0XwFwEeyxNFO0xRYSq1_7GQd8HJAFKNDsZPNMLo,10946 +sqlalchemy/dialects/postgresql/base.py,sha256=cS0EIca6lacJJU3YUnOTfagX6y3eEQbU-S0SPgKgFSs,119332 +sqlalchemy/dialects/postgresql/dml.py,sha256=OTrr1V4O2aHR-QcWMxrEvNFIpwxtd6gHG_M6tjXiQ2c,7579 +sqlalchemy/dialects/postgresql/ext.py,sha256=50vUJeDhqt9eYB-FOOXSwckkbRA-vvf-QGoSbMWL2dE,6823 +sqlalchemy/dialects/postgresql/hstore.py,sha256=ziir2ENH-jtGiHHDmqh5LsYQ9wkskYzK4mHhrCseyHs,12510 +sqlalchemy/dialects/postgresql/json.py,sha256=MLz3Jen1cKfKvtLKAHl19z02-x3mYk8j_9yFjhS1AYQ,9938 +sqlalchemy/dialects/postgresql/pg8000.py,sha256=w3-trNsJWNdaY1YkQVlvCQk9PwRS3s0biFnIQdVJkUo,9719 +sqlalchemy/dialects/postgresql/psycopg2.py,sha256=c7GMl4cbLTh8e6JOQ2JvzMngcLI04_aSD-OjNSQOvY8,35719 +sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=CxJa1kEhcVL89CDofQu5cLCkXi0Kak_3qHtSY28m3D0,1657 +sqlalchemy/dialects/postgresql/pygresql.py,sha256=dGQxZvs8JonnwrFggnF2P3h62wtjQWUAeD7FP1j3di0,8129 +sqlalchemy/dialects/postgresql/pypostgresql.py,sha256=Q5UEjdWMydD-3CU9eYTdpkuqE3C2lmbl57JhfI76StE,2915 +sqlalchemy/dialects/postgresql/ranges.py,sha256=5kXgQWlUUoFaqM4nybF9lXdubPyLuyQ5-Cl1MrW0HY4,4750 +sqlalchemy/dialects/postgresql/zxjdbc.py,sha256=EOBSePhEZ5ofxWxpL4pjKrBdH-J0IU7MNI6bfrNg_f8,1415 +sqlalchemy/dialects/sqlite/__init__.py,sha256=xf7Jo5xBzd3pM2FskTBvK4GEwe2uKF3615wx5igAJnY,1042 +sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/json.cpython-37.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-37.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-37.pyc,, +sqlalchemy/dialects/sqlite/base.py,sha256=VtFt3bgvG5k8wkJVYnR4CMG_4-K5KMz9XPARnart-sk,71140 +sqlalchemy/dialects/sqlite/json.py,sha256=NlSvgukUs7BOK7HAhoHuk5Li1K2UxUgK0DpTkJ449NE,2292 +sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=xVjUM8QfJvXZWVPacptuVUrAvTELmgKk6idlK9yCg8M,4689 +sqlalchemy/dialects/sqlite/pysqlite.py,sha256=ZwUGJh3fsxWgEGaxIjkPd4yD33of79iopQRTk7mzaQc,14878 +sqlalchemy/dialects/sybase/__init__.py,sha256=E7EalDeHIf7ol6Guvh2fxkUt6db39SMTmpr2BNcFqhA,1363 +sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/dialects/sybase/__pycache__/base.cpython-37.pyc,, +sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-37.pyc,, +sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-37.pyc,, +sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-37.pyc,, +sqlalchemy/dialects/sybase/base.py,sha256=PBn5aJe5pUjQjrEbvydYvKHql190GNgDmZIXito6lCo,31953 +sqlalchemy/dialects/sybase/mxodbc.py,sha256=SAFYjwWM43w5kexxouD9k9ZixvVnjdYgrV-3cFmehtM,902 +sqlalchemy/dialects/sybase/pyodbc.py,sha256=GY1ckbvHEyAMsOATiD3l154xBFLbvyEl2DAezuKkK-o,2120 +sqlalchemy/dialects/sybase/pysybase.py,sha256=5aDa_EP4TDwD58p78MQCFdL8xEVeUfLgI9TsRL3awcI,3313 +sqlalchemy/engine/__init__.py,sha256=O5sUyKtiNYCvNIqMh825MaiKDi3CHeMXHCPCWH-VFPY,22618 +sqlalchemy/engine/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/base.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/default.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/interfaces.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/reflection.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/result.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/strategies.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/threadlocal.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/url.cpython-37.pyc,, +sqlalchemy/engine/__pycache__/util.cpython-37.pyc,, +sqlalchemy/engine/base.py,sha256=Sz88d3xDqhMskQAYF5dEwC0mzIB2pBGskZIMPEOsSI8,84656 +sqlalchemy/engine/default.py,sha256=YKT3Ke-0unHkjWvIl4udAKgNBShAldzipFBwx9GEtoM,51401 +sqlalchemy/engine/interfaces.py,sha256=Qs8a5NdXA31B5_iSBU8VjMqjgo5UyIjQiX7Serbj1P4,42397 +sqlalchemy/engine/reflection.py,sha256=FE8UbtsqqFseHmgLldcdydemwTCu96MEwTbWHqIE8BM,33530 +sqlalchemy/engine/result.py,sha256=ULlBOIXQwoO99yizhKBaMtZopI40DpUPNgbG66RxqAY,52615 +sqlalchemy/engine/strategies.py,sha256=2rTy1ZStpgu3vMtLICGFt34PKOr7QlRTsX0E-XN35hg,9847 +sqlalchemy/engine/threadlocal.py,sha256=emgAmROgo6SmJkCP8gG8eFViUQHYnd8U3pN1aAt831o,4746 +sqlalchemy/engine/url.py,sha256=d25Q-jI8KUqgVD8aGrsW6A3pI3LIP2TiV1Ny8rgZEyM,9411 +sqlalchemy/engine/util.py,sha256=pdoqEAzvm1TIIYNQsHP5eeAQZVbdEzyBE69r5rjdo94,2421 +sqlalchemy/event/__init__.py,sha256=MEawrpuhgajkBpodIp2BfEmLyHYkCicSoz60dTFJk7A,596 +sqlalchemy/event/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/event/__pycache__/api.cpython-37.pyc,, +sqlalchemy/event/__pycache__/attr.cpython-37.pyc,, +sqlalchemy/event/__pycache__/base.cpython-37.pyc,, +sqlalchemy/event/__pycache__/legacy.cpython-37.pyc,, +sqlalchemy/event/__pycache__/registry.cpython-37.pyc,, +sqlalchemy/event/api.py,sha256=P7VRkpZnGZ5BohVDAK81zbGiOyDLo4CVjFlJsIvmQYw,7085 +sqlalchemy/event/attr.py,sha256=4yiClv4zS3C5eQjshpH2siuNeBRIDVVHQ-XmZ4hrtb4,13853 +sqlalchemy/event/base.py,sha256=1qV9UUIw3FcKc6AjFTiV7wiFRpNv4CFCPGYq2nuqANc,9760 +sqlalchemy/event/legacy.py,sha256=N5IF3sonoACbA3zusM6nejBmecdD9r7o5ZrWj7JUfyo,5904 +sqlalchemy/event/registry.py,sha256=Lx2zLh2uZqizxBm5oYIdwTcqMsYbtQbW21h0buosXr4,8243 +sqlalchemy/events.py,sha256=q8YUUj9ie-jqHAhpRCSob6U0AWnO97XTXNU4eFMIoqA,51669 +sqlalchemy/exc.py,sha256=Q2oMyiOTB0jynFHMvT1WxZS6WdNUzRWEA7SPW-tVPDU,16938 +sqlalchemy/ext/__init__.py,sha256=FZuukFICvDXSuR142gLZ7dBWNpRHqASSL2aMtUfachE,322 +sqlalchemy/ext/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/associationproxy.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/automap.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/baked.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/compiler.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/horizontal_shard.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/hybrid.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/indexable.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/instrumentation.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/mutable.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/orderinglist.cpython-37.pyc,, +sqlalchemy/ext/__pycache__/serializer.cpython-37.pyc,, +sqlalchemy/ext/associationproxy.py,sha256=8r5JwaKz2zGWo9mXOtvZlxKTo6cPRpTOzj055W5BgU8,49463 +sqlalchemy/ext/automap.py,sha256=Sejl92gboBfHYXpw4xn-e1-uCr3DLud8u6MJRU395MU,41710 +sqlalchemy/ext/baked.py,sha256=7iK_B9lZX20g08IrC2xg9tidUCxGi1D4TiMQo5x9ZrQ,21469 +sqlalchemy/ext/compiler.py,sha256=bnwt9fjMG4_rrwPsX_5Kv96JgqEJM4TKQY4OorHEttc,16850 +sqlalchemy/ext/declarative/__init__.py,sha256=vjC-rEQ8py1ai0Gsh47UYHcYNlrhNw3774_u5ffhyws,902 +sqlalchemy/ext/declarative/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/ext/declarative/__pycache__/api.cpython-37.pyc,, +sqlalchemy/ext/declarative/__pycache__/base.cpython-37.pyc,, +sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-37.pyc,, +sqlalchemy/ext/declarative/api.py,sha256=KGnM7bHVyB03WDcd6ToiLCJQifIXxxx0NyDrHmb5XQM,27683 +sqlalchemy/ext/declarative/base.py,sha256=5UzkPwx-ICOji3iJi-70bbhfMQ8rcF4tYvC91dYZHA8,32093 +sqlalchemy/ext/declarative/clsregistry.py,sha256=jH0vm14_bN7fw_hfkqNNiK0eihkRDpA1YlyS_yjkfIY,11051 +sqlalchemy/ext/horizontal_shard.py,sha256=TxazGyRKBY-0q_iYGQ6omdZw96GoRb11Dh5omMH35Lk,9109 +sqlalchemy/ext/hybrid.py,sha256=l1qSV6leIR57j3dsSXbCfJMIQH3EYzoEBY7IUnn-4ME,40233 +sqlalchemy/ext/indexable.py,sha256=Zsx-ZWUQ4EJOgGIi8fkwqNZ1Z0u234Vx45jcH9zJ1GM,11169 +sqlalchemy/ext/instrumentation.py,sha256=7pxb7SDAnFvtHUxXnx8rqg4XKCadnWDGOBzFQHqeBS8,14351 +sqlalchemy/ext/mutable.py,sha256=rHTPaTAAiLda-cTAZpW4a1zl8Mqa0pgde0wWc6pGABM,31808 +sqlalchemy/ext/orderinglist.py,sha256=HEqlfaUQv5TI6kVchcNuxF_dcwvHHH_uGXY1EvP4GxQ,13888 +sqlalchemy/ext/serializer.py,sha256=D7DGYqH_tQsYSB2NFh44Eouud3aaZjclnfA-7lymCdE,5784 +sqlalchemy/inspection.py,sha256=Ld16VK6UHHncT6OTk2EF4pb5dVy6UAluKirO_efhJe4,2990 +sqlalchemy/interfaces.py,sha256=-hmOQE7bQj97PDqwBLnFbHP8spyq_SdWAsT2jj5V_2w,12721 +sqlalchemy/log.py,sha256=p15DWPQsSEbiuM-n9fXpUUKfDcC8DZzR8iVnX9vJyPU,6693 +sqlalchemy/orm/__init__.py,sha256=0oVxiEjATefM7AsVfn3GwFVdpoTqClB5v2h3wkoJubs,9542 +sqlalchemy/orm/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/attributes.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/base.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/collections.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/dependency.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/descriptor_props.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/dynamic.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/evaluator.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/events.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/exc.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/identity.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/instrumentation.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/interfaces.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/loading.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/mapper.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/path_registry.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/persistence.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/properties.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/query.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/relationships.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/scoping.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/session.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/state.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/strategies.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/strategy_options.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/sync.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/unitofwork.cpython-37.pyc,, +sqlalchemy/orm/__pycache__/util.cpython-37.pyc,, +sqlalchemy/orm/attributes.py,sha256=KZZP9OlxMSXeGUxfYZ-SCcphLAFIAC6ZBx3skSjffSg,67137 +sqlalchemy/orm/base.py,sha256=buwPRxecLZ-jlLiE6iMr-Nu5dQapiAjQVhHFzqDlAS4,14864 +sqlalchemy/orm/collections.py,sha256=AtwAGy1fBr8Nb6cOE6ErkfbwB04WAMZh02OE5c1ab1M,52614 +sqlalchemy/orm/dependency.py,sha256=nOe6kS0U6V_3qQibhK9EDqmqbkcMl9jw9XPmdqZnS0U,46556 +sqlalchemy/orm/deprecated_interfaces.py,sha256=Ck4e2jxE09lf0STxFPvJm7XtnrAsCKi26NG2WWgnI4s,20751 +sqlalchemy/orm/descriptor_props.py,sha256=uw_3B8zPTXJRw1JjZetl87oHLP70B92enkZTzMyIIGw,28201 +sqlalchemy/orm/dynamic.py,sha256=ZIekBr63mDFhhovss0o6h8SW90yQ1ImU1InQiArKXK0,14666 +sqlalchemy/orm/evaluator.py,sha256=bKHiPgCfcGlZ48by-j1E2ui5quPjEa3dcjinTpAdaNc,5441 +sqlalchemy/orm/events.py,sha256=ny4pvcj-HOaSgIFzO2zyAYIgTvF6hfi_T1kqUrejplI,94409 +sqlalchemy/orm/exc.py,sha256=mgjHeg87b0WJ8NGM1Exq39dQ5-nz_Crn61dSXKyHO6Q,6610 +sqlalchemy/orm/identity.py,sha256=zQBUIWAto8UBUKsMV74aX3AqYwqYlURjUZ2xiS0Mrj8,10299 +sqlalchemy/orm/instrumentation.py,sha256=6UM6L0MGh_4UoGDKMqSoQbuGVc9fQke7qYG5Q_9Ko9A,18131 +sqlalchemy/orm/interfaces.py,sha256=JzAQS8ulSBk-AUFPPxIAkBkfPV9HA5WztCL7osBIY9g,25766 +sqlalchemy/orm/loading.py,sha256=lQpLChrS32LN5x3YrZhZvyWptx3B6mDPtIUgMKxI_88,32236 +sqlalchemy/orm/mapper.py,sha256=Rqe_qaYddfBDz-M35Jpf33S1gYmem7ODtTrKh_6fs30,128844 +sqlalchemy/orm/path_registry.py,sha256=zCvdxp1I3MprZ6q8J3VnDEn4Pm8ROXxvqQLb-OUeECM,10023 +sqlalchemy/orm/persistence.py,sha256=oLoXkp3RaFdU_N-2vDMVpDdirVPX6dum6SUK_wn2cws,65720 +sqlalchemy/orm/properties.py,sha256=R_QJCCH1POO3mm6M_TP2UXGhF1tzMZ4T5S1muj1Kmc0,11043 +sqlalchemy/orm/query.py,sha256=dZ0kuz9KoRdba9wTRUKbSwPiQDWMH2qfDHl7w65qD2Q,172794 +sqlalchemy/orm/relationships.py,sha256=tPaigWDao6IkBjdhfFRV8SE-EGZVy129p-JH0Fchbog,124442 +sqlalchemy/orm/scoping.py,sha256=XQbBSdlbNC9kiKFt6RQ4AhR_Ds-zd2dbyEsDYQNzL_E,6393 +sqlalchemy/orm/session.py,sha256=dIU4zd22lfQpYIM-P983X3I2cqRquuDaW-A5ZyB53RU,128754 +sqlalchemy/orm/state.py,sha256=mK5CslhHSpFFsiXr8Le7OLDZW0Jmh0nc2haLvqSOAtM,31044 +sqlalchemy/orm/strategies.py,sha256=6hI25yNC5C3wf55O7_iUZzCbyDD6IuuP5ju1E2LsvZ0,85055 +sqlalchemy/orm/strategy_options.py,sha256=8z8h7aQbIsTHFJfKlIM76zpwNwIildcDBauoyjxtqQY,55688 +sqlalchemy/orm/sync.py,sha256=M5lWCUhgzxI_CXh3WJvI6xEKLCeQ2F2e42DDri27vZ8,5536 +sqlalchemy/orm/unitofwork.py,sha256=qM0DWBlZfI6BkZWH9Ir7xBxUWEXgnV53XytBMHSACq0,24735 +sqlalchemy/orm/util.py,sha256=i4DpXzYO7qKYHDzYj2dMjKKc4Javu26NIrz9bDnn5qM,44859 +sqlalchemy/pool/__init__.py,sha256=ryTuFoeMcSGBRtGWhkQLgqWBpDW72KRNU7mnEoI6zZs,1483 +sqlalchemy/pool/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/pool/__pycache__/base.cpython-37.pyc,, +sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-37.pyc,, +sqlalchemy/pool/__pycache__/impl.cpython-37.pyc,, +sqlalchemy/pool/base.py,sha256=b0IjolajKDIVESlya9yLUDWffRimhDBLV_0CfhEIApM,34626 +sqlalchemy/pool/dbapi_proxy.py,sha256=fXfMOhXiphQUXtdUkXyALbSSdTK1rmAl-96UWdt1yi0,4320 +sqlalchemy/pool/impl.py,sha256=IlCjSEY0e3TxLIM8Qqt_3kUp0TgQ_dUkFiB60DrRoEw,14594 +sqlalchemy/processors.py,sha256=JaohpclZth6hoENx14gSoJ0g6Xtw2hBNYpJB6tDMgh8,5648 +sqlalchemy/schema.py,sha256=6WropRk5UfzJ3ux_PW2XM6LF_VKChK3bVuH0CEtkxlE,2377 +sqlalchemy/sql/__init__.py,sha256=yYsKlrXrIVLaaohxVqZDQny02FRj5uZ2KwBRtj6nDfE,3789 +sqlalchemy/sql/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/annotation.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/base.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/compiler.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/crud.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/ddl.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/default_comparator.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/dml.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/elements.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/expression.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/functions.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/naming.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/operators.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/schema.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/selectable.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/sqltypes.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/type_api.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/util.cpython-37.pyc,, +sqlalchemy/sql/__pycache__/visitors.cpython-37.pyc,, +sqlalchemy/sql/annotation.py,sha256=mEFt4M7DT4SRwDSRwmi5ZR4idRrCsRESITl9jDAU_HE,6651 +sqlalchemy/sql/base.py,sha256=JqxZ-yhSWV37SpYxedwKjogOYIqopJy5b6sT4oE_kkU,21506 +sqlalchemy/sql/compiler.py,sha256=x6cOq922uwRjLiqnUwBJJJ11gXoEaSIAn8Kb7KEgQl0,124814 +sqlalchemy/sql/crud.py,sha256=lioHSo6Ud4pEZ8H-4LHWgR6AHwPjfoB1PKxJL3EAab8,25840 +sqlalchemy/sql/ddl.py,sha256=JWrv5XZNr6NtReXV_M4a4UBg8tACGpJD7EPoRAMWiNM,39549 +sqlalchemy/sql/default_comparator.py,sha256=Q4if2ZxvIS0uVWM9sjE03DWSeNCKueuPvx5mfrjb-TM,12234 +sqlalchemy/sql/dml.py,sha256=EbCBhs-9aFk1t7aSs9AXkTwOCoc9XfXnUygnU_LPl-A,34420 +sqlalchemy/sql/elements.py,sha256=6KBj0jhabpzU0pq3-03fHexC9gC5nvkOzvl1e7j7RqQ,153952 +sqlalchemy/sql/expression.py,sha256=ZOFtmLM6gKfC_GGq7jEnCjBntiZoSwfjbIHvbqg-v2M,9037 +sqlalchemy/sql/functions.py,sha256=2BHESuoJoq_95h6KF9P_b_FX0LAKybFgmTLyAHPVRy0,33760 +sqlalchemy/sql/naming.py,sha256=XhFmVhT4AyXTyfr98Fm1zJXDQWXGyaDSx6pjkFzwe1w,5885 +sqlalchemy/sql/operators.py,sha256=z_Dj6FkSaCqb0pgXByRxWXscPuLypjyJuiV7t2n7nnU,42221 +sqlalchemy/sql/schema.py,sha256=65jc_njLDfvjagA-oUtR4t-pPXmjycEFc0hCljsqAak,164499 +sqlalchemy/sql/selectable.py,sha256=-suJZT84zQcY_FXCzhxbZcEHNVHXmbqECTlBy7U4UqI,132514 +sqlalchemy/sql/sqltypes.py,sha256=U7-lfzGXTL27pKzg7ZMcYt6w9oaXyj5YGSwwnHIkF_k,96258 +sqlalchemy/sql/type_api.py,sha256=IChEqGThXkzmCtSngULwhvKNocaecObm5BQqC1qIEHY,51814 +sqlalchemy/sql/util.py,sha256=RqV2UkXR6TD-TNJp8KunVQnvs5gNVkSU7_pnHtJmA4g,29275 +sqlalchemy/sql/visitors.py,sha256=WbHDTEFoIfBCPRPHohZTvG191KSTPVNvCl-yB9ooXKU,10290 +sqlalchemy/testing/__init__.py,sha256=AMAb69uUKMaRMWpk-RYade6muNOfqhq-yx0gklK-tDw,2362 +sqlalchemy/testing/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/assertions.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/assertsql.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/config.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/engines.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/entities.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/exclusions.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/fixtures.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/mock.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/pickleable.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/profiling.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/provision.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/replay_fixture.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/requirements.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/schema.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/util.cpython-37.pyc,, +sqlalchemy/testing/__pycache__/warnings.cpython-37.pyc,, +sqlalchemy/testing/assertions.py,sha256=k-n4GfA2FHRVazA0d_RgHFG-c8pQZU-ymZEbAeRcuKo,18017 +sqlalchemy/testing/assertsql.py,sha256=hex8NrwU4_yQlsd9TrzunWE93mreZq-QatZvyzGqMlc,13398 +sqlalchemy/testing/config.py,sha256=xtKFYGVj0dhSlpLupX2nuYv_dqlwSr9h3xULp6GuwwA,2680 +sqlalchemy/testing/engines.py,sha256=KLU8Uyy6mCA19c4ha4hnbfSST3OyhYiQWG03qixaeX8,10437 +sqlalchemy/testing/entities.py,sha256=qEwjw1GnWPthQLFxtaNzIjth-wJWcPU12k_3_7CnE-k,3203 +sqlalchemy/testing/exclusions.py,sha256=kKLxtaE7qXrOXmn5Y_woKod2h7V7DO4vLJ0NRb9TwHM,12765 +sqlalchemy/testing/fixtures.py,sha256=6bPUb2yuO-xmvDbF5H1gpgBLnQRGsDxfuRiKXI2-vzQ,10814 +sqlalchemy/testing/mock.py,sha256=A5GADY9Iwr7Cbr3OeAZwNl32EzJx1U2OIRPl8hLV3kM,893 +sqlalchemy/testing/pickleable.py,sha256=LolLY6wnug3CwcJ701BTPYPm9A_dCNT8r4MT8F0M1N4,2693 +sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/testing/plugin/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-37.pyc,, +sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-37.pyc,, +sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc,, +sqlalchemy/testing/plugin/bootstrap.py,sha256=0rkror_9S175GPGNnbtbDmfdLEhu9v-AAv715lR8KyU,1468 +sqlalchemy/testing/plugin/plugin_base.py,sha256=dbIPpXRX0jxL-zOMvnskHop_M23gNuCvKCBmQ7000DU,19692 +sqlalchemy/testing/plugin/pytestplugin.py,sha256=oGYI6vsnSlwarpk4oo0j9nYLgortCvxDqeCk477Z1Ow,7166 +sqlalchemy/testing/profiling.py,sha256=lKQLwvTW0H_JnuKaA4riaQOjwdRvW4JX7X2y4Q1m74Y,8513 +sqlalchemy/testing/provision.py,sha256=8wno6MSqe2WGfoo_aiDzHmnxmQSi1CF5kIiWjankuBw,13263 +sqlalchemy/testing/replay_fixture.py,sha256=W_QZD96t7ichRNvILOjhuoQXTCYnd2usiHBQhPkzUYI,5875 +sqlalchemy/testing/requirements.py,sha256=74_qOYzLTexHADWJbplD8g1jzPvfg-DXJnFV3COocE0,27126 +sqlalchemy/testing/schema.py,sha256=bDySUn-cFBuly4XZrxZLrWmWF0BO7KKAcV5uSZmM16w,3712 +sqlalchemy/testing/suite/__init__.py,sha256=SUWU-LR3asH2hN2YsIhlpqxeuo8fpvej3o6nct-L4xU,358 +sqlalchemy/testing/suite/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_cte.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_insert.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_results.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_select.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_types.cpython-37.pyc,, +sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-37.pyc,, +sqlalchemy/testing/suite/test_cte.py,sha256=yRWq8d3q5YJu_PBDaV_mrTcfGhJCaFtjWnL0P6H3p_0,6788 +sqlalchemy/testing/suite/test_ddl.py,sha256=zzG8K1NrzTQowMbIqHEV2TjZwk0crEdc8d1u6oHbzwg,2870 +sqlalchemy/testing/suite/test_dialect.py,sha256=aZ6b0Jy6OKKVdM9gYs74NNGls8tUfO0oya1RPpTfIME,4572 +sqlalchemy/testing/suite/test_insert.py,sha256=Usn0cmLEfn82vOGlVHxaeaq9KH9tO6L_BZWrW-I3XYM,9586 +sqlalchemy/testing/suite/test_reflection.py,sha256=lj5ki65Iie3XYxeo2FjyZq6IXktZ0wHFX_6Lq89wqm4,38495 +sqlalchemy/testing/suite/test_results.py,sha256=YPNMvnbx9dulwvsa8nuTRx_SHw2XaAZhTTNulmc5_pA,11504 +sqlalchemy/testing/suite/test_select.py,sha256=7IKzlpcg18mC3HegLy1-WcZ0wlphFEGGMoj0DTHvCNM,19984 +sqlalchemy/testing/suite/test_sequence.py,sha256=oacBvtAqW3Ua3gcqyqnT1U_hpJutEW_EmEbwvf7Xq7E,4661 +sqlalchemy/testing/suite/test_types.py,sha256=4QFL1IyZ2E3mCznfMGbNwScVdMDvI9K5ZN_hSum2Z3w,30455 +sqlalchemy/testing/suite/test_update_delete.py,sha256=PA0kY_yeRDELIwvTljpElr8Q6sw_D0bFQqPTODzrL6w,1478 +sqlalchemy/testing/util.py,sha256=lxFV07DVuFrTyE7i4DLxa-_ifGi2dX-mQul5gAUC36U,7738 +sqlalchemy/testing/warnings.py,sha256=uHN8jNwg7d6D5eEYkI1RcSYk7wfyk7v8zNe5ApN0yIk,1298 +sqlalchemy/types.py,sha256=5fqsxdZyh0VSUuKkLaNuvTkZ3Vd6yyXZaMLQ6-DdozU,3377 +sqlalchemy/util/__init__.py,sha256=BeuHkC0z7vyYSNPpolkFhlNcQsLAp97kz5ZqI94BeQ0,6580 +sqlalchemy/util/__pycache__/__init__.cpython-37.pyc,, +sqlalchemy/util/__pycache__/_collections.cpython-37.pyc,, +sqlalchemy/util/__pycache__/compat.cpython-37.pyc,, +sqlalchemy/util/__pycache__/deprecations.cpython-37.pyc,, +sqlalchemy/util/__pycache__/langhelpers.cpython-37.pyc,, +sqlalchemy/util/__pycache__/queue.cpython-37.pyc,, +sqlalchemy/util/__pycache__/topological.cpython-37.pyc,, +sqlalchemy/util/_collections.py,sha256=BtaTnF9T6DmcwNm_Ppn6bMC5q-DrlMDyqvdWL_5CR9s,29153 +sqlalchemy/util/compat.py,sha256=eWgHNJyK3EiDky_TFkooH-4GLROKxw6jPW3AyDl0fq4,11794 +sqlalchemy/util/deprecations.py,sha256=f3jR0vDfDzGCmJzrJhLmGFFn-GBlRc7EEMCSFa-s4BE,7128 +sqlalchemy/util/langhelpers.py,sha256=G1mSm7134ny6XIhYOGW1ESE673HnvN-7kSVMvnrad58,49315 +sqlalchemy/util/queue.py,sha256=EBxMwtWpxO2od9YlVetESq6-ShQER2ejH1MqmeA8iss,6827 +sqlalchemy/util/topological.py,sha256=lymXt3K0HlPlJsZRQCyIyLS9VZNgRFuALXkJiB_e7Bk,2767 diff --git a/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/WHEEL new file mode 100644 index 0000000..be93b0e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: false +Tag: cp37-cp37m-linux_x86_64 + diff --git a/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/top_level.txt new file mode 100644 index 0000000..39fb2be --- /dev/null +++ b/project/env/lib/python3.7/site-packages/SQLAlchemy-1.3.8.dist-info/top_level.txt @@ -0,0 +1 @@ +sqlalchemy diff --git a/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/LICENSE.rst b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may 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 +HOLDER 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. diff --git a/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/METADATA b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/METADATA new file mode 100644 index 0000000..541f4b1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/METADATA @@ -0,0 +1,128 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 0.15.6 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/werkzeug +Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues +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.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: dev +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pallets-sphinx-themes ; extra == 'dev' +Requires-Dist: sphinx-issues ; extra == 'dev' +Provides-Extra: termcolor +Requires-Dist: termcolor ; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up +to the developer to choose a template engine, database adapter, and even +how to handle requests. It can be used to build all sorts of end user +applications such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Links +----- + +- Website: https://palletsprojects.com/p/werkzeug/ +- Documentation: https://werkzeug.palletsprojects.com/ +- Releases: https://pypi.org/project/Werkzeug/ +- Code: https://github.com/pallets/werkzeug +- Issue tracker: https://github.com/pallets/werkzeug/issues +- Test status: https://dev.azure.com/pallets/werkzeug/_build +- Official chat: https://discord.gg/t6rrQZH + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + diff --git a/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/RECORD b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/RECORD new file mode 100644 index 0000000..d14e2c2 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/RECORD @@ -0,0 +1,119 @@ +Werkzeug-0.15.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-0.15.6.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-0.15.6.dist-info/METADATA,sha256=XAzCgdu0ft-a2ZSlRp3MgbjshgB7LfU8vR9KY9nYa-g,4712 +Werkzeug-0.15.6.dist-info/RECORD,, +Werkzeug-0.15.6.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +Werkzeug-0.15.6.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=uyoxKSh0NzjDjlPnWnsNoO9sMhZ2Ax2MBm5ejHGg9QI,6805 +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431 +werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590 +werkzeug/_reloader.py,sha256=I3mg3oRQ0lLzl06oEoVopN3bN7CtINuuUQdqDcmTnEs,11531 +werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553 +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415 +werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115 +werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193 +werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928 +werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296 +werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229 +werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076 +werkzeug/contrib/sessions.py,sha256=oVXh_7-6_CWOMxDKqcaK05H8RpYoWqAd3al-KzMFPYs,13042 +werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199 +werkzeug/datastructures.py,sha256=8HoA4Gu9i7ZWi5OBjx244OLWvDEE4JTQQUUTRoAYKog,91761 +werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275 +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469 +werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 +werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318 +werkzeug/exceptions.py,sha256=UzmMCkt5PCn5-TDNI0iGxGz07d3sKHQoArJrvurqVBE,23638 +werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 +werkzeug/formparser.py,sha256=tN6SO4mn6RUsxRZq4qVBWXbNWNuasn2KaBznTieMaVk,21790 +werkzeug/http.py,sha256=t0ET2tySAf9ZWdEelVWJoLaZzFViYpjoUmiYHPz10-E,43304 +werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456 +werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 +werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, +werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 +werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 +werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 +werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 +werkzeug/middleware/proxy_fix.py,sha256=1hi6AJH-J2uh2hMm1g0u7XfjRiTOoUeIOOmwWZ2n9t0,8670 +werkzeug/middleware/shared_data.py,sha256=WtSphPrsUdpEk4E-_09CAILhfOBJ1YtcX1LrxcQfIzw,8224 +werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 +werkzeug/routing.py,sha256=BSgjrYNwj2j5dAHQtK4INEp2TOf4OJP8hBncYSRO2ps,73410 +werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106 +werkzeug/serving.py,sha256=tUFUMg7Bj9iw3nA8ZgC_czMDJJKN7vFskajEmgEFhzE,36597 +werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645 +werkzeug/testapp.py,sha256=hcKBzorVlSHC-uGvGXXjCm3FzCwGWq4yjbTG3Pr7MV8,9301 +werkzeug/urls.py,sha256=8yHdYI99N__-isoTwvGqvuj9QhOh66dd1Xh1DIp0q0g,39261 +werkzeug/useragents.py,sha256=FIonyUF790Ro8OG8cJqG1zixhg5YzXdHmkZbrnK0QRo,5965 +werkzeug/utils.py,sha256=O20Y0qWk5O1IWamC_A5gkmzR5cgBd3yDIHviwBTfNB0,27387 +werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 +werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, +werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 +werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 +werkzeug/wrappers/base_request.py,sha256=aknREwqVT7WJUxm4weUGdBj90H6rDR3DvsIvmYhaC8A,26943 +werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906 +werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089 +werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533 +werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 +werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338 +werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329 +werkzeug/wrappers/user_agent.py,sha256=4bTgQKTLQmGUyxOREYOzbeiFP2VwIOE7E14AhUB5NqM,444 +werkzeug/wsgi.py,sha256=h-zyAeInwE6X6ciSnHI14ImA85adV-F861PmR7UGtRk,36681 diff --git a/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/Werkzeug-0.15.6.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/project/env/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/project/env/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000..1e704a9 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc b/project/env/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000..e39f49d Binary files /dev/null and b/project/env/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/INSTALLER b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/LICENSE b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/LICENSE new file mode 100644 index 0000000..a668014 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2019, Brandon Nielsen +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its contributors + may 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 HOLDER 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. diff --git a/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/METADATA b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/METADATA new file mode 100644 index 0000000..be388e4 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/METADATA @@ -0,0 +1,426 @@ +Metadata-Version: 2.1 +Name: aniso8601 +Version: 8.0.0 +Summary: A library for parsing ISO 8601 strings. +Home-page: https://bitbucket.org/nielsenb/aniso8601 +Author: Brandon Nielsen +Author-email: nielsenb@jetfuse.net +License: UNKNOWN +Project-URL: Documentation, https://aniso8601.readthedocs.io/ +Project-URL: Source, https://bitbucket.org/nielsenb/aniso8601 +Project-URL: Tracker, https://bitbucket.org/nielsenb/aniso8601/issues +Keywords: iso8601 parser +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +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.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Libraries :: Python Modules + +aniso8601 +========= + +Another ISO 8601 parser for Python +---------------------------------- + +Features +======== +* Pure Python implementation +* Python 3 support +* Logical behavior + + - Parse a time, get a `datetime.time `_ + - Parse a date, get a `datetime.date `_ + - Parse a datetime, get a `datetime.datetime `_ + - Parse a duration, get a `datetime.timedelta `_ + - Parse an interval, get a tuple of dates or datetimes + - Parse a repeating interval, get a date or datetime `generator `_ + +* UTC offset represented as fixed-offset tzinfo +* Parser separate from representation, allowing parsing to different datetime formats +* No regular expressions + +Installation +============ + +The recommended installation method is to use pip:: + + $ pip install aniso8601 + +Alternatively, you can download the source (git repository hosted at `Bitbucket `_) and install directly:: + + $ python setup.py install + +Use +=== + +Parsing datetimes +----------------- + +To parse a typical ISO 8601 datetime string:: + + >>> import aniso8601 + >>> aniso8601.parse_datetime('1977-06-10T12:00:00Z') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +Alternative delimiters can be specified, for example, a space:: + + >>> aniso8601.parse_datetime('1977-06-10 12:00:00Z', delimiter=' ') + datetime.datetime(1977, 6, 10, 12, 0, tzinfo=+0:00:00 UTC) + +UTC offsets are supported:: + + >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00') + datetime.datetime(1979, 6, 5, 8, 0, tzinfo=-8:00:00 UTC) + +If a UTC offset is not specified, the returned datetime will be naive:: + + >>> aniso8601.parse_datetime('1983-01-22T08:00:00') + datetime.datetime(1983, 1, 22, 8, 0) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_datetime('2018-03-06T23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/time.py", line 131, in parse_datetime + return builder.build_datetime(datepart, timepart) + File "aniso8601/builder.py", line 300, in build_datetime + cls._build_object(time)) + File "aniso8601/builder.py", line 71, in _build_object + ss=parsetuple[2], tz=parsetuple[3]) + File "aniso8601/builder.py", line 253, in build_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +Parsing dates +------------- + +To parse a date represented in an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_date('1984-04-23') + datetime.date(1984, 4, 23) + +Basic format is supported as well:: + + >>> aniso8601.parse_date('19840423') + datetime.date(1984, 4, 23) + +To parse a date using the ISO 8601 week date format:: + + >>> aniso8601.parse_date('1986-W38-1') + datetime.date(1986, 9, 15) + +To parse an ISO 8601 ordinal date:: + + >>> aniso8601.parse_date('1988-132') + datetime.date(1988, 5, 11) + +Parsing times +------------- + +To parse a time formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_time('11:31:14') + datetime.time(11, 31, 14) + +As with all of the above, basic format is supported:: + + >>> aniso8601.parse_time('113114') + datetime.time(11, 31, 14) + +A UTC offset can be specified for times:: + + >>> aniso8601.parse_time('17:18:19-02:30') + datetime.time(17, 18, 19, tzinfo=-2:30:00 UTC) + >>> aniso8601.parse_time('171819Z') + datetime.time(17, 18, 19, tzinfo=+0:00:00 UTC) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_time('21:42') + datetime.time(21, 42) + >>> aniso8601.parse_time('22') + datetime.time(22, 0) + +A decimal fraction is always allowed on the lowest order element of an ISO 8601 formatted time:: + + >>> aniso8601.parse_time('22:33.5') + datetime.time(22, 33, 30) + >>> aniso8601.parse_time('23.75') + datetime.time(23, 45) + +The decimal fraction can be specified with a comma instead of a full-stop:: + + >>> aniso8601.parse_time('22:33,5') + datetime.time(22, 33, 30) + >>> aniso8601.parse_time('23,75') + datetime.time(23, 45) + +Leap seconds are currently not supported and attempting to parse one raises a :code:`LeapSecondError`:: + + >>> aniso8601.parse_time('23:59:60') + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/time.py", line 116, in parse_time + return _RESOLUTION_MAP[get_time_resolution(timestr)](timestr, tz, builder) + File "aniso8601/time.py", line 165, in _parse_second_time + return builder.build_time(hh=hourstr, mm=minutestr, ss=secondstr, tz=tz) + File "aniso8601/builder.py", line 253, in build_time + raise LeapSecondError('Leap seconds are not supported.') + aniso8601.exceptions.LeapSecondError: Leap seconds are not supported. + +Parsing durations +----------------- + +To parse a duration formatted as an ISO 8601 string:: + + >>> import aniso8601 + >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S') + datetime.timedelta(428, 17646) + +Reduced accuracy is supported:: + + >>> aniso8601.parse_duration('P1Y') + datetime.timedelta(365) + +A decimal fraction is allowed on the lowest order element:: + + >>> aniso8601.parse_duration('P1YT3.5M') + datetime.timedelta(365, 210) + +The decimal fraction can be specified with a comma instead of a full-stop:: + + >>> aniso8601.parse_duration('P1YT3,5M') + datetime.timedelta(365, 210) + +Parsing a duration from a combined date and time is supported as well:: + + >>> aniso8601.parse_duration('P0001-01-02T01:30:5') + datetime.timedelta(397, 5405) + +Parsing intervals +----------------- + +To parse an interval specified by a start and end:: + + >>> import aniso8601 + >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00') + (datetime.datetime(2007, 3, 1, 13, 0), datetime.datetime(2008, 5, 11, 15, 30)) + +Intervals specified by a start time and a duration are supported:: + + >>> aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M') + (datetime.datetime(2007, 3, 1, 13, 0, tzinfo=+0:00:00 UTC), datetime.datetime(2008, 5, 9, 15, 30, tzinfo=+0:00:00 UTC)) + +A duration can also be specified by a duration and end time:: + + >>> aniso8601.parse_interval('P1M/1981-04-05') + (datetime.date(1981, 4, 5), datetime.date(1981, 3, 6)) + +Notice that the result of the above parse is not in order from earliest to latest. If sorted intervals are required, simply use the :code:`sorted` keyword as shown below:: + + >>> sorted(aniso8601.parse_interval('P1M/1981-04-05')) + [datetime.date(1981, 3, 6), datetime.date(1981, 4, 5)] + +The end of an interval is returned as a datetime when required to maintain the resolution specified by a duration, even if the duration start is given as a date:: + + >>> aniso8601.parse_interval('2014-11-12/PT4H54M6.5S') + (datetime.date(2014, 11, 12), datetime.datetime(2014, 11, 12, 4, 54, 6, 500000)) + >>> aniso8601.parse_interval('2007-03-01/P1.5D') + (datetime.date(2007, 3, 1), datetime.datetime(2007, 3, 2, 12, 0)) + +Repeating intervals are supported as well, and return a generator:: + + >>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D') + + >>> list(aniso8601.parse_repeating_interval('R3/1981-04-05/P1D')) + [datetime.date(1981, 4, 5), datetime.date(1981, 4, 6), datetime.date(1981, 4, 7)] + +Repeating intervals are allowed to go in the reverse direction:: + + >>> list(aniso8601.parse_repeating_interval('R2/PT1H2M/1980-03-05T01:01:00')) + [datetime.datetime(1980, 3, 5, 1, 1), datetime.datetime(1980, 3, 4, 23, 59)] + +Unbounded intervals are also allowed (Python 2):: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> result.next() + datetime.datetime(1980, 3, 5, 1, 1) + >>> result.next() + datetime.datetime(1980, 3, 4, 23, 59) + +or for Python 3:: + + >>> result = aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00') + >>> next(result) + datetime.datetime(1980, 3, 5, 1, 1) + >>> next(result) + datetime.datetime(1980, 3, 4, 23, 59) + +Note that you should never try to convert a generator produced by an unbounded interval to a list:: + + >>> list(aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00')) + Traceback (most recent call last): + File "", line 1, in + File "aniso8601/builders/python.py", line 463, in _date_generator_unbounded + currentdate += timedelta + OverflowError: date value out of range + +Date and time resolution +------------------------ + +In some situations, it may be useful to figure out the resolution provided by an ISO 8601 date or time string. Two functions are provided for this purpose. + +To get the resolution of a ISO 8601 time string:: + + >>> aniso8601.get_time_resolution('11:31:14') == aniso8601.resolution.TimeResolution.Seconds + True + >>> aniso8601.get_time_resolution('11:31') == aniso8601.resolution.TimeResolution.Minutes + True + >>> aniso8601.get_time_resolution('11') == aniso8601.resolution.TimeResolution.Hours + True + +Similarly, for an ISO 8601 date string:: + + >>> aniso8601.get_date_resolution('1981-04-05') == aniso8601.resolution.DateResolution.Day + True + >>> aniso8601.get_date_resolution('1981-04') == aniso8601.resolution.DateResolution.Month + True + >>> aniso8601.get_date_resolution('1981') == aniso8601.resolution.DateResolution.Year + True + +Builders +======== + +Builders can be used to change the output format of a parse operation. All parse functions have a :code:`builder` keyword argument which accepts a builder class. + +Two builders are included. The :code:`PythonTimeBuilder` (the default) in the :code:`aniso8601.builders.python` module, and the :code:`TupleBuilder` which returns the parse result as a tuple of strings and is located in the :code:`aniso8601.builders` module. + +The following builders are available as separate projects: + +* `RelativeTimeBuilder `_ supports parsing to `datetutil relativedelta types `_ for calendar level accuracy +* `AttoTimeBuilder `_ supports parsing directly to `attotime attodatetime and attotimedelta types `_ which support sub-nanosecond precision +* `NumPyTimeBuilder `_ supports parsing directly to `NumPy datetime64 and timedelta64 types `_ + +TupleBuilder +------------ + +The :code:`TupleBuilder` returns parse results as tuples of strings. It is located in the :code:`aniso8601.builders` module. + +Datetimes +^^^^^^^^^ + +Parsing a datetime returns a tuple containing a date tuple as a collection of strings, a time tuple as a collection of strings, and the 'datetime' string. The date tuple contains the following parse components: :code:`(YYYY, MM, DD, Www, D, DDD, 'date')`. The time tuple contains the following parse components :code:`(hh, mm, ss, tz, 'time')`, where :code:`tz` is a tuple with the following components :code:`(negative, Z, hh, mm, name, 'timezone')` with :code:`negative` and :code:`Z` being booleans:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_datetime('1977-06-10T12:00:00', builder=TupleBuilder) + (('1977', '06', '10', None, None, None, 'date'), ('12', '00', '00', None, 'time'), 'datetime') + >>> aniso8601.parse_datetime('1979-06-05T08:00:00-08:00', builder=TupleBuilder) + (('1979', '06', '05', None, None, None, 'date'), ('08', '00', '00', (True, None, '08', '00', '-08:00', 'timezone'), 'time'), 'datetime') + +Dates +^^^^^ + +Parsing a date returns a tuple containing the following parse components: :code:`(YYYY, MM, DD, Www, D, DDD, 'date')`:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_date('1984-04-23', builder=TupleBuilder) + ('1984', '04', '23', None, None, None, 'date') + >>> aniso8601.parse_date('1986-W38-1', builder=TupleBuilder) + ('1986', None, None, '38', '1', None, 'date') + >>> aniso8601.parse_date('1988-132', builder=TupleBuilder) + ('1988', None, None, None, None, '132', 'date') + +Times +^^^^^ + +Parsing a time returns a tuple containing following parse components: :code:`(hh, mm, ss, tz, 'time')`, where :code:`tz` is a tuple with the following components :code:`(negative, Z, hh, mm, name, 'timezone')` with :code:`negative` and :code:`Z` being booleans:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_time('11:31:14', builder=TupleBuilder) + ('11', '31', '14', None, 'time') + >>> aniso8601.parse_time('171819Z', builder=TupleBuilder) + ('17', '18', '19', (False, True, None, None, 'Z', 'timezone'), 'time') + >>> aniso8601.parse_time('17:18:19-02:30', builder=TupleBuilder) + ('17', '18', '19', (True, None, '02', '30', '-02:30', 'timezone'), 'time') + +Durations +^^^^^^^^^ + +Parsing a duration returns a tuple containing the following parse components: :code:`(PnY, PnM, PnW, PnD, TnH, TnM, TnS, 'duration')`:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_duration('P1Y2M3DT4H54M6S', builder=TupleBuilder) + ('1', '2', None, '3', '4', '54', '6', 'duration') + >>> aniso8601.parse_duration('P7W', builder=TupleBuilder) + (None, None, '7', None, None, None, None, 'duration') + +Intervals +^^^^^^^^^ + +Parsing an interval returns a tuple containing the following parse components: :code:`(start, end, duration, 'interval')`, :code:`start` and :code:`end` may both be datetime or date tuples, :code:`duration` is a duration tuple:: + + >>> import aniso8601 + >>> from aniso8601.builders import TupleBuilder + >>> aniso8601.parse_interval('2007-03-01T13:00:00/2008-05-11T15:30:00', builder=TupleBuilder) + ((('2007', '03', '01', None, None, None, 'date'), ('13', '00', '00', None, 'time'), 'datetime'), (('2008', '05', '11', None, None, None, 'date'), ('15', '30', '00', None, 'time'), 'datetime'), None, 'interval') + >>> aniso8601.parse_interval('2007-03-01T13:00:00Z/P1Y2M10DT2H30M', builder=TupleBuilder) + ((('2007', '03', '01', None, None, None, 'date'), ('13', '00', '00', (False, True, None, None, 'Z', 'timezone'), 'time'), 'datetime'), None, ('1', '2', None, '10', '2', '30', None, 'duration'), 'interval') + >>> aniso8601.parse_interval('P1M/1981-04-05', builder=TupleBuilder) + (None, ('1981', '04', '05', None, None, None, 'date'), (None, '1', None, None, None, None, None, 'duration'), 'interval') + +A repeating interval returns a tuple containing the following parse components: :code:`(R, Rnn, interval, 'repeatinginterval')` where :code:`R` is a boolean, :code:`True` for an unbounded interval, :code:`False` otherwise.:: + + >>> aniso8601.parse_repeating_interval('R3/1981-04-05/P1D', builder=TupleBuilder) + (False, '3', (('1981', '04', '05', None, None, None, 'date'), None, (None, None, None, '1', None, None, None, 'duration'), 'interval'), 'repeatinginterval') + >>> aniso8601.parse_repeating_interval('R/PT1H2M/1980-03-05T01:01:00', builder=TupleBuilder) + (True, None, (None, (('1980', '03', '05', None, None, None, 'date'), ('01', '01', '00', None, 'time'), 'datetime'), (None, None, None, None, '1', '2', None, 'duration'), 'interval'), 'repeatinginterval') + +Development +=========== + +Setup +----- + +It is recommended to develop using a `virtualenv `_. + +Tests +----- + +Tests can be run using `setuptools `:: + + $ python setup.py test + +Contributing +============ + +aniso8601 is an open source project hosted on `Bitbucket `_. + +Any and all bugs are welcome on our `issue tracker `_. +Of particular interest are valid ISO 8601 strings that don't parse, or invalid ones that do. At a minimum, +bug reports should include an example of the misbehaving string, as well as the expected result. Of course +patches containing unit tests (or fixed bugs) are welcome! + +References +========== + +* `ISO 8601:2004(E) `_ (Caution, PDF link) +* `Wikipedia article on ISO 8601 `_ +* `Discussion on alternative ISO 8601 parsers for Python `_ + + diff --git a/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/RECORD b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/RECORD new file mode 100644 index 0000000..349d928 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/RECORD @@ -0,0 +1,58 @@ +aniso8601-8.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aniso8601-8.0.0.dist-info/LICENSE,sha256=_4-36Mju5uzbMHe1eLOXOuwIXiA7ugYNCjZLFS78c7E,1501 +aniso8601-8.0.0.dist-info/METADATA,sha256=I7aDyEj9IaUZqhV1GpJXZuKCpHtN2AaG_iOrVwFizr0,17682 +aniso8601-8.0.0.dist-info/RECORD,, +aniso8601-8.0.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +aniso8601-8.0.0.dist-info/top_level.txt,sha256=MVQomyeED8nGIH7PUQdMzxgLppIB48oYHtcmL17ETB0,10 +aniso8601/__init__.py,sha256=2kR6ejtLWMAYh2SEGNAI9u9B0kHzyrPLemgY1T1I2rI,527 +aniso8601/__pycache__/__init__.cpython-37.pyc,, +aniso8601/__pycache__/compat.cpython-37.pyc,, +aniso8601/__pycache__/date.cpython-37.pyc,, +aniso8601/__pycache__/decimalfraction.cpython-37.pyc,, +aniso8601/__pycache__/duration.cpython-37.pyc,, +aniso8601/__pycache__/exceptions.cpython-37.pyc,, +aniso8601/__pycache__/interval.cpython-37.pyc,, +aniso8601/__pycache__/resolution.cpython-37.pyc,, +aniso8601/__pycache__/time.cpython-37.pyc,, +aniso8601/__pycache__/timezone.cpython-37.pyc,, +aniso8601/__pycache__/utcoffset.cpython-37.pyc,, +aniso8601/builders/__init__.py,sha256=xopOoBTrP3OWHQjIq2r5krXPxAY_ZZMbzMC_xTJ9SP4,4355 +aniso8601/builders/__pycache__/__init__.cpython-37.pyc,, +aniso8601/builders/__pycache__/python.cpython-37.pyc,, +aniso8601/builders/python.py,sha256=0qWXgssqE1b6JUVQj3Dh2JVfHO52CZOQmwahjqVfOuo,17874 +aniso8601/builders/tests/__init__.py,sha256=fTze-wZVwlWm5PQ3JwVFQB4_sUA8VYc5xAUlpuJXyF8,209 +aniso8601/builders/tests/__pycache__/__init__.cpython-37.pyc,, +aniso8601/builders/tests/__pycache__/test_init.cpython-37.pyc,, +aniso8601/builders/tests/__pycache__/test_python.cpython-37.pyc,, +aniso8601/builders/tests/test_init.py,sha256=sUj_AFcflZ14qzyvcNSQCZ_gZyiel4GH3Hl9pUbR9g4,19811 +aniso8601/builders/tests/test_python.py,sha256=F8qLx5Aer52HrpFL1aVUWPJWIqXyMjZ0yR1bt2TBvH0,56546 +aniso8601/compat.py,sha256=yIFLFZPynvlbkP-VxVgl-zMIixHMMA70TQ2XPrA-8Uo,305 +aniso8601/date.py,sha256=YmLON2OvH44VxnNpiof_XVLpbeq0FTLEzBlApJ9KOJk,6799 +aniso8601/decimalfraction.py,sha256=CZjkhnvWTwr8P6SyXYRG4VDVKtBGRcrr6Agvmh2xfmA,470 +aniso8601/duration.py,sha256=cr5eUM1H5jDxumpgui2cgMQrHTqqcHO_-yhQbHJn1Cs,10239 +aniso8601/exceptions.py,sha256=meiF5CfDPI4kAXhWdtqNPdvr-A2SsgtFqrevUxV2nLQ,1182 +aniso8601/interval.py,sha256=STbdtAsF301tcMczP7WW9eTSyeakI_Hme6kITFeUXrI,6467 +aniso8601/resolution.py,sha256=-9bOvUPBfRikQW8eEqWcdJGmaG8wmOmfLvKPI7-Kw-k,422 +aniso8601/tests/__init__.py,sha256=fTze-wZVwlWm5PQ3JwVFQB4_sUA8VYc5xAUlpuJXyF8,209 +aniso8601/tests/__pycache__/__init__.cpython-37.pyc,, +aniso8601/tests/__pycache__/compat.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_date.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_decimalfraction.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_duration.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_init.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_interval.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_time.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_timezone.cpython-37.pyc,, +aniso8601/tests/__pycache__/test_utcoffset.cpython-37.pyc,, +aniso8601/tests/compat.py,sha256=WAdb3CjQdWVWfPE4beKKZNONXmjZ4FRPOtVaHODB6lQ,314 +aniso8601/tests/test_date.py,sha256=esYbP_xelmjH6KCmTezPPQkLSV5AzzD822Z1voTAYHA,7867 +aniso8601/tests/test_decimalfraction.py,sha256=xG3VcJxr62aiduE8qw5_n3NHz26xBC4a2kKmgkcnvE4,839 +aniso8601/tests/test_duration.py,sha256=X4W5VfI_ObOXGlekBj58IGXEU2PdHBRpfn46H1xoryo,24588 +aniso8601/tests/test_init.py,sha256=mvWz-CjIwdhebTebs4ndb3Ib-JqvuWreAYt5Gz7bXQk,1198 +aniso8601/tests/test_interval.py,sha256=8YDuBCBr4NwhkpQU9UzNncl4N7fnERvujdK5d6hNDhs,33730 +aniso8601/tests/test_time.py,sha256=niQ5Bn5nFQMhBqM9MIjYOAeS6dabdjVKewOxmUpEkGU,22844 +aniso8601/tests/test_timezone.py,sha256=dvJJS_XShCiNYCRdUr_E2G3DwgeNh9QsfPtUFe_korI,5130 +aniso8601/tests/test_utcoffset.py,sha256=SXCGYLo4F5zSqD3Y269KaIqZssWzAxAw7iCaAUA43Lk,1947 +aniso8601/time.py,sha256=Iuagso7Zl4i599AVNJWhM3qpD1ddXDKs4EWBI3fnP2c,5159 +aniso8601/timezone.py,sha256=uS3EcImNjtasdEDyG7h5gHxWVXBtvAN_7jPz3MzK2G4,2055 +aniso8601/utcoffset.py,sha256=F9f2dyA7IHvuxtgBYr6v2Hwyt-u6YNxfjEh8YK0x6-k,2671 diff --git a/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/WHEEL b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/top_level.txt b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/top_level.txt new file mode 100644 index 0000000..166ae78 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601-8.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +aniso8601 diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__init__.py b/project/env/lib/python3.7/site-packages/aniso8601/__init__.py new file mode 100644 index 0000000..1ce7f6c --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +#Import the main parsing functions so they are readily available +from aniso8601.time import parse_datetime, parse_time, get_time_resolution +from aniso8601.date import parse_date, get_date_resolution +from aniso8601.duration import parse_duration +from aniso8601.interval import parse_interval, parse_repeating_interval diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/__init__.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..48a436f Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/__init__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/compat.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000..cdd939a Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/compat.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/date.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/date.cpython-37.pyc new file mode 100644 index 0000000..8d72e1a Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/date.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/decimalfraction.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/decimalfraction.cpython-37.pyc new file mode 100644 index 0000000..8e93c1b Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/decimalfraction.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/duration.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/duration.cpython-37.pyc new file mode 100644 index 0000000..1f625bc Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/duration.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/exceptions.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000..01f6621 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/exceptions.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/interval.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/interval.cpython-37.pyc new file mode 100644 index 0000000..e573c07 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/interval.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/resolution.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/resolution.cpython-37.pyc new file mode 100644 index 0000000..a332948 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/resolution.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/time.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/time.cpython-37.pyc new file mode 100644 index 0000000..c497ba3 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/time.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/timezone.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/timezone.cpython-37.pyc new file mode 100644 index 0000000..66fd8bf Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/timezone.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/utcoffset.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/utcoffset.cpython-37.pyc new file mode 100644 index 0000000..8407d16 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/__pycache__/utcoffset.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/__init__.py b/project/env/lib/python3.7/site-packages/aniso8601/builders/__init__.py new file mode 100644 index 0000000..014688d --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/builders/__init__.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +from aniso8601.exceptions import ISOFormatError + +class BaseTimeBuilder(object): + @classmethod + def build_date(cls, YYYY=None, MM=None, DD=None, Www=None, D=None, + DDD=None): + raise NotImplementedError + + @classmethod + def build_time(cls, hh=None, mm=None, ss=None, tz=None): + raise NotImplementedError + + @classmethod + def build_datetime(cls, date, time): + raise NotImplementedError + + @classmethod + def build_duration(cls, PnY=None, PnM=None, PnW=None, PnD=None, TnH=None, + TnM=None, TnS=None): + raise NotImplementedError + + @classmethod + def build_interval(cls, start=None, end=None, duration=None): + #start, end, and duration are all tuples + raise NotImplementedError + + @classmethod + def build_repeating_interval(cls, R=None, Rnn=None, interval=None): + #interval is a tuple + raise NotImplementedError + + @classmethod + def build_timezone(cls, negative=None, Z=None, hh=None, mm=None, name=''): + raise NotImplementedError + + @staticmethod + def cast(value, castfunction, caughtexceptions=(ValueError,), + thrownexception=ISOFormatError, thrownmessage=None): + + try: + result = castfunction(value) + except caughtexceptions: + raise thrownexception(thrownmessage) + + return result + + @classmethod + def _build_object(cls, parsetuple): + #Given a TupleBuilder tuple, build the correct object + if parsetuple[-1] == 'date': + return cls.build_date(YYYY=parsetuple[0], MM=parsetuple[1], + DD=parsetuple[2], Www=parsetuple[3], + D=parsetuple[4], DDD=parsetuple[5]) + elif parsetuple[-1] == 'time': + return cls.build_time(hh=parsetuple[0], mm=parsetuple[1], + ss=parsetuple[2], tz=parsetuple[3]) + elif parsetuple[-1] == 'datetime': + return cls.build_datetime(parsetuple[0], parsetuple[1]) + elif parsetuple[-1] == 'duration': + return cls.build_duration(PnY=parsetuple[0], PnM=parsetuple[1], + PnW=parsetuple[2], PnD=parsetuple[3], + TnH=parsetuple[4], TnM=parsetuple[5], + TnS=parsetuple[6]) + elif parsetuple[-1] == 'interval': + return cls.build_interval(start=parsetuple[0], end=parsetuple[1], + duration=parsetuple[2]) + elif parsetuple[-1] == 'repeatinginterval': + return cls.build_repeating_interval(R=parsetuple[0], + Rnn=parsetuple[1], + interval=parsetuple[2]) + + return cls.build_timezone(negative=parsetuple[0], Z=parsetuple[1], + hh=parsetuple[2], mm=parsetuple[3], + name=parsetuple[4]) + +class TupleBuilder(BaseTimeBuilder): + #Builder used to return the arguments as a tuple, cleans up some parse methods + @classmethod + def build_date(cls, YYYY=None, MM=None, DD=None, Www=None, D=None, + DDD=None): + + return (YYYY, MM, DD, Www, D, DDD, 'date') + + @classmethod + def build_time(cls, hh=None, mm=None, ss=None, tz=None): + return (hh, mm, ss, tz, 'time') + + @classmethod + def build_datetime(cls, date, time): + return (date, time, 'datetime') + + @classmethod + def build_duration(cls, PnY=None, PnM=None, PnW=None, PnD=None, TnH=None, + TnM=None, TnS=None): + + return (PnY, PnM, PnW, PnD, TnH, TnM, TnS, 'duration') + + @classmethod + def build_interval(cls, start=None, end=None, duration=None): + return (start, end, duration, 'interval') + + @classmethod + def build_repeating_interval(cls, R=None, Rnn=None, interval=None): + return (R, Rnn, interval, 'repeatinginterval') + + @classmethod + def build_timezone(cls, negative=None, Z=None, hh=None, mm=None, name=''): + return (negative, Z, hh, mm, name, 'timezone') diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/__pycache__/__init__.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/builders/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..02eb333 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/builders/__pycache__/__init__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/__pycache__/python.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/builders/__pycache__/python.cpython-37.pyc new file mode 100644 index 0000000..c9c3e18 Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/builders/__pycache__/python.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/python.py b/project/env/lib/python3.7/site-packages/aniso8601/builders/python.py new file mode 100644 index 0000000..1b7fffa --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/builders/python.py @@ -0,0 +1,458 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import datetime + +from aniso8601.builders import BaseTimeBuilder, TupleBuilder +from aniso8601.exceptions import (DayOutOfBoundsError, + HoursOutOfBoundsError, + LeapSecondError, MidnightBoundsError, + MinutesOutOfBoundsError, + SecondsOutOfBoundsError, + WeekOutOfBoundsError, YearOutOfBoundsError) +from aniso8601.utcoffset import UTCOffset + +MICROSECONDS_PER_SECOND = int(1e6) + +MICROSECONDS_PER_MINUTE = 60 * MICROSECONDS_PER_SECOND +MICROSECONDS_PER_HOUR = 60 * MICROSECONDS_PER_MINUTE +MICROSECONDS_PER_DAY = 24 * MICROSECONDS_PER_HOUR +MICROSECONDS_PER_WEEK = 7 * MICROSECONDS_PER_DAY +MICROSECONDS_PER_MONTH = 30 * MICROSECONDS_PER_DAY +MICROSECONDS_PER_YEAR = 365 * MICROSECONDS_PER_DAY + +class PythonTimeBuilder(BaseTimeBuilder): + @classmethod + def build_date(cls, YYYY=None, MM=None, DD=None, Www=None, D=None, + DDD=None): + + if YYYY is not None: + #Truncated dates, like '19', refer to 1900-1999 inclusive, + #we simply parse to 1900 + if len(YYYY) < 4: + #Shift 0s in from the left to form complete year + YYYY = YYYY.ljust(4, '0') + + year = cls.cast(YYYY, int, + thrownmessage='Invalid year string.') + + if MM is not None: + month = cls.cast(MM, int, + thrownmessage='Invalid month string.') + else: + month = 1 + + if DD is not None: + day = cls.cast(DD, int, + thrownmessage='Invalid day string.') + else: + day = 1 + + if Www is not None: + weeknumber = cls.cast(Www, int, + thrownmessage='Invalid week string.') + + if weeknumber == 0 or weeknumber > 53: + raise WeekOutOfBoundsError('Week number must be between ' + '1..53.') + else: + weeknumber = None + + if DDD is not None: + dayofyear = cls.cast(DDD, int, + thrownmessage='Invalid day string.') + else: + dayofyear = None + + if D is not None: + dayofweek = cls.cast(D, int, + thrownmessage='Invalid day string.') + + if dayofweek == 0 or dayofweek > 7: + raise DayOutOfBoundsError('Weekday number must be between ' + '1..7.') + else: + dayofweek = None + + #0000 (1 BC) is not representable as a Python date so a ValueError is + #raised + if year == 0: + raise YearOutOfBoundsError('Year must be between 1..9999.') + + if dayofyear is not None: + return PythonTimeBuilder._build_ordinal_date(year, dayofyear) + + if weeknumber is not None: + return PythonTimeBuilder._build_week_date(year, weeknumber, + isoday=dayofweek) + + return datetime.date(year, month, day) + + @classmethod + def build_time(cls, hh=None, mm=None, ss=None, tz=None): + #Builds a time from the given parts, handling fractional arguments + #where necessary + hours = 0 + minutes = 0 + seconds = 0 + microseconds = 0 + + if hh is not None: + if '.' in hh: + hours, remainingmicroseconds = cls._split_to_microseconds(hh, MICROSECONDS_PER_HOUR, 'Invalid hour string.') + microseconds += remainingmicroseconds + else: + hours = cls.cast(hh, int, + thrownmessage='Invalid hour string.') + + if mm is not None: + if '.' in mm: + minutes, remainingmicroseconds = cls._split_to_microseconds(mm, MICROSECONDS_PER_MINUTE, 'Invalid minute string.') + microseconds += remainingmicroseconds + else: + minutes = cls.cast(mm, int, + thrownmessage='Invalid minute string.') + + if ss is not None: + if '.' in ss: + seconds, remainingmicroseconds = cls._split_to_microseconds(ss, MICROSECONDS_PER_SECOND, 'Invalid second string.') + microseconds += remainingmicroseconds + else: + seconds = cls.cast(ss, int, + thrownmessage='Invalid second string.') + + hours, minutes, seconds, microseconds = PythonTimeBuilder._distribute_microseconds(microseconds, (hours, minutes, seconds), (MICROSECONDS_PER_HOUR, MICROSECONDS_PER_MINUTE, MICROSECONDS_PER_SECOND)) + + #Range checks + if hours == 23 and minutes == 59 and seconds == 60: + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + raise LeapSecondError('Leap seconds are not supported.') + + if (hours == 24 + and (minutes != 0 or seconds != 0)): + raise MidnightBoundsError('Hour 24 may only represent midnight.') + + if hours > 24: + raise HoursOutOfBoundsError('Hour must be between 0..24 with ' + '24 representing midnight.') + + if minutes >= 60: + raise MinutesOutOfBoundsError('Minutes must be less than 60.') + + if seconds >= 60: + raise SecondsOutOfBoundsError('Seconds must be less than 60.') + + #Fix ranges that have passed range checks + if hours == 24: + hours = 0 + minutes = 0 + seconds = 0 + + #Datetimes don't handle fractional components, so we use a timedelta + if tz is not None: + return (datetime.datetime(1, 1, 1, + hour=hours, + minute=minutes, + tzinfo=cls._build_object(tz)) + + datetime.timedelta(seconds=seconds, + microseconds=microseconds) + ).timetz() + + return (datetime.datetime(1, 1, 1, + hour=hours, + minute=minutes) + + datetime.timedelta(seconds=seconds, + microseconds=microseconds) + ).time() + + @classmethod + def build_datetime(cls, date, time): + return datetime.datetime.combine(cls._build_object(date), + cls._build_object(time)) + + @classmethod + def build_duration(cls, PnY=None, PnM=None, PnW=None, PnD=None, TnH=None, + TnM=None, TnS=None): + years = 0 + months = 0 + days = 0 + weeks = 0 + hours = 0 + minutes = 0 + seconds = 0 + microseconds = 0 + + if PnY is not None: + if '.' in PnY: + years, remainingmicroseconds = cls._split_to_microseconds(PnY, MICROSECONDS_PER_YEAR, 'Invalid year string.') + microseconds += remainingmicroseconds + else: + years = cls.cast(PnY, int, + thrownmessage='Invalid year string.') + + if PnM is not None: + if '.' in PnM: + months, remainingmicroseconds = cls._split_to_microseconds(PnM, MICROSECONDS_PER_MONTH, 'Invalid month string.') + microseconds += remainingmicroseconds + else: + months = cls.cast(PnM, int, + thrownmessage='Invalid month string.') + + if PnW is not None: + if '.' in PnW: + weeks, remainingmicroseconds = cls._split_to_microseconds(PnW, MICROSECONDS_PER_WEEK, 'Invalid week string.') + microseconds += remainingmicroseconds + else: + weeks = cls.cast(PnW, int, + thrownmessage='Invalid week string.') + + if PnD is not None: + if '.' in PnD: + days, remainingmicroseconds = cls._split_to_microseconds(PnD, MICROSECONDS_PER_DAY, 'Invalid day string.') + microseconds += remainingmicroseconds + else: + days = cls.cast(PnD, int, + thrownmessage='Invalid day string.') + + if TnH is not None: + if '.' in TnH: + hours, remainingmicroseconds = cls._split_to_microseconds(TnH, MICROSECONDS_PER_HOUR, 'Invalid hour string.') + microseconds += remainingmicroseconds + else: + hours = cls.cast(TnH, int, + thrownmessage='Invalid hour string.') + + if TnM is not None: + if '.' in TnM: + minutes, remainingmicroseconds = cls._split_to_microseconds(TnM, MICROSECONDS_PER_MINUTE, 'Invalid minute string.') + microseconds += remainingmicroseconds + else: + minutes = cls.cast(TnM, int, + thrownmessage='Invalid minute string.') + + if TnS is not None: + if '.' in TnS: + seconds, remainingmicroseconds = cls._split_to_microseconds(TnS, MICROSECONDS_PER_SECOND, 'Invalid second string.') + microseconds += remainingmicroseconds + else: + seconds = cls.cast(TnS, int, + thrownmessage='Invalid second string.') + + years, months, weeks, days, hours, minutes, seconds, microseconds = PythonTimeBuilder._distribute_microseconds(microseconds, (years, months, weeks, days, hours, minutes, seconds), (MICROSECONDS_PER_YEAR, MICROSECONDS_PER_MONTH, MICROSECONDS_PER_WEEK, MICROSECONDS_PER_DAY, MICROSECONDS_PER_HOUR, MICROSECONDS_PER_MINUTE, MICROSECONDS_PER_SECOND)) + + #Note that weeks can be handled without conversion to days + totaldays = years * 365 + months * 30 + days + + return datetime.timedelta(days=totaldays, + seconds=seconds, + microseconds=microseconds, + minutes=minutes, + hours=hours, + weeks=weeks) + + @classmethod + def build_interval(cls, start=None, end=None, duration=None): + if start is not None and end is not None: + #/ + startobject = cls._build_object(start) + endobject = cls._build_object(end) + + return (startobject, endobject) + + durationobject = cls._build_object(duration) + + #Determine if datetime promotion is required + datetimerequired = (duration[4] is not None + or duration[5] is not None + or duration[6] is not None + or durationobject.seconds != 0 + or durationobject.microseconds != 0) + + if end is not None: + #/ + endobject = cls._build_object(end) + if end[-1] == 'date' and datetimerequired is True: + # is a date, and requires datetime resolution + return (endobject, + cls.build_datetime(end, TupleBuilder.build_time()) + - durationobject) + + return (endobject, + endobject + - durationobject) + + #/ + startobject = cls._build_object(start) + + if start[-1] == 'date' and datetimerequired is True: + # is a date, and requires datetime resolution + return (startobject, + cls.build_datetime(start, TupleBuilder.build_time()) + + durationobject) + + return (startobject, + startobject + + durationobject) + + @classmethod + def build_repeating_interval(cls, R=None, Rnn=None, interval=None): + startobject = None + endobject = None + + if interval[0] is not None: + startobject = cls._build_object(interval[0]) + + if interval[1] is not None: + endobject = cls._build_object(interval[1]) + + if interval[2] is not None: + durationobject = cls._build_object(interval[2]) + else: + durationobject = endobject - startobject + + if R is True: + if startobject is not None: + return cls._date_generator_unbounded(startobject, + durationobject) + + return cls._date_generator_unbounded(endobject, + -durationobject) + + iterations = cls.cast(Rnn, int, + thrownmessage='Invalid iterations.') + + if startobject is not None: + return cls._date_generator(startobject, durationobject, iterations) + + return cls._date_generator(endobject, -durationobject, iterations) + + @classmethod + def build_timezone(cls, negative=None, Z=None, hh=None, mm=None, name=''): + if Z is True: + #Z -> UTC + return UTCOffset(name='UTC', minutes=0) + + if hh is not None: + tzhour = cls.cast(hh, int, + thrownmessage='Invalid hour string.') + else: + tzhour = 0 + + if mm is not None: + tzminute = cls.cast(mm, int, + thrownmessage='Invalid minute string.') + else: + tzminute = 0 + + if negative is True: + return UTCOffset(name=name, minutes=-(tzhour * 60 + tzminute)) + + return UTCOffset(name=name, minutes=tzhour * 60 + tzminute) + + @staticmethod + def _build_week_date(isoyear, isoweek, isoday=None): + if isoday is None: + return (PythonTimeBuilder._iso_year_start(isoyear) + + datetime.timedelta(weeks=isoweek - 1)) + + return (PythonTimeBuilder._iso_year_start(isoyear) + + datetime.timedelta(weeks=isoweek - 1, days=isoday - 1)) + + @staticmethod + def _build_ordinal_date(isoyear, isoday): + #Day of year to a date + #https://stackoverflow.com/questions/2427555/python-question-year-and-day-of-year-to-date + builtdate = (datetime.date(isoyear, 1, 1) + + datetime.timedelta(days=isoday - 1)) + + #Enforce ordinal day limitation + #https://bitbucket.org/nielsenb/aniso8601/issues/14/parsing-ordinal-dates-should-only-allow + if isoday == 0 or builtdate.year != isoyear: + raise DayOutOfBoundsError('Day of year must be from 1..365, ' + '1..366 for leap year.') + + return builtdate + + @staticmethod + def _iso_year_start(isoyear): + #Given an ISO year, returns the equivalent of the start of the year + #on the Gregorian calendar (which is used by Python) + #Stolen from: + #http://stackoverflow.com/questions/304256/whats-the-best-way-to-find-the-inverse-of-datetime-isocalendar + + #Determine the location of the 4th of January, the first week of + #the ISO year is the week containing the 4th of January + #http://en.wikipedia.org/wiki/ISO_week_date + fourth_jan = datetime.date(isoyear, 1, 4) + + #Note the conversion from ISO day (1 - 7) and Python day (0 - 6) + delta = datetime.timedelta(days=fourth_jan.isoweekday() - 1) + + #Return the start of the year + return fourth_jan - delta + + @staticmethod + def _date_generator(startdate, timedelta, iterations): + currentdate = startdate + currentiteration = 0 + + while currentiteration < iterations: + yield currentdate + + #Update the values + currentdate += timedelta + currentiteration += 1 + + @staticmethod + def _date_generator_unbounded(startdate, timedelta): + currentdate = startdate + + while True: + yield currentdate + + #Update the value + currentdate += timedelta + + @classmethod + def _split_to_microseconds(cls, floatstr, conversion, thrownmessage): + #Splits a string with a decimal point into an int, and + #int representing the floating point remainder as a number + #of microseconds, determined by multiplying by conversion + intpart, floatpart = floatstr.split('.') + + intvalue = cls.cast(intpart, int, + thrownmessage=thrownmessage) + + preconvertedvalue = cls.cast(floatpart, int, + thrownmessage=thrownmessage) + + convertedvalue = ((preconvertedvalue * conversion) // + (10 ** len(floatpart))) + + return (intvalue, convertedvalue) + + @staticmethod + def _distribute_microseconds(todistribute, recipients, reductions): + #Given a number of microseconds as int, a tuple of ints length n + #to distribute to, and a tuple of ints length n to divide todistribute + #by (from largest to smallest), returns a tuple of length n + 1, with + #todistribute divided across recipients using the reductions, with + #the final remainder returned as the final tuple member + results = [] + + remainder = todistribute + + for index, reduction in enumerate(reductions): + additional, remainder = divmod(remainder, reduction) + + results.append(recipients[index] + additional) + + #Always return the remaining microseconds + results.append(remainder) + + return tuple(results) diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__init__.py b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__init__.py new file mode 100644 index 0000000..7dcd5d1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/__init__.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..59b183c Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/__init__.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/test_init.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/test_init.cpython-37.pyc new file mode 100644 index 0000000..f3b7eac Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/test_init.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/test_python.cpython-37.pyc b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/test_python.cpython-37.pyc new file mode 100644 index 0000000..175f72f Binary files /dev/null and b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/__pycache__/test_python.cpython-37.pyc differ diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/test_init.py b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/test_init.py new file mode 100644 index 0000000..440b816 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/test_init.py @@ -0,0 +1,421 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import unittest +import aniso8601 + +from aniso8601.builders import BaseTimeBuilder, TupleBuilder +from aniso8601.exceptions import ISOFormatError +from aniso8601.tests.compat import mock + +class TestBaseTimeBuilder(unittest.TestCase): + def test_build_date(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_date() + + def test_build_time(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_time() + + def test_build_datetime(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_datetime(None, None) + + def test_build_duration(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_duration() + + def test_build_interval(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_interval() + + def test_build_repeating_interval(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_repeating_interval() + + def test_build_timezone(self): + with self.assertRaises(NotImplementedError): + BaseTimeBuilder.build_timezone() + + def test_cast(self): + self.assertEqual(BaseTimeBuilder.cast('1', int), 1) + self.assertEqual(BaseTimeBuilder.cast('-2', int), -2) + self.assertEqual(BaseTimeBuilder.cast('3', float), float(3)) + self.assertEqual(BaseTimeBuilder.cast('-4', float), float(-4)) + self.assertEqual(BaseTimeBuilder.cast('5.6', float), 5.6) + self.assertEqual(BaseTimeBuilder.cast('-7.8', float), -7.8) + + def test_cast_exception(self): + with self.assertRaises(ISOFormatError): + BaseTimeBuilder.cast('asdf', int) + + with self.assertRaises(ISOFormatError): + BaseTimeBuilder.cast('asdf', float) + + def test_cast_caughtexception(self): + def tester(value): + raise RuntimeError + + with self.assertRaises(ISOFormatError): + BaseTimeBuilder.cast('asdf', tester, + caughtexceptions=(RuntimeError,)) + + def test_cast_thrownexception(self): + with self.assertRaises(RuntimeError): + BaseTimeBuilder.cast('asdf', int, + thrownexception=RuntimeError) + + def test_build_object(self): + datetest = (('1', '2', '3', '4', '5', '6', 'date'), + {'YYYY': '1', 'MM': '2', 'DD': '3', + 'Www': '4', 'D': '5', 'DDD': '6'}) + + timetest = (('1', '2', '3', + (False, False, '4', '5', 'tz name', 'timezone'), + 'time'), + {'hh': '1', 'mm': '2', 'ss': '3', + 'tz': (False, False, '4', '5', 'tz name', 'timezone')}) + + datetimetest = ((('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', + (True, False, '10', '11', 'tz name', 'timezone'), + 'time'), + 'datetime'), + (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', + (True, False, '10', '11', 'tz name', 'timezone'), + 'time'))) + + durationtest = (('1', '2', '3', '4', '5', '6', '7', 'duration'), + {'PnY': '1', 'PnM': '2', 'PnW': '3', 'PnD': '4', + 'TnH': '5', 'TnM': '6', 'TnS': '7'}) + + intervaltests = (((('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', '10', '11', '12', 'date'), + None, 'interval'), + {'start': ('1', '2', '3', '4', '5', '6', 'date'), + 'end': ('7', '8', '9', '10', '11', '12', 'date'), + 'duration': None}), + ((('1', '2', '3', '4', '5', '6', 'date'), + None, + ('7', '8', '9', '10', '11', '12', '13', 'duration'), + 'interval'), + {'start': ('1', '2', '3', '4', '5', '6', 'date'), + 'end': None, + 'duration': ('7', '8', '9', '10', '11', '12', '13', + 'duration')}), + ((None, + ('1', '2', '3', + (True, False, '4', '5', 'tz name', 'timezone'), + 'time'), + ('6', '7', '8', '9', '10', '11', '12', 'duration'), + 'interval'), + {'start': None, + 'end': ('1', '2', '3', + (True, False, '4', '5', 'tz name', + 'timezone'), + 'time'), + 'duration': ('6', '7', '8', '9', '10', '11', '12', + 'duration')})) + + repeatingintervaltests = (((True, + None, + (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', '10', '11', '12', 'date'), + None, 'interval'), 'repeatinginterval'), + {'R': True, + 'Rnn': None, + 'interval': (('1', '2', '3', + '4', '5', '6', 'date'), + ('7', '8', '9', + '10', '11', '12', 'date'), + None, 'interval')}), + ((False, + '1', + ((('2', '3', '4', '5', '6', '7', 'date'), + ('8', '9', '10', None, 'time'), + 'datetime'), + (('11', '12', '13', '14', '15', '16', + 'date'), + ('17', '18', '19', None, 'time'), + 'datetime'), + None, 'interval'), 'repeatinginterval'), + {'R':False, + 'Rnn': '1', + 'interval': ((('2', '3', '4', + '5', '6', '7', 'date'), + ('8', '9', '10', None, + 'time'), 'datetime'), + (('11', '12', '13', + '14', '15', '16', 'date'), + ('17', '18', '19', None, + 'time'), 'datetime'), + None, 'interval')})) + + timezonetest = ((False, False, '1', '2', '+01:02', 'timezone'), + {'negative': False, 'Z': False, + 'hh': '1', 'mm': '2', 'name': '+01:02'}) + + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_date') as mock_build: + mock_build.return_value = datetest[0] + + result = BaseTimeBuilder._build_object(datetest[0]) + + self.assertEqual(result, datetest[0]) + mock_build.assert_called_once_with(**datetest[1]) + + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_time') as mock_build: + mock_build.return_value = timetest[0] + + result = BaseTimeBuilder._build_object(timetest[0]) + + self.assertEqual(result, timetest[0]) + mock_build.assert_called_once_with(**timetest[1]) + + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_datetime') as mock_build: + mock_build.return_value = datetimetest[0] + + result = BaseTimeBuilder._build_object(datetimetest[0]) + + self.assertEqual(result, datetimetest[0]) + mock_build.assert_called_once_with(*datetimetest[1]) + + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_duration') as mock_build: + mock_build.return_value = durationtest[0] + + result = BaseTimeBuilder._build_object(durationtest[0]) + + self.assertEqual(result, durationtest[0]) + mock_build.assert_called_once_with(**durationtest[1]) + + for intervaltest in intervaltests: + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_interval') as mock_build: + mock_build.return_value = intervaltest[0] + + result = BaseTimeBuilder._build_object(intervaltest[0]) + + self.assertEqual(result, intervaltest[0]) + mock_build.assert_called_once_with(**intervaltest[1]) + + for repeatingintervaltest in repeatingintervaltests: + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_repeating_interval') as mock_build: + mock_build.return_value = repeatingintervaltest[0] + + result = BaseTimeBuilder._build_object(repeatingintervaltest[0]) + + self.assertEqual(result, repeatingintervaltest[0]) + mock_build.assert_called_once_with(**repeatingintervaltest[1]) + + with mock.patch.object(aniso8601.builders.BaseTimeBuilder, + 'build_timezone') as mock_build: + mock_build.return_value = timezonetest[0] + + result = BaseTimeBuilder._build_object(timezonetest[0]) + + self.assertEqual(result, timezonetest[0]) + mock_build.assert_called_once_with(**timezonetest[1]) + +class TestTupleBuilder(unittest.TestCase): + def test_build_date(self): + datetuple = TupleBuilder.build_date() + + self.assertEqual(datetuple, (None, None, None, + None, None, None, + 'date')) + + datetuple = TupleBuilder.build_date(YYYY='1', MM='2', DD='3', + Www='4', D='5', DDD='6') + + self.assertEqual(datetuple, ('1', '2', '3', + '4', '5', '6', + 'date')) + + def test_build_time(self): + testtuples = (({}, (None, None, None, None, 'time')), + ({'hh': '1', 'mm': '2', 'ss': '3', 'tz': None}, + ('1', '2', '3', None, 'time')), + ({'hh': '1', 'mm': '2', 'ss': '3', 'tz': (False, False, + '4', '5', + 'tz name', + 'timezone')}, + ('1', '2', '3', (False, False, '4', '5', + 'tz name', 'timezone'), + 'time'))) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_time(**testtuple[0]), + testtuple[1]) + + def test_build_datetime(self): + testtuples = (({'date': ('1', '2', '3', '4', '5', '6', 'date'), + 'time': ('7', '8', '9', None, 'time')}, + (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', None, 'time'), + 'datetime')), + ({'date': ('1', '2', '3', '4', '5', '6', 'date'), + 'time': ('7', '8', '9', + (True, False, '10', '11', 'tz name', + 'timezone'), + 'time')}, + (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', + (True, False, '10', '11', 'tz name', + 'timezone'), + 'time'), 'datetime'))) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_datetime(**testtuple[0]), + testtuple[1]) + + def test_build_duration(self): + testtuples = (({}, (None, None, None, None, None, None, None, + 'duration')), + ({'PnY': '1', 'PnM': '2', 'PnW': '3', 'PnD': '4', + 'TnH': '5', 'TnM': '6', 'TnS': '7'}, + ('1', '2', '3', '4', + '5', '6', '7', + 'duration'))) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_duration(**testtuple[0]), + testtuple[1]) + + def test_build_interval(self): + testtuples = (({}, (None, None, None, 'interval')), + ({'start': ('1', '2', '3', '4', '5', '6', 'date'), + 'end': ('7', '8', '9', '10', '11', '12', 'date')}, + (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', '10', '11', '12', 'date'), + None, 'interval')), + ({'start': ('1', '2', '3', + (True, False, '7', '8', 'tz name', + 'timezone'), + 'time'), + 'end': ('4', '5', '6', + (False, False, '9', '10', 'tz name', + 'timezone'), + 'time')}, + (('1', '2', '3', + (True, False, '7', '8', 'tz name', + 'timezone'), + 'time'), + ('4', '5', '6', + (False, False, '9', '10', 'tz name', + 'timezone'), + 'time'), + None, 'interval')), + ({'start': (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', + (True, False, '10', '11', 'tz name', + 'timezone'), + 'time'), + 'datetime'), + 'end': (('12', '13', '14', '15', '16', '17', 'date'), + ('18', '19', '20', + (False, False, '21', '22', 'tz name', + 'timezone'), + 'time'), + 'datetime')}, + ((('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', + (True, False, '10', '11', 'tz name', + 'timezone'), + 'time'), + 'datetime'), + (('12', '13', '14', '15', '16', '17', 'date'), + ('18', '19', '20', + (False, False, '21', '22', 'tz name', + 'timezone'), + 'time'), + 'datetime'), + None, 'interval')), + ({'start': ('1', '2', '3', '4', '5', '6', 'date'), + 'end': None, + 'duration': ('7', '8', '9', '10', '11', '12', '13', + 'duration')}, + (('1', '2', '3', '4', '5', '6', 'date'), + None, + ('7', '8', '9', '10', '11', '12', '13', + 'duration'), + 'interval')), + ({'start': None, + 'end': ('1', '2', '3', + (True, False, '4', '5', 'tz name', + 'timezone'), + 'time'), + 'duration': ('6', '7', '8', '9', '10', '11', '12', + 'duration')}, + (None, + ('1', '2', '3', + (True, False, '4', '5', 'tz name', + 'timezone'), + 'time'), + ('6', '7', '8', '9', '10', '11', '12', + 'duration'), + 'interval'))) + + for testtuple in testtuples: + self.assertEqual(TupleBuilder.build_interval(**testtuple[0]), + testtuple[1]) + + def test_build_repeating_interval(self): + testtuples = (({}, (None, None, None, 'repeatinginterval')), + ({'R': True, + 'interval':(('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', '10', '11', '12', 'date'), + None, 'interval')}, + (True, None, (('1', '2', '3', '4', '5', '6', 'date'), + ('7', '8', '9', '10', '11', '12', 'date'), + None, 'interval'), + 'repeatinginterval')), + ({'R':False, 'Rnn': '1', + 'interval': ((('2', '3', '4', '5', '6', '7', + 'date'), + ('8', '9', '10', None, 'time'), + 'datetime'), + (('11', '12', '13', '14', '15', '16', + 'date'), + ('17', '18', '19', None, 'time'), + 'datetime'), + None, 'interval')}, + (False, '1', + ((('2', '3', '4', '5', '6', '7', + 'date'), + ('8', '9', '10', None, 'time'), + 'datetime'), + (('11', '12', '13', '14', '15', '16', + 'date'), + ('17', '18', '19', None, 'time'), + 'datetime'), + None, 'interval'), + 'repeatinginterval'))) + + for testtuple in testtuples: + result = TupleBuilder.build_repeating_interval(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_timezone(self): + testtuples = (({}, (None, None, None, None, '', 'timezone')), + ({'negative': False, 'Z': True, 'name': 'UTC'}, + (False, True, None, None, 'UTC', 'timezone')), + ({'negative': False, 'Z': False, 'hh': '1', 'mm': '2', + 'name': '+01:02'}, + (False, False, '1', '2', '+01:02', 'timezone')), + ({'negative': True, 'Z': False, 'hh': '1', 'mm': '2', + 'name': '-01:02'}, + (True, False, '1', '2', '-01:02', 'timezone'))) + + for testtuple in testtuples: + result = TupleBuilder.build_timezone(**testtuple[0]) + self.assertEqual(result, testtuple[1]) diff --git a/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/test_python.py b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/test_python.py new file mode 100644 index 0000000..e17c51b --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/builders/tests/test_python.py @@ -0,0 +1,998 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import datetime +import unittest + +from aniso8601 import compat +from aniso8601.exceptions import (DayOutOfBoundsError, HoursOutOfBoundsError, + ISOFormatError, LeapSecondError, + MidnightBoundsError, MinutesOutOfBoundsError, + SecondsOutOfBoundsError, + WeekOutOfBoundsError, YearOutOfBoundsError) +from aniso8601.builders.python import PythonTimeBuilder +from aniso8601.utcoffset import UTCOffset + +class TestPythonTimeBuilder(unittest.TestCase): + def test_build_date(self): + testtuples = (({'YYYY': '2013', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(2013, 1, 1)), + ({'YYYY': '0001', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1, 1, 1)), + ({'YYYY': '1900', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1900, 1, 1)), + ({'YYYY': '1981', 'MM': '04', 'DD': '05', 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1981, 4, 5)), + ({'YYYY': '1981', 'MM': '04', 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1981, 4, 1)), + ({'YYYY': '1981', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': '095'}, + datetime.date(1981, 4, 5)), + ({'YYYY': '1981', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': '365'}, + datetime.date(1981, 12, 31)), + ({'YYYY': '1980', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': '366'}, + datetime.date(1980, 12, 31)), + #Make sure we shift in zeros + ({'YYYY': '1', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1000, 1, 1)), + ({'YYYY': '12', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1200, 1, 1)), + ({'YYYY': '123', 'MM': None, 'DD': None, 'Www': None, + 'D': None, 'DDD': None}, + datetime.date(1230, 1, 1))) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_date(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + #Test weekday + testtuples = (({'YYYY': '2004', 'MM': None, 'DD': None, 'Www': '53', + 'D': None, 'DDD': None}, + datetime.date(2004, 12, 27), 0), + ({'YYYY': '2009', 'MM': None, 'DD': None, 'Www': '01', + 'D': None, 'DDD': None}, + datetime.date(2008, 12, 29), 0), + ({'YYYY': '2010', 'MM': None, 'DD': None, 'Www': '01', + 'D': None, 'DDD': None}, + datetime.date(2010, 1, 4), 0), + ({'YYYY': '2009', 'MM': None, 'DD': None, 'Www': '53', + 'D': None, 'DDD': None}, + datetime.date(2009, 12, 28), 0), + ({'YYYY': '2009', 'MM': None, 'DD': None, 'Www': '01', + 'D': '1', 'DDD': None}, + datetime.date(2008, 12, 29), 0), + ({'YYYY': '2009', 'MM': None, 'DD': None, 'Www': '53', + 'D': '7', 'DDD': None}, + datetime.date(2010, 1, 3), 6), + ({'YYYY': '2010', 'MM': None, 'DD': None, 'Www': '01', + 'D': '1', 'DDD': None}, + datetime.date(2010, 1, 4), 0), + ({'YYYY': '2004', 'MM': None, 'DD': None, 'Www': '53', + 'D': '6', 'DDD': None}, + datetime.date(2005, 1, 1), 5)) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_date(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + self.assertEqual(result.weekday(), testtuple[2]) + + def test_build_date_bounds_checking(self): + #0 isn't a valid week number + with self.assertRaises(WeekOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='2003', Www='00') + + #Week must not be larger than 53 + with self.assertRaises(WeekOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='2004', Www='54') + + #0 isn't a valid day number + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='2001', Www='02', D='0') + + #Day must not be larger than 7 + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='2001', Www='02', D='8') + + #0 isn't a valid year for a Python builder + with self.assertRaises(YearOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='0000') + + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='1981', DDD='000') + + #Day 366 is only valid on a leap year + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='1981', DDD='366') + + #Day must me 365, or 366, not larger + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder.build_date(YYYY='1981', DDD='367') + + def test_build_time(self): + testtuples = (({}, datetime.time()), + ({'hh': '12.5'}, + datetime.time(hour=12, minute=30)), + ({'hh': '23.99999999997'}, + datetime.time(hour=23, minute=59, second=59, + microsecond=999999)), + ({'hh': '1', 'mm': '23'}, + datetime.time(hour=1, minute=23)), + ({'hh': '1', 'mm': '23.4567'}, + datetime.time(hour=1, minute=23, second=27, + microsecond=402000)), + ({'hh': '14', 'mm': '43.999999997'}, + datetime.time(hour=14, minute=43, second=59, + microsecond=999999)), + ({'hh': '1', 'mm': '23', 'ss': '45'}, + datetime.time(hour=1, minute=23, second=45)), + ({'hh': '23', 'mm': '21', 'ss': '28.512400'}, + datetime.time(hour=23, minute=21, second=28, + microsecond=512400)), + ({'hh': '01', 'mm': '03', 'ss': '11.858714'}, + datetime.time(hour=1, minute=3, second=11, + microsecond=858714)), + ({'hh': '14', 'mm': '43', 'ss': '59.9999997'}, + datetime.time(hour=14, minute=43, second=59, + microsecond=999999)), + ({'hh': '24'}, datetime.time(hour=0)), + ({'hh': '24', 'mm': '00'}, datetime.time(hour=0)), + ({'hh': '24', 'mm': '00', 'ss': '00'}, + datetime.time(hour=0)), + ({'tz': (False, None, '00', '00', 'UTC', 'timezone')}, + datetime.time(tzinfo=UTCOffset(name='UTC', minutes=0))), + ({'hh': '23', 'mm': '21', 'ss': '28.512400', + 'tz': (False, None, '00', '00', '+00:00', 'timezone')}, + datetime.time(hour=23, minute=21, second=28, + microsecond=512400, + tzinfo=UTCOffset(name='+00:00', + minutes=0))), + ({'hh': '1', 'mm': '23', + 'tz': (False, None, '01', '00', '+1', 'timezone')}, + datetime.time(hour=1, minute=23, + tzinfo=UTCOffset(name='+1', + minutes=60))), + ({'hh': '1', 'mm': '23.4567', + 'tz': (True, None, '01', '00', '-1', 'timezone')}, + datetime.time(hour=1, minute=23, second=27, + microsecond=402000, + tzinfo=UTCOffset(name='-1', + minutes=-60))), + ({'hh': '23', 'mm': '21', 'ss': '28.512400', + 'tz': (False, None, '01', '30', '+1:30', 'timezone')}, + datetime.time(hour=23, minute=21, second=28, + microsecond=512400, + tzinfo=UTCOffset(name='+1:30', + minutes=90))), + ({'hh': '23', 'mm': '21', 'ss': '28.512400', + 'tz': (False, None, '11', '15', '+11:15', 'timezone')}, + datetime.time(hour=23, minute=21, second=28, + microsecond=512400, + tzinfo=UTCOffset(name='+11:15', + minutes=675))), + ({'hh': '23', 'mm': '21', 'ss': '28.512400', + 'tz': (False, None, '12', '34', '+12:34', 'timezone')}, + datetime.time(hour=23, minute=21, second=28, + microsecond=512400, + tzinfo=UTCOffset(name='+12:34', + minutes=754))), + ({'hh': '23', 'mm': '21', 'ss': '28.512400', + 'tz': (False, None, '00', '00', 'UTC', 'timezone')}, + datetime.time(hour=23, minute=21, second=28, + microsecond=512400, + tzinfo=UTCOffset(name='UTC', + minutes=0))), + #Make sure we truncate, not round + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + #https://bitbucket.org/nielsenb/aniso8601/issues/21/sub-microsecond-precision-is-lost-when + ({'hh': '14.9999999999999999'}, + datetime.time(hour=14, minute=59, second=59, + microsecond=999999)), + ({'mm': '0.00000000999'}, + datetime.time()), + ({'mm': '0.0000000999'}, + datetime.time(microsecond=5)), + ({'ss': '0.0000001'}, + datetime.time()), + ({'ss': '2.0000048'}, + datetime.time(second=2, + microsecond=4))) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_time(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_time_bounds_checking(self): + #Leap seconds not supported + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + #https://bitbucket.org/nielsenb/aniso8601/issues/13/parsing-of-leap-second-gives-wildly + with self.assertRaises(LeapSecondError): + PythonTimeBuilder.build_time(hh='23', mm='59', ss='60') + + with self.assertRaises(LeapSecondError): + PythonTimeBuilder.build_time(hh='23', mm='59', ss='60', + tz=UTCOffset(name='UTC', minutes=0)) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='00', ss='60') + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='00', ss='60', + tz=UTCOffset(name='UTC', minutes=0)) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='00', ss='61') + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='00', ss='61', + tz=UTCOffset(name='UTC', minutes=0)) + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='61') + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='61', + tz=UTCOffset(name='UTC', minutes=0)) + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='60') + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_time(hh='00', mm='60.1') + + with self.assertRaises(HoursOutOfBoundsError): + PythonTimeBuilder.build_time(hh='25') + + #Hour 24 can only represent midnight + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh='24', mm='00', ss='01') + + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh='24', mm='00.1') + + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh='24', mm='01') + + with self.assertRaises(MidnightBoundsError): + PythonTimeBuilder.build_time(hh='24.1') + + def test_build_datetime(self): + testtuples = (((('2019', '06', '05', None, None, None, 'date'), + ('01', '03', '11.858714', None, 'time')), + datetime.datetime(2019, 6, 5, hour=1, minute=3, + second=11, microsecond=858714)), + ((('1234', '02', '03', None, None, None, 'date'), + ('23', '21', '28.512400', None, 'time')), + datetime.datetime(1234, 2, 3, hour=23, minute=21, + second=28, microsecond=512400)), + ((('1981', '04', '05', None, None, None, 'date'), + ('23', '21', '28.512400', + (False, None, '11', '15', '+11:15', 'timezone'), + 'time')), + datetime.datetime(1981, 4, 5, hour=23, minute=21, + second=28, microsecond=512400, + tzinfo=UTCOffset(name='+11:15', + minutes=675)))) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_datetime(*testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_datetime_bounds_checking(self): + #Leap seconds not supported + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + #https://bitbucket.org/nielsenb/aniso8601/issues/13/parsing-of-leap-second-gives-wildly + with self.assertRaises(LeapSecondError): + PythonTimeBuilder.build_datetime(('2016', '12', '31', + None, None, None, 'date'), + ('23', '59', '60', None, 'time')) + + with self.assertRaises(LeapSecondError): + PythonTimeBuilder.build_datetime(('2016', '12', '31', + None, None, None, 'date'), + ('23', '59', '60', + (False, None, '00', '00', + '+00:00', 'timezone'), 'time')) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '00', '60', None, 'time')) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '00', '60', + (False, None, '00', '00', + '+00:00', 'timezone'), 'time')) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '00', '61', None, 'time')) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '00', '61', + (False, None, '00', '00', + '+00:00', 'timezone'), 'time')) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '59', '61', None, 'time')) + + with self.assertRaises(SecondsOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '59', '61', + (False, None, '00', '00', + '+00:00', 'timezone'), 'time')) + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '61', None, None, 'time')) + + with self.assertRaises(MinutesOutOfBoundsError): + PythonTimeBuilder.build_datetime(('1981', '04', '05', + None, None, None, 'date'), + ('00', '61', None, + (False, None, '00', '00', + '+00:00', 'timezone'), 'time')) + + def test_build_duration(self): + testtuples = (({'PnY': '1', 'PnM': '2', 'PnD': '3', + 'TnH': '4', 'TnM': '54', 'TnS': '6'}, + datetime.timedelta(days=428, hours=4, + minutes=54, seconds=6)), + ({'PnY': '1', 'PnM': '2', 'PnD': '3', + 'TnH': '4', 'TnM': '54', 'TnS': '6.5'}, + datetime.timedelta(days=428, hours=4, + minutes=54, seconds=6.5)), + ({'PnY': '1', 'PnM': '2', 'PnD': '3'}, + datetime.timedelta(days=428)), + ({'PnY': '1', 'PnM': '2', 'PnD': '3.5'}, + datetime.timedelta(days=428.5)), + ({'TnH': '4', 'TnM': '54', 'TnS': '6.5'}, + datetime.timedelta(hours=4, minutes=54, seconds=6.5)), + ({'TnH': '1', 'TnM': '3', 'TnS': '11.858714'}, + datetime.timedelta(hours=1, minutes=3, + seconds=11, microseconds=858714)), + ({'TnH': '4', 'TnM': '54', 'TnS': '28.512400'}, + datetime.timedelta(hours=4, minutes=54, + seconds=28, microseconds=512400)), + #Make sure we truncate, not round + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + #https://bitbucket.org/nielsenb/aniso8601/issues/21/sub-microsecond-precision-is-lost-when + ({'PnY': '1999.9999999999999999'}, + datetime.timedelta(days=729999, seconds=86399, + microseconds=999999)), + ({'PnM': '1.9999999999999999'}, + datetime.timedelta(days=59, hours=23, + minutes=59, seconds=59, + microseconds=999999)), + ({'PnW': '1.9999999999999999'}, + datetime.timedelta(days=13, hours=23, + minutes=59, seconds=59, + microseconds=999999)), + ({'PnD': '1.9999999999999999'}, + datetime.timedelta(days=1, hours=23, + minutes=59, seconds=59, + microseconds=999999)), + ({'TnH': '14.9999999999999999'}, + datetime.timedelta(hours=14, minutes=59, + seconds=59, microseconds=999999)), + ({'TnM': '0.00000000999'}, datetime.timedelta(0)), + ({'TnM': '0.0000000999'}, + datetime.timedelta(microseconds=5)), + ({'TnS': '0.0000001'}, datetime.timedelta(0)), + ({'TnS': '2.0000048'}, + datetime.timedelta(seconds=2, microseconds=4)), + ({'PnY': '1'}, datetime.timedelta(days=365)), + ({'PnY': '1.5'}, datetime.timedelta(days=547.5)), + ({'PnM': '1'}, datetime.timedelta(days=30)), + ({'PnM': '1.5'}, datetime.timedelta(days=45)), + ({'PnW': '1'}, datetime.timedelta(days=7)), + ({'PnW': '1.5'}, datetime.timedelta(days=10.5)), + ({'PnD': '1'}, datetime.timedelta(days=1)), + ({'PnD': '1.5'}, datetime.timedelta(days=1.5)), + ({'PnY': '0003', 'PnM': '06', 'PnD': '04', + 'TnH': '12', 'TnM': '30', 'TnS': '05'}, + datetime.timedelta(days=1279, hours=12, + minutes=30, seconds=5)), + ({'PnY': '0003', 'PnM': '06', 'PnD': '04', + 'TnH': '12', 'TnM': '30', 'TnS': '05.5'}, + datetime.timedelta(days=1279, hours=12, + minutes=30, seconds=5.5)), + #Make sure we truncate, not round + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + ({'PnY': '0001', 'PnM': '02', 'PnD': '03', + 'TnH': '14', 'TnM': '43', 'TnS': '59.9999997'}, + datetime.timedelta(days=428, hours=14, + minutes=43, seconds=59, + microseconds=999999)), + #Verify overflows + ({'TnH': '36'}, datetime.timedelta(days=1, hours=12))) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_duration(**testtuple[0]) + self.assertEqual(result, testtuple[1]) + + def test_build_interval(self): + testtuples = (({'end': (('1981', '04', '05', None, None, None, 'date'), + ('01', '01', '00', None, 'time'), 'datetime'), + 'duration': (None, '1', None, None, None, None, None, + 'duration')}, + datetime.datetime(year=1981, month=4, day=5, + hour=1, minute=1), + datetime.datetime(year=1981, month=3, day=6, + hour=1, minute=1)), + ({'end': ('1981', '04', '05', None, None, None, 'date'), + 'duration': (None, '1', None, None, None, None, None, + 'duration')}, + datetime.date(year=1981, month=4, day=5), + datetime.date(year=1981, month=3, day=6)), + ({'end': ('2018', '03', '06', None, None, None, 'date'), + 'duration': ('1.5', None, None, None, None, None, None, + 'duration')}, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2016, month=9, day=4, + hour=12)), + ({'end': ('2014', '11', '12', None, None, None, 'date'), + 'duration': (None, None, None, None, '1', None, None, + 'duration')}, + datetime.date(year=2014, month=11, day=12), + datetime.datetime(year=2014, month=11, day=11, + hour=23)), + ({'end': ('2014', '11', '12', None, None, None, 'date'), + 'duration': (None, None, None, None, '4', '54', '6.5', + 'duration')}, + datetime.date(year=2014, month=11, day=12), + datetime.datetime(year=2014, month=11, day=11, + hour=19, minute=5, second=53, + microsecond=500000)), + ({'end': (('2050', '03', '01', + None, None, None, 'date'), + ('13', '00', '00', + (False, True, None, None, + 'Z', 'timezone'), 'time'), 'datetime'), + 'duration': (None, None, None, + None, '10', None, None, 'duration')}, + datetime.datetime(year=2050, month=3, day=1, + hour=13, + tzinfo=UTCOffset(name='UTC', + minutes=0)), + datetime.datetime(year=2050, month=3, day=1, + hour=3, + tzinfo=UTCOffset(name='UTC', + minutes=0))), + #Make sure we truncate, not round + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + #https://bitbucket.org/nielsenb/aniso8601/issues/21/sub-microsecond-precision-is-lost-when + ({'end': ('2000', '01', '01', + None, None, None, 'date'), + 'duration': ('1999.9999999999999999', None, None, + None, None, None, + None, 'duration')}, + datetime.date(year=2000, month=1, day=1), + datetime.datetime(year=1, month=4, day=30, + hour=0, minute=0, second=0, + microsecond=1)), + ({'end': ('1989', '03', '01', + None, None, None, 'date'), + 'duration': (None, '1.9999999999999999', None, + None, None, None, + None, 'duration')}, + datetime.date(year=1989, month=3, day=1), + datetime.datetime(year=1988, month=12, day=31, + hour=0, minute=0, second=0, + microsecond=1)), + ({'end': ('1989', '03', '01', + None, None, None, 'date'), + 'duration': (None, None, '1.9999999999999999', + None, None, None, + None, 'duration')}, + datetime.date(year=1989, month=3, day=1), + datetime.datetime(year=1989, month=2, day=15, + hour=0, minute=0, second=0, + microsecond=1)), + ({'end': ('1989', '03', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + '1.9999999999999999', None, None, + None, 'duration')}, + datetime.date(year=1989, month=3, day=1), + datetime.datetime(year=1989, month=2, day=27, + hour=0, minute=0, second=0, + microsecond=1)), + ({'end': ('2001', '01', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + None, '14.9999999999999999', None, + None, 'duration')}, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2000, month=12, day=31, + hour=9, minute=0, second=0, + microsecond=1)), + ({'end': ('2001', '01', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + None, None, '0.00000000999', + None, 'duration')}, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2001, month=1, day=1)), + ({'end': ('2001', '01', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + None, None, '0.0000000999', + None, 'duration')}, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2000, month=12, day=31, + hour=23, minute=59, second=59, + microsecond=999995)), + ({'end': ('2018', '03', '06', None, None, None, 'date'), + 'duration': (None, None, None, + None, None, None, + '0.0000001', 'duration')}, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2018, month=3, day=6)), + ({'end': ('2018', '03', '06', None, None, None, 'date'), + 'duration': (None, None, None, + None, None, None, + '2.0000048', 'duration')}, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2018, month=3, day=5, + hour=23, minute=59, second=57, + microsecond=999996)), + ({'start': (('1981', '04', '05', + None, None, None, 'date'), + ('01', '01', '00', None, 'time'), + 'datetime'), + 'duration': (None, '1', None, + '1', None, '1', None, 'duration')}, + datetime.datetime(year=1981, month=4, day=5, + hour=1, minute=1), + datetime.datetime(year=1981, month=5, day=6, + hour=1, minute=2)), + ({'start': ('1981', '04', '05', + None, None, None, 'date'), + 'duration': (None, '1', None, + '1', None, None, None, 'duration')}, + datetime.date(year=1981, month=4, day=5), + datetime.date(year=1981, month=5, day=6)), + ({'start': ('2018', '03', '06', + None, None, None, 'date'), + 'duration': (None, '2.5', None, + None, None, None, None, 'duration')}, + datetime.date(year=2018, month=3, day=6), + datetime.date(year=2018, month=5, day=20)), + ({'start': ('2014', '11', '12', + None, None, None, 'date'), + 'duration': (None, None, None, + None, '1', None, None, 'duration')}, + datetime.date(year=2014, month=11, day=12), + datetime.datetime(year=2014, month=11, day=12, + hour=1, minute=0)), + ({'start': ('2014', '11', '12', + None, None, None, 'date'), + 'duration': (None, None, None, + None, '4', '54', '6.5', 'duration')}, + datetime.date(year=2014, month=11, day=12), + datetime.datetime(year=2014, month=11, day=12, + hour=4, minute=54, second=6, + microsecond=500000)), + ({'start': (('2050', '03', '01', + None, None, None, 'date'), + ('13', '00', '00', + (False, True, None, None, + 'Z', 'timezone'), 'time'), 'datetime'), + 'duration': (None, None, None, + None, '10', None, None, 'duration')}, + datetime.datetime(year=2050, month=3, day=1, + hour=13, + tzinfo=UTCOffset(name='UTC', + minutes=0)), + datetime.datetime(year=2050, month=3, day=1, + hour=23, + tzinfo=UTCOffset(name='UTC', + minutes=0))), + #Make sure we truncate, not round + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + ({'start': ('0001', '01', '01', + None, None, None, 'date'), + 'duration': ('1999.9999999999999999', None, None, + None, None, None, + None, 'duration')}, + datetime.date(year=1, month=1, day=1), + datetime.datetime(year=1999, month=9, day=3, + hour=23, minute=59, second=59, + microsecond=999999)), + ({'start': ('1989', '03', '01', + None, None, None, 'date'), + 'duration': (None, '1.9999999999999999', None, + None, None, None, + None, 'duration')}, + datetime.date(year=1989, month=3, day=1), + datetime.datetime(year=1989, month=4, day=29, + hour=23, minute=59, second=59, + microsecond=999999)), + ({'start': ('1989', '03', '01', + None, None, None, 'date'), + 'duration': (None, None, '1.9999999999999999', + None, None, None, + None, 'duration')}, + datetime.date(year=1989, month=3, day=1), + datetime.datetime(year=1989, month=3, day=14, + hour=23, minute=59, second=59, + microsecond=999999)), + ({'start': ('1989', '03', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + '1.9999999999999999', None, None, + None, 'duration')}, + datetime.date(year=1989, month=3, day=1), + datetime.datetime(year=1989, month=3, day=2, + hour=23, minute=59, second=59, + microsecond=999999)), + ({'start': ('2001', '01', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + None, '14.9999999999999999', None, + None, 'duration')}, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2001, month=1, day=1, + hour=14, minute=59, second=59, + microsecond=999999)), + ({'start': ('2001', '01', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + None, None, '0.00000000999', + None, 'duration')}, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2001, month=1, day=1)), + ({'start': ('2001', '01', '01', + None, None, None, 'date'), + 'duration': (None, None, None, + None, None, '0.0000000999', + None, 'duration')}, + datetime.date(year=2001, month=1, day=1), + datetime.datetime(year=2001, month=1, day=1, + hour=0, minute=0, second=0, + microsecond=5)), + ({'start': ('2018', '03', '06', + None, None, None, 'date'), + 'duration': (None, None, None, + None, None, None, + '0.0000001', 'duration')}, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2018, month=3, day=6)), + ({'start': ('2018', '03', '06', + None, None, None, 'date'), + 'duration': (None, None, None, + None, None, None, + '2.0000048', 'duration')}, + datetime.date(year=2018, month=3, day=6), + datetime.datetime(year=2018, month=3, day=6, + hour=0, minute=0, second=2, + microsecond=4)), + ({'start': (('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + 'end': (('1981', '04', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime')}, + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1), + datetime.datetime(year=1981, month=4, day=5, + hour=1, minute=1)), + ({'start': (('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + 'end': ('1981', '04', '05', + None, None, None, 'date')}, + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1), + datetime.date(year=1981, month=4, day=5)), + ({'start': ('1980', '03', '05', + None, None, None, 'date'), + 'end': (('1981', '04', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime')}, + datetime.date(year=1980, month=3, day=5), + datetime.datetime(year=1981, month=4, day=5, + hour=1, minute=1)), + ({'start': ('1980', '03', '05', + None, None, None, 'date'), + 'end': ('1981', '04', '05', + None, None, None, 'date')}, + datetime.date(year=1980, month=3, day=5), + datetime.date(year=1981, month=4, day=5)), + ({'start': ('1981', '04', '05', + None, None, None, 'date'), + 'end': ('1980', '03', '05', + None, None, None, 'date')}, + datetime.date(year=1981, month=4, day=5), + datetime.date(year=1980, month=3, day=5)), + ({'start': (('2050', '03', '01', + None, None, None, 'date'), + ('13', '00', '00', + (False, True, None, None, + 'Z', 'timezone'), 'time'), 'datetime'), + 'end': (('2050', '05', '11', + None, None, None, 'date'), + ('15', '30', '00', + (False, True, None, None, + 'Z', 'timezone'), 'time'), 'datetime')}, + datetime.datetime(year=2050, month=3, day=1, + hour=13, + tzinfo=UTCOffset(name='UTC', + minutes=0)), + datetime.datetime(year=2050, month=5, day=11, + hour=15, minute=30, + tzinfo=UTCOffset(name='UTC', + minutes=0))), + #Make sure we truncate, not round + #https://bitbucket.org/nielsenb/aniso8601/issues/10/sub-microsecond-precision-in-durations-is + ({'start': (('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00.0000001', + None, 'time'), 'datetime'), + 'end': (('1981', '04', '05', + None, None, None, 'date'), + ('14', '43', '59.9999997', None, 'time'), + 'datetime')}, + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1), + datetime.datetime(year=1981, month=4, day=5, + hour=14, minute=43, second=59, + microsecond=999999))) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_interval(**testtuple[0]) + self.assertEqual(result[0], testtuple[1]) + self.assertEqual(result[1], testtuple[2]) + + def test_build_repeating_interval(self): + args = {'Rnn': '3', 'interval': (('1981', '04', '05', + None, None, None, 'date'), + None, + (None, None, None, + '1', None, None, + None, 'duration'), + 'interval')} + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + self.assertEqual(results[0], datetime.date(year=1981, month=4, day=5)) + self.assertEqual(results[1], datetime.date(year=1981, month=4, day=6)) + self.assertEqual(results[2], datetime.date(year=1981, month=4, day=7)) + + args = {'Rnn': '11', 'interval': (None, + (('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + (None, None, None, + None, '1', '2', + None, 'duration'), + 'interval')} + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + for dateindex in compat.range(0, 11): + self.assertEqual(results[dateindex], + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1) + - dateindex * datetime.timedelta(hours=1, + minutes=2)) + + args = {'Rnn': '2', 'interval': ((('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + (('1981', '04', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + None, + 'interval')} + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + self.assertEqual(results[0], + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1)) + self.assertEqual(results[1], + datetime.datetime(year=1981, month=4, day=5, + hour=1, minute=1)) + + args = {'Rnn': '2', 'interval': ((('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + (('1981', '04', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + None, + 'interval')} + results = list(PythonTimeBuilder.build_repeating_interval(**args)) + + self.assertEqual(results[0], + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1)) + self.assertEqual(results[1], + datetime.datetime(year=1981, month=4, day=5, + hour=1, minute=1)) + + args = {'R': True, 'interval': (None, + (('1980', '03', '05', + None, None, None, 'date'), + ('01', '01', '00', + None, 'time'), 'datetime'), + (None, None, None, + None, '1', '2', None, 'duration'), + 'interval')} + resultgenerator = PythonTimeBuilder.build_repeating_interval(**args) + + #Test the first 11 generated + for dateindex in compat.range(0, 11): + self.assertEqual(next(resultgenerator), + datetime.datetime(year=1980, month=3, day=5, + hour=1, minute=1) + - dateindex * datetime.timedelta(hours=1, + minutes=2)) + + def test_build_timezone(self): + testtuples = (({'Z': True, 'name': 'Z'}, + datetime.timedelta(hours=0), 'UTC'), + ({'negative': False, 'hh': '00', 'mm': '00', + 'name': '+00:00'}, + datetime.timedelta(hours=0), '+00:00'), + ({'negative': False, 'hh': '01', 'mm': '00', + 'name': '+01:00'}, + datetime.timedelta(hours=1), '+01:00'), + ({'negative': True, 'hh': '01', 'mm': '00', + 'name': '-01:00'}, + -datetime.timedelta(hours=1), '-01:00'), + ({'negative': False, 'hh': '00', 'mm': '12', + 'name': '+00:12'}, + datetime.timedelta(minutes=12), '+00:12'), + ({'negative': False, 'hh': '01', 'mm': '23', + 'name': '+01:23'}, + datetime.timedelta(hours=1, minutes=23), '+01:23'), + ({'negative': True, 'hh': '01', 'mm': '23', + 'name': '-01:23'}, + -datetime.timedelta(hours=1, minutes=23), '-01:23'), + ({'negative': False, 'hh': '00', + 'name': '+00'}, + datetime.timedelta(hours=0), '+00'), + ({'negative': False, 'hh': '01', + 'name': '+01'}, + datetime.timedelta(hours=1), '+01'), + ({'negative': True, 'hh': '01', + 'name': '-01'}, + -datetime.timedelta(hours=1), '-01'), + ({'negative': False, 'hh': '12', + 'name': '+12'}, + datetime.timedelta(hours=12), '+12'), + ({'negative': True, 'hh': '12', + 'name': '-12'}, + -datetime.timedelta(hours=12), '-12')) + + for testtuple in testtuples: + result = PythonTimeBuilder.build_timezone(**testtuple[0]) + self.assertEqual(result.utcoffset(None), testtuple[1]) + self.assertEqual(result.tzname(None), testtuple[2]) + + def test_build_week_date(self): + weekdate = PythonTimeBuilder._build_week_date(2009, 1) + self.assertEqual(weekdate, datetime.date(year=2008, month=12, day=29)) + + weekdate = PythonTimeBuilder._build_week_date(2009, 53, isoday=7) + self.assertEqual(weekdate, datetime.date(year=2010, month=1, day=3)) + + def test_build_ordinal_date(self): + ordinaldate = PythonTimeBuilder._build_ordinal_date(1981, 95) + self.assertEqual(ordinaldate, datetime.date(year=1981, month=4, day=5)) + + def test_build_ordinal_date_bounds_checking(self): + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder._build_ordinal_date(1234, 0) + + with self.assertRaises(DayOutOfBoundsError): + PythonTimeBuilder._build_ordinal_date(1234, 367) + + def test_iso_year_start(self): + yearstart = PythonTimeBuilder._iso_year_start(2004) + self.assertEqual(yearstart, datetime.date(year=2003, month=12, day=29)) + + yearstart = PythonTimeBuilder._iso_year_start(2010) + self.assertEqual(yearstart, datetime.date(year=2010, month=1, day=4)) + + yearstart = PythonTimeBuilder._iso_year_start(2009) + self.assertEqual(yearstart, datetime.date(year=2008, month=12, day=29)) + + def test_date_generator(self): + startdate = datetime.date(year=2018, month=8, day=29) + timedelta = datetime.timedelta(days=1) + iterations = 10 + + generator = PythonTimeBuilder._date_generator(startdate, + timedelta, + iterations) + + results = list(generator) + + for dateindex in compat.range(0, 10): + self.assertEqual(results[dateindex], + datetime.date(year=2018, month=8, day=29) + + dateindex * datetime.timedelta(days=1)) + + def test_date_generator_unbounded(self): + startdate = datetime.date(year=2018, month=8, day=29) + timedelta = datetime.timedelta(days=5) + + generator = PythonTimeBuilder._date_generator_unbounded(startdate, + timedelta) + + #Check the first 10 results + for dateindex in compat.range(0, 10): + self.assertEqual(next(generator), + datetime.date(year=2018, month=8, day=29) + + dateindex * datetime.timedelta(days=5)) + + def test_split_to_microseconds(self): + result = PythonTimeBuilder._split_to_microseconds('1.1', int(1e6), 'dummy') + + self.assertEqual(result, (1, 100000)) + self.assertIsInstance(result[0], int) + self.assertIsInstance(result[1], int) + + result = PythonTimeBuilder._split_to_microseconds('1.000001', int(1e6), 'dummy') + + self.assertEqual(result, (1, 1)) + self.assertIsInstance(result[0], int) + self.assertIsInstance(result[1], int) + + result = PythonTimeBuilder._split_to_microseconds('1.0000001', int(1e6), 'dummy') + + self.assertEqual(result, (1, 0)) + self.assertIsInstance(result[0], int) + self.assertIsInstance(result[1], int) + + def test_split_to_microseconds_exception(self): + with self.assertRaises(ISOFormatError) as e: + PythonTimeBuilder._split_to_microseconds('b.1', int(1e6), 'exception text') + + self.assertEqual(str(e.exception), 'exception text') + + with self.assertRaises(ISOFormatError) as e: + PythonTimeBuilder._split_to_microseconds('1.ad', int(1e6), 'exception text') + + self.assertEqual(str(e.exception), 'exception text') + + def test_distribute_microseconds(self): + self.assertEqual(PythonTimeBuilder._distribute_microseconds(1, (), ()), (1,)) + self.assertEqual(PythonTimeBuilder._distribute_microseconds(11, (0,), (10,)), (1, 1)) + self.assertEqual(PythonTimeBuilder._distribute_microseconds(211, (0, 0), (100, 10)), (2, 1, 1)) + + self.assertEqual(PythonTimeBuilder._distribute_microseconds(1, (), ()), (1,)) + self.assertEqual(PythonTimeBuilder._distribute_microseconds(11, (5,), (10,)), (6, 1)) + self.assertEqual(PythonTimeBuilder._distribute_microseconds(211, (10, 5), (100, 10)), (12, 6, 1)) diff --git a/project/env/lib/python3.7/site-packages/aniso8601/compat.py b/project/env/lib/python3.7/site-packages/aniso8601/compat.py new file mode 100644 index 0000000..f824ba1 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/compat.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +import sys + +PY2 = sys.version_info[0] == 2 + +if PY2: + range = xrange +else: + range = range diff --git a/project/env/lib/python3.7/site-packages/aniso8601/date.py b/project/env/lib/python3.7/site-packages/aniso8601/date.py new file mode 100644 index 0000000..cc0291a --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/date.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +from aniso8601.exceptions import ISOFormatError +from aniso8601.builders.python import PythonTimeBuilder +from aniso8601.resolution import DateResolution + +def get_date_resolution(isodatestr): + #Valid string formats are: + # + #Y[YYY] + #YYYY-MM-DD + #YYYYMMDD + #YYYY-MM + #YYYY-Www + #YYYYWww + #YYYY-Www-D + #YYYYWwwD + #YYYY-DDD + #YYYYDDD + if isodatestr.startswith('+') or isodatestr.startswith('-'): + raise NotImplementedError('ISO 8601 extended year representation ' + 'not supported.') + + if isodatestr[0].isdigit() is False or isodatestr[-1].isdigit() is False: + raise ISOFormatError('"{0}" is not a valid ISO 8601 date.' + .format(isodatestr)) + + if isodatestr.find('W') != -1: + #Handle ISO 8601 week date format + hyphens_present = 1 if isodatestr.find('-') != -1 else 0 + week_date_len = 7 + hyphens_present + weekday_date_len = 8 + 2 * hyphens_present + + if len(isodatestr) == week_date_len: + #YYYY-Www + #YYYYWww + return DateResolution.Week + elif len(isodatestr) == weekday_date_len: + #YYYY-Www-D + #YYYYWwwD + return DateResolution.Weekday + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 week date.' + .format(isodatestr)) + + #If the size of the string of 4 or less, + #assume its a truncated year representation + if len(isodatestr) <= 4: + return DateResolution.Year + + #An ISO string may be a calendar represntation if: + # 1) When split on a hyphen, the sizes of the parts are 4, 2, 2 or 4, 2 + # 2) There are no hyphens, and the length is 8 + datestrsplit = isodatestr.split('-') + + #Check case 1 + if len(datestrsplit) == 2: + if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 2: + return DateResolution.Month + + if len(datestrsplit) == 3: + if (len(datestrsplit[0]) == 4 + and len(datestrsplit[1]) == 2 + and len(datestrsplit[2]) == 2): + return DateResolution.Day + + #Check case 2 + if len(isodatestr) == 8 and isodatestr.find('-') == -1: + return DateResolution.Day + + #An ISO string may be a ordinal date representation if: + # 1) When split on a hyphen, the sizes of the parts are 4, 3 + # 2) There are no hyphens, and the length is 7 + + #Check case 1 + if len(datestrsplit) == 2: + if len(datestrsplit[0]) == 4 and len(datestrsplit[1]) == 3: + return DateResolution.Ordinal + + #Check case 2 + if len(isodatestr) == 7 and isodatestr.find('-') == -1: + return DateResolution.Ordinal + + #None of the date representations match + raise ISOFormatError('"{0}" is not an ISO 8601 date, perhaps it ' + 'represents a time or datetime.'.format(isodatestr)) + +def parse_date(isodatestr, builder=PythonTimeBuilder): + #Given a string in any ISO 8601 date format, return a datetime.date + #object that corresponds to the given date. Valid string formats are: + # + #Y[YYY] + #YYYY-MM-DD + #YYYYMMDD + #YYYY-MM + #YYYY-Www + #YYYYWww + #YYYY-Www-D + #YYYYWwwD + #YYYY-DDD + #YYYYDDD + # + #Note that the ISO 8601 date format of ±YYYYY is expressly not supported + return _RESOLUTION_MAP[get_date_resolution(isodatestr)](isodatestr, + builder) + +def _parse_year(yearstr, builder): + #yearstr is of the format Y[YYY] + return builder.build_date(YYYY=yearstr) + +def _parse_calendar_day(datestr, builder): + #datestr is of the format YYYY-MM-DD or YYYYMMDD + if len(datestr) == 10: + #YYYY-MM-DD + yearstr = datestr[0:4] + monthstr = datestr[5:7] + daystr = datestr[8:] + elif len(datestr) == 8: + #YYYYMMDD + yearstr = datestr[0:4] + monthstr = datestr[4:6] + daystr = datestr[6:] + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 calendar day.' + .format(datestr)) + + return builder.build_date(YYYY=yearstr, MM=monthstr, DD=daystr) + +def _parse_calendar_month(datestr, builder): + #datestr is of the format YYYY-MM + if len(datestr) != 7: + raise ISOFormatError('"{0}" is not a valid ISO 8601 calendar month.' + .format(datestr)) + + yearstr = datestr[0:4] + monthstr = datestr[5:] + + return builder.build_date(YYYY=yearstr, MM=monthstr) + +def _parse_week_day(datestr, builder): + #datestr is of the format YYYY-Www-D, YYYYWwwD + # + #W is the week number prefix, ww is the week number, between 1 and 53 + #0 is not a valid week number, which differs from the Python implementation + # + #D is the weekday number, between 1 and 7, which differs from the Python + #implementation which is between 0 and 6 + + yearstr = datestr[0:4] + + #Week number will be the two characters after the W + windex = datestr.find('W') + weekstr = datestr[windex + 1:windex + 3] + + if datestr.find('-') != -1 and len(datestr) == 10: + #YYYY-Www-D + daystr = datestr[9:10] + elif len(datestr) == 8: + #YYYYWwwD + daystr = datestr[7:8] + else: + raise ISOFormatError('"{0}" is not a valid ISO 8601 week date.' + .format(datestr)) + + return builder.build_date(YYYY=yearstr, Www=weekstr, D=daystr) + +def _parse_week(datestr, builder): + #datestr is of the format YYYY-Www, YYYYWww + # + #W is the week number prefix, ww is the week number, between 1 and 53 + #0 is not a valid week number, which differs from the Python implementation + + yearstr = datestr[0:4] + + #Week number will be the two characters after the W + windex = datestr.find('W') + weekstr = datestr[windex + 1:windex + 3] + + return builder.build_date(YYYY=yearstr, Www=weekstr) + +def _parse_ordinal_date(datestr, builder): + #datestr is of the format YYYY-DDD or YYYYDDD + #DDD can be from 1 - 36[5,6], this matches Python's definition + + yearstr = datestr[0:4] + + if datestr.find('-') != -1: + #YYYY-DDD + daystr = datestr[(datestr.find('-') + 1):] + else: + #YYYYDDD + daystr = datestr[4:] + + return builder.build_date(YYYY=yearstr, DDD=daystr) + +_RESOLUTION_MAP = { + DateResolution.Day: _parse_calendar_day, + DateResolution.Ordinal: _parse_ordinal_date, + DateResolution.Month: _parse_calendar_month, + DateResolution.Week: _parse_week, + DateResolution.Weekday: _parse_week_day, + DateResolution.Year: _parse_year +} diff --git a/project/env/lib/python3.7/site-packages/aniso8601/decimalfraction.py b/project/env/lib/python3.7/site-packages/aniso8601/decimalfraction.py new file mode 100644 index 0000000..528284d --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/decimalfraction.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +def find_separator(value): + """Returns the decimal separator index if found else -1.""" + return normalize(value).find('.') + +def normalize(value): + """Returns the string that the decimal separators are normalized.""" + return value.replace(',', '.') diff --git a/project/env/lib/python3.7/site-packages/aniso8601/duration.py b/project/env/lib/python3.7/site-packages/aniso8601/duration.py new file mode 100644 index 0000000..7012ca9 --- /dev/null +++ b/project/env/lib/python3.7/site-packages/aniso8601/duration.py @@ -0,0 +1,281 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2019, Brandon Nielsen +# All rights reserved. +# +# This software may be modified and distributed under the terms +# of the BSD license. See the LICENSE file for details. + +from aniso8601 import compat +from aniso8601.builders import TupleBuilder +from aniso8601.builders.python import PythonTimeBuilder +from aniso8601.date import parse_date +from aniso8601.decimalfraction import find_separator, normalize +from aniso8601.exceptions import ISOFormatError, NegativeDurationError +from aniso8601.time import parse_time + +def parse_duration(isodurationstr, builder=PythonTimeBuilder): + #Given a string representing an ISO 8601 duration, return a + #a duration built by the given builder. Valid formats are: + # + #PnYnMnDTnHnMnS (or any reduced precision equivalent) + #PT