-- DBMS: snowflake
create or replace TABLE DISTRIBUTION_METADATA (
	"metadata_version" VARCHAR(16777216),
	"name" VARCHAR(16777216),
	"version" VARCHAR(16777216),
	"summary" VARCHAR(16777216),
	"description" VARCHAR(16777216),
	"description_content_type" VARCHAR(16777216),
	"author" VARCHAR(16777216),
	"author_email" VARCHAR(16777216),
	"maintainer" VARCHAR(16777216),
	"maintainer_email" VARCHAR(16777216),
	"license" VARCHAR(16777216),
	"keywords" VARCHAR(16777216),
	"classifiers" VARIANT,
	"platform" VARIANT,
	"home_page" VARCHAR(16777216),
	"download_url" VARCHAR(16777216),
	"requires_python" VARCHAR(16777216),
	"requires" VARIANT,
	"provides" VARIANT,
	"obsoletes" VARIANT,
	"requires_dist" VARIANT,
	"provides_dist" VARIANT,
	"obsoletes_dist" VARIANT,
	"requires_external" VARIANT,
	"project_urls" VARIANT,
	"uploaded_via" VARCHAR(16777216),
	"upload_time" NUMBER(38,0),
	"filename" VARCHAR(16777216),
	"size" NUMBER(38,0),
	"path" VARCHAR(16777216),
	"python_version" VARCHAR(16777216),
	"packagetype" VARCHAR(16777216),
	"comment_text" VARCHAR(16777216),
	"has_signature" BOOLEAN,
	"md5_digest" VARCHAR(16777216),
	"sha256_digest" VARCHAR(16777216),
	"blake2_256_digest" VARCHAR(16777216)
);

INSERT INTO "PYPI"."PYPI"."DISTRIBUTION_METADATA" (filename, platform, python_version, upload_time, path, summary, author, obsoletes_dist, download_url, comment_text, description_content_type, author_email, has_signature, requires_python, maintainer, maintainer_email, name, sha256_digest, keywords, description, requires_external, classifiers, requires, project_urls, license, packagetype, provides_dist, md5_digest, requires_dist, blake2_256_digest, uploaded_via, provides, size, version, home_page, obsoletes, metadata_version) VALUES ('uttl.buildout-1.2.2-py3.9.egg', '[]', '1.2.2', 1632989731907552, 'e8/44/c7b6e88b860cdc7908b3be665c7f90eb818c715112ac3232017dc3bef31e/uttl.buildout-1.2.2-py3.9.egg', 'Utilities for Buildout developed for Up There They Love.', 'Mr. Hands', '[]', NULL, NULL, 'text/markdown', 'mrhands31@gmail.com', False, '>=3', NULL, NULL, 'uttl.buildout', '989ecce3803b23bea32b212bc00d93e7ec9ca052aaf66062bb7321ffdb90ea98', 'buildout extension uttl cmake qmake qt copyfile version', 'uttl.buildout
=============

Utilities for [zc.buildout](buildout.org/) for different build systems on Windows, as used by [Up There They Love](https://uptheretheylove.com) for developing their titles.

# Usage

The `uttl.buildout` package will be automatically installed from [PyPi](https://pypi.org/project/uttl.buildout/) using `easy_install` when you use it in your buildout configuration.

You can also clone the repository to disk and use the recipes directly without installing a package.

    [buildout]
    develop = C:\Downloads\uttl-buildout

The downside of this approach is that your configuration will be invalidated (and thus your dependencies rebuilt) when the recipes change.

# Example

    [buildout]
    parts =
        devenv
        game

    # find devenv executable from visual studio path

    [devenv]
    recipe = uttl.buildout:versioncheck
    required-major = 2017
    required-minor = 15
    body = ... path = None
        ... args = [ 
        ...   r''%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe'',
        ...   ''-version'',
        ...   ''%s.0'' % (self.options[''required-minor'']),
        ...   ''-property'',
        ...   ''installationPath''
        ... ]
        ...
        ... try:
        ...   with subprocess.Popen(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc:
        ...     for line in iter(proc.stdout.readline, b''''):
        ...       path = os.path.abspath(str(line.rstrip(), encoding=''ascii''))
        ...       break
        ... except FileNotFoundError:
        ...   self.log.error(''Visual Studio is not installed.'')
        ...   return (False, 0, 0, 0, '''')
        ...
        ... if not path:
        ...   self.log.error(''Cannot find Visual Studio executable.'')
        ...   return (False, 0, 0, 0, '''')
        ...
        ... path = os.path.abspath(path + r''\Common7\IDE\devenv.com'')
        ... if not os.path.exists(path):
        ...   self.log.error(''Failed to find path to devenv.'')
        ...   return (False, 0, 0, 0, '''')
        ...
        ... return (True, self.options[''required-major''], self.options[''required-minor''], 64, path)

    # build game executable

    [game]
    recipe = uttl.buildout:devenv
    executable = ${devenv:path}
    solution = SSSG.sln
    project = SSSG
    build = Release

# Recipes

The following recipes (scripts) for `zc.buildout` are available in this package:

* [uttl.buildout.cmake](uttl/buildout/cmake/README.md) - Run CMake commands
* [uttl.buildout.command](uttl/buildout/README.md) - Run an executable with arguments
* [uttl.buildout.copyfile](uttl/buildout/copyfile/README.md) - Copy files between directories
* [uttl.buildout.devenv](uttl/buildout/devenv/README.md) - Build projects with Visual Studio
* [uttl.buildout.dotnet-restore](uttl/buildout/dotnet/restore/README.md) - Restore .NET packages using NuGet
* [uttl.buildout.inklecate](uttl/buildout/inklecate/README.md) - Compile .ink files to JSON
* [uttl.buildout.qmake](uttl/buildout/qmake/README.md) - Run QMake commands
* [uttl.buildout.qtdeploy](uttl/buildout/qtdeploy/README.md) - Deploy Qt libraries
* [uttl.buildout.versioncheck](uttl/buildout/versioncheck/README.md) - Get versioned executables

Check the source folders for detailed documentation about each recipe.

# Building from source

Check that you''re running at least Python 3.9:

    D:\Projects\uttl-buildout>python --version
    Python 3.9.5

Build and install egg on system:

    python setup.py install

Create egg in `dist/` folder:

    python setup.py bdist_egg

Install on your system using `easy_install`:

    python -m easy_install -a dist\uttl_buildout-1.0.0-py3.9.egg

Upload packaged egg to repository:

    python -m twine upload --repository pypi dist/*
# Changes

## 1.2.2 - 2021-09-30

* Small fix to README in package

## 1.2.1 - 2021-09-30

* Command: Added missing `always-install` option to documentation
* Command: Added `working-dir` option
* CopyFile: Renamed `source-path`, `destination-path` to `-dir` (old names treated as synonymous)
* CMake: Renamed `source-path`, `install-path`, `configure-path`, and `build-path` to `-dir` (old names treated as synonymous)
* CMake: Added `working-dir` option
* DotnetRestore: Fixed recipe being registered with the wrong name
* DotnetRestore: Renamed `config-file` to `config-path` (old name treated as synonymous)
* DotnetRestore: Renamed `packages-path` to `packages-dir` (old name treated as synonymous)
* DotnetRestore: Added `working-dir` option
* Devenv: Renamed `solution` to `solution-path` (old name treated as synonymous)
* Devenv: Added `working-dir` option
* Inklecate: Renamed `output-directory` to `output-dir` (old name treated as synonymous)
* Inklecate: Renamed `input` to `inputs` (old name treated as synonymous)
* Inklecate: Added `working-dir` option
* QMake: Added `working-dir` option
* QtDeploy: Added `dir`, `libraries-dir`, `plugins-dir`, `libraries`, `qml-dir`, `qml-import`, `plugins`, and `patch-qt` options
* QtDeploy: Added `lib-` option to explicity add or skip libaries
* QtDeploy: Added `working-dir` option
* VersionCheck: Made `body` option mandatory


## 1.2.0 - 2021-09-28

* All: Added optional artefacts and arguments options
* CMake: Made the path to source option mandatory to prevent user error
* Command: New recipe for calling executables
* CopyFile: Install files before copying them

## 1.1.0 - 2021-09-27

* All: Changed all options from snake_case to kebab-case
* DotnetRestore: New recipe for invoking dotnet commands
* CMake: Fixed source path option
* CMake: Made target option a synonym for targets
* CopyFile: Copies files if they do not exist or if they were modified
* CopyFile: Added documentation
* Devenv: Cleaned up script
* Devenv: Added documentation
* QMake: Fixed files option throwing an error
* QMake: Expanded documentation
* QMake: Fixed typos in documentation

## 1.0.0 - 2021-09-26

* Initial release

# License

MIT No Attribution

Copyright 2021 Mr. Hands <mrhands31@gmail.com>

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.

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.', '[]', '[
  "Framework :: Buildout",
  "Intended Audience :: Developers",
  "Topic :: Software Development :: Build Tools",
  "License :: OSI Approved :: MIT No Attribution License (MIT-0)"
]', '[]', '[]', 'MIT-0', 'bdist_egg', '[]', '8703ae2cbeedb760a2e3100621ef5958', '[]', 'e844c7b6e88b860cdc7908b3be665c7f90eb818c715112ac3232017dc3bef31e', 'twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.1', '[]', 39065, '1.2.2', 'https://github.com/MrHands/uttl-buildout', '[]', '2.1'), ('tfields-0.3.8-py2.py3-none-any.whl', '[]', 'py2.py3', 1631088517112669, 'ef/0e/9155da518a32c9a461e4343e588f07655d7704419c8f6eec59f6ff3e5e4d/tfields-0.3.8-py2.py3-none-any.whl', 'Tensors, tensor fields, graphs, mesh manipulation, CAD and more on the basis of numpy.ndarrays. All objects keep track of their coordinate system. Symbolic math operations work for object manipulation.', 'Daniel Böckenhoff', '[]', NULL, NULL, 'text/x-rst', 'dboe@ipp.mpg.de', False, '>=3.0', NULL, NULL, 'tfields', '096317182fa2aa1b3c324802d35df16b5e21d2bc47568afd3f1edc951cb03b9d', 'tensors,tensor-fields,graphs,mesh,numpy,math', '=========================
Introduction to `tfields`
=========================


.. pypi
.. image:: https://img.shields.io/pypi/v/tfields.svg
    :target: https://pypi.python.org/pypi/tfields

.. ci
    .. image:: https://img.shields.io/travis/dboe/tfields.svg
        :target: https://travis-ci.com/dboe/tfields
.. image:: https://gitlab.mpcdf.mpg.de/dboe/tfields/badges/master/pipeline.svg
    :target: https://gitlab.mpcdf.mpg.de/dboe/tfields/commits/master

.. coverage
.. image:: https://gitlab.mpcdf.mpg.de/dboe/tfields/badges/master/coverage.svg
    :target: https://gitlab.mpcdf.mpg.de/dboe/tfields/commits/master

.. readthedocs
.. image:: https://readthedocs.org/projects/tfields/badge/?version=latest
    :target: https://tfields.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status

.. pyup crosschecks your dependencies. Github is default, gitlab more complicated: https://pyup.readthedocs.io/en/latest/readme.html#run-your-first-update 
    .. image:: https://pyup.io/repos/github/dboe/tfields/shield.svg
        :target: https://pyup.io/repos/github/dboe/tfields/
        :alt: Updates

.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white
   :target: https://github.com/pre-commit/pre-commit
   :alt: pre-commit


Tensors, tensor fields, graphs, mesh manipulation, CAD and more on the basis of numpy.ndarrays. All objects keep track of their coordinate system. Symbolic math operations work for object manipulation.


Licensed under the ``MIT License``

Resources
---------

* Source code: https://gitlab.mpcdf.mpg.de/dboe/tfields
* Documentation: https://tfields.readthedocs.io
* Pypi: https://pypi.python.org/pypi/tfields


Features
--------

The following features should be highlighted:

* Tensors
* TensorFields
* TensorMaps with fields
* Mesh manipulation by graph theory
* TODO

MIT License

Copyright (c) 2021, Daniel Böckenhoff

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.


', '[]', '[
  "Development Status :: 3 - Alpha",
  "License :: OSI Approved :: MIT License",
  "Programming Language :: Python",
  "Programming Language :: Python :: 3",
  "Programming Language :: Python :: 3.5",
  "Programming Language :: Python :: 3.6",
  "Programming Language :: Python :: 3.7",
  "Programming Language :: Python :: 3.8"
]', '[]', '[
  "Documentation, https://tfields.readthedocs.io",
  "Source, https://gitlab.mpcdf.mpg.de/dboe/tfields"
]', 'MIT License', 'bdist_wheel', '[]', '54cc7ab1539fdf39ff3d3241074cc5da', '[
  "six",
  "numpy",
  "sympy (<=1.6.2)",
  "scipy",
  "pathlib",
  "rna (>=0.6.3)",
  "sortedcontainers",
  "sphinx (>=2.2.0) ; extra == ''all''",
  "sphinx-rtd-theme (>=0.4.3) ; extra == ''all''",
  "flake8 ; extra == ''all''",
  "pylint ; extra == ''all''",
  "pytest ; extra == ''all''",
  "pytest-cov ; extra == ''all''",
  "coverage ; extra == ''all''",
  "pytest-shutil ; extra == ''all''",
  "pytest-virtualenv ; extra == ''all''",
  "pytest-fixture-config ; extra == ''all''",
  "pytest-xdist ; extra == ''all''",
  "matplotlib ; extra == ''all''",
  "numpy-stl ; extra == ''all''",
  "bumpversion (==1.0.0) ; extra == ''all''",
  "twine ; extra == ''all''",
  "sphinx ; extra == ''all''",
  "pre-commit ; extra == ''all''",
  "pre-commit-hooks ; extra == ''all''",
  "cookiecutter-project-upgrader ; extra == ''all''",
  "sphinx (>=2.2.0) ; extra == ''dev''",
  "sphinx-rtd-theme (>=0.4.3) ; extra == ''dev''",
  "flake8 ; extra == ''dev''",
  "pylint ; extra == ''dev''",
  "pytest ; extra == ''dev''",
  "pytest-cov ; extra == ''dev''",
  "coverage ; extra == ''dev''",
  "pytest-shutil ; extra == ''dev''",
  "pytest-virtualenv ; extra == ''dev''",
  "pytest-fixture-config ; extra == ''dev''",
  "pytest-xdist ; extra == ''dev''",
  "matplotlib ; extra == ''dev''",
  "numpy-stl ; extra == ''dev''",
  "bumpversion (==1.0.0) ; extra == ''dev''",
  "twine ; extra == ''dev''",
  "sphinx ; extra == ''dev''",
  "pre-commit ; extra == ''dev''",
  "pre-commit-hooks ; extra == ''dev''",
  "cookiecutter-project-upgrader ; extra == ''dev''",
  "sphinx (>=2.2.0) ; extra == ''docs''",
  "sphinx-rtd-theme (>=0.4.3) ; extra == ''docs''",
  "numpy-stl ; extra == ''io''",
  "flake8 ; extra == ''test''",
  "pylint ; extra == ''test''",
  "pytest ; extra == ''test''",
  "pytest-cov ; extra == ''test''",
  "coverage ; extra == ''test''",
  "pytest-shutil ; extra == ''test''",
  "pytest-virtualenv ; extra == ''test''",
  "pytest-fixture-config ; extra == ''test''",
  "pytest-xdist ; extra == ''test''",
  "matplotlib ; extra == ''test''"
]', 'ef0e9155da518a32c9a461e4343e588f07655d7704419c8f6eec59f6ff3e5e4d', 'twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.23.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.7.1', '[]', 77356, '0.3.8', 'https://gitlab.mpcdf.mpg.de/dboe/tfields', '[]', '2.1'), ('Levenshtein-0.15.0-cp36-cp36m-manylinux2010_i686.whl', '[]', 'cp36', 1631210509940688, 'a8/57/70053a521f0822fd3c6c4ce590be8be253fabae5283f817824faca6d3bdf/Levenshtein-0.15.0-cp36-cp36m-manylinux2010_i686.whl', 'Python extension for computing string edit distances and similarities.', 'Max Bachmann', '[]', NULL, NULL, 'text/markdown', 'contact@maxbachmann.de', False, '>=3.5', NULL, NULL, 'Levenshtein', '3391e3ca6e16dcd850e40585e4a9c4c3df5932cff403e1b111ab8cfb99a227ba', NULL, '# Levenshtein

<p>
  <a href="https://github.com/maxbachmann/Levenshtein/actions">
    <img src="https://github.com/maxbachmann/Levenshtein/workflows/Build/badge.svg"
         alt="Continous Integration">
  </a>
  <a href="https://pypi.org/project/levenshtein/">
    <img src="https://img.shields.io/pypi/v/levenshtein"
         alt="PyPI package version">
  </a>
  <a href="https://www.python.org">
    <img src="https://img.shields.io/pypi/pyversions/levenshtein"
         alt="Python versions">
  </a>
  <a href="https://maxbachmann.github.io/Levenshtein">
    <img src="https://img.shields.io/badge/-documentation-blue"
         alt="Documentation">
  </a>
  <a href="https://github.com/maxbachmann/Levenshtein/blob/main/COPYING">
    <img src="https://img.shields.io/github/license/maxbachmann/Levenshtein"
         alt="GitHub license">
  </a>
</p>

## Introduction
The Levenshtein Python C extension module contains functions for fast
computation of:

* Levenshtein (edit) distance, and edit operations
* string similarity
* approximate median strings, and generally string averaging
* string sequence and set similarity

This is a fork of [ztane/python-Levenshtein](https://github.com/ztane/python-Levenshtein), since the original
project is no longer actively maintained.

## Requirements
* Python 2.7 or later

## Installation
```bash
pip install levenshtein
```

## Documentation

The documentation for the current version can be found at [https://maxbachmann.github.io/Levenshtein/](https://maxbachmann.github.io/Levenshtein/)

## License

Levenshtein is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.

See the file [COPYING](https://github.com/maxbachmann/Levenshtein/blob/main/COPYING) for the full text of GNU General Public License version 2.
## Changelog

### v0.15.0
* Update SequenceMatcher interface to support the autojunk parameter

### v0.14.0
* Drop Python 2 support
* Fixed free of non heap object due caused by zero offset on a heap object
* Fixed warnings about missing type conversions
* Fix segmentation fault in subtract_edit when incorrect input types are used
* Fixed unchecked memory allocations
* Implement distance/ratio/hamming/jaro/jaro_winkler
  using rapidfuzz instead of providing a own implementation
* Implement Wrapper for inverse/editops/opcodes/matching_blocks/subtract_edit/apply_edit
  using Cython to simplify support for new Python versions

### v0.13.0
* Maintainership passed to Max Bachmann
* use faster bitparallel implementations for distance and ratio
* avoid string copies in distance, ratio and hamming
* Fix usage of deprecated Unicode APIs in distance, ratio and hamming
* Fixed incorrect window size inside Jaro and Jaro-Winkler implementation
* Fixed incorrect exception messages
* Removed unused functions and compiler specific hacks
* Split the Python and C implementations to simplify building of
  the C library
* Fixed multiple bugs which prevented the use as C library, since some functions
  only got defined when compiling for Python
* Build and deliver python wheels for the library
* Fixed incorrect allocation size in lev_editops_matching_blocks and
  lev_opcodes_matching_blocks

### v0.12.1
* Fixed handling of numerous possible wraparounds in calculating the size
  of memory allocations; incorrect handling of which could cause denial
  of service or even possible remote code execution in previous versions
  of the library.

### v0.12.0
* Fixed a bug in StringMatcher.StringMatcher.get_matching_blocks /
  extract_editops for Python 3; now allow only `str` editops on
  both Python 2 and Python 3, for simpler and working code.
* Added documentation in the source distribution and in GIT
* Fixed the package layout: renamed the .so/.dll to _levenshtein,
  and made it reside inside a package, along with the StringMatcher
  class.
* Fixed spelling errors.

### v0.11.2
* Fixed a bug in setup.py: installation would fail on Python 3 if the locale
  did not specify UTF-8 charset (Felix Yan).

* Added COPYING, StringMatcher.py, gendoc.sh and NEWS in MANIFEST.in, as they
  were missing from source distributions.

### v0.11.1
* Added Levenshtein.h to MANIFEST.in

### v0.11.0
* Python 3 support, maintainership passed to Antti Haapala

### v0.10.2
* Made python-Lehvenstein Git compatible and use setuptools for PyPi upload
* Created HISTORY.txt and made README reST compatible

### v0.10.1
* apply_edit() broken for Unicodes was fixed (thanks to Radovan Garabik)
* subtract_edit() function was added

### v0.10.0
* Hamming distance, Jaro similarity metric and Jaro-Winkler similarity
      metric were added
* ValueErrors raised on wrong argument types were fixed to TypeErrors

### v0.9.0
* a poor-but-fast generalized median method quickmedian() was added
* some auxiliary functions added to the C api (lev_set_median_index,
      lev_editops_normalize, ...)

### v0.8.2
* fixed missing `static'' in the method list

### v0.8.1
* some compilation problems with non-gcc were fixed

v0.8.0
* median_improve(), a generalized median improving function, was added
* an arbitrary length limitation imposed on greedy median() result was
      removed
* out of memory should be handled more gracefully (on systems w/o memory
      overcomitting)
* the documentation now passes doctest

### v0.7.0
* fixed greedy median() for Unicode characters > U+FFFF, it''s now usable
      with whatever integer type wchar_t happens to be
* added missing MANIFEST
* renamed exported C functions, all public names now have lev_, LEV_ or
      Lev prefix; defined lev_byte, lev_wchar, and otherwise santinized
      the (still unstable) C interface
* added edit-ops group of functions, with two interfaces: native, useful
      for string averaging, and difflib-like for interoperability
* added an example SequenceMatcher-like class StringMatcher

### v0.6.0
* a segfault in seqratio()/setratio() on invalid input has been fixed
      to an exception
* optimized ratio() and distance() (about 20%)
* Levenshtein.h header file was added to make it easier to actually use
      it as a C library

### v0.5.0
* a segfault in setratio() was fixed
* median() handles all empty strings situation more gracefully

### v0.4.0
* new functions seqratio() and setratio() computing similarity between
      string sequences and sets
* Levenshtein optimizations (affects all routines except median())
* all Sequence objects are accepted, not just Lists

### v0.3.0
* setmedian() finding set median was added
* median() initial overhead for Unicodes was reduced

### v0.2.0
* ratio() and distance() now accept both Strings and Unicodes
* removed uratio() and udistance()
* Levenshtein.c is now compilable as a C library (with -DNO_PYTHON)
* a median() function finding approximate weighted median of a string
      set was added

### v0.1.0
* Inital release



', '[]', '[
  "Programming Language :: Python :: 3",
  "Programming Language :: Python :: 3.5",
  "Programming Language :: Python :: 3.6",
  "Programming Language :: Python :: 3.7",
  "Programming Language :: Python :: 3.8",
  "Programming Language :: Python :: 3.9",
  "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)"
]', '[]', '[]', 'GPL', 'bdist_wheel', '[]', '9d4e9935f7a5fbd520c1d83366eb82c2', '[
  "rapidfuzz (<1.7,>=1.5.1)"
]', 'a85770053a521f0822fd3c6c4ce590be8be253fabae5283f817824faca6d3bdf', 'twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.9.7', '[]', 103470, '0.15.0', 'https://github.com/maxbachmann/Levenshtein', '[]', '2.1'), ('pyats.aetest-21.8.1-cp36-cp36m-macosx_10_10_x86_64.whl', '[]', 'cp36', 1630683608168273, '6c/be/486c5e4c074aa25cc4048f4cd9d1f7cd5d17f88a5fe93e10600a778dbfaa/pyats.aetest-21.8.1-cp36-cp36m-macosx_10_10_x86_64.whl', 'pyATS AEtest: Testscript Engine', 'Cisco Systems Inc.', '[]', NULL, NULL, NULL, 'pyats-support-ext@cisco.com', False, '>=3.5', NULL, NULL, 'pyats.aetest', '0f3fa4b957a911f652476d67fc65c69164bb85d57a3eb6d867599d966c6df7e0', 'pyats aetest template script testing', 'pyATS AEtest Component
======================

pyATS is an end-to-end testing ecosystem, specializing in data-driven and 
reusable testing, and engineered to be suitable for Agile, rapid development 
iterations. Extensible by design, pyATS enables developers start with small, 
simple and linear test cases, and scale towards large, complex and asynchronous 
test suites.

pyATS is initially developed internally in Cisco, and is now available to the
general public starting late 2017 through `Cisco DevNet`_. Visit the pyATS
home page at

    https://developer.cisco.com/site/pyats/

.. _Cisco DevNet: https://developer.cisco.com/


AEtest Package
--------------

This is a sub-component of pyATS that handles test script definition and
execution.

Requirements
------------

pyATS currently supports Python 3.4+ on Linux & Mac systems. Windows platforms
are not yet supported.

Quick Start
-----------

.. code-block:: console

    # install pyats as a whole
    $ pip install pyats

    # to upgrade this package manually
    $ pip install --upgrade pyats.aetest

    # to install alpha/beta versions, add --pre
    $ pip install --pre pyats.aetest

For more information on setting up your Python development environment,
such as creating virtual environment and installing ``pip`` on your system, 
please refer to `Virtual Environment and Packages`_ in Python tutorials.

.. _Virtual Environment and Packages: https://docs.python.org/3/tutorial/venv.html

', '[]', '[
  "Development Status :: 6 - Mature",
  "Development Status :: 5 - Production/Stable",
  "Environment :: Console",
  "Intended Audience :: Developers",
  "Intended Audience :: Telecommunications Industry",
  "Intended Audience :: Information Technology",
  "Intended Audience :: System Administrators",
  "License :: OSI Approved :: Apache Software License",
  "Operating System :: MacOS",
  "Operating System :: POSIX :: Linux",
  "Programming Language :: Python :: 3.8",
  "Programming Language :: Python :: 3.7",
  "Programming Language :: Python :: 3.6",
  "Programming Language :: Python :: 3.5",
  "Programming Language :: Python :: 3 :: Only",
  "Programming Language :: Python :: Implementation :: CPython",
  "Topic :: Software Development :: Testing",
  "Topic :: Software Development :: Build Tools",
  "Topic :: Software Development :: Libraries",
  "Topic :: Software Development :: Libraries :: Python Modules"
]', '[]', '[]', 'Apache 2.0', 'bdist_wheel', '[]', '28efadd94c9f4e1de990e7c487036fe7', '[
  "pyats.results (<21.9.0,>=21.8.0)",
  "pyats.log (<21.9.0,>=21.8.0)",
  "pyats.aereport (<21.9.0,>=21.8.0)",
  "pyats.datastructures (<21.9.0,>=21.8.0)",
  "pyats.utils (<21.9.0,>=21.8.0)",
  "pyyaml",
  "jinja2 (<3.0)",
  "Sphinx ; extra == ''dev''",
  "sphinx-rtd-theme ; extra == ''dev''"
]', '6cbe486c5e4c074aa25cc4048f4cd9d1f7cd5d17f88a5fe93e10600a778dbfaa', 'twine/3.2.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/57.4.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.6.12', '[]', 1454946, '21.8.1', 'https://developer.cisco.com/pyats/', '[]', '2.1'), ('BottleSessions-21.9.18-py3-none-any.whl', '[]', 'py3', 1632027763679760, '8f/e4/a4ea844c98004626ff60e7bd0d8c30acd98fa6dfbe71e719d7612b793939/BottleSessions-21.9.18-py3-none-any.whl', 'Sessions middleware plug-in for Bottle', 'gunville', '[]', NULL, NULL, 'text/markdown', 'rk13088@yahoo.com', False, '>=3.6', NULL, NULL, 'BottleSessions', 'a6aa647a0e8555954e025261515e03d1ec78dfce8bcbb2aa1c1dbdc21b8117aa', '''bottle cachelib sessions redis memcached''', '
## BottleSessions

**BottleSessions** is middleware providing web _sessions_ for the **[Bottle](http://bottlepy.org/docs/dev/)** *micro web-framework*.  

The goal of **BottleSessions** is to provide easy to use and flexible to configure sessions. The _defaults_ attempt to make sense for typical bottle web apps with little or no tuning.  

**BottleSessions** is simple for the programmer to use in both *middleware* and route *views*. The ***Session*** is a superclass of a Python `dict`, accessible as an attribute added to the bottle **`request`** object as **`request.session`**. No special sauce is required to acquire or use the session.
##### Using the session
As an extension to `dict` the *session* is *pythonic* and is used like any other `dict`:
```python
    user = request.session.get(''user'',''Anonymous)
    ...
    request.session.update({
            ''groups'':[''sysadmin'',''employee''], 
            ''ip'': request.ip
        })
    request.session[''timestamp''] = time.now()
```
More details on using the `BottleSessions.Session` class are [available.](docs/SESSIONS.md)
#### Installation

Install from pypi:
```bash
pip install BottleSessions
```
#### BottleSessions Example 

```python
#app.py:

from BottleSessions import BottleSessions
from bottle import Bottle, request

app = Bottle()
btl = BottleSessions(app)

@app.route(''/set/<key>/<val>'')
def set_sess(key,val=None):

    request.session[key] = val
    return {key: val}

@app.route(''/get/<key>'')
def get_sess(key=None):

    return {key: request.session.get(key,''does not exist'')}

@app.route(''/'')
def hello():
    return ''hello world''

if __name__ == ''__main__'':
    app.run()
#app.py:

from BottleSessions import BottleSessions
from bottle import Bottle, request

app = Bottle()
btl = BottleSessions(app)

@app.route(''/set/<key>/<val>'')
def set_sess(key,val=None):

    request.session[key] = val
    return {key: val}

@app.route(''/get/<key>'')
def get_sess(key=None):

    return {key: request.session.get(key,''does not exist'')}

@app.route(''/'')
def hello():
    return ''hello world''

if __name__ == ''__main__'':
    app.run()

```
Another sample app is [available here](examples/sample_session_app.py)

#### BottleSession Defaults and Tuning

**BottleSessions** default behavior provides a session/cookie life of 300 seconds after last update using a cookie named **bottlecookie** marked `Secure` and `http-only` with `path=/`. The sessions use the same lifetime and are stored in a memory based *cachelib* **SimpleCache**.

These defaults are useful for a range of micro-framework web apps Bottle is typically used for. However, different applications have differing session needs. Hence both cookies and sessions can be [easily customized](docs/OPTIONS.md) to suite a variety of uses.  

#### Backing Store
The backing store is provided by [Pallets Project *cachelib* library](https://pypi.org/project/cachelib/) and uses **SimpleCache** as the default.  

*cachelib* **FileSystemCache**, **RedisCache**, and **Memcached** classes are also supported and can be configured with class specific options:

```python
# config.py - FileSystemCache configuration
cache_config = {
    ''cache_type'': ''FileSystem'',
    ''cache_dir'' : ''./sess_dir'',
    ''threshold'': 2000,
    # Additional configuration parameters
    # per cachelib docs
    }
```
```python
# app.py initialization
    ...
from config import cache_config
btl = BottleSessions(app, session_backing=cache_config,
session_cookie=''appcookie'')
```
Further information is [available on configuring session backing store](docs/BACKING.md) for differing needs and differing cache types.


', '[]', '[
  "Programming Language :: Python :: 3",
  "License :: OSI Approved :: MIT License",
  "Operating System :: OS Independent",
  "Framework :: Bottle"
]', '[]', '[
  "repo, https://github.com/Glocktober/BottleSessions",
  "overview, https://github.com/Glocktober/BottleSessions/blob/main/README.md"
]', NULL, 'bdist_wheel', '[]', '1eb33eb21f6c8970d41b40cb799e14c5', '[
  "bottle (>=0.12.0)",
  "cachelib (>=0.2.0)"
]', '8fe4a4ea844c98004626ff60e7bd0d8c30acd98fa6dfbe71e719d7612b793939', 'twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6', '[]', 10358, '21.9.18', 'https://github.com/Glocktober/BottleSessions', '[]', '2.1');