Thank for this Ash. Pipenv works very well in 99% of cases and is vastly better than managing requirements files. Also, PYPA (Python Packaging Authority) officially recommends Pipenv.
I gave poetry a try and it seems like it has a lot of potential. I did run into two errors, a max recursion depth when installing Airflow with a lot of extras, and when installing Airflow without any extras an issue installing lxml. On Fri, Oct 5, 2018 at 4:29 AM Ash Berlin-Taylor <a...@apache.org> wrote: > Oh I meant FAB 1.11.1. > > And it looks like the Jinja issue is a bug in pip-tools, where it treats a > dep of "jina" as actually being "jinja>=CURRENT" > https://github.com/pypa/pipenv/issues/2596 < > https://github.com/pypa/pipenv/issues/2596> > > In short: pip-env isn't ready for real-world use yet? (I'm guessing and > extrapolating, but I haven't used it myself so don't trust my word on this) > > -ash > > On 4 Oct 2018, at 16:38, Kyle Hamlin <hamlin...@gmail.com> wrote: > > > > If I remove the Flask-AppBuild pinning to 1.11.0 then it uncovers a > Jinja2 > > conflict which is baffling because I don't see anywhere in the graph that > > jinja2 >=2.10 is required. > > > > Could not find a version that matches > > jinja2<2.9.0,>=2.10,>=2.4,>=2.5,>=2.7.3,>=2.8 > > Tried: 2.0, 2.1, 2.1.1, 2.2, 2.2.1, 2.3, 2.3.1, 2.4, 2.4.1, 2.5, 2.5.1, > > 2.5.2, 2.5.3, 2.5.4, 2.5.5, 2.6, 2.7, 2.7.1, 2.7.2, 2.7.3, 2.8, 2.8, > 2.8.1, > > 2.8.1, 2.9, 2.9, 2.9.1, 2.9.1, 2.9.2, 2.9.2, 2.9.3, 2.9.3, 2.9.4, 2.9.4, > > 2.9.5, 2.9.5, 2.9.6, 2.9.6, 2.10, 2.10 > > > > I highlighted why the dep fails there one dep that requires Jinjs2 < > 2.9.0 > > but I still have not idea where the 2.10.0 comes from. > > > > apache-airflow==2.0.0.dev0+incubating > > - alembic [required: >=0.9,<1.0, installed: 0.9.10] > > - Mako [required: Any, installed: 1.0.7] > > - MarkupSafe [required: >=0.9.2, installed: 1.0] > > - python-dateutil [required: Any, installed: 2.7.3] > > - six [required: >=1.5, installed: 1.11.0] > > - python-editor [required: >=0.3, installed: 1.0.3] > > - SQLAlchemy [required: >=0.7.6, installed: 1.1.18] > > - bleach [required: ~=2.1.3, installed: 2.1.4] > > - html5lib [required: > >> > =0.99999999pre,!=1.0b8,!=1.0b7,!=1.0b6,!=1.0b5,!=1.0b4,!=1.0b3,!=1.0b2,!=1.0b1, > > installed: 1.0.1] > > - six [required: >=1.9, installed: 1.11.0] > > - webencodings [required: Any, installed: 0.5.1] > > - six [required: Any, installed: 1.11.0] > > - configparser [required: >=3.5.0,<3.6.0, installed: 3.5.0] > > - croniter [required: >=0.3.17,<0.4, installed: 0.3.25] > > - python-dateutil [required: Any, installed: 2.7.3] > > - six [required: >=1.5, installed: 1.11.0] > > - dill [required: >=0.2.2,<0.3, installed: 0.2.8.2] > > - flask [required: >=0.12.4,<0.13, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - flask-admin [required: ==1.4.1, installed: 1.4.1] > > - Flask [required: >=0.7, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - wtforms [required: Any, installed: 2.2.1] > > - flask-appbuilder [required: >=1.12,<2.0.0, installed: 1.12.0] > > - click [required: ==6.7, installed: 7.0] > > - colorama [required: ==0.3.9, installed: 0.3.9] > > - Flask [required: >=0.10.0,<0.12.99, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - Flask-Babel [required: ==0.11.1, installed: 0.11.1] > > - Babel [required: >=2.3, installed: 2.6.0] > > - pytz [required: >=0a, installed: 2018.5] > > - Flask [required: Any, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - Jinja2 [required: >=2.5, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Flask-Login [required: >=0.3,<0.5, installed: 0.4.1] > > - Flask [required: Any, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - Flask-OpenID [required: ==1.2.5, installed: 1.2.5] > > - Flask [required: >=0.10.1, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - python3-openid [required: >=2.0, installed: 3.1.0] > > - defusedxml [required: Any, installed: 0.5.0] > > - Flask-SQLAlchemy [required: ==2.1, installed: 2.1] > > - Flask [required: >=0.10, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - SQLAlchemy [required: >=0.7, installed: 1.1.18] > > - Flask-WTF [required: ==0.14.2, installed: 0.14.2] > > - Flask [required: Any, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - WTForms [required: Any, installed: 2.2.1] > > - python-dateutil [required: >=2.3,<3, installed: 2.7.3] > > - six [required: >=1.5, installed: 1.11.0] > > - flask-caching [required: >=1.3.3,<1.4.0, installed: 1.3.3] > > - Flask [required: Any, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - Werkzeug [required: >=0.12, installed: 0.14.1] > > - flask-login [required: >=0.3,<0.5, installed: 0.4.1] > > - Flask [required: Any, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - flask-swagger [required: ==0.2.13, installed: 0.2.13] > > - Flask [required: >=0.10, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - PyYAML [required: >=3.0, installed: 3.13] > > - flask-wtf [required: >=0.14.2,<0.15, installed: 0.14.2] > > - Flask [required: Any, installed: 0.12.4] > > - click [required: >=2.0, installed: 7.0] > > - itsdangerous [required: >=0.21, installed: 0.24] > > - Jinja2 [required: >=2.4, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - Werkzeug [required: >=0.7, installed: 0.14.1] > > - WTForms [required: Any, installed: 2.2.1] > > - funcsigs [required: ==1.0.0, installed: 1.0.0] > > - ordereddict [required: Any, installed: 1.1] > > - future [required: >=0.16.0,<0.17, installed: 0.16.0] > > - gitpython [required: >=2.0.2, installed: 2.1.11] > > - gitdb2 [required: >=2.0.0, installed: 2.0.4] > > - smmap2 [required: >=2.0.0, installed: 2.0.4] > > - gunicorn [required: >=19.4.0,<20.0, installed: 19.9.0] > > - iso8601 [required: >=0.1.12, installed: 0.1.12] > > - jinja2 [required: >=2.7.3,<2.9.0, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - lxml [required: >=4.0.0, installed: 4.2.5] > > - markdown [required: >=2.5.2,<3.0, installed: 2.6.11] > > - pandas [required: >=0.17.1,<1.0.0, installed: 0.23.4] > > - numpy [required: >=1.9.0, installed: 1.15.2] > > - python-dateutil [required: >=2.5.0, installed: 2.7.3] > > - six [required: >=1.5, installed: 1.11.0] > > - pytz [required: >=2011k, installed: 2018.5] > > - pendulum [required: ==1.4.4, installed: 1.4.4] > > - python-dateutil [required: >=2.6.0.0,<3.0.0.0, installed: 2.7.3] > > - six [required: >=1.5, installed: 1.11.0] > > - pytzdata [required: >=2018.3.0.0, installed: 2018.5] > > - tzlocal [required: >=1.5.0.0,<2.0.0.0, installed: 1.5.1] > > - pytz [required: Any, installed: 2018.5] > > - psutil [required: >=4.2.0,<6.0.0, installed: 5.4.7] > > - pygments [required: >=2.0.1,<3.0, installed: 2.2.0] > > - python-daemon [required: >=2.1.1,<2.2, installed: 2.1.2] > > - docutils [required: Any, installed: 0.14] > > - lockfile [required: >=0.10, installed: 0.12.2] > > - setuptools [required: Any, installed: 40.4.3] > > - python-dateutil [required: >=2.3,<3, installed: 2.7.3] > > - six [required: >=1.5, installed: 1.11.0] > > - python-nvd3 [required: ==0.15.0, installed: 0.15.0] > > - Jinja2 [required: >=2.8, installed: 2.8.1] > > - MarkupSafe [required: Any, installed: 1.0] > > - python-slugify [required: >=1.2.5, installed: 1.2.6] > > - Unidecode [required: >=0.04.16, installed: 1.0.22] > > - requests [required: >=2.5.1,<3, installed: 2.19.1] > > - certifi [required: >=2017.4.17, installed: 2018.8.24] > > - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4] > > - idna [required: >=2.5,<2.8, installed: 2.7] > > - urllib3 [required: >=1.21.1,<1.24, installed: 1.23] > > - setproctitle [required: >=1.1.8,<2, installed: 1.1.10] > > - sqlalchemy [required: >=1.1.15,<1.2.0, installed: 1.1.18] > > - tabulate [required: >=0.7.5,<=0.8.2, installed: 0.8.2] > > - tenacity [required: ==4.8.0, installed: 4.8.0] > > - monotonic [required: >=0.6, installed: 1.5] > > - six [required: >=1.9.0, installed: 1.11.0] > > - thrift [required: >=0.9.2, installed: 0.11.0] > > - six [required: >=1.7.2, installed: 1.11.0] > > - tzlocal [required: >=1.4, installed: 1.5.1] > > - pytz [required: Any, installed: 2018.5] > > - unicodecsv [required: >=0.14.1, installed: 0.14.1] > > - werkzeug [required: >=0.14.1,<0.15.0, installed: 0.14.1] > > - zope.deprecation [required: >=4.0,<5.0, installed: 4.3.0] > > - setuptools [required: Any, installed: 40.4.3] > > > > On Thu, Oct 4, 2018 at 11:29 AM Kyle Hamlin <hamlin...@gmail.com> wrote: > > > >> whoops remove the [[source]] at the end of the url = " > >> https://pypi.python.org/simple" that is a typo. > >> > >> On Thu, Oct 4, 2018 at 11:26 AM Kyle Hamlin <hamlin...@gmail.com> > wrote: > >> > >>> Thank you for the response Ash. > >>> > >>> Even with your suggestion, there appear to be version conflicts all > over > >>> the place. Can you get this Pipfile to install because I cannot? > >>> > >>> *Pipfile:* > >>> > >>> [[source]] > >>> url = "https://pypi.python.org/simple" [[source]] > >>> verify_ssl = true > >>> name = "pypi" > >>> > >>> [packages] > >>> apache-airflow = {editable = true, ref = > >>> "fb5ffd146a5a33820cfa7541e5ce09098f3d541a", git = " > >>> https://github.com/apache/incubator-airflow.git", extras = ["s3", > >>> "slack", "kubernetes", "celery", "postgres", "mongo", "crypto"]} > >>> Flask-AppBuilder="==1.11.0" > >>> > >>> [requires] > >>> python_version = "3.6" > >>> > >>> > >>> > >>> > >>> > >>> > >>> On Thu, Oct 4, 2018 at 10:50 AM Ash Berlin-Taylor <a...@apache.org> > wrote: > >>> > >>>> We've committed a fix for this to master and will include it in a > 1.10.1 > >>>> > https://github.com/apache/incubator-airflow/commit/fb5ffd146a5a33820cfa7541e5ce09098f3d541a > >>>> > >>>> > >>>> For installing in the mea time pin `Flask-AppBuilder=1.11.0' > >>>> > >>>>> On 4 Oct 2018, at 00:41, Kyle Hamlin <hamlin...@gmail.com> wrote: > >>>>> > >>>>> Hi, > >>>>> > >>>>> Today I was trying to upgrade Airflow to 1.10.0 and it appears that > >>>> there > >>>>> are some version conflicts with click and flask-login. I uncovered > >>>> these > >>>>> because I use Pipenv to manage our project's dependencies. You can > see > >>>> here > >>>>> that Flask-AppBuilder pins click==6.7 and flask-login>=0.3,<0.5 > >>>>> > >>>>> > >>>> > https://github.com/dpgaspar/Flask-AppBuilder/blob/master/setup.py#L37-L47 > >>>>> > >>>>> I'm able to force pipenv to install click==6.7 because that is not > >>>> pinned > >>>>> in Airflow's setup.py, but I can do nothing about flask-login because > >>>>> Airflow pins the flask-login version: > >>>>> > https://github.com/apache/incubator-airflow/blob/master/setup.py#L304 > >>>>> > >>>>> This prevents me from being able to upgrade to 1.10.0. > >>>>> > >>>>> *Pipenv's Graphed project dependencies (conflicts highlighted):* > >>>>> > >>>>> apache-airflow==1.10.0 > >>>>> - alembic [required: >=0.8.3,<0.9, installed: 0.8.10] > >>>>> - Mako [required: Any, installed: 1.0.7] > >>>>> - MarkupSafe [required: >=0.9.2, installed: 1.0] > >>>>> - python-editor [required: >=0.3, installed: 1.0.3] > >>>>> - SQLAlchemy [required: >=0.7.6, installed: 1.2.12] > >>>>> - bleach [required: ==2.1.2, installed: 2.1.2] > >>>>> - html5lib [required: > >>>>>> > >>>> > =0.99999999pre,!=1.0b8,!=1.0b7,!=1.0b6,!=1.0b5,!=1.0b4,!=1.0b3,!=1.0b2,!=1.0b1, > >>>>> installed: 1.0.1] > >>>>> - six [required: >=1.9, installed: 1.11.0] > >>>>> - webencodings [required: Any, installed: 0.5.1] > >>>>> - six [required: Any, installed: 1.11.0] > >>>>> - configparser [required: >=3.5.0,<3.6.0, installed: 3.5.0] > >>>>> - croniter [required: >=0.3.17,<0.4, installed: 0.3.25] > >>>>> - python-dateutil [required: Any, installed: 2.7.3] > >>>>> - six [required: >=1.5, installed: 1.11.0] > >>>>> - dill [required: >=0.2.2,<0.3, installed: 0.2.8.2] > >>>>> - flask [required: >=0.12.4,<0.13, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - flask-admin [required: ==1.4.1, installed: 1.4.1] > >>>>> - Flask [required: >=0.7, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - wtforms [required: Any, installed: 2.2.1] > >>>>> - flask-appbuilder [required: >=1.11.1,<2.0.0, installed: 1.12.0] > >>>>> - click [required: ==6.7, installed: 7.0] > >>>>> - colorama [required: ==0.3.9, installed: 0.3.9] > >>>>> - Flask [required: >=0.10.0,<0.12.99, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - Flask-Babel [required: ==0.11.1, installed: 0.11.1] > >>>>> - Babel [required: >=2.3, installed: 2.6.0] > >>>>> - pytz [required: >=0a, installed: 2018.5] > >>>>> - Flask [required: Any, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - Jinja2 [required: >=2.5, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Flask-Login [required: >=0.3,<0.5, installed: 0.2.11] > >>>>> - Flask [required: Any, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - Flask-OpenID [required: ==1.2.5, installed: 1.2.5] > >>>>> - Flask [required: >=0.10.1, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - python3-openid [required: >=2.0, installed: 3.1.0] > >>>>> - defusedxml [required: Any, installed: 0.5.0] > >>>>> - Flask-SQLAlchemy [required: ==2.1, installed: 2.1] > >>>>> - Flask [required: >=0.10, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - SQLAlchemy [required: >=0.7, installed: 1.2.12] > >>>>> - Flask-WTF [required: ==0.14.2, installed: 0.14.2] > >>>>> - Flask [required: Any, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - WTForms [required: Any, installed: 2.2.1] > >>>>> - python-dateutil [required: >=2.3,<3, installed: 2.7.3] > >>>>> - six [required: >=1.5, installed: 1.11.0] > >>>>> - flask-caching [required: >=1.3.3,<1.4.0, installed: 1.3.3] > >>>>> - Flask [required: Any, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - Werkzeug [required: >=0.12, installed: 0.14.1] > >>>>> - flask-login [required: ==0.2.11, installed: 0.2.11] > >>>>> - Flask [required: Any, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - flask-swagger [required: ==0.2.13, installed: 0.2.13] > >>>>> - Flask [required: >=0.10, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - PyYAML [required: >=3.0, installed: 3.13] > >>>>> - flask-wtf [required: >=0.14.2,<0.15, installed: 0.14.2] > >>>>> - Flask [required: Any, installed: 0.12.4] > >>>>> - click [required: >=2.0, installed: 7.0] > >>>>> - itsdangerous [required: >=0.21, installed: 0.24] > >>>>> - Jinja2 [required: >=2.4, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - Werkzeug [required: >=0.7, installed: 0.14.1] > >>>>> - WTForms [required: Any, installed: 2.2.1] > >>>>> - funcsigs [required: ==1.0.0, installed: 1.0.0] > >>>>> - ordereddict [required: Any, installed: 1.1] > >>>>> - future [required: >=0.16.0,<0.17, installed: 0.16.0] > >>>>> - gitpython [required: >=2.0.2, installed: 2.1.11] > >>>>> - gitdb2 [required: >=2.0.0, installed: 2.0.4] > >>>>> - smmap2 [required: >=2.0.0, installed: 2.0.4] > >>>>> - gunicorn [required: >=19.4.0,<20.0, installed: 19.9.0] > >>>>> - iso8601 [required: >=0.1.12, installed: 0.1.12] > >>>>> - jinja2 [required: >=2.7.3,<2.9.0, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - lxml [required: >=3.6.0,<4.0, installed: 3.8.0] > >>>>> - markdown [required: >=2.5.2,<3.0, installed: 2.6.11] > >>>>> - pandas [required: >=0.17.1,<1.0.0, installed: 0.23.4] > >>>>> - numpy [required: >=1.9.0, installed: 1.15.2] > >>>>> - python-dateutil [required: >=2.5.0, installed: 2.7.3] > >>>>> - six [required: >=1.5, installed: 1.11.0] > >>>>> - pytz [required: >=2011k, installed: 2018.5] > >>>>> - pendulum [required: ==1.4.4, installed: 1.4.4] > >>>>> - python-dateutil [required: >=2.6.0.0,<3.0.0.0, installed: 2.7.3] > >>>>> - six [required: >=1.5, installed: 1.11.0] > >>>>> - pytzdata [required: >=2018.3.0.0, installed: 2018.5] > >>>>> - tzlocal [required: >=1.5.0.0,<2.0.0.0, installed: 1.5.1] > >>>>> - pytz [required: Any, installed: 2018.5] > >>>>> - psutil [required: >=4.2.0,<5.0.0, installed: 4.4.2] > >>>>> - pygments [required: >=2.0.1,<3.0, installed: 2.2.0] > >>>>> - python-daemon [required: >=2.1.1,<2.2, installed: 2.1.2] > >>>>> - docutils [required: Any, installed: 0.14] > >>>>> - lockfile [required: >=0.10, installed: 0.12.2] > >>>>> - setuptools [required: Any, installed: 40.4.3] > >>>>> - python-dateutil [required: >=2.3,<3, installed: 2.7.3] > >>>>> - six [required: >=1.5, installed: 1.11.0] > >>>>> - python-nvd3 [required: ==0.15.0, installed: 0.15.0] > >>>>> - Jinja2 [required: >=2.8, installed: 2.8.1] > >>>>> - MarkupSafe [required: Any, installed: 1.0] > >>>>> - python-slugify [required: >=1.2.5, installed: 1.2.6] > >>>>> - Unidecode [required: >=0.04.16, installed: 1.0.22] > >>>>> - requests [required: >=2.5.1,<3, installed: 2.19.1] > >>>>> - certifi [required: >=2017.4.17, installed: 2018.8.24] > >>>>> - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4] > >>>>> - idna [required: >=2.5,<2.8, installed: 2.7] > >>>>> - urllib3 [required: >=1.21.1,<1.24, installed: 1.23] > >>>>> - setproctitle [required: >=1.1.8,<2, installed: 1.1.10] > >>>>> - sqlalchemy [required: >=1.1.15,<1.2.0, installed: 1.2.12] > >>>>> - tabulate [required: >=0.7.5,<0.8.0, installed: 0.7.7] > >>>>> - tenacity [required: ==4.8.0, installed: 4.8.0] > >>>>> - monotonic [required: >=0.6, installed: 1.5] > >>>>> - six [required: >=1.9.0, installed: 1.11.0] > >>>>> - thrift [required: >=0.9.2, installed: 0.11.0] > >>>>> - six [required: >=1.7.2, installed: 1.11.0] > >>>>> - tzlocal [required: >=1.4, installed: 1.5.1] > >>>>> - pytz [required: Any, installed: 2018.5] > >>>>> - unicodecsv [required: >=0.14.1, installed: 0.14.1] > >>>>> - werkzeug [required: >=0.14.1,<0.15.0, installed: 0.14.1] > >>>>> - zope.deprecation [required: >=4.0,<5.0, installed: 4.3.0] > >>>>> - setuptools [required: Any, installed: 40.4.3] > >>>>> > >>>>> -- > >>>>> Kyle Hamlin > >>>> > >>>> > >>> > >>> -- > >>> Kyle Hamlin > >>> > >> > >> > >> -- > >> Kyle Hamlin > >> > > > > > > -- > > Kyle Hamlin > > -- Kyle Hamlin