feature: use tox to test both SA 1.3 and SA 1.4
3 files changed, 99 insertions(+), 37 deletions(-)

M .build.yml
M pyproject.toml
M requirements.txt
M .build.yml +9 -17
@@ 1,4 1,4 @@ 
-image: alpine/3.9
+image: alpine/old
 packages:
   - findutils
   - linux-headers

          
@@ 6,10 6,8 @@ packages:
   - libressl-dev
   - python3
   - python3-dev
-# For hg-git  
-  - python
-  - python-dev
-  - py2-pip
+  - py3-pip
+  - py3-requests
 # Enable this to debug
 # shell: true
 secrets:

          
@@ 20,7 18,8 @@ sources:
 tasks:
   - sync_github: |
       cd sqlalchemy-querybuilder
-      sudo pip -q install hg-git
+      sudo pip3 -q install hg-git
+      sudo pip3 -q install dulwich
       echo "[extensions]" >>./.hg/hgrc
       echo "hgext.bookmarks =" >>./.hg/hgrc
       echo "hggit = " >>./.hg/hgrc

          
@@ 29,23 28,16 @@ tasks:
       hg push git+ssh://git@github.com/ocurero/sqlalchemy-querybuilder.git || hg push git+ssh://git@github.com/ocurero/sqlalchemy-querybuilder.git | grep "no changes found"
   - clone_github: |
       rm -R sqlalchemy-querybuilder && git clone git@github.com:ocurero/sqlalchemy-querybuilder.git
-  - mkvenv: 'python3 -m venv CI'
-  - tests: 'source CI/bin/activate
-
-    cd sqlalchemy-querybuilder
-
-    pip install --quiet --upgrade pip coverage
+  - tests: 'cd sqlalchemy-querybuilder
 
     curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py
-    | python
+    | python3
 
     source $HOME/.poetry/env
 
-    poetry -q update
+    poetry install --quiet
 
-    poetry install
-
-    poetry run coverage run --source=sqlalchemy_querybuilder -m pytest
+    tox
 
     if [ $? -eq 0 ]; then curl -s https://codecov.io/bash | bash -s -- -Z -t @/home/build/CODECOV_TOKEN;
     fi'

          
M pyproject.toml +1 -0
@@ 25,6 25,7 @@ pytest = "*"
 coverage = "^5.1"
 mkdocs = "^1.1.2"
 markdown-include = "^0.6.0"
+tox = "^3.23.0"
 
 [build-system]
 requires = ["poetry-core>=1.0.0"]

          
M requirements.txt +89 -20
@@ 1,20 1,89 @@ 
-sqlalchemy==1.3.16 \
-    --hash=sha256:8d8c21e9d4efef01351bf28513648ceb988031be4159745a7ad1b3e28c8ff68a \
-    --hash=sha256:083e383a1dca8384d0ea6378bd182d83c600ed4ff4ec8247d3b2442cf70db1ad \
-    --hash=sha256:128f6179325f7597a46403dde0bf148478f868df44841348dfc8d158e00db1f9 \
-    --hash=sha256:6056b671aeda3fc451382e52ab8a753c0d5f66ef2a5ccc8fa5ba7abd20988b4d \
-    --hash=sha256:7025c639ce7e170db845e94006cf5f404e243e6fc00d6c86fa19e8ad8d411880 \
-    --hash=sha256:e18752cecaef61031252ca72031d4d6247b3212ebb84748fc5d1a0d2029c23ea \
-    --hash=sha256:0a690a6486658d03cc6a73536d46e796b6570ac1f8a7ec133f9e28c448b69828 \
-    --hash=sha256:d00b393f05dbd4ecd65c989b7f5a81110eae4baea7a6a4cdd94c20a908d1456e \
-    --hash=sha256:114b6ace30001f056e944cebd46daef38fdb41ebb98f5e5940241a03ed6cad43 \
-    --hash=sha256:13d48cd8b925b6893a4e59b2dfb3e59a5204fd8c98289aad353af78bd214db49 \
-    --hash=sha256:211a1ce7e825f7142121144bac76f53ac28b12172716a710f4bf3eab477e730b \
-    --hash=sha256:68d78cf4a9dfade2e6cf57c4be19f7b82ed66e67dacf93b32bb390c9bed12749 \
-    --hash=sha256:2dc57ee80b76813759cccd1a7affedf9c4dbe5b065a91fb6092c9d8151d66078 \
-    --hash=sha256:43078c7ec0457387c79b8d52fff90a7ad352ca4c7aa841c366238c3e2cf52fdf \
-    --hash=sha256:bbb545da054e6297242a1bb1ba88e7a8ffb679f518258d66798ec712b82e4e07 \
-    --hash=sha256:5b1bf3c2c2dca738235ce08079783ef04f1a7fc5b21cf24adaae77f2da4e73c3 \
-    --hash=sha256:3e625e283eecc15aee5b1ef77203bfb542563fa4a9aa622c7643c7b55438ff49 \
-    --hash=sha256:7d98e0785c4cd7ae30b4a451416db71f5724a1839025544b4edbd92e00b91f0f \
-    --hash=sha256:7224e126c00b8178dfd227bc337ba5e754b197a3867d33b9f30dc0208f773d70
+greenlet==1.0.0; python_version >= "3" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3" \
+    --hash=sha256:1d1d4473ecb1c1d31ce8fd8d91e4da1b1f64d425c1dc965edc4ed2a63cfa67b2 \
+    --hash=sha256:cfd06e0f0cc8db2a854137bd79154b61ecd940dce96fad0cba23fe31de0b793c \
+    --hash=sha256:eb333b90036358a0e2c57373f72e7648d7207b76ef0bd00a4f7daad1f79f5203 \
+    --hash=sha256:1a1ada42a1fd2607d232ae11a7b3195735edaa49ea787a6d9e6a53afaf6f3476 \
+    --hash=sha256:f6f65bf54215e4ebf6b01e4bb94c49180a589573df643735107056f7a910275b \
+    --hash=sha256:f59eded163d9752fd49978e0bab7a1ff21b1b8d25c05f0995d140cc08ac83379 \
+    --hash=sha256:875d4c60a6299f55df1c3bb870ebe6dcb7db28c165ab9ea6cdc5d5af36bb33ce \
+    --hash=sha256:1bb80c71de788b36cefb0c3bb6bfab306ba75073dbde2829c858dc3ad70f867c \
+    --hash=sha256:b5f1b333015d53d4b381745f5de842f19fe59728b65f0fbb662dafbe2018c3a5 \
+    --hash=sha256:5352c15c1d91d22902582e891f27728d8dac3bd5e0ee565b6a9f575355e6d92f \
+    --hash=sha256:2c65320774a8cd5fdb6e117c13afa91c4707548282464a18cf80243cf976b3e6 \
+    --hash=sha256:111cfd92d78f2af0bc7317452bd93a477128af6327332ebf3c2be7df99566683 \
+    --hash=sha256:cdb90267650c1edb54459cdb51dab865f6c6594c3a47ebd441bc493360c7af70 \
+    --hash=sha256:eac8803c9ad1817ce3d8d15d1bb82c2da3feda6bee1153eec5c58fa6e5d3f770 \
+    --hash=sha256:c93d1a71c3fe222308939b2e516c07f35a849c5047f0197442a4d6fbcb4128ee \
+    --hash=sha256:122c63ba795fdba4fc19c744df6277d9cfd913ed53d1a286f12189a0265316dd \
+    --hash=sha256:c5b22b31c947ad8b6964d4ed66776bcae986f73669ba50620162ba7c832a6b6a \
+    --hash=sha256:4365eccd68e72564c776418c53ce3c5af402bc526fe0653722bc89efd85bf12d \
+    --hash=sha256:da7d09ad0f24270b20f77d56934e196e982af0d0a2446120cb772be4e060e1a2 \
+    --hash=sha256:647ba1df86d025f5a34043451d7c4a9f05f240bee06277a524daad11f997d1e7 \
+    --hash=sha256:e6e9fdaf6c90d02b95e6b0709aeb1aba5affbbb9ccaea5502f8638e4323206be \
+    --hash=sha256:62afad6e5fd70f34d773ffcbb7c22657e1d46d7fd7c95a43361de979f0a45aef \
+    --hash=sha256:d3789c1c394944084b5e57c192889985a9f23bd985f6d15728c745d380318128 \
+    --hash=sha256:f5e2d36c86c7b03c94b8459c3bd2c9fe2c7dab4b258b8885617d44a22e453fb7 \
+    --hash=sha256:292e801fcb3a0b3a12d8c603c7cf340659ea27fd73c98683e75800d9fd8f704c \
+    --hash=sha256:f3dc68272990849132d6698f7dc6df2ab62a88b0d36e54702a8fd16c0490e44f \
+    --hash=sha256:7cd5a237f241f2764324396e06298b5dee0df580cf06ef4ada0ff9bff851286c \
+    --hash=sha256:0ddd77586553e3daf439aa88b6642c5f252f7ef79a39271c25b1d4bf1b7cbb85 \
+    --hash=sha256:90b6a25841488cf2cb1c8623a53e6879573010a669455046df5f029d93db51b7 \
+    --hash=sha256:ed1d1351f05e795a527abc04a0d82e9aecd3bdf9f46662c36ff47b0b00ecaf06 \
+    --hash=sha256:94620ed996a7632723a424bccb84b07e7b861ab7bb06a5aeb041c111dd723d36 \
+    --hash=sha256:f97d83049715fd9dec7911860ecf0e17b48d8725de01e45de07d8ac0bd5bc378 \
+    --hash=sha256:0a77691f0080c9da8dfc81e23f4e3cffa5accf0f5b56478951016d7cfead9196 \
+    --hash=sha256:e1128e022d8dce375362e063754e129750323b67454cac5600008aad9f54139e \
+    --hash=sha256:5d4030b04061fdf4cbc446008e238e44936d77a04b2b32f804688ad64197953c \
+    --hash=sha256:f8450d5ef759dbe59f84f2c9f77491bb3d3c44bc1a573746daf086e70b14c243 \
+    --hash=sha256:df8053867c831b2643b2c489fe1d62049a98566b1646b194cc815f13e27b90df \
+    --hash=sha256:df3e83323268594fa9755480a442cabfe8d82b21aba815a71acf1bb6c1776218 \
+    --hash=sha256:181300f826625b7fd1182205b830642926f52bd8cdb08b34574c9d5b2b1813f7 \
+    --hash=sha256:58ca0f078d1c135ecf1879d50711f925ee238fe773dfe44e206d7d126f5bc664 \
+    --hash=sha256:5f297cb343114b33a13755032ecf7109b07b9a0020e841d1c3cedff6602cc139 \
+    --hash=sha256:5d69bbd9547d3bc49f8a545db7a0bd69f407badd2ff0f6e1a163680b5841d2b0 \
+    --hash=sha256:719e169c79255816cdcf6dccd9ed2d089a72a9f6c42273aae12d55e8d35bdcf8
+importlib-metadata==3.7.3; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.6.0" and python_version < "3.8" and python_version >= "3.6" \
+    --hash=sha256:b74159469b464a99cb8cc3e21973e4d96e05d3024d337313fedb618a6e86e6f4 \
+    --hash=sha256:742add720a20d0467df2f444ae41704000f50e1234f46174b51f9c6031a1bd71
+sqlalchemy==1.4.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") \
+    --hash=sha256:aed22be55a608787bb6875dbcf3561349a0e88fe33fd88c318c1e5b4eeb2306a \
+    --hash=sha256:7e1b0ed6d720750f02333d2f52502dfc2a23185aacc2cc6ce6ec29d28c21397c \
+    --hash=sha256:9406b96a979ab8d6de5d89f58b1f103c9aeef6fb5367448537a8228619f11258 \
+    --hash=sha256:59ec279f1bd55e1d703e3d4b651600cc463cc3eafa8d8e5a70ab844f736348d4 \
+    --hash=sha256:8cfcfcf2582b19c874fa20d0b75100abe17be80a4c637c0683b4eb919946dfee \
+    --hash=sha256:a6b4b7688fe7d251bbae3f9da4a487568bd584d13201bc7591c8639ad01fecdc \
+    --hash=sha256:0abab6d1044198993256f073340b14c459736777c550a7e914cd00444dcf9c30 \
+    --hash=sha256:5fb8f6a391992dd6aafe4fdf1dffbf7934fba1f5938593f20b152aa7f9619f82 \
+    --hash=sha256:97e333260a99d989f2a131aa8aa74140636dfbd030987150cb3748da607ea7db \
+    --hash=sha256:3fa75c854dba3f9b9c28bc5d88d246f6bc6f20b7480367c65339bcb2864d4707 \
+    --hash=sha256:1b9f3c7b281aa1c3d0c74ef12c4633e5f8358bb94f01be7b964887183fd53e5e \
+    --hash=sha256:da72e3499bde4548e8b7d7f2ab23ceed09a5bac307bf51057e066c406a0ba2e1 \
+    --hash=sha256:8383292298bb85d7ad79a13c6571aff213b96c49737f3c3af129de63bbfb42c9 \
+    --hash=sha256:4d1447183356c9679853926e81c7ebce3fbca9b1c607ea439975298c72137a36 \
+    --hash=sha256:ff76d7dbf33f62e30e5a1d1b095d46afcdc49e42cbe33ce12014110147466700 \
+    --hash=sha256:1ba6922331b3f38e116c9266206b044baf64576e5cebd87917b5ad872d7a025f \
+    --hash=sha256:d3b2819f4d7ae56191efc6fc456eb1805ada2bd5ba93d918893bc24fa7a1e30c \
+    --hash=sha256:3b290ff34de625143a05d2d172a88a064bb04a7938265b09d4e4bf45f21948f6 \
+    --hash=sha256:5289cafee71037f15feeeaf736f01910b9e3572525b73b201bdd21816db010ed \
+    --hash=sha256:0bb04fd7414718fb1f4dfa17efcb0be787363451cf99a5e992728925d298d9ae \
+    --hash=sha256:4e88549a5e58ba8c80c5ea071ac3b4e590236672a882bb80f56da4afcee45d96 \
+    --hash=sha256:edec945ed57d11a1123657e4066f0bf747aaa93c8a65ec1c2c98172d1f2a9b7d \
+    --hash=sha256:06125670280111e39014af87f14d74599fd4b39a512c74f1a10e21e5626eb158 \
+    --hash=sha256:e1692bdf1b95c97caab1201773a4576f59627997f598d30bdadc50dd9f897fec \
+    --hash=sha256:65c4df9517da9cce2c1255282d3e39f2afbc3a02deba60d99b0a3283ae80ec0b \
+    --hash=sha256:c6197c88ad53c31f58de5a8180936b8ef027356e788cd5f6514b3439d3d897ac \
+    --hash=sha256:6d6115edf1297bfa58994986ffe0dff21af18f0cba51dfa6d1769aa8a277be32 \
+    --hash=sha256:facacaea95e0822f7bbeaa6909b30b2836b14cff8790209d52a0c866e240b673 \
+    --hash=sha256:6e517126d3bc13d455826befdc35a89f82f01d163848f68db02caa80d25433fc \
+    --hash=sha256:09b08eb1bea621e47c2b0fcb0334fcbb00e1da2a3c2d45a98e56cd072b840719 \
+    --hash=sha256:7eba42098a13a3bcd509080b5e44d73783d9129ba0383793979bf518d01e8bb3 \
+    --hash=sha256:920db115eb06fc507fe2c774fb5c82a898b05dffbdadc7fafad51ce2cfd8c549 \
+    --hash=sha256:dcde5067a7dab1ff2eaea2f3622b2055c5225ce2aaf589c5a4c703d43519c4ba \
+    --hash=sha256:6a8e4c2e65028933a6dc8643c8f5a4f295a367131195b3c708634925cb3e8ec1
+typing-extensions==3.7.4.3; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.6.0" and python_version < "3.8" and python_version >= "3.6" \
+    --hash=sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f \
+    --hash=sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918 \
+    --hash=sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c
+zipp==3.4.1; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.6.0" and python_version < "3.8" and python_version >= "3.6" \
+    --hash=sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098 \
+    --hash=sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76