diff --git a/ext/readme.md b/ext/readme.md
index 469f2a513f..7c88adde9e 100644
--- a/ext/readme.md
+++ b/ext/readme.md
@@ -1,66 +1,72 @@
## ext
- Status | Package | Version / Commit | Usage | py2 | py3 | Notes
-:------: | :-------: | :----------------: | :---- | :--: | :--: | :----
-:: | `adba` | pymedusa/[fcb4bf4](https://github.com/pymedusa/adba/tree/fcb4bf43f10ca53f3beb915707c877581b1bf2a5) | **`medusa`** | v | v | -
-:: | appdirs.py
| [1.4.3](https://pypi.org/project/appdirs/1.4.3/) | `subliminal` (cli only), `simpleanidb` | v | v | -
-:: | `attrs` | [18.1.0](https://pypi.org/project/attrs/18.1.0/) | `imdbpie` | v | v | Module: `attr`
-:: | `babelfish` | [f403000](https://github.com/Diaoul/babelfish/tree/f403000dd63092cfaaae80be9f309fd85c7f20c9) | **`medusa`**, `guessit`, `knowit`, `subliminal` | v | v | -
-:: | backports_abc.py
| [0.5](https://pypi.org/project/backports_abc/0.5/) | `tornado` | v | v | Markers: `python_version < '3.5'`
-:: | `beautifulsoup4` | [4.6.3](https://pypi.org/project/beautifulsoup4/4.6.3/) | **`medusa`**, `subliminal` | v | v | Module: `bs4`
-:: | `bencode.py` | [2.0.0](https://pypi.org/project/bencode.py/2.0.0/) | **`medusa`** | v | v | Module: `bencode`
-:: | `boto` | [2.48.0](https://pypi.org/project/boto/2.48.0/) | `imdbpie` | v | v | -
-:: | `CacheControl` | [0.12.5](https://pypi.org/project/CacheControl/0.12.5/) | **`medusa`** | v | v | Module: `cachecontrol`
-:: | `certifi` | [2018.8.24](https://pypi.org/project/certifi/2018.8.24/) | **`medusa`**, `traktor`, `requests` | v | v | -
-:: | `chardet` | [3.0.4](https://pypi.org/project/chardet/3.0.4/) | **`medusa`**, `beautifulsoup4`, `feedparser`, `html5lib`, `pysrt`, `requests`, `subliminal` | v | v | -
-:: | `cloudflare-scrape` | pymedusa/[320456e](https://github.com/pymedusa/cloudflare-scrape/tree/320456e8b28cedb807363a7a892b1379db843f66) | **`medusa`** | v | v | Module: `cfscrape`
-:: | configobj.py
`validate.py`
`_version.py` | [5.0.6](https://pypi.org/project/configobj/5.0.6/) | **`medusa`** | v | v | -
-:: | configparser.py
`configparser.pth`
`backports.configparser` | [3.5.0](https://pypi.org/project/configparser/3.5.0/) | `adba` | v | v | `configparser.pth` was renamed from `configparser-3.5.0-py2.7-nspkg.pth`
-:: | contextlib2.py
| [0.5.5](https://pypi.org/project/contextlib2/0.5.5/) | **`medusa`**, `tvdbapiv2` | v | v | Markers: `python_version < '3.5'`
-:: | decorator.py
| [4.3.0](https://pypi.org/project/decorator/4.3.0/) | `validators` | v | v | -
-:: | `deprecated` | [1.2.3](https://pypi.org/project/deprecated/1.2.3/) | `PyGithub` | v | v | -
-:: | `dirtyjson` | [1.0.7](https://pypi.org/project/dirtyjson/1.0.7/) | **`medusa`** | v | v | -
-:: | `diskcache` | [2.9.0](https://pypi.org/project/diskcache/2.9.0/) | `imdbpie` | v | v | -
-:: | `dogpile.cache` | [0.6.7](https://pypi.org/project/dogpile.cache/0.6.7/) | **`medusa`**, `subliminal` | v | v | -
-:: | `enzyme` | pymedusa/[665cf69](https://github.com/pymedusa/enzyme/tree/665cf6948aab1c249dcc99bd9624a81d17b3302a) | `knowit`, `subliminal` | v | v | -
-:: | `feedparser` | [2b11c80](https://github.com/kurtmckee/feedparser/tree/2b11c8028321ed43cbaf313f83b0c94820143d66) | **`medusa`** | v | v | Requires `sgmllib3k` on Python 3
-:: | **`future`**
`_dummy_thread`
`_markupbase`
`_thread`
`builtins`
`copyreg`
`html`
`http`
`libfuturize`
`libpasteurize`
`past`
`queue`
`reprlib`
`socketserver`
`tkinter`
`winreg`
`xmlrpc` | [0.16.0](https://pypi.org/project/future/0.16.0/) | **`medusa`**, `python-twitter`, ????? | v | v | -
-:: | `futures` | [3.2.0](https://pypi.org/project/futures/3.2.0/) | **`medusa`**, `subliminal`, `tornado` | v | v | Module: `concurrent.futures`
Markers: `python_version >= '2.6' and python_version < '3'`
-:: | `PyGithub` | [1.43.2](https://pypi.org/project/PyGithub/1.43.2/) | **`medusa`** | v | v | Module: `github`
**Removed tests**
-:: | `gntp` | [1.0.3](https://pypi.org/project/gntp/1.0.3/) | **`medusa`** | v | v | -
-:: | `guessit` | [3.0.0](https://pypi.org/project/guessit/3.0.0/) | **`medusa`**, `subliminal` | v | v | -
-:: | `html5lib` | [1.0.1](https://pypi.org/project/html5lib/1.0.1/) | **`medusa`** (via `beautifulsoup4`) | v | v | -
-:: | `idna` | [2.7](https://pypi.org/project/idna/2.7/) | `requests` | v | v | -
-:: | `imdbpie` | [5.6.2](https://pypi.org/project/imdbpie/5.6.2/) | **`medusa`** | v | v | -
-:: | `Js2Py` | [0.59](https://pypi.org/project/Js2Py/0.59/) | `cloudflare-scrape` | v | v | Module: `js2py`
-:: | `jsonrpclib-pelix` | [0.3.1](https://pypi.org/project/jsonrpclib-pelix/0.3.1/) | **`medusa`** | v | v | Module: `jsonrpclib`
-:: | `PyJWT` | [1.6.4](https://pypi.org/project/pyjwt/1.6.4/) | **`medusa`**, `PyGithub`, `tvdbapiv2` | v | v | Module: `jwt`
-:: | `knowit` | [0.2.4](https://pypi.org/project/knowit/0.2.4/) | **`medusa`** | v | v | -
-:: | `lockfile` | [0.12.2](https://pypi.org/project/lockfile/0.12.2/) | `CacheControl` | v | v | -
-:: | `Mako` | [1.0.7](https://pypi.org/project/mako/1.0.7/) | **`medusa`** | v | v | Module: `mako`
-:: | markdown2.py
| [2.3.5](https://pypi.org/project/markdown2/2.3.5/) | **`medusa`** | v | v | -
-:: | `MarkupSafe` | [1.0](https://pypi.org/project/MarkupSafe/1.0/) | `Mako` | v | v | Module: `markupsafe`
-:: | `msgpack` | [0.5.6](https://pypi.org/project/msgpack/0.5.6/) | `CacheControl` | v | v | -
-:: | `oauthlib` | [2.1.0](https://pypi.org/project/oauthlib/2.1.0/) | `requests-oauthlib` | v | v | -
-:: | `Pint` | [0.8.1](https://pypi.org/project/Pint/0.8.1/) | `knowit` | v | v | Module: `pint`
-:: | profilehooks.py
| [1.10.0](https://pypi.org/project/profilehooks/1.10.0/) | **`medusa`** | v | v | -
-:: | `pyjsparser` | [2.5.2](https://pypi.org/project/pyjsparser/2.5.2/) | `Js2Py` | v | v | -
-:: | `pysrt` | [1.1.0](https://pypi.org/project/pysrt/1.1.0/) | `subliminal` | v | v | -
-:: | `python-dateutil` | [2.7.3](https://pypi.org/project/python-dateutil/2.7.3/) | **`medusa`**, `tvdbapiv2`, `guessit`, `imdbpie` | v | v | Module: `dateutil`
-:: | `python-twitter` | [3.4.2](https://pypi.org/project/python-twitter/3.4.2/) | **`medusa`** | v | v | Module: `twitter`
-:: | `pytz` | [2018.4](https://pypi.org/project/pytz/2018.4/) | `subliminal`, `tzlocal` | v | v | -
-:: | rarfile.py
| [3.0](https://pypi.org/project/rarfile/3.0/) | **`medusa`**, `subliminal` | v | v | -
-:: | `rebulk` | [0.9.0](https://pypi.org/project/rebulk/0.9.0/) | **`medusa`**, `guessit` | v | v | -
-:: | `requests` | [2.19.1](https://pypi.org/project/requests/2.19.1/) | **`medusa`**, `adba`, `pytvmaze`, `simpleanidb`, `tmdbsimple`, `traktor`, `tvdbapiv2`, `boto`, `rtorrent`, `CacheControl`, `cloudflare-scrape`, `subliminal`, `PyGithub`, `python-twitter` | v | v | -
-:: | `requests-oauthlib` | [1.0.0](https://pypi.org/project/requests-oauthlib/1.0.0/) | **`medusa`**, `python-twitter` | v | v | Module: `requests_oauthlib`
-:: | singledispatch.py
`singledispatch_helpers.py` | [3.4.0.3](https://pypi.org/project/singledispatch/3.4.0.3/) | `tornado` | v | v | Markers: `python_version < '3.4'`
-:: | six.py
| [1.11.0](https://pypi.org/project/six/1.11.0/) | **`medusa`**, `tvdbapiv2`, `configobj`, `python-dateutil`, `guessit`, `html5lib`, `imdbpie`, `Js2Py`, `knowit`, `rebulk`, `subliminal`, `validators` | v | v | -
-:: | `stevedore` | [1.29.0](https://pypi.org/project/stevedore/1.29.0/) | `subliminal` | v | v | -
-:: | `subliminal` | pymedusa/[78687f4](https://github.com/pymedusa/subliminal/tree/78687f45d23b1bc47fae0a5493be0198dc1fd5b5) | **`medusa`** | v | v | -
-:: | `tornado` | [5.1.1](https://pypi.org/project/tornado/5.1.1/) | **`medusa`**, `tornroutes` | v | v | -
-:: | `tornroutes` | [0.5.1](https://pypi.org/project/tornroutes/0.5.1/) | **`medusa`** | v | v | -
-:: | `tzlocal` | [1.5.1](https://pypi.org/project/tzlocal/1.5.1/) | `Js2Py` | v | v | -
-:: | `urllib3` | [1.23](https://pypi.org/project/urllib3/1.23/) | `requests`, `CacheControl` | v | v | -
-:: | `validators` | [0.12.2](https://pypi.org/project/validators/0.12.2/) | **`medusa`** | v | v | -
-:: | `webencodings` | [0.5.1](https://pypi.org/project/webencodings/0.5.1/) | `html5lib` | v | v | -
-:: | `wrapt` | [1.10.11](https://pypi.org/project/wrapt/1.10.11/) | `deprecated` | v | v | -
-:: | `PyYAML` | [3.13](https://pypi.org/project/PyYAML/3.13/) | `knowit` | v | v | Module: `yaml`
+ Status | Package | Version / Commit | Usage | Folder | Notes
+:------: | :-------: | :----------------: | :---- | :--: | :----
+:: | `adba` | pymedusa/[fcb4bf4](https://github.com/pymedusa/adba/tree/fcb4bf43f10ca53f3beb915707c877581b1bf2a5) | **`medusa`** | ext | -
+:: | appdirs.py
| [1.4.3](https://pypi.org/project/appdirs/1.4.3/) | `subliminal` (cli only), `simpleanidb` | ext | -
+:: | `attrs` | [18.1.0](https://pypi.org/project/attrs/18.1.0/) | `imdbpie` | ext | Module: `attr`
+:: | `babelfish` | [f403000](https://github.com/Diaoul/babelfish/tree/f403000dd63092cfaaae80be9f309fd85c7f20c9) | **`medusa`**, `guessit`, `knowit`, `subliminal` | ext | -
+:: | backports_abc.py
| [0.5](https://pypi.org/project/backports_abc/0.5/) | `tornado` | ext | Markers: `python_version < '3.5'`
+:: | `beautifulsoup4` | [4.6.3](https://pypi.org/project/beautifulsoup4/4.6.3/) | **`medusa`**, `subliminal` | **ext2 ext3** | Module: `bs4`
+:: | `bencode.py` | [2.0.0](https://pypi.org/project/bencode.py/2.0.0/) | **`medusa`** | ext | Module: `bencode`
+:: | `boto` | [2.48.0](https://pypi.org/project/boto/2.48.0/) | `imdbpie` | ext | -
+:: | `CacheControl` | [0.12.5](https://pypi.org/project/CacheControl/0.12.5/) | **`medusa`** | ext | Module: `cachecontrol`
+:: | `certifi` | [2018.8.24](https://pypi.org/project/certifi/2018.8.24/) | **`medusa`**, `traktor`, `requests` | ext | -
+:: | `chardet` | [3.0.4](https://pypi.org/project/chardet/3.0.4/) | **`medusa`**, `beautifulsoup4`, `feedparser`, `html5lib`, `pysrt`, `requests`, `subliminal` | ext | -
+:: | `cloudflare-scrape` | pymedusa/[320456e](https://github.com/pymedusa/cloudflare-scrape/tree/320456e8b28cedb807363a7a892b1379db843f66) | **`medusa`** | ext | Module: `cfscrape`
+:: | configobj.py
`validate.py`
`_version.py` | [5.0.6](https://pypi.org/project/configobj/5.0.6/) | **`medusa`** | ext | -
+:: | configparser.py
`configparser.pth`
`backports.configparser` | [3.5.0](https://pypi.org/project/configparser/3.5.0/) | `adba` | ext | `configparser.pth` was renamed from `configparser-3.5.0-py2.7-nspkg.pth`
+:: | contextlib2.py
| [0.5.5](https://pypi.org/project/contextlib2/0.5.5/) | **`medusa`**, `tvdbapiv2` | ext | Markers: `python_version < '3.5'`
+:: | decorator.py
| [4.3.0](https://pypi.org/project/decorator/4.3.0/) | `validators` | ext | -
+:: | `deprecated` | [1.2.3](https://pypi.org/project/deprecated/1.2.3/) | `PyGithub` | ext | -
+:: | `dirtyjson` | [1.0.7](https://pypi.org/project/dirtyjson/1.0.7/) | **`medusa`** | ext | -
+:: | `diskcache` | [2.9.0](https://pypi.org/project/diskcache/2.9.0/) | `imdbpie` | ext | -
+:: | `dogpile.cache` | [0.6.7](https://pypi.org/project/dogpile.cache/0.6.7/) | **`medusa`**, `subliminal` | ext | -
+:: | `enzyme` | pymedusa/[665cf69](https://github.com/pymedusa/enzyme/tree/665cf6948aab1c249dcc99bd9624a81d17b3302a) | `knowit`, `subliminal` | ext | -
+:: | `feedparser` | [2b11c80](https://github.com/kurtmckee/feedparser/tree/2b11c8028321ed43cbaf313f83b0c94820143d66) | **`medusa`** | ext | Requires `sgmllib3k` on Python 3
+:: | **`future`**
`_dummy_thread`
`_markupbase`
`_thread`
`builtins`
`copyreg`
`html`
`http`
`libfuturize`
`libpasteurize`
`past`
`queue`
`reprlib`
`socketserver`
`tkinter`
`winreg`
`xmlrpc` | [0.16.0](https://pypi.org/project/future/0.16.0/) | **`medusa`**, `python-twitter`, ????? | **ext2** | -
+:: | `futures` | [3.2.0](https://pypi.org/project/futures/3.2.0/) | **`medusa`**, `subliminal`, `tornado` | **ext2** | Module: `concurrent.futures`
Markers: `python_version >= '2.6' and python_version < '3'`
+:: | `PyGithub` | [1.43.2](https://pypi.org/project/PyGithub/1.43.2/) | **`medusa`** | **ext2 ext3** | Module: `github`
**Removed tests**
+:: | `gntp` | [1.0.3](https://pypi.org/project/gntp/1.0.3/) | **`medusa`** | ext | -
+:: | `guessit` | [3.0.0](https://pypi.org/project/guessit/3.0.0/) | **`medusa`**, `subliminal` | ext | -
+:: | `html5lib` | [1.0.1](https://pypi.org/project/html5lib/1.0.1/) | **`medusa`** (via `beautifulsoup4`) | ext | -
+:: | `idna` | [2.7](https://pypi.org/project/idna/2.7/) | `requests` | ext | -
+:: | `imdbpie` | [5.6.2](https://pypi.org/project/imdbpie/5.6.2/) | **`medusa`** | ext | -
+:: | `Js2Py` | [0.59](https://pypi.org/project/Js2Py/0.59/) | `cloudflare-scrape` | ext | Module: `js2py`
+:: | `jsonrpclib-pelix` | [0.3.1](https://pypi.org/project/jsonrpclib-pelix/0.3.1/) | **`medusa`** | ext | Module: `jsonrpclib`
+:: | `PyJWT` | [1.6.4](https://pypi.org/project/pyjwt/1.6.4/) | **`medusa`**, `PyGithub`, `tvdbapiv2` | ext | Module: `jwt`
+:: | `knowit` | [0.2.4](https://pypi.org/project/knowit/0.2.4/) | **`medusa`** | ext | -
+:: | `lockfile` | [0.12.2](https://pypi.org/project/lockfile/0.12.2/) | `CacheControl` | ext | -
+:: | `Mako` | [1.0.7](https://pypi.org/project/mako/1.0.7/) | **`medusa`** | ext | Module: `mako`
+:: | markdown2.py
| [2.3.5](https://pypi.org/project/markdown2/2.3.5/) | **`medusa`** | ext | -
+:: | `MarkupSafe` | [1.0](https://pypi.org/project/MarkupSafe/1.0/) | `Mako` | ext | Module: `markupsafe`
+:: | `msgpack` | [0.5.6](https://pypi.org/project/msgpack/0.5.6/) | `CacheControl` | ext | -
+:: | `oauthlib` | [2.1.0](https://pypi.org/project/oauthlib/2.1.0/) | `requests-oauthlib` | ext | -
+:: | `Pint` | [0.8.1](https://pypi.org/project/Pint/0.8.1/) | `knowit` | ext | Module: `pint`
+:: | profilehooks.py
| [1.10.0](https://pypi.org/project/profilehooks/1.10.0/) | **`medusa`** | ext | -
+:: | `pyjsparser` | [2.5.2](https://pypi.org/project/pyjsparser/2.5.2/) | `Js2Py` | ext | -
+:: | `pysrt` | [1.1.0](https://pypi.org/project/pysrt/1.1.0/) | `subliminal` | ext | -
+:: | `python-dateutil` | [2.7.3](https://pypi.org/project/python-dateutil/2.7.3/) | **`medusa`**, `tvdbapiv2`, `guessit`, `imdbpie` | ext | Module: `dateutil`
+:: | `python-twitter` | [3.4.2](https://pypi.org/project/python-twitter/3.4.2/) | **`medusa`** | ext | Module: `twitter`
+:: | `pytz` | [2018.4](https://pypi.org/project/pytz/2018.4/) | `subliminal`, `tzlocal` | ext | -
+:: | rarfile.py
| [3.0](https://pypi.org/project/rarfile/3.0/) | **`medusa`**, `subliminal` | ext | -
+:: | `rebulk` | [0.9.0](https://pypi.org/project/rebulk/0.9.0/) | **`medusa`**, `guessit` | ext | -
+:: | `requests` | [2.19.1](https://pypi.org/project/requests/2.19.1/) | **`medusa`**, `adba`, `pytvmaze`, `simpleanidb`, `tmdbsimple`, `traktor`, `tvdbapiv2`, `boto`, `rtorrent`, `CacheControl`, `cloudflare-scrape`, `subliminal`, `PyGithub`, `python-twitter` | ext | -
+:: | `requests-oauthlib` | [1.0.0](https://pypi.org/project/requests-oauthlib/1.0.0/) | **`medusa`**, `python-twitter` | ext | Module: `requests_oauthlib`
+:: | sgmllib3k
| [1.0.0](https://pypi.org/project/sgmllib3k/1.0.0/) | `feedparser` | **ext3** | File: `sgmllib.py`
+:: | singledispatch.py
`singledispatch_helpers.py` | [3.4.0.3](https://pypi.org/project/singledispatch/3.4.0.3/) | `tornado` | ext | Markers: `python_version < '3.4'`
+:: | six.py
| [1.11.0](https://pypi.org/project/six/1.11.0/) | **`medusa`**, `tvdbapiv2`, `configobj`, `python-dateutil`, `guessit`, `html5lib`, `imdbpie`, `Js2Py`, `knowit`, `rebulk`, `subliminal`, `validators` | ext | -
+:: | `stevedore` | [1.29.0](https://pypi.org/project/stevedore/1.29.0/) | `subliminal` | ext | -
+:: | `subliminal` | pymedusa/[78687f4](https://github.com/pymedusa/subliminal/tree/78687f45d23b1bc47fae0a5493be0198dc1fd5b5) | **`medusa`** | ext | -
+:: | `tornado` | [5.1.1](https://pypi.org/project/tornado/5.1.1/) | **`medusa`**, `tornroutes` | ext | -
+:: | `tornroutes` | [0.5.1](https://pypi.org/project/tornroutes/0.5.1/) | **`medusa`** | ext | -
+:: | `tzlocal` | [1.5.1](https://pypi.org/project/tzlocal/1.5.1/) | `Js2Py` | ext | -
+:: | `urllib3` | [1.23](https://pypi.org/project/urllib3/1.23/) | `requests`, `CacheControl` | ext | -
+:: | `validators` | [0.12.2](https://pypi.org/project/validators/0.12.2/) | **`medusa`** | ext | -
+:: | `webencodings` | [0.5.1](https://pypi.org/project/webencodings/0.5.1/) | `html5lib` | ext | -
+:: | `wrapt` | [1.10.11](https://pypi.org/project/wrapt/1.10.11/) | `deprecated` | ext | -
+:: | `PyYAML` | [3.13](https://pypi.org/project/PyYAML/3.13/) | `knowit` | **ext2 ext3** | Module: `yaml`
+
+Notes:
+ - `ext` compatible with python2 and python3
+ - `ext2` only compatible with python2
+ - `ext3` only compatible with python3
diff --git a/ext/_dummy_thread/__init__.py b/ext2/_dummy_thread/__init__.py
similarity index 100%
rename from ext/_dummy_thread/__init__.py
rename to ext2/_dummy_thread/__init__.py
diff --git a/ext/_markupbase/__init__.py b/ext2/_markupbase/__init__.py
similarity index 100%
rename from ext/_markupbase/__init__.py
rename to ext2/_markupbase/__init__.py
diff --git a/ext/_thread/__init__.py b/ext2/_thread/__init__.py
similarity index 100%
rename from ext/_thread/__init__.py
rename to ext2/_thread/__init__.py
diff --git a/ext/bs4/__init__.py b/ext2/bs4/__init__.py
similarity index 100%
rename from ext/bs4/__init__.py
rename to ext2/bs4/__init__.py
diff --git a/ext/bs4/builder/__init__.py b/ext2/bs4/builder/__init__.py
similarity index 100%
rename from ext/bs4/builder/__init__.py
rename to ext2/bs4/builder/__init__.py
diff --git a/ext/bs4/builder/_html5lib.py b/ext2/bs4/builder/_html5lib.py
similarity index 100%
rename from ext/bs4/builder/_html5lib.py
rename to ext2/bs4/builder/_html5lib.py
diff --git a/ext/bs4/builder/_htmlparser.py b/ext2/bs4/builder/_htmlparser.py
similarity index 100%
rename from ext/bs4/builder/_htmlparser.py
rename to ext2/bs4/builder/_htmlparser.py
diff --git a/ext/bs4/builder/_lxml.py b/ext2/bs4/builder/_lxml.py
similarity index 100%
rename from ext/bs4/builder/_lxml.py
rename to ext2/bs4/builder/_lxml.py
diff --git a/ext/bs4/dammit.py b/ext2/bs4/dammit.py
similarity index 100%
rename from ext/bs4/dammit.py
rename to ext2/bs4/dammit.py
diff --git a/ext/bs4/diagnose.py b/ext2/bs4/diagnose.py
similarity index 100%
rename from ext/bs4/diagnose.py
rename to ext2/bs4/diagnose.py
diff --git a/ext/bs4/element.py b/ext2/bs4/element.py
similarity index 100%
rename from ext/bs4/element.py
rename to ext2/bs4/element.py
diff --git a/ext/bs4/testing.py b/ext2/bs4/testing.py
similarity index 100%
rename from ext/bs4/testing.py
rename to ext2/bs4/testing.py
diff --git a/ext/bs4/tests/__init__.py b/ext2/bs4/tests/__init__.py
similarity index 100%
rename from ext/bs4/tests/__init__.py
rename to ext2/bs4/tests/__init__.py
diff --git a/ext/bs4/tests/test_builder_registry.py b/ext2/bs4/tests/test_builder_registry.py
similarity index 100%
rename from ext/bs4/tests/test_builder_registry.py
rename to ext2/bs4/tests/test_builder_registry.py
diff --git a/ext/bs4/tests/test_docs.py b/ext2/bs4/tests/test_docs.py
similarity index 100%
rename from ext/bs4/tests/test_docs.py
rename to ext2/bs4/tests/test_docs.py
diff --git a/ext/bs4/tests/test_html5lib.py b/ext2/bs4/tests/test_html5lib.py
similarity index 100%
rename from ext/bs4/tests/test_html5lib.py
rename to ext2/bs4/tests/test_html5lib.py
diff --git a/ext/bs4/tests/test_htmlparser.py b/ext2/bs4/tests/test_htmlparser.py
similarity index 100%
rename from ext/bs4/tests/test_htmlparser.py
rename to ext2/bs4/tests/test_htmlparser.py
diff --git a/ext/bs4/tests/test_lxml.py b/ext2/bs4/tests/test_lxml.py
similarity index 100%
rename from ext/bs4/tests/test_lxml.py
rename to ext2/bs4/tests/test_lxml.py
diff --git a/ext/bs4/tests/test_soup.py b/ext2/bs4/tests/test_soup.py
similarity index 100%
rename from ext/bs4/tests/test_soup.py
rename to ext2/bs4/tests/test_soup.py
diff --git a/ext/bs4/tests/test_tree.py b/ext2/bs4/tests/test_tree.py
similarity index 100%
rename from ext/bs4/tests/test_tree.py
rename to ext2/bs4/tests/test_tree.py
diff --git a/ext/builtins/__init__.py b/ext2/builtins/__init__.py
similarity index 100%
rename from ext/builtins/__init__.py
rename to ext2/builtins/__init__.py
diff --git a/ext/concurrent/__init__.py b/ext2/concurrent/__init__.py
similarity index 100%
rename from ext/concurrent/__init__.py
rename to ext2/concurrent/__init__.py
diff --git a/ext/concurrent/futures/__init__.py b/ext2/concurrent/futures/__init__.py
similarity index 100%
rename from ext/concurrent/futures/__init__.py
rename to ext2/concurrent/futures/__init__.py
diff --git a/ext/concurrent/futures/_base.py b/ext2/concurrent/futures/_base.py
similarity index 100%
rename from ext/concurrent/futures/_base.py
rename to ext2/concurrent/futures/_base.py
diff --git a/ext/concurrent/futures/process.py b/ext2/concurrent/futures/process.py
similarity index 100%
rename from ext/concurrent/futures/process.py
rename to ext2/concurrent/futures/process.py
diff --git a/ext/concurrent/futures/thread.py b/ext2/concurrent/futures/thread.py
similarity index 100%
rename from ext/concurrent/futures/thread.py
rename to ext2/concurrent/futures/thread.py
diff --git a/ext/copyreg/__init__.py b/ext2/copyreg/__init__.py
similarity index 100%
rename from ext/copyreg/__init__.py
rename to ext2/copyreg/__init__.py
diff --git a/ext/future/__init__.py b/ext2/future/__init__.py
similarity index 100%
rename from ext/future/__init__.py
rename to ext2/future/__init__.py
diff --git a/ext/future/backports/__init__.py b/ext2/future/backports/__init__.py
similarity index 100%
rename from ext/future/backports/__init__.py
rename to ext2/future/backports/__init__.py
diff --git a/ext/future/backports/_markupbase.py b/ext2/future/backports/_markupbase.py
similarity index 100%
rename from ext/future/backports/_markupbase.py
rename to ext2/future/backports/_markupbase.py
diff --git a/ext/future/backports/datetime.py b/ext2/future/backports/datetime.py
similarity index 100%
rename from ext/future/backports/datetime.py
rename to ext2/future/backports/datetime.py
diff --git a/ext/future/backports/email/__init__.py b/ext2/future/backports/email/__init__.py
similarity index 100%
rename from ext/future/backports/email/__init__.py
rename to ext2/future/backports/email/__init__.py
diff --git a/ext/future/backports/email/_encoded_words.py b/ext2/future/backports/email/_encoded_words.py
similarity index 100%
rename from ext/future/backports/email/_encoded_words.py
rename to ext2/future/backports/email/_encoded_words.py
diff --git a/ext/future/backports/email/_header_value_parser.py b/ext2/future/backports/email/_header_value_parser.py
similarity index 100%
rename from ext/future/backports/email/_header_value_parser.py
rename to ext2/future/backports/email/_header_value_parser.py
diff --git a/ext/future/backports/email/_parseaddr.py b/ext2/future/backports/email/_parseaddr.py
similarity index 100%
rename from ext/future/backports/email/_parseaddr.py
rename to ext2/future/backports/email/_parseaddr.py
diff --git a/ext/future/backports/email/_policybase.py b/ext2/future/backports/email/_policybase.py
similarity index 100%
rename from ext/future/backports/email/_policybase.py
rename to ext2/future/backports/email/_policybase.py
diff --git a/ext/future/backports/email/base64mime.py b/ext2/future/backports/email/base64mime.py
similarity index 100%
rename from ext/future/backports/email/base64mime.py
rename to ext2/future/backports/email/base64mime.py
diff --git a/ext/future/backports/email/charset.py b/ext2/future/backports/email/charset.py
similarity index 100%
rename from ext/future/backports/email/charset.py
rename to ext2/future/backports/email/charset.py
diff --git a/ext/future/backports/email/encoders.py b/ext2/future/backports/email/encoders.py
similarity index 100%
rename from ext/future/backports/email/encoders.py
rename to ext2/future/backports/email/encoders.py
diff --git a/ext/future/backports/email/errors.py b/ext2/future/backports/email/errors.py
similarity index 100%
rename from ext/future/backports/email/errors.py
rename to ext2/future/backports/email/errors.py
diff --git a/ext/future/backports/email/feedparser.py b/ext2/future/backports/email/feedparser.py
similarity index 100%
rename from ext/future/backports/email/feedparser.py
rename to ext2/future/backports/email/feedparser.py
diff --git a/ext/future/backports/email/generator.py b/ext2/future/backports/email/generator.py
similarity index 100%
rename from ext/future/backports/email/generator.py
rename to ext2/future/backports/email/generator.py
diff --git a/ext/future/backports/email/header.py b/ext2/future/backports/email/header.py
similarity index 100%
rename from ext/future/backports/email/header.py
rename to ext2/future/backports/email/header.py
diff --git a/ext/future/backports/email/headerregistry.py b/ext2/future/backports/email/headerregistry.py
similarity index 100%
rename from ext/future/backports/email/headerregistry.py
rename to ext2/future/backports/email/headerregistry.py
diff --git a/ext/future/backports/email/iterators.py b/ext2/future/backports/email/iterators.py
similarity index 100%
rename from ext/future/backports/email/iterators.py
rename to ext2/future/backports/email/iterators.py
diff --git a/ext/future/backports/email/message.py b/ext2/future/backports/email/message.py
similarity index 100%
rename from ext/future/backports/email/message.py
rename to ext2/future/backports/email/message.py
diff --git a/ext/future/backports/email/mime/__init__.py b/ext2/future/backports/email/mime/__init__.py
similarity index 100%
rename from ext/future/backports/email/mime/__init__.py
rename to ext2/future/backports/email/mime/__init__.py
diff --git a/ext/future/backports/email/mime/application.py b/ext2/future/backports/email/mime/application.py
similarity index 100%
rename from ext/future/backports/email/mime/application.py
rename to ext2/future/backports/email/mime/application.py
diff --git a/ext/future/backports/email/mime/audio.py b/ext2/future/backports/email/mime/audio.py
similarity index 100%
rename from ext/future/backports/email/mime/audio.py
rename to ext2/future/backports/email/mime/audio.py
diff --git a/ext/future/backports/email/mime/base.py b/ext2/future/backports/email/mime/base.py
similarity index 100%
rename from ext/future/backports/email/mime/base.py
rename to ext2/future/backports/email/mime/base.py
diff --git a/ext/future/backports/email/mime/image.py b/ext2/future/backports/email/mime/image.py
similarity index 100%
rename from ext/future/backports/email/mime/image.py
rename to ext2/future/backports/email/mime/image.py
diff --git a/ext/future/backports/email/mime/message.py b/ext2/future/backports/email/mime/message.py
similarity index 100%
rename from ext/future/backports/email/mime/message.py
rename to ext2/future/backports/email/mime/message.py
diff --git a/ext/future/backports/email/mime/multipart.py b/ext2/future/backports/email/mime/multipart.py
similarity index 100%
rename from ext/future/backports/email/mime/multipart.py
rename to ext2/future/backports/email/mime/multipart.py
diff --git a/ext/future/backports/email/mime/nonmultipart.py b/ext2/future/backports/email/mime/nonmultipart.py
similarity index 100%
rename from ext/future/backports/email/mime/nonmultipart.py
rename to ext2/future/backports/email/mime/nonmultipart.py
diff --git a/ext/future/backports/email/mime/text.py b/ext2/future/backports/email/mime/text.py
similarity index 100%
rename from ext/future/backports/email/mime/text.py
rename to ext2/future/backports/email/mime/text.py
diff --git a/ext/future/backports/email/parser.py b/ext2/future/backports/email/parser.py
similarity index 100%
rename from ext/future/backports/email/parser.py
rename to ext2/future/backports/email/parser.py
diff --git a/ext/future/backports/email/policy.py b/ext2/future/backports/email/policy.py
similarity index 100%
rename from ext/future/backports/email/policy.py
rename to ext2/future/backports/email/policy.py
diff --git a/ext/future/backports/email/quoprimime.py b/ext2/future/backports/email/quoprimime.py
similarity index 100%
rename from ext/future/backports/email/quoprimime.py
rename to ext2/future/backports/email/quoprimime.py
diff --git a/ext/future/backports/email/utils.py b/ext2/future/backports/email/utils.py
similarity index 100%
rename from ext/future/backports/email/utils.py
rename to ext2/future/backports/email/utils.py
diff --git a/ext/future/backports/html/__init__.py b/ext2/future/backports/html/__init__.py
similarity index 100%
rename from ext/future/backports/html/__init__.py
rename to ext2/future/backports/html/__init__.py
diff --git a/ext/future/backports/html/entities.py b/ext2/future/backports/html/entities.py
similarity index 100%
rename from ext/future/backports/html/entities.py
rename to ext2/future/backports/html/entities.py
diff --git a/ext/future/backports/html/parser.py b/ext2/future/backports/html/parser.py
similarity index 100%
rename from ext/future/backports/html/parser.py
rename to ext2/future/backports/html/parser.py
diff --git a/ext/future/backports/http/__init__.py b/ext2/future/backports/http/__init__.py
similarity index 100%
rename from ext/future/backports/http/__init__.py
rename to ext2/future/backports/http/__init__.py
diff --git a/ext/future/backports/http/client.py b/ext2/future/backports/http/client.py
similarity index 100%
rename from ext/future/backports/http/client.py
rename to ext2/future/backports/http/client.py
diff --git a/ext/future/backports/http/cookiejar.py b/ext2/future/backports/http/cookiejar.py
similarity index 100%
rename from ext/future/backports/http/cookiejar.py
rename to ext2/future/backports/http/cookiejar.py
diff --git a/ext/future/backports/http/cookies.py b/ext2/future/backports/http/cookies.py
similarity index 100%
rename from ext/future/backports/http/cookies.py
rename to ext2/future/backports/http/cookies.py
diff --git a/ext/future/backports/http/server.py b/ext2/future/backports/http/server.py
similarity index 100%
rename from ext/future/backports/http/server.py
rename to ext2/future/backports/http/server.py
diff --git a/ext/future/backports/misc.py b/ext2/future/backports/misc.py
similarity index 100%
rename from ext/future/backports/misc.py
rename to ext2/future/backports/misc.py
diff --git a/ext/future/backports/socket.py b/ext2/future/backports/socket.py
similarity index 100%
rename from ext/future/backports/socket.py
rename to ext2/future/backports/socket.py
diff --git a/ext/future/backports/socketserver.py b/ext2/future/backports/socketserver.py
similarity index 100%
rename from ext/future/backports/socketserver.py
rename to ext2/future/backports/socketserver.py
diff --git a/ext/future/backports/test/__init__.py b/ext2/future/backports/test/__init__.py
similarity index 100%
rename from ext/future/backports/test/__init__.py
rename to ext2/future/backports/test/__init__.py
diff --git a/ext/future/backports/test/badcert.pem b/ext2/future/backports/test/badcert.pem
similarity index 100%
rename from ext/future/backports/test/badcert.pem
rename to ext2/future/backports/test/badcert.pem
diff --git a/ext/future/backports/test/badkey.pem b/ext2/future/backports/test/badkey.pem
similarity index 100%
rename from ext/future/backports/test/badkey.pem
rename to ext2/future/backports/test/badkey.pem
diff --git a/ext/future/backports/test/dh512.pem b/ext2/future/backports/test/dh512.pem
similarity index 100%
rename from ext/future/backports/test/dh512.pem
rename to ext2/future/backports/test/dh512.pem
diff --git a/ext/future/backports/test/https_svn_python_org_root.pem b/ext2/future/backports/test/https_svn_python_org_root.pem
similarity index 100%
rename from ext/future/backports/test/https_svn_python_org_root.pem
rename to ext2/future/backports/test/https_svn_python_org_root.pem
diff --git a/ext/future/backports/test/keycert.passwd.pem b/ext2/future/backports/test/keycert.passwd.pem
similarity index 100%
rename from ext/future/backports/test/keycert.passwd.pem
rename to ext2/future/backports/test/keycert.passwd.pem
diff --git a/ext/future/backports/test/keycert.pem b/ext2/future/backports/test/keycert.pem
similarity index 100%
rename from ext/future/backports/test/keycert.pem
rename to ext2/future/backports/test/keycert.pem
diff --git a/ext/future/backports/test/keycert2.pem b/ext2/future/backports/test/keycert2.pem
similarity index 100%
rename from ext/future/backports/test/keycert2.pem
rename to ext2/future/backports/test/keycert2.pem
diff --git a/ext/future/backports/test/nokia.pem b/ext2/future/backports/test/nokia.pem
similarity index 100%
rename from ext/future/backports/test/nokia.pem
rename to ext2/future/backports/test/nokia.pem
diff --git a/ext/future/backports/test/nullbytecert.pem b/ext2/future/backports/test/nullbytecert.pem
similarity index 100%
rename from ext/future/backports/test/nullbytecert.pem
rename to ext2/future/backports/test/nullbytecert.pem
diff --git a/ext/future/backports/test/nullcert.pem b/ext2/future/backports/test/nullcert.pem
similarity index 100%
rename from ext/future/backports/test/nullcert.pem
rename to ext2/future/backports/test/nullcert.pem
diff --git a/ext/future/backports/test/pystone.py b/ext2/future/backports/test/pystone.py
similarity index 100%
rename from ext/future/backports/test/pystone.py
rename to ext2/future/backports/test/pystone.py
diff --git a/ext/future/backports/test/sha256.pem b/ext2/future/backports/test/sha256.pem
similarity index 100%
rename from ext/future/backports/test/sha256.pem
rename to ext2/future/backports/test/sha256.pem
diff --git a/ext/future/backports/test/ssl_cert.pem b/ext2/future/backports/test/ssl_cert.pem
similarity index 100%
rename from ext/future/backports/test/ssl_cert.pem
rename to ext2/future/backports/test/ssl_cert.pem
diff --git a/ext/future/backports/test/ssl_key.passwd.pem b/ext2/future/backports/test/ssl_key.passwd.pem
similarity index 100%
rename from ext/future/backports/test/ssl_key.passwd.pem
rename to ext2/future/backports/test/ssl_key.passwd.pem
diff --git a/ext/future/backports/test/ssl_key.pem b/ext2/future/backports/test/ssl_key.pem
similarity index 100%
rename from ext/future/backports/test/ssl_key.pem
rename to ext2/future/backports/test/ssl_key.pem
diff --git a/ext/future/backports/test/ssl_servers.py b/ext2/future/backports/test/ssl_servers.py
similarity index 100%
rename from ext/future/backports/test/ssl_servers.py
rename to ext2/future/backports/test/ssl_servers.py
diff --git a/ext/future/backports/test/support.py b/ext2/future/backports/test/support.py
similarity index 100%
rename from ext/future/backports/test/support.py
rename to ext2/future/backports/test/support.py
diff --git a/ext/future/backports/total_ordering.py b/ext2/future/backports/total_ordering.py
similarity index 100%
rename from ext/future/backports/total_ordering.py
rename to ext2/future/backports/total_ordering.py
diff --git a/ext/future/backports/urllib/__init__.py b/ext2/future/backports/urllib/__init__.py
similarity index 100%
rename from ext/future/backports/urllib/__init__.py
rename to ext2/future/backports/urllib/__init__.py
diff --git a/ext/future/backports/urllib/error.py b/ext2/future/backports/urllib/error.py
similarity index 100%
rename from ext/future/backports/urllib/error.py
rename to ext2/future/backports/urllib/error.py
diff --git a/ext/future/backports/urllib/parse.py b/ext2/future/backports/urllib/parse.py
similarity index 100%
rename from ext/future/backports/urllib/parse.py
rename to ext2/future/backports/urllib/parse.py
diff --git a/ext/future/backports/urllib/request.py b/ext2/future/backports/urllib/request.py
similarity index 100%
rename from ext/future/backports/urllib/request.py
rename to ext2/future/backports/urllib/request.py
diff --git a/ext/future/backports/urllib/response.py b/ext2/future/backports/urllib/response.py
similarity index 100%
rename from ext/future/backports/urllib/response.py
rename to ext2/future/backports/urllib/response.py
diff --git a/ext/future/backports/urllib/robotparser.py b/ext2/future/backports/urllib/robotparser.py
similarity index 100%
rename from ext/future/backports/urllib/robotparser.py
rename to ext2/future/backports/urllib/robotparser.py
diff --git a/ext/future/backports/xmlrpc/__init__.py b/ext2/future/backports/xmlrpc/__init__.py
similarity index 100%
rename from ext/future/backports/xmlrpc/__init__.py
rename to ext2/future/backports/xmlrpc/__init__.py
diff --git a/ext/future/backports/xmlrpc/client.py b/ext2/future/backports/xmlrpc/client.py
similarity index 100%
rename from ext/future/backports/xmlrpc/client.py
rename to ext2/future/backports/xmlrpc/client.py
diff --git a/ext/future/backports/xmlrpc/server.py b/ext2/future/backports/xmlrpc/server.py
similarity index 100%
rename from ext/future/backports/xmlrpc/server.py
rename to ext2/future/backports/xmlrpc/server.py
diff --git a/ext/future/builtins/__init__.py b/ext2/future/builtins/__init__.py
similarity index 100%
rename from ext/future/builtins/__init__.py
rename to ext2/future/builtins/__init__.py
diff --git a/ext/future/builtins/disabled.py b/ext2/future/builtins/disabled.py
similarity index 100%
rename from ext/future/builtins/disabled.py
rename to ext2/future/builtins/disabled.py
diff --git a/ext/future/builtins/iterators.py b/ext2/future/builtins/iterators.py
similarity index 100%
rename from ext/future/builtins/iterators.py
rename to ext2/future/builtins/iterators.py
diff --git a/ext/future/builtins/misc.py b/ext2/future/builtins/misc.py
similarity index 100%
rename from ext/future/builtins/misc.py
rename to ext2/future/builtins/misc.py
diff --git a/ext/future/builtins/newnext.py b/ext2/future/builtins/newnext.py
similarity index 100%
rename from ext/future/builtins/newnext.py
rename to ext2/future/builtins/newnext.py
diff --git a/ext/future/builtins/newround.py b/ext2/future/builtins/newround.py
similarity index 100%
rename from ext/future/builtins/newround.py
rename to ext2/future/builtins/newround.py
diff --git a/ext/future/builtins/newsuper.py b/ext2/future/builtins/newsuper.py
similarity index 100%
rename from ext/future/builtins/newsuper.py
rename to ext2/future/builtins/newsuper.py
diff --git a/ext/future/moves/__init__.py b/ext2/future/moves/__init__.py
similarity index 100%
rename from ext/future/moves/__init__.py
rename to ext2/future/moves/__init__.py
diff --git a/ext/future/moves/_dummy_thread.py b/ext2/future/moves/_dummy_thread.py
similarity index 100%
rename from ext/future/moves/_dummy_thread.py
rename to ext2/future/moves/_dummy_thread.py
diff --git a/ext/future/moves/_markupbase.py b/ext2/future/moves/_markupbase.py
similarity index 100%
rename from ext/future/moves/_markupbase.py
rename to ext2/future/moves/_markupbase.py
diff --git a/ext/future/moves/_thread.py b/ext2/future/moves/_thread.py
similarity index 100%
rename from ext/future/moves/_thread.py
rename to ext2/future/moves/_thread.py
diff --git a/ext/future/moves/builtins.py b/ext2/future/moves/builtins.py
similarity index 100%
rename from ext/future/moves/builtins.py
rename to ext2/future/moves/builtins.py
diff --git a/ext/future/moves/collections.py b/ext2/future/moves/collections.py
similarity index 100%
rename from ext/future/moves/collections.py
rename to ext2/future/moves/collections.py
diff --git a/ext/future/moves/configparser.py b/ext2/future/moves/configparser.py
similarity index 100%
rename from ext/future/moves/configparser.py
rename to ext2/future/moves/configparser.py
diff --git a/ext/future/moves/copyreg.py b/ext2/future/moves/copyreg.py
similarity index 100%
rename from ext/future/moves/copyreg.py
rename to ext2/future/moves/copyreg.py
diff --git a/ext/future/moves/dbm/__init__.py b/ext2/future/moves/dbm/__init__.py
similarity index 100%
rename from ext/future/moves/dbm/__init__.py
rename to ext2/future/moves/dbm/__init__.py
diff --git a/ext/future/moves/dbm/dumb.py b/ext2/future/moves/dbm/dumb.py
similarity index 100%
rename from ext/future/moves/dbm/dumb.py
rename to ext2/future/moves/dbm/dumb.py
diff --git a/ext/future/moves/dbm/gnu.py b/ext2/future/moves/dbm/gnu.py
similarity index 100%
rename from ext/future/moves/dbm/gnu.py
rename to ext2/future/moves/dbm/gnu.py
diff --git a/ext/future/moves/dbm/ndbm.py b/ext2/future/moves/dbm/ndbm.py
similarity index 100%
rename from ext/future/moves/dbm/ndbm.py
rename to ext2/future/moves/dbm/ndbm.py
diff --git a/ext/future/moves/html/__init__.py b/ext2/future/moves/html/__init__.py
similarity index 100%
rename from ext/future/moves/html/__init__.py
rename to ext2/future/moves/html/__init__.py
diff --git a/ext/future/moves/html/entities.py b/ext2/future/moves/html/entities.py
similarity index 100%
rename from ext/future/moves/html/entities.py
rename to ext2/future/moves/html/entities.py
diff --git a/ext/future/moves/html/parser.py b/ext2/future/moves/html/parser.py
similarity index 100%
rename from ext/future/moves/html/parser.py
rename to ext2/future/moves/html/parser.py
diff --git a/ext/future/moves/http/__init__.py b/ext2/future/moves/http/__init__.py
similarity index 100%
rename from ext/future/moves/http/__init__.py
rename to ext2/future/moves/http/__init__.py
diff --git a/ext/future/moves/http/client.py b/ext2/future/moves/http/client.py
similarity index 100%
rename from ext/future/moves/http/client.py
rename to ext2/future/moves/http/client.py
diff --git a/ext/future/moves/http/cookiejar.py b/ext2/future/moves/http/cookiejar.py
similarity index 100%
rename from ext/future/moves/http/cookiejar.py
rename to ext2/future/moves/http/cookiejar.py
diff --git a/ext/future/moves/http/cookies.py b/ext2/future/moves/http/cookies.py
similarity index 100%
rename from ext/future/moves/http/cookies.py
rename to ext2/future/moves/http/cookies.py
diff --git a/ext/future/moves/http/server.py b/ext2/future/moves/http/server.py
similarity index 100%
rename from ext/future/moves/http/server.py
rename to ext2/future/moves/http/server.py
diff --git a/ext/future/moves/itertools.py b/ext2/future/moves/itertools.py
similarity index 100%
rename from ext/future/moves/itertools.py
rename to ext2/future/moves/itertools.py
diff --git a/ext/future/moves/pickle.py b/ext2/future/moves/pickle.py
similarity index 100%
rename from ext/future/moves/pickle.py
rename to ext2/future/moves/pickle.py
diff --git a/ext/future/moves/queue.py b/ext2/future/moves/queue.py
similarity index 100%
rename from ext/future/moves/queue.py
rename to ext2/future/moves/queue.py
diff --git a/ext/future/moves/reprlib.py b/ext2/future/moves/reprlib.py
similarity index 100%
rename from ext/future/moves/reprlib.py
rename to ext2/future/moves/reprlib.py
diff --git a/ext/future/moves/socketserver.py b/ext2/future/moves/socketserver.py
similarity index 100%
rename from ext/future/moves/socketserver.py
rename to ext2/future/moves/socketserver.py
diff --git a/ext/future/moves/subprocess.py b/ext2/future/moves/subprocess.py
similarity index 100%
rename from ext/future/moves/subprocess.py
rename to ext2/future/moves/subprocess.py
diff --git a/ext/future/moves/sys.py b/ext2/future/moves/sys.py
similarity index 100%
rename from ext/future/moves/sys.py
rename to ext2/future/moves/sys.py
diff --git a/ext/future/moves/test/__init__.py b/ext2/future/moves/test/__init__.py
similarity index 100%
rename from ext/future/moves/test/__init__.py
rename to ext2/future/moves/test/__init__.py
diff --git a/ext/future/moves/test/support.py b/ext2/future/moves/test/support.py
similarity index 100%
rename from ext/future/moves/test/support.py
rename to ext2/future/moves/test/support.py
diff --git a/ext/future/moves/tkinter/__init__.py b/ext2/future/moves/tkinter/__init__.py
similarity index 100%
rename from ext/future/moves/tkinter/__init__.py
rename to ext2/future/moves/tkinter/__init__.py
diff --git a/ext/future/moves/tkinter/colorchooser.py b/ext2/future/moves/tkinter/colorchooser.py
similarity index 100%
rename from ext/future/moves/tkinter/colorchooser.py
rename to ext2/future/moves/tkinter/colorchooser.py
diff --git a/ext/future/moves/tkinter/commondialog.py b/ext2/future/moves/tkinter/commondialog.py
similarity index 100%
rename from ext/future/moves/tkinter/commondialog.py
rename to ext2/future/moves/tkinter/commondialog.py
diff --git a/ext/future/moves/tkinter/constants.py b/ext2/future/moves/tkinter/constants.py
similarity index 100%
rename from ext/future/moves/tkinter/constants.py
rename to ext2/future/moves/tkinter/constants.py
diff --git a/ext/future/moves/tkinter/dialog.py b/ext2/future/moves/tkinter/dialog.py
similarity index 100%
rename from ext/future/moves/tkinter/dialog.py
rename to ext2/future/moves/tkinter/dialog.py
diff --git a/ext/future/moves/tkinter/dnd.py b/ext2/future/moves/tkinter/dnd.py
similarity index 100%
rename from ext/future/moves/tkinter/dnd.py
rename to ext2/future/moves/tkinter/dnd.py
diff --git a/ext/future/moves/tkinter/filedialog.py b/ext2/future/moves/tkinter/filedialog.py
similarity index 100%
rename from ext/future/moves/tkinter/filedialog.py
rename to ext2/future/moves/tkinter/filedialog.py
diff --git a/ext/future/moves/tkinter/font.py b/ext2/future/moves/tkinter/font.py
similarity index 100%
rename from ext/future/moves/tkinter/font.py
rename to ext2/future/moves/tkinter/font.py
diff --git a/ext/future/moves/tkinter/messagebox.py b/ext2/future/moves/tkinter/messagebox.py
similarity index 100%
rename from ext/future/moves/tkinter/messagebox.py
rename to ext2/future/moves/tkinter/messagebox.py
diff --git a/ext/future/moves/tkinter/scrolledtext.py b/ext2/future/moves/tkinter/scrolledtext.py
similarity index 100%
rename from ext/future/moves/tkinter/scrolledtext.py
rename to ext2/future/moves/tkinter/scrolledtext.py
diff --git a/ext/future/moves/tkinter/simpledialog.py b/ext2/future/moves/tkinter/simpledialog.py
similarity index 100%
rename from ext/future/moves/tkinter/simpledialog.py
rename to ext2/future/moves/tkinter/simpledialog.py
diff --git a/ext/future/moves/tkinter/tix.py b/ext2/future/moves/tkinter/tix.py
similarity index 100%
rename from ext/future/moves/tkinter/tix.py
rename to ext2/future/moves/tkinter/tix.py
diff --git a/ext/future/moves/tkinter/ttk.py b/ext2/future/moves/tkinter/ttk.py
similarity index 100%
rename from ext/future/moves/tkinter/ttk.py
rename to ext2/future/moves/tkinter/ttk.py
diff --git a/ext/future/moves/urllib/__init__.py b/ext2/future/moves/urllib/__init__.py
similarity index 100%
rename from ext/future/moves/urllib/__init__.py
rename to ext2/future/moves/urllib/__init__.py
diff --git a/ext/future/moves/urllib/error.py b/ext2/future/moves/urllib/error.py
similarity index 100%
rename from ext/future/moves/urllib/error.py
rename to ext2/future/moves/urllib/error.py
diff --git a/ext/future/moves/urllib/parse.py b/ext2/future/moves/urllib/parse.py
similarity index 100%
rename from ext/future/moves/urllib/parse.py
rename to ext2/future/moves/urllib/parse.py
diff --git a/ext/future/moves/urllib/request.py b/ext2/future/moves/urllib/request.py
similarity index 100%
rename from ext/future/moves/urllib/request.py
rename to ext2/future/moves/urllib/request.py
diff --git a/ext/future/moves/urllib/response.py b/ext2/future/moves/urllib/response.py
similarity index 100%
rename from ext/future/moves/urllib/response.py
rename to ext2/future/moves/urllib/response.py
diff --git a/ext/future/moves/urllib/robotparser.py b/ext2/future/moves/urllib/robotparser.py
similarity index 100%
rename from ext/future/moves/urllib/robotparser.py
rename to ext2/future/moves/urllib/robotparser.py
diff --git a/ext/future/moves/winreg.py b/ext2/future/moves/winreg.py
similarity index 100%
rename from ext/future/moves/winreg.py
rename to ext2/future/moves/winreg.py
diff --git a/ext/future/moves/xmlrpc/__init__.py b/ext2/future/moves/xmlrpc/__init__.py
similarity index 100%
rename from ext/future/moves/xmlrpc/__init__.py
rename to ext2/future/moves/xmlrpc/__init__.py
diff --git a/ext/future/moves/xmlrpc/client.py b/ext2/future/moves/xmlrpc/client.py
similarity index 100%
rename from ext/future/moves/xmlrpc/client.py
rename to ext2/future/moves/xmlrpc/client.py
diff --git a/ext/future/moves/xmlrpc/server.py b/ext2/future/moves/xmlrpc/server.py
similarity index 100%
rename from ext/future/moves/xmlrpc/server.py
rename to ext2/future/moves/xmlrpc/server.py
diff --git a/ext/future/standard_library/__init__.py b/ext2/future/standard_library/__init__.py
similarity index 100%
rename from ext/future/standard_library/__init__.py
rename to ext2/future/standard_library/__init__.py
diff --git a/ext/future/tests/__init__.py b/ext2/future/tests/__init__.py
similarity index 100%
rename from ext/future/tests/__init__.py
rename to ext2/future/tests/__init__.py
diff --git a/ext/future/tests/base.py b/ext2/future/tests/base.py
similarity index 100%
rename from ext/future/tests/base.py
rename to ext2/future/tests/base.py
diff --git a/ext/future/types/__init__.py b/ext2/future/types/__init__.py
similarity index 100%
rename from ext/future/types/__init__.py
rename to ext2/future/types/__init__.py
diff --git a/ext/future/types/newbytes.py b/ext2/future/types/newbytes.py
similarity index 100%
rename from ext/future/types/newbytes.py
rename to ext2/future/types/newbytes.py
diff --git a/ext/future/types/newdict.py b/ext2/future/types/newdict.py
similarity index 100%
rename from ext/future/types/newdict.py
rename to ext2/future/types/newdict.py
diff --git a/ext/future/types/newint.py b/ext2/future/types/newint.py
similarity index 100%
rename from ext/future/types/newint.py
rename to ext2/future/types/newint.py
diff --git a/ext/future/types/newlist.py b/ext2/future/types/newlist.py
similarity index 100%
rename from ext/future/types/newlist.py
rename to ext2/future/types/newlist.py
diff --git a/ext/future/types/newmemoryview.py b/ext2/future/types/newmemoryview.py
similarity index 100%
rename from ext/future/types/newmemoryview.py
rename to ext2/future/types/newmemoryview.py
diff --git a/ext/future/types/newobject.py b/ext2/future/types/newobject.py
similarity index 100%
rename from ext/future/types/newobject.py
rename to ext2/future/types/newobject.py
diff --git a/ext/future/types/newopen.py b/ext2/future/types/newopen.py
similarity index 100%
rename from ext/future/types/newopen.py
rename to ext2/future/types/newopen.py
diff --git a/ext/future/types/newrange.py b/ext2/future/types/newrange.py
similarity index 100%
rename from ext/future/types/newrange.py
rename to ext2/future/types/newrange.py
diff --git a/ext/future/types/newstr.py b/ext2/future/types/newstr.py
similarity index 100%
rename from ext/future/types/newstr.py
rename to ext2/future/types/newstr.py
diff --git a/ext/future/utils/__init__.py b/ext2/future/utils/__init__.py
similarity index 100%
rename from ext/future/utils/__init__.py
rename to ext2/future/utils/__init__.py
diff --git a/ext/future/utils/surrogateescape.py b/ext2/future/utils/surrogateescape.py
similarity index 100%
rename from ext/future/utils/surrogateescape.py
rename to ext2/future/utils/surrogateescape.py
diff --git a/ext/github/AuthenticatedUser.py b/ext2/github/AuthenticatedUser.py
similarity index 100%
rename from ext/github/AuthenticatedUser.py
rename to ext2/github/AuthenticatedUser.py
diff --git a/ext/github/Authorization.py b/ext2/github/Authorization.py
similarity index 100%
rename from ext/github/Authorization.py
rename to ext2/github/Authorization.py
diff --git a/ext/github/AuthorizationApplication.py b/ext2/github/AuthorizationApplication.py
similarity index 100%
rename from ext/github/AuthorizationApplication.py
rename to ext2/github/AuthorizationApplication.py
diff --git a/ext/github/Branch.py b/ext2/github/Branch.py
similarity index 100%
rename from ext/github/Branch.py
rename to ext2/github/Branch.py
diff --git a/ext/github/BranchProtection.py b/ext2/github/BranchProtection.py
similarity index 100%
rename from ext/github/BranchProtection.py
rename to ext2/github/BranchProtection.py
diff --git a/ext/github/Commit.py b/ext2/github/Commit.py
similarity index 100%
rename from ext/github/Commit.py
rename to ext2/github/Commit.py
diff --git a/ext/github/CommitCombinedStatus.py b/ext2/github/CommitCombinedStatus.py
similarity index 100%
rename from ext/github/CommitCombinedStatus.py
rename to ext2/github/CommitCombinedStatus.py
diff --git a/ext/github/CommitComment.py b/ext2/github/CommitComment.py
similarity index 100%
rename from ext/github/CommitComment.py
rename to ext2/github/CommitComment.py
diff --git a/ext/github/CommitStats.py b/ext2/github/CommitStats.py
similarity index 100%
rename from ext/github/CommitStats.py
rename to ext2/github/CommitStats.py
diff --git a/ext/github/CommitStatus.py b/ext2/github/CommitStatus.py
similarity index 100%
rename from ext/github/CommitStatus.py
rename to ext2/github/CommitStatus.py
diff --git a/ext/github/Comparison.py b/ext2/github/Comparison.py
similarity index 100%
rename from ext/github/Comparison.py
rename to ext2/github/Comparison.py
diff --git a/ext/github/Consts.py b/ext2/github/Consts.py
similarity index 100%
rename from ext/github/Consts.py
rename to ext2/github/Consts.py
diff --git a/ext/github/ContentFile.py b/ext2/github/ContentFile.py
similarity index 100%
rename from ext/github/ContentFile.py
rename to ext2/github/ContentFile.py
diff --git a/ext/github/Download.py b/ext2/github/Download.py
similarity index 100%
rename from ext/github/Download.py
rename to ext2/github/Download.py
diff --git a/ext/github/Event.py b/ext2/github/Event.py
similarity index 100%
rename from ext/github/Event.py
rename to ext2/github/Event.py
diff --git a/ext/github/File.py b/ext2/github/File.py
similarity index 100%
rename from ext/github/File.py
rename to ext2/github/File.py
diff --git a/ext/github/Gist.py b/ext2/github/Gist.py
similarity index 100%
rename from ext/github/Gist.py
rename to ext2/github/Gist.py
diff --git a/ext/github/GistComment.py b/ext2/github/GistComment.py
similarity index 100%
rename from ext/github/GistComment.py
rename to ext2/github/GistComment.py
diff --git a/ext/github/GistFile.py b/ext2/github/GistFile.py
similarity index 100%
rename from ext/github/GistFile.py
rename to ext2/github/GistFile.py
diff --git a/ext/github/GistHistoryState.py b/ext2/github/GistHistoryState.py
similarity index 100%
rename from ext/github/GistHistoryState.py
rename to ext2/github/GistHistoryState.py
diff --git a/ext/github/GitAuthor.py b/ext2/github/GitAuthor.py
similarity index 100%
rename from ext/github/GitAuthor.py
rename to ext2/github/GitAuthor.py
diff --git a/ext/github/GitBlob.py b/ext2/github/GitBlob.py
similarity index 100%
rename from ext/github/GitBlob.py
rename to ext2/github/GitBlob.py
diff --git a/ext/github/GitCommit.py b/ext2/github/GitCommit.py
similarity index 100%
rename from ext/github/GitCommit.py
rename to ext2/github/GitCommit.py
diff --git a/ext/github/GitObject.py b/ext2/github/GitObject.py
similarity index 100%
rename from ext/github/GitObject.py
rename to ext2/github/GitObject.py
diff --git a/ext/github/GitRef.py b/ext2/github/GitRef.py
similarity index 100%
rename from ext/github/GitRef.py
rename to ext2/github/GitRef.py
diff --git a/ext/github/GitRelease.py b/ext2/github/GitRelease.py
similarity index 100%
rename from ext/github/GitRelease.py
rename to ext2/github/GitRelease.py
diff --git a/ext/github/GitReleaseAsset.py b/ext2/github/GitReleaseAsset.py
similarity index 100%
rename from ext/github/GitReleaseAsset.py
rename to ext2/github/GitReleaseAsset.py
diff --git a/ext/github/GitTag.py b/ext2/github/GitTag.py
similarity index 100%
rename from ext/github/GitTag.py
rename to ext2/github/GitTag.py
diff --git a/ext/github/GitTree.py b/ext2/github/GitTree.py
similarity index 100%
rename from ext/github/GitTree.py
rename to ext2/github/GitTree.py
diff --git a/ext/github/GitTreeElement.py b/ext2/github/GitTreeElement.py
similarity index 100%
rename from ext/github/GitTreeElement.py
rename to ext2/github/GitTreeElement.py
diff --git a/ext/github/GithubException.py b/ext2/github/GithubException.py
similarity index 100%
rename from ext/github/GithubException.py
rename to ext2/github/GithubException.py
diff --git a/ext/github/GithubObject.py b/ext2/github/GithubObject.py
similarity index 100%
rename from ext/github/GithubObject.py
rename to ext2/github/GithubObject.py
diff --git a/ext/github/GitignoreTemplate.py b/ext2/github/GitignoreTemplate.py
similarity index 100%
rename from ext/github/GitignoreTemplate.py
rename to ext2/github/GitignoreTemplate.py
diff --git a/ext/github/Hook.py b/ext2/github/Hook.py
similarity index 100%
rename from ext/github/Hook.py
rename to ext2/github/Hook.py
diff --git a/ext/github/HookDescription.py b/ext2/github/HookDescription.py
similarity index 100%
rename from ext/github/HookDescription.py
rename to ext2/github/HookDescription.py
diff --git a/ext/github/HookResponse.py b/ext2/github/HookResponse.py
similarity index 100%
rename from ext/github/HookResponse.py
rename to ext2/github/HookResponse.py
diff --git a/ext/github/InputFileContent.py b/ext2/github/InputFileContent.py
similarity index 100%
rename from ext/github/InputFileContent.py
rename to ext2/github/InputFileContent.py
diff --git a/ext/github/InputGitAuthor.py b/ext2/github/InputGitAuthor.py
similarity index 100%
rename from ext/github/InputGitAuthor.py
rename to ext2/github/InputGitAuthor.py
diff --git a/ext/github/InputGitTreeElement.py b/ext2/github/InputGitTreeElement.py
similarity index 100%
rename from ext/github/InputGitTreeElement.py
rename to ext2/github/InputGitTreeElement.py
diff --git a/ext/github/Installation.py b/ext2/github/Installation.py
similarity index 100%
rename from ext/github/Installation.py
rename to ext2/github/Installation.py
diff --git a/ext/github/InstallationAuthorization.py b/ext2/github/InstallationAuthorization.py
similarity index 100%
rename from ext/github/InstallationAuthorization.py
rename to ext2/github/InstallationAuthorization.py
diff --git a/ext/github/Invitation.py b/ext2/github/Invitation.py
similarity index 100%
rename from ext/github/Invitation.py
rename to ext2/github/Invitation.py
diff --git a/ext/github/Issue.py b/ext2/github/Issue.py
similarity index 100%
rename from ext/github/Issue.py
rename to ext2/github/Issue.py
diff --git a/ext/github/IssueComment.py b/ext2/github/IssueComment.py
similarity index 100%
rename from ext/github/IssueComment.py
rename to ext2/github/IssueComment.py
diff --git a/ext/github/IssueEvent.py b/ext2/github/IssueEvent.py
similarity index 100%
rename from ext/github/IssueEvent.py
rename to ext2/github/IssueEvent.py
diff --git a/ext/github/IssuePullRequest.py b/ext2/github/IssuePullRequest.py
similarity index 100%
rename from ext/github/IssuePullRequest.py
rename to ext2/github/IssuePullRequest.py
diff --git a/ext/github/Label.py b/ext2/github/Label.py
similarity index 100%
rename from ext/github/Label.py
rename to ext2/github/Label.py
diff --git a/ext/github/Legacy.py b/ext2/github/Legacy.py
similarity index 100%
rename from ext/github/Legacy.py
rename to ext2/github/Legacy.py
diff --git a/ext/github/License.py b/ext2/github/License.py
similarity index 100%
rename from ext/github/License.py
rename to ext2/github/License.py
diff --git a/ext/github/MainClass.py b/ext2/github/MainClass.py
similarity index 100%
rename from ext/github/MainClass.py
rename to ext2/github/MainClass.py
diff --git a/ext/github/Milestone.py b/ext2/github/Milestone.py
similarity index 100%
rename from ext/github/Milestone.py
rename to ext2/github/Milestone.py
diff --git a/ext/github/NamedUser.py b/ext2/github/NamedUser.py
similarity index 100%
rename from ext/github/NamedUser.py
rename to ext2/github/NamedUser.py
diff --git a/ext/github/Notification.py b/ext2/github/Notification.py
similarity index 100%
rename from ext/github/Notification.py
rename to ext2/github/Notification.py
diff --git a/ext/github/NotificationSubject.py b/ext2/github/NotificationSubject.py
similarity index 100%
rename from ext/github/NotificationSubject.py
rename to ext2/github/NotificationSubject.py
diff --git a/ext/github/Organization.py b/ext2/github/Organization.py
similarity index 100%
rename from ext/github/Organization.py
rename to ext2/github/Organization.py
diff --git a/ext/github/PaginatedList.py b/ext2/github/PaginatedList.py
similarity index 100%
rename from ext/github/PaginatedList.py
rename to ext2/github/PaginatedList.py
diff --git a/ext/github/Permissions.py b/ext2/github/Permissions.py
similarity index 100%
rename from ext/github/Permissions.py
rename to ext2/github/Permissions.py
diff --git a/ext/github/Plan.py b/ext2/github/Plan.py
similarity index 100%
rename from ext/github/Plan.py
rename to ext2/github/Plan.py
diff --git a/ext/github/Project.py b/ext2/github/Project.py
similarity index 100%
rename from ext/github/Project.py
rename to ext2/github/Project.py
diff --git a/ext/github/ProjectCard.py b/ext2/github/ProjectCard.py
similarity index 100%
rename from ext/github/ProjectCard.py
rename to ext2/github/ProjectCard.py
diff --git a/ext/github/ProjectColumn.py b/ext2/github/ProjectColumn.py
similarity index 100%
rename from ext/github/ProjectColumn.py
rename to ext2/github/ProjectColumn.py
diff --git a/ext/github/PullRequest.py b/ext2/github/PullRequest.py
similarity index 100%
rename from ext/github/PullRequest.py
rename to ext2/github/PullRequest.py
diff --git a/ext/github/PullRequestComment.py b/ext2/github/PullRequestComment.py
similarity index 100%
rename from ext/github/PullRequestComment.py
rename to ext2/github/PullRequestComment.py
diff --git a/ext/github/PullRequestMergeStatus.py b/ext2/github/PullRequestMergeStatus.py
similarity index 100%
rename from ext/github/PullRequestMergeStatus.py
rename to ext2/github/PullRequestMergeStatus.py
diff --git a/ext/github/PullRequestPart.py b/ext2/github/PullRequestPart.py
similarity index 100%
rename from ext/github/PullRequestPart.py
rename to ext2/github/PullRequestPart.py
diff --git a/ext/github/PullRequestReview.py b/ext2/github/PullRequestReview.py
similarity index 100%
rename from ext/github/PullRequestReview.py
rename to ext2/github/PullRequestReview.py
diff --git a/ext/github/Rate.py b/ext2/github/Rate.py
similarity index 100%
rename from ext/github/Rate.py
rename to ext2/github/Rate.py
diff --git a/ext/github/RateLimit.py b/ext2/github/RateLimit.py
similarity index 100%
rename from ext/github/RateLimit.py
rename to ext2/github/RateLimit.py
diff --git a/ext/github/Reaction.py b/ext2/github/Reaction.py
similarity index 100%
rename from ext/github/Reaction.py
rename to ext2/github/Reaction.py
diff --git a/ext/github/Repository.py b/ext2/github/Repository.py
similarity index 100%
rename from ext/github/Repository.py
rename to ext2/github/Repository.py
diff --git a/ext/github/RepositoryKey.py b/ext2/github/RepositoryKey.py
similarity index 100%
rename from ext/github/RepositoryKey.py
rename to ext2/github/RepositoryKey.py
diff --git a/ext/github/Requester.py b/ext2/github/Requester.py
similarity index 100%
rename from ext/github/Requester.py
rename to ext2/github/Requester.py
diff --git a/ext/github/RequiredPullRequestReviews.py b/ext2/github/RequiredPullRequestReviews.py
similarity index 100%
rename from ext/github/RequiredPullRequestReviews.py
rename to ext2/github/RequiredPullRequestReviews.py
diff --git a/ext/github/RequiredStatusChecks.py b/ext2/github/RequiredStatusChecks.py
similarity index 100%
rename from ext/github/RequiredStatusChecks.py
rename to ext2/github/RequiredStatusChecks.py
diff --git a/ext/github/SourceImport.py b/ext2/github/SourceImport.py
similarity index 100%
rename from ext/github/SourceImport.py
rename to ext2/github/SourceImport.py
diff --git a/ext/github/Stargazer.py b/ext2/github/Stargazer.py
similarity index 100%
rename from ext/github/Stargazer.py
rename to ext2/github/Stargazer.py
diff --git a/ext/github/StatsCodeFrequency.py b/ext2/github/StatsCodeFrequency.py
similarity index 100%
rename from ext/github/StatsCodeFrequency.py
rename to ext2/github/StatsCodeFrequency.py
diff --git a/ext/github/StatsCommitActivity.py b/ext2/github/StatsCommitActivity.py
similarity index 100%
rename from ext/github/StatsCommitActivity.py
rename to ext2/github/StatsCommitActivity.py
diff --git a/ext/github/StatsContributor.py b/ext2/github/StatsContributor.py
similarity index 100%
rename from ext/github/StatsContributor.py
rename to ext2/github/StatsContributor.py
diff --git a/ext/github/StatsParticipation.py b/ext2/github/StatsParticipation.py
similarity index 100%
rename from ext/github/StatsParticipation.py
rename to ext2/github/StatsParticipation.py
diff --git a/ext/github/StatsPunchCard.py b/ext2/github/StatsPunchCard.py
similarity index 100%
rename from ext/github/StatsPunchCard.py
rename to ext2/github/StatsPunchCard.py
diff --git a/ext/github/Status.py b/ext2/github/Status.py
similarity index 100%
rename from ext/github/Status.py
rename to ext2/github/Status.py
diff --git a/ext/github/StatusMessage.py b/ext2/github/StatusMessage.py
similarity index 100%
rename from ext/github/StatusMessage.py
rename to ext2/github/StatusMessage.py
diff --git a/ext/github/Tag.py b/ext2/github/Tag.py
similarity index 100%
rename from ext/github/Tag.py
rename to ext2/github/Tag.py
diff --git a/ext/github/Team.py b/ext2/github/Team.py
similarity index 100%
rename from ext/github/Team.py
rename to ext2/github/Team.py
diff --git a/ext/github/UserKey.py b/ext2/github/UserKey.py
similarity index 100%
rename from ext/github/UserKey.py
rename to ext2/github/UserKey.py
diff --git a/ext/github/__init__.py b/ext2/github/__init__.py
similarity index 100%
rename from ext/github/__init__.py
rename to ext2/github/__init__.py
diff --git a/ext/html/__init__.py b/ext2/html/__init__.py
similarity index 100%
rename from ext/html/__init__.py
rename to ext2/html/__init__.py
diff --git a/ext/html/entities.py b/ext2/html/entities.py
similarity index 100%
rename from ext/html/entities.py
rename to ext2/html/entities.py
diff --git a/ext/html/parser.py b/ext2/html/parser.py
similarity index 100%
rename from ext/html/parser.py
rename to ext2/html/parser.py
diff --git a/ext/http/__init__.py b/ext2/http/__init__.py
similarity index 100%
rename from ext/http/__init__.py
rename to ext2/http/__init__.py
diff --git a/ext/http/client.py b/ext2/http/client.py
similarity index 100%
rename from ext/http/client.py
rename to ext2/http/client.py
diff --git a/ext/http/cookiejar.py b/ext2/http/cookiejar.py
similarity index 100%
rename from ext/http/cookiejar.py
rename to ext2/http/cookiejar.py
diff --git a/ext/http/cookies.py b/ext2/http/cookies.py
similarity index 100%
rename from ext/http/cookies.py
rename to ext2/http/cookies.py
diff --git a/ext/http/server.py b/ext2/http/server.py
similarity index 100%
rename from ext/http/server.py
rename to ext2/http/server.py
diff --git a/ext/libfuturize/__init__.py b/ext2/libfuturize/__init__.py
similarity index 100%
rename from ext/libfuturize/__init__.py
rename to ext2/libfuturize/__init__.py
diff --git a/ext/libfuturize/fixer_util.py b/ext2/libfuturize/fixer_util.py
similarity index 100%
rename from ext/libfuturize/fixer_util.py
rename to ext2/libfuturize/fixer_util.py
diff --git a/ext/libfuturize/fixes/__init__.py b/ext2/libfuturize/fixes/__init__.py
similarity index 100%
rename from ext/libfuturize/fixes/__init__.py
rename to ext2/libfuturize/fixes/__init__.py
diff --git a/ext/libfuturize/fixes/fix_UserDict.py b/ext2/libfuturize/fixes/fix_UserDict.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_UserDict.py
rename to ext2/libfuturize/fixes/fix_UserDict.py
diff --git a/ext/libfuturize/fixes/fix_absolute_import.py b/ext2/libfuturize/fixes/fix_absolute_import.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_absolute_import.py
rename to ext2/libfuturize/fixes/fix_absolute_import.py
diff --git a/ext/libfuturize/fixes/fix_add__future__imports_except_unicode_literals.py b/ext2/libfuturize/fixes/fix_add__future__imports_except_unicode_literals.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_add__future__imports_except_unicode_literals.py
rename to ext2/libfuturize/fixes/fix_add__future__imports_except_unicode_literals.py
diff --git a/ext/libfuturize/fixes/fix_basestring.py b/ext2/libfuturize/fixes/fix_basestring.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_basestring.py
rename to ext2/libfuturize/fixes/fix_basestring.py
diff --git a/ext/libfuturize/fixes/fix_bytes.py b/ext2/libfuturize/fixes/fix_bytes.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_bytes.py
rename to ext2/libfuturize/fixes/fix_bytes.py
diff --git a/ext/libfuturize/fixes/fix_cmp.py b/ext2/libfuturize/fixes/fix_cmp.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_cmp.py
rename to ext2/libfuturize/fixes/fix_cmp.py
diff --git a/ext/libfuturize/fixes/fix_division.py b/ext2/libfuturize/fixes/fix_division.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_division.py
rename to ext2/libfuturize/fixes/fix_division.py
diff --git a/ext/libfuturize/fixes/fix_division_safe.py b/ext2/libfuturize/fixes/fix_division_safe.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_division_safe.py
rename to ext2/libfuturize/fixes/fix_division_safe.py
diff --git a/ext/libfuturize/fixes/fix_execfile.py b/ext2/libfuturize/fixes/fix_execfile.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_execfile.py
rename to ext2/libfuturize/fixes/fix_execfile.py
diff --git a/ext/libfuturize/fixes/fix_future_builtins.py b/ext2/libfuturize/fixes/fix_future_builtins.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_future_builtins.py
rename to ext2/libfuturize/fixes/fix_future_builtins.py
diff --git a/ext/libfuturize/fixes/fix_future_standard_library.py b/ext2/libfuturize/fixes/fix_future_standard_library.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_future_standard_library.py
rename to ext2/libfuturize/fixes/fix_future_standard_library.py
diff --git a/ext/libfuturize/fixes/fix_future_standard_library_urllib.py b/ext2/libfuturize/fixes/fix_future_standard_library_urllib.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_future_standard_library_urllib.py
rename to ext2/libfuturize/fixes/fix_future_standard_library_urllib.py
diff --git a/ext/libfuturize/fixes/fix_metaclass.py b/ext2/libfuturize/fixes/fix_metaclass.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_metaclass.py
rename to ext2/libfuturize/fixes/fix_metaclass.py
diff --git a/ext/libfuturize/fixes/fix_next_call.py b/ext2/libfuturize/fixes/fix_next_call.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_next_call.py
rename to ext2/libfuturize/fixes/fix_next_call.py
diff --git a/ext/libfuturize/fixes/fix_object.py b/ext2/libfuturize/fixes/fix_object.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_object.py
rename to ext2/libfuturize/fixes/fix_object.py
diff --git a/ext/libfuturize/fixes/fix_oldstr_wrap.py b/ext2/libfuturize/fixes/fix_oldstr_wrap.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_oldstr_wrap.py
rename to ext2/libfuturize/fixes/fix_oldstr_wrap.py
diff --git a/ext/libfuturize/fixes/fix_order___future__imports.py b/ext2/libfuturize/fixes/fix_order___future__imports.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_order___future__imports.py
rename to ext2/libfuturize/fixes/fix_order___future__imports.py
diff --git a/ext/libfuturize/fixes/fix_print.py b/ext2/libfuturize/fixes/fix_print.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_print.py
rename to ext2/libfuturize/fixes/fix_print.py
diff --git a/ext/libfuturize/fixes/fix_print_with_import.py b/ext2/libfuturize/fixes/fix_print_with_import.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_print_with_import.py
rename to ext2/libfuturize/fixes/fix_print_with_import.py
diff --git a/ext/libfuturize/fixes/fix_raise.py b/ext2/libfuturize/fixes/fix_raise.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_raise.py
rename to ext2/libfuturize/fixes/fix_raise.py
diff --git a/ext/libfuturize/fixes/fix_remove_old__future__imports.py b/ext2/libfuturize/fixes/fix_remove_old__future__imports.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_remove_old__future__imports.py
rename to ext2/libfuturize/fixes/fix_remove_old__future__imports.py
diff --git a/ext/libfuturize/fixes/fix_unicode_keep_u.py b/ext2/libfuturize/fixes/fix_unicode_keep_u.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_unicode_keep_u.py
rename to ext2/libfuturize/fixes/fix_unicode_keep_u.py
diff --git a/ext/libfuturize/fixes/fix_unicode_literals_import.py b/ext2/libfuturize/fixes/fix_unicode_literals_import.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_unicode_literals_import.py
rename to ext2/libfuturize/fixes/fix_unicode_literals_import.py
diff --git a/ext/libfuturize/fixes/fix_xrange_with_import.py b/ext2/libfuturize/fixes/fix_xrange_with_import.py
similarity index 100%
rename from ext/libfuturize/fixes/fix_xrange_with_import.py
rename to ext2/libfuturize/fixes/fix_xrange_with_import.py
diff --git a/ext/libfuturize/main.py b/ext2/libfuturize/main.py
similarity index 100%
rename from ext/libfuturize/main.py
rename to ext2/libfuturize/main.py
diff --git a/ext/libpasteurize/__init__.py b/ext2/libpasteurize/__init__.py
similarity index 100%
rename from ext/libpasteurize/__init__.py
rename to ext2/libpasteurize/__init__.py
diff --git a/ext/libpasteurize/fixes/__init__.py b/ext2/libpasteurize/fixes/__init__.py
similarity index 100%
rename from ext/libpasteurize/fixes/__init__.py
rename to ext2/libpasteurize/fixes/__init__.py
diff --git a/ext/libpasteurize/fixes/feature_base.py b/ext2/libpasteurize/fixes/feature_base.py
similarity index 100%
rename from ext/libpasteurize/fixes/feature_base.py
rename to ext2/libpasteurize/fixes/feature_base.py
diff --git a/ext/libpasteurize/fixes/fix_add_all__future__imports.py b/ext2/libpasteurize/fixes/fix_add_all__future__imports.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_add_all__future__imports.py
rename to ext2/libpasteurize/fixes/fix_add_all__future__imports.py
diff --git a/ext/libpasteurize/fixes/fix_add_all_future_builtins.py b/ext2/libpasteurize/fixes/fix_add_all_future_builtins.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_add_all_future_builtins.py
rename to ext2/libpasteurize/fixes/fix_add_all_future_builtins.py
diff --git a/ext/libpasteurize/fixes/fix_add_future_standard_library_import.py b/ext2/libpasteurize/fixes/fix_add_future_standard_library_import.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_add_future_standard_library_import.py
rename to ext2/libpasteurize/fixes/fix_add_future_standard_library_import.py
diff --git a/ext/libpasteurize/fixes/fix_annotations.py b/ext2/libpasteurize/fixes/fix_annotations.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_annotations.py
rename to ext2/libpasteurize/fixes/fix_annotations.py
diff --git a/ext/libpasteurize/fixes/fix_division.py b/ext2/libpasteurize/fixes/fix_division.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_division.py
rename to ext2/libpasteurize/fixes/fix_division.py
diff --git a/ext/libpasteurize/fixes/fix_features.py b/ext2/libpasteurize/fixes/fix_features.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_features.py
rename to ext2/libpasteurize/fixes/fix_features.py
diff --git a/ext/libpasteurize/fixes/fix_fullargspec.py b/ext2/libpasteurize/fixes/fix_fullargspec.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_fullargspec.py
rename to ext2/libpasteurize/fixes/fix_fullargspec.py
diff --git a/ext/libpasteurize/fixes/fix_future_builtins.py b/ext2/libpasteurize/fixes/fix_future_builtins.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_future_builtins.py
rename to ext2/libpasteurize/fixes/fix_future_builtins.py
diff --git a/ext/libpasteurize/fixes/fix_getcwd.py b/ext2/libpasteurize/fixes/fix_getcwd.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_getcwd.py
rename to ext2/libpasteurize/fixes/fix_getcwd.py
diff --git a/ext/libpasteurize/fixes/fix_imports.py b/ext2/libpasteurize/fixes/fix_imports.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_imports.py
rename to ext2/libpasteurize/fixes/fix_imports.py
diff --git a/ext/libpasteurize/fixes/fix_imports2.py b/ext2/libpasteurize/fixes/fix_imports2.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_imports2.py
rename to ext2/libpasteurize/fixes/fix_imports2.py
diff --git a/ext/libpasteurize/fixes/fix_kwargs.py b/ext2/libpasteurize/fixes/fix_kwargs.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_kwargs.py
rename to ext2/libpasteurize/fixes/fix_kwargs.py
diff --git a/ext/libpasteurize/fixes/fix_memoryview.py b/ext2/libpasteurize/fixes/fix_memoryview.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_memoryview.py
rename to ext2/libpasteurize/fixes/fix_memoryview.py
diff --git a/ext/libpasteurize/fixes/fix_metaclass.py b/ext2/libpasteurize/fixes/fix_metaclass.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_metaclass.py
rename to ext2/libpasteurize/fixes/fix_metaclass.py
diff --git a/ext/libpasteurize/fixes/fix_newstyle.py b/ext2/libpasteurize/fixes/fix_newstyle.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_newstyle.py
rename to ext2/libpasteurize/fixes/fix_newstyle.py
diff --git a/ext/libpasteurize/fixes/fix_next.py b/ext2/libpasteurize/fixes/fix_next.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_next.py
rename to ext2/libpasteurize/fixes/fix_next.py
diff --git a/ext/libpasteurize/fixes/fix_printfunction.py b/ext2/libpasteurize/fixes/fix_printfunction.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_printfunction.py
rename to ext2/libpasteurize/fixes/fix_printfunction.py
diff --git a/ext/libpasteurize/fixes/fix_raise.py b/ext2/libpasteurize/fixes/fix_raise.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_raise.py
rename to ext2/libpasteurize/fixes/fix_raise.py
diff --git a/ext/libpasteurize/fixes/fix_raise_.py b/ext2/libpasteurize/fixes/fix_raise_.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_raise_.py
rename to ext2/libpasteurize/fixes/fix_raise_.py
diff --git a/ext/libpasteurize/fixes/fix_throw.py b/ext2/libpasteurize/fixes/fix_throw.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_throw.py
rename to ext2/libpasteurize/fixes/fix_throw.py
diff --git a/ext/libpasteurize/fixes/fix_unpacking.py b/ext2/libpasteurize/fixes/fix_unpacking.py
similarity index 100%
rename from ext/libpasteurize/fixes/fix_unpacking.py
rename to ext2/libpasteurize/fixes/fix_unpacking.py
diff --git a/ext/libpasteurize/main.py b/ext2/libpasteurize/main.py
similarity index 100%
rename from ext/libpasteurize/main.py
rename to ext2/libpasteurize/main.py
diff --git a/ext/past/__init__.py b/ext2/past/__init__.py
similarity index 100%
rename from ext/past/__init__.py
rename to ext2/past/__init__.py
diff --git a/ext/past/builtins/__init__.py b/ext2/past/builtins/__init__.py
similarity index 100%
rename from ext/past/builtins/__init__.py
rename to ext2/past/builtins/__init__.py
diff --git a/ext/past/builtins/misc.py b/ext2/past/builtins/misc.py
similarity index 100%
rename from ext/past/builtins/misc.py
rename to ext2/past/builtins/misc.py
diff --git a/ext/past/builtins/noniterators.py b/ext2/past/builtins/noniterators.py
similarity index 100%
rename from ext/past/builtins/noniterators.py
rename to ext2/past/builtins/noniterators.py
diff --git a/ext/past/tests/__init__.py b/ext2/past/tests/__init__.py
similarity index 100%
rename from ext/past/tests/__init__.py
rename to ext2/past/tests/__init__.py
diff --git a/ext/past/translation/__init__.py b/ext2/past/translation/__init__.py
similarity index 100%
rename from ext/past/translation/__init__.py
rename to ext2/past/translation/__init__.py
diff --git a/ext/past/types/__init__.py b/ext2/past/types/__init__.py
similarity index 100%
rename from ext/past/types/__init__.py
rename to ext2/past/types/__init__.py
diff --git a/ext/past/types/basestring.py b/ext2/past/types/basestring.py
similarity index 100%
rename from ext/past/types/basestring.py
rename to ext2/past/types/basestring.py
diff --git a/ext/past/types/olddict.py b/ext2/past/types/olddict.py
similarity index 100%
rename from ext/past/types/olddict.py
rename to ext2/past/types/olddict.py
diff --git a/ext/past/types/oldstr.py b/ext2/past/types/oldstr.py
similarity index 100%
rename from ext/past/types/oldstr.py
rename to ext2/past/types/oldstr.py
diff --git a/ext/past/utils/__init__.py b/ext2/past/utils/__init__.py
similarity index 100%
rename from ext/past/utils/__init__.py
rename to ext2/past/utils/__init__.py
diff --git a/ext/queue/__init__.py b/ext2/queue/__init__.py
similarity index 100%
rename from ext/queue/__init__.py
rename to ext2/queue/__init__.py
diff --git a/ext/reprlib/__init__.py b/ext2/reprlib/__init__.py
similarity index 100%
rename from ext/reprlib/__init__.py
rename to ext2/reprlib/__init__.py
diff --git a/ext/socketserver/__init__.py b/ext2/socketserver/__init__.py
similarity index 100%
rename from ext/socketserver/__init__.py
rename to ext2/socketserver/__init__.py
diff --git a/ext/tkinter/__init__.py b/ext2/tkinter/__init__.py
similarity index 100%
rename from ext/tkinter/__init__.py
rename to ext2/tkinter/__init__.py
diff --git a/ext/tkinter/colorchooser.py b/ext2/tkinter/colorchooser.py
similarity index 100%
rename from ext/tkinter/colorchooser.py
rename to ext2/tkinter/colorchooser.py
diff --git a/ext/tkinter/commondialog.py b/ext2/tkinter/commondialog.py
similarity index 100%
rename from ext/tkinter/commondialog.py
rename to ext2/tkinter/commondialog.py
diff --git a/ext/tkinter/constants.py b/ext2/tkinter/constants.py
similarity index 100%
rename from ext/tkinter/constants.py
rename to ext2/tkinter/constants.py
diff --git a/ext/tkinter/dialog.py b/ext2/tkinter/dialog.py
similarity index 100%
rename from ext/tkinter/dialog.py
rename to ext2/tkinter/dialog.py
diff --git a/ext/tkinter/dnd.py b/ext2/tkinter/dnd.py
similarity index 100%
rename from ext/tkinter/dnd.py
rename to ext2/tkinter/dnd.py
diff --git a/ext/tkinter/filedialog.py b/ext2/tkinter/filedialog.py
similarity index 100%
rename from ext/tkinter/filedialog.py
rename to ext2/tkinter/filedialog.py
diff --git a/ext/tkinter/font.py b/ext2/tkinter/font.py
similarity index 100%
rename from ext/tkinter/font.py
rename to ext2/tkinter/font.py
diff --git a/ext/tkinter/messagebox.py b/ext2/tkinter/messagebox.py
similarity index 100%
rename from ext/tkinter/messagebox.py
rename to ext2/tkinter/messagebox.py
diff --git a/ext/tkinter/scrolledtext.py b/ext2/tkinter/scrolledtext.py
similarity index 100%
rename from ext/tkinter/scrolledtext.py
rename to ext2/tkinter/scrolledtext.py
diff --git a/ext/tkinter/simpledialog.py b/ext2/tkinter/simpledialog.py
similarity index 100%
rename from ext/tkinter/simpledialog.py
rename to ext2/tkinter/simpledialog.py
diff --git a/ext/tkinter/tix.py b/ext2/tkinter/tix.py
similarity index 100%
rename from ext/tkinter/tix.py
rename to ext2/tkinter/tix.py
diff --git a/ext/tkinter/ttk.py b/ext2/tkinter/ttk.py
similarity index 100%
rename from ext/tkinter/ttk.py
rename to ext2/tkinter/ttk.py
diff --git a/ext/winreg/__init__.py b/ext2/winreg/__init__.py
similarity index 100%
rename from ext/winreg/__init__.py
rename to ext2/winreg/__init__.py
diff --git a/ext/xmlrpc/__init__.py b/ext2/xmlrpc/__init__.py
similarity index 100%
rename from ext/xmlrpc/__init__.py
rename to ext2/xmlrpc/__init__.py
diff --git a/ext/xmlrpc/client.py b/ext2/xmlrpc/client.py
similarity index 100%
rename from ext/xmlrpc/client.py
rename to ext2/xmlrpc/client.py
diff --git a/ext/xmlrpc/server.py b/ext2/xmlrpc/server.py
similarity index 100%
rename from ext/xmlrpc/server.py
rename to ext2/xmlrpc/server.py
diff --git a/ext/yaml/__init__.py b/ext2/yaml/__init__.py
similarity index 100%
rename from ext/yaml/__init__.py
rename to ext2/yaml/__init__.py
diff --git a/ext/yaml/composer.py b/ext2/yaml/composer.py
similarity index 100%
rename from ext/yaml/composer.py
rename to ext2/yaml/composer.py
diff --git a/ext/yaml/constructor.py b/ext2/yaml/constructor.py
similarity index 100%
rename from ext/yaml/constructor.py
rename to ext2/yaml/constructor.py
diff --git a/ext/yaml/cyaml.py b/ext2/yaml/cyaml.py
similarity index 100%
rename from ext/yaml/cyaml.py
rename to ext2/yaml/cyaml.py
diff --git a/ext/yaml/dumper.py b/ext2/yaml/dumper.py
similarity index 100%
rename from ext/yaml/dumper.py
rename to ext2/yaml/dumper.py
diff --git a/ext/yaml/emitter.py b/ext2/yaml/emitter.py
similarity index 100%
rename from ext/yaml/emitter.py
rename to ext2/yaml/emitter.py
diff --git a/ext/yaml/error.py b/ext2/yaml/error.py
similarity index 100%
rename from ext/yaml/error.py
rename to ext2/yaml/error.py
diff --git a/ext/yaml/events.py b/ext2/yaml/events.py
similarity index 100%
rename from ext/yaml/events.py
rename to ext2/yaml/events.py
diff --git a/ext/yaml/loader.py b/ext2/yaml/loader.py
similarity index 100%
rename from ext/yaml/loader.py
rename to ext2/yaml/loader.py
diff --git a/ext/yaml/nodes.py b/ext2/yaml/nodes.py
similarity index 100%
rename from ext/yaml/nodes.py
rename to ext2/yaml/nodes.py
diff --git a/ext/yaml/parser.py b/ext2/yaml/parser.py
similarity index 100%
rename from ext/yaml/parser.py
rename to ext2/yaml/parser.py
diff --git a/ext/yaml/reader.py b/ext2/yaml/reader.py
similarity index 100%
rename from ext/yaml/reader.py
rename to ext2/yaml/reader.py
diff --git a/ext/yaml/representer.py b/ext2/yaml/representer.py
similarity index 100%
rename from ext/yaml/representer.py
rename to ext2/yaml/representer.py
diff --git a/ext/yaml/resolver.py b/ext2/yaml/resolver.py
similarity index 100%
rename from ext/yaml/resolver.py
rename to ext2/yaml/resolver.py
diff --git a/ext/yaml/scanner.py b/ext2/yaml/scanner.py
similarity index 100%
rename from ext/yaml/scanner.py
rename to ext2/yaml/scanner.py
diff --git a/ext/yaml/serializer.py b/ext2/yaml/serializer.py
similarity index 100%
rename from ext/yaml/serializer.py
rename to ext2/yaml/serializer.py
diff --git a/ext/yaml/tokens.py b/ext2/yaml/tokens.py
similarity index 100%
rename from ext/yaml/tokens.py
rename to ext2/yaml/tokens.py
diff --git a/ext3/bs4/__init__.py b/ext3/bs4/__init__.py
new file mode 100644
index 0000000000..797a6826eb
--- /dev/null
+++ b/ext3/bs4/__init__.py
@@ -0,0 +1,584 @@
+"""Beautiful Soup
+Elixir and Tonic
+"The Screen-Scraper's Friend"
+http://www.crummy.com/software/BeautifulSoup/
+
+Beautiful Soup uses a pluggable XML or HTML parser to parse a
+(possibly invalid) document into a tree representation. Beautiful Soup
+provides methods and Pythonic idioms that make it easy to navigate,
+search, and modify the parse tree.
+
+Beautiful Soup works with Python 2.7 and up. It works better if lxml
+and/or html5lib is installed.
+
+For more than you ever wanted to know about Beautiful Soup, see the
+documentation:
+http://www.crummy.com/software/BeautifulSoup/bs4/doc/
+
+"""
+
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+__author__ = "Leonard Richardson (leonardr@segfault.org)"
+__version__ = "4.6.3"
+__copyright__ = "Copyright (c) 2004-2018 Leonard Richardson"
+__license__ = "MIT"
+
+__all__ = ['BeautifulSoup']
+
+import os
+import re
+import sys
+import traceback
+import warnings
+
+from .builder import builder_registry, ParserRejectedMarkup
+from .dammit import UnicodeDammit
+from .element import (
+ CData,
+ Comment,
+ DEFAULT_OUTPUT_ENCODING,
+ Declaration,
+ Doctype,
+ NavigableString,
+ PageElement,
+ ProcessingInstruction,
+ ResultSet,
+ SoupStrainer,
+ Tag,
+ )
+
+# The very first thing we do is give a useful error if someone is
+# running this code under Python 3 without converting it.
+'You are trying to run the Python 2 version of Beautiful Soup under Python 3. This will not work.'!='You need to convert the code, either by installing it (`python setup.py install`) or by running 2to3 (`2to3 -w bs4`).'
+
+class BeautifulSoup(Tag):
+ """
+ This class defines the basic interface called by the tree builders.
+
+ These methods will be called by the parser:
+ reset()
+ feed(markup)
+
+ The tree builder may call these methods from its feed() implementation:
+ handle_starttag(name, attrs) # See note about return value
+ handle_endtag(name)
+ handle_data(data) # Appends to the current data node
+ endData(containerClass=NavigableString) # Ends the current data node
+
+ No matter how complicated the underlying parser is, you should be
+ able to build a tree using 'start tag' events, 'end tag' events,
+ 'data' events, and "done with data" events.
+
+ If you encounter an empty-element tag (aka a self-closing tag,
+ like HTML's
tag), call handle_starttag and then
+ handle_endtag.
+ """
+ ROOT_TAG_NAME = '[document]'
+
+ # If the end-user gives no indication which tree builder they
+ # want, look for one with these features.
+ DEFAULT_BUILDER_FEATURES = ['html', 'fast']
+
+ ASCII_SPACES = '\x20\x0a\x09\x0c\x0d'
+
+ NO_PARSER_SPECIFIED_WARNING = "No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system (\"%(parser)s\"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.\n\nThe code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features=\"%(parser)s\"' to the BeautifulSoup constructor.\n"
+
+ def __init__(self, markup="", features=None, builder=None,
+ parse_only=None, from_encoding=None, exclude_encodings=None,
+ **kwargs):
+ """Constructor.
+
+ :param markup: A string or a file-like object representing
+ markup to be parsed.
+
+ :param features: Desirable features of the parser to be used. This
+ may be the name of a specific parser ("lxml", "lxml-xml",
+ "html.parser", or "html5lib") or it may be the type of markup
+ to be used ("html", "html5", "xml"). It's recommended that you
+ name a specific parser, so that Beautiful Soup gives you the
+ same results across platforms and virtual environments.
+
+ :param builder: A specific TreeBuilder to use instead of looking one
+ up based on `features`. You shouldn't need to use this.
+
+ :param parse_only: A SoupStrainer. Only parts of the document
+ matching the SoupStrainer will be considered. This is useful
+ when parsing part of a document that would otherwise be too
+ large to fit into memory.
+
+ :param from_encoding: A string indicating the encoding of the
+ document to be parsed. Pass this in if Beautiful Soup is
+ guessing wrongly about the document's encoding.
+
+ :param exclude_encodings: A list of strings indicating
+ encodings known to be wrong. Pass this in if you don't know
+ the document's encoding but you know Beautiful Soup's guess is
+ wrong.
+
+ :param kwargs: For backwards compatibility purposes, the
+ constructor accepts certain keyword arguments used in
+ Beautiful Soup 3. None of these arguments do anything in
+ Beautiful Soup 4 and there's no need to actually pass keyword
+ arguments into the constructor.
+ """
+
+ if 'convertEntities' in kwargs:
+ warnings.warn(
+ "BS4 does not respect the convertEntities argument to the "
+ "BeautifulSoup constructor. Entities are always converted "
+ "to Unicode characters.")
+
+ if 'markupMassage' in kwargs:
+ del kwargs['markupMassage']
+ warnings.warn(
+ "BS4 does not respect the markupMassage argument to the "
+ "BeautifulSoup constructor. The tree builder is responsible "
+ "for any necessary markup massage.")
+
+ if 'smartQuotesTo' in kwargs:
+ del kwargs['smartQuotesTo']
+ warnings.warn(
+ "BS4 does not respect the smartQuotesTo argument to the "
+ "BeautifulSoup constructor. Smart quotes are always converted "
+ "to Unicode characters.")
+
+ if 'selfClosingTags' in kwargs:
+ del kwargs['selfClosingTags']
+ warnings.warn(
+ "BS4 does not respect the selfClosingTags argument to the "
+ "BeautifulSoup constructor. The tree builder is responsible "
+ "for understanding self-closing tags.")
+
+ if 'isHTML' in kwargs:
+ del kwargs['isHTML']
+ warnings.warn(
+ "BS4 does not respect the isHTML argument to the "
+ "BeautifulSoup constructor. Suggest you use "
+ "features='lxml' for HTML and features='lxml-xml' for "
+ "XML.")
+
+ def deprecated_argument(old_name, new_name):
+ if old_name in kwargs:
+ warnings.warn(
+ 'The "%s" argument to the BeautifulSoup constructor '
+ 'has been renamed to "%s."' % (old_name, new_name))
+ value = kwargs[old_name]
+ del kwargs[old_name]
+ return value
+ return None
+
+ parse_only = parse_only or deprecated_argument(
+ "parseOnlyThese", "parse_only")
+
+ from_encoding = from_encoding or deprecated_argument(
+ "fromEncoding", "from_encoding")
+
+ if from_encoding and isinstance(markup, str):
+ warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.")
+ from_encoding = None
+
+ if len(kwargs) > 0:
+ arg = list(kwargs.keys()).pop()
+ raise TypeError(
+ "__init__() got an unexpected keyword argument '%s'" % arg)
+
+ if builder is None:
+ original_features = features
+ if isinstance(features, str):
+ features = [features]
+ if features is None or len(features) == 0:
+ features = self.DEFAULT_BUILDER_FEATURES
+ builder_class = builder_registry.lookup(*features)
+ if builder_class is None:
+ raise FeatureNotFound(
+ "Couldn't find a tree builder with the features you "
+ "requested: %s. Do you need to install a parser library?"
+ % ",".join(features))
+ builder = builder_class()
+ if not (original_features == builder.NAME or
+ original_features in builder.ALTERNATE_NAMES):
+ if builder.is_xml:
+ markup_type = "XML"
+ else:
+ markup_type = "HTML"
+
+ # This code adapted from warnings.py so that we get the same line
+ # of code as our warnings.warn() call gets, even if the answer is wrong
+ # (as it may be in a multithreading situation).
+ caller = None
+ try:
+ caller = sys._getframe(1)
+ except ValueError:
+ pass
+ if caller:
+ globals = caller.f_globals
+ line_number = caller.f_lineno
+ else:
+ globals = sys.__dict__
+ line_number= 1
+ filename = globals.get('__file__')
+ if filename:
+ fnl = filename.lower()
+ if fnl.endswith((".pyc", ".pyo")):
+ filename = filename[:-1]
+ if filename:
+ # If there is no filename at all, the user is most likely in a REPL,
+ # and the warning is not necessary.
+ values = dict(
+ filename=filename,
+ line_number=line_number,
+ parser=builder.NAME,
+ markup_type=markup_type
+ )
+ warnings.warn(self.NO_PARSER_SPECIFIED_WARNING % values, stacklevel=2)
+
+ self.builder = builder
+ self.is_xml = builder.is_xml
+ self.known_xml = self.is_xml
+ self.builder.soup = self
+
+ self.parse_only = parse_only
+
+ if hasattr(markup, 'read'): # It's a file-type object.
+ markup = markup.read()
+ elif len(markup) <= 256 and (
+ (isinstance(markup, bytes) and not b'<' in markup)
+ or (isinstance(markup, str) and not '<' in markup)
+ ):
+ # Print out warnings for a couple beginner problems
+ # involving passing non-markup to Beautiful Soup.
+ # Beautiful Soup will still parse the input as markup,
+ # just in case that's what the user really wants.
+ if (isinstance(markup, str)
+ and not os.path.supports_unicode_filenames):
+ possible_filename = markup.encode("utf8")
+ else:
+ possible_filename = markup
+ is_file = False
+ try:
+ is_file = os.path.exists(possible_filename)
+ except Exception as e:
+ # This is almost certainly a problem involving
+ # characters not valid in filenames on this
+ # system. Just let it go.
+ pass
+ if is_file:
+ if isinstance(markup, str):
+ markup = markup.encode("utf8")
+ warnings.warn(
+ '"%s" looks like a filename, not markup. You should'
+ ' probably open this file and pass the filehandle into'
+ ' Beautiful Soup.' % markup)
+ self._check_markup_is_url(markup)
+
+ for (self.markup, self.original_encoding, self.declared_html_encoding,
+ self.contains_replacement_characters) in (
+ self.builder.prepare_markup(
+ markup, from_encoding, exclude_encodings=exclude_encodings)):
+ self.reset()
+ try:
+ self._feed()
+ break
+ except ParserRejectedMarkup:
+ pass
+
+ # Clear out the markup and remove the builder's circular
+ # reference to this object.
+ self.markup = None
+ self.builder.soup = None
+
+ def __copy__(self):
+ copy = type(self)(
+ self.encode('utf-8'), builder=self.builder, from_encoding='utf-8'
+ )
+
+ # Although we encoded the tree to UTF-8, that may not have
+ # been the encoding of the original markup. Set the copy's
+ # .original_encoding to reflect the original object's
+ # .original_encoding.
+ copy.original_encoding = self.original_encoding
+ return copy
+
+ def __getstate__(self):
+ # Frequently a tree builder can't be pickled.
+ d = dict(self.__dict__)
+ if 'builder' in d and not self.builder.picklable:
+ d['builder'] = None
+ return d
+
+ @staticmethod
+ def _check_markup_is_url(markup):
+ """
+ Check if markup looks like it's actually a url and raise a warning
+ if so. Markup can be unicode or str (py2) / bytes (py3).
+ """
+ if isinstance(markup, bytes):
+ space = b' '
+ cant_start_with = (b"http:", b"https:")
+ elif isinstance(markup, str):
+ space = ' '
+ cant_start_with = ("http:", "https:")
+ else:
+ return
+
+ if any(markup.startswith(prefix) for prefix in cant_start_with):
+ if not space in markup:
+ if isinstance(markup, bytes):
+ decoded_markup = markup.decode('utf-8', 'replace')
+ else:
+ decoded_markup = markup
+ warnings.warn(
+ '"%s" looks like a URL. Beautiful Soup is not an'
+ ' HTTP client. You should probably use an HTTP client like'
+ ' requests to get the document behind the URL, and feed'
+ ' that document to Beautiful Soup.' % decoded_markup
+ )
+
+ def _feed(self):
+ # Convert the document to Unicode.
+ self.builder.reset()
+
+ self.builder.feed(self.markup)
+ # Close out any unfinished strings and close all the open tags.
+ self.endData()
+ while self.currentTag.name != self.ROOT_TAG_NAME:
+ self.popTag()
+
+ def reset(self):
+ Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME)
+ self.hidden = 1
+ self.builder.reset()
+ self.current_data = []
+ self.currentTag = None
+ self.tagStack = []
+ self.preserve_whitespace_tag_stack = []
+ self.pushTag(self)
+
+ def new_tag(self, name, namespace=None, nsprefix=None, attrs={}, **kwattrs):
+ """Create a new tag associated with this soup."""
+ kwattrs.update(attrs)
+ return Tag(None, self.builder, name, namespace, nsprefix, kwattrs)
+
+ def new_string(self, s, subclass=NavigableString):
+ """Create a new NavigableString associated with this soup."""
+ return subclass(s)
+
+ def insert_before(self, successor):
+ raise NotImplementedError("BeautifulSoup objects don't support insert_before().")
+
+ def insert_after(self, successor):
+ raise NotImplementedError("BeautifulSoup objects don't support insert_after().")
+
+ def popTag(self):
+ tag = self.tagStack.pop()
+ if self.preserve_whitespace_tag_stack and tag == self.preserve_whitespace_tag_stack[-1]:
+ self.preserve_whitespace_tag_stack.pop()
+ #print "Pop", tag.name
+ if self.tagStack:
+ self.currentTag = self.tagStack[-1]
+ return self.currentTag
+
+ def pushTag(self, tag):
+ #print "Push", tag.name
+ if self.currentTag:
+ self.currentTag.contents.append(tag)
+ self.tagStack.append(tag)
+ self.currentTag = self.tagStack[-1]
+ if tag.name in self.builder.preserve_whitespace_tags:
+ self.preserve_whitespace_tag_stack.append(tag)
+
+ def endData(self, containerClass=NavigableString):
+ if self.current_data:
+ current_data = ''.join(self.current_data)
+ # If whitespace is not preserved, and this string contains
+ # nothing but ASCII spaces, replace it with a single space
+ # or newline.
+ if not self.preserve_whitespace_tag_stack:
+ strippable = True
+ for i in current_data:
+ if i not in self.ASCII_SPACES:
+ strippable = False
+ break
+ if strippable:
+ if '\n' in current_data:
+ current_data = '\n'
+ else:
+ current_data = ' '
+
+ # Reset the data collector.
+ self.current_data = []
+
+ # Should we add this string to the tree at all?
+ if self.parse_only and len(self.tagStack) <= 1 and \
+ (not self.parse_only.text or \
+ not self.parse_only.search(current_data)):
+ return
+
+ o = containerClass(current_data)
+ self.object_was_parsed(o)
+
+ def object_was_parsed(self, o, parent=None, most_recent_element=None):
+ """Add an object to the parse tree."""
+ parent = parent or self.currentTag
+ previous_element = most_recent_element or self._most_recent_element
+
+ next_element = previous_sibling = next_sibling = None
+ if isinstance(o, Tag):
+ next_element = o.next_element
+ next_sibling = o.next_sibling
+ previous_sibling = o.previous_sibling
+ if not previous_element:
+ previous_element = o.previous_element
+
+ o.setup(parent, previous_element, next_element, previous_sibling, next_sibling)
+
+ self._most_recent_element = o
+ parent.contents.append(o)
+
+ if parent.next_sibling:
+ # This node is being inserted into an element that has
+ # already been parsed. Deal with any dangling references.
+ index = len(parent.contents)-1
+ while index >= 0:
+ if parent.contents[index] is o:
+ break
+ index -= 1
+ else:
+ raise ValueError(
+ "Error building tree: supposedly %r was inserted "
+ "into %r after the fact, but I don't see it!" % (
+ o, parent
+ )
+ )
+ if index == 0:
+ previous_element = parent
+ previous_sibling = None
+ else:
+ previous_element = previous_sibling = parent.contents[index-1]
+ if index == len(parent.contents)-1:
+ next_element = parent.next_sibling
+ next_sibling = None
+ else:
+ next_element = next_sibling = parent.contents[index+1]
+
+ o.previous_element = previous_element
+ if previous_element:
+ previous_element.next_element = o
+ o.next_element = next_element
+ if next_element:
+ next_element.previous_element = o
+ o.next_sibling = next_sibling
+ if next_sibling:
+ next_sibling.previous_sibling = o
+ o.previous_sibling = previous_sibling
+ if previous_sibling:
+ previous_sibling.next_sibling = o
+
+ def _popToTag(self, name, nsprefix=None, inclusivePop=True):
+ """Pops the tag stack up to and including the most recent
+ instance of the given tag. If inclusivePop is false, pops the tag
+ stack up to but *not* including the most recent instqance of
+ the given tag."""
+ #print "Popping to %s" % name
+ if name == self.ROOT_TAG_NAME:
+ # The BeautifulSoup object itself can never be popped.
+ return
+
+ most_recently_popped = None
+
+ stack_size = len(self.tagStack)
+ for i in range(stack_size - 1, 0, -1):
+ t = self.tagStack[i]
+ if (name == t.name and nsprefix == t.prefix):
+ if inclusivePop:
+ most_recently_popped = self.popTag()
+ break
+ most_recently_popped = self.popTag()
+
+ return most_recently_popped
+
+ def handle_starttag(self, name, namespace, nsprefix, attrs):
+ """Push a start tag on to the stack.
+
+ If this method returns None, the tag was rejected by the
+ SoupStrainer. You should proceed as if the tag had not occurred
+ in the document. For instance, if this was a self-closing tag,
+ don't call handle_endtag.
+ """
+
+ # print "Start tag %s: %s" % (name, attrs)
+ self.endData()
+
+ if (self.parse_only and len(self.tagStack) <= 1
+ and (self.parse_only.text
+ or not self.parse_only.search_tag(name, attrs))):
+ return None
+
+ tag = Tag(self, self.builder, name, namespace, nsprefix, attrs,
+ self.currentTag, self._most_recent_element)
+ if tag is None:
+ return tag
+ if self._most_recent_element:
+ self._most_recent_element.next_element = tag
+ self._most_recent_element = tag
+ self.pushTag(tag)
+ return tag
+
+ def handle_endtag(self, name, nsprefix=None):
+ #print "End tag: " + name
+ self.endData()
+ self._popToTag(name, nsprefix)
+
+ def handle_data(self, data):
+ self.current_data.append(data)
+
+ def decode(self, pretty_print=False,
+ eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+ formatter="minimal"):
+ """Returns a string or Unicode representation of this document.
+ To get Unicode, pass None for encoding."""
+
+ if self.is_xml:
+ # Print the XML declaration
+ encoding_part = ''
+ if eventual_encoding != None:
+ encoding_part = ' encoding="%s"' % eventual_encoding
+ prefix = '\n' % encoding_part
+ else:
+ prefix = ''
+ if not pretty_print:
+ indent_level = None
+ else:
+ indent_level = 0
+ return prefix + super(BeautifulSoup, self).decode(
+ indent_level, eventual_encoding, formatter)
+
+# Alias to make it easier to type import: 'from bs4 import _soup'
+_s = BeautifulSoup
+_soup = BeautifulSoup
+
+class BeautifulStoneSoup(BeautifulSoup):
+ """Deprecated interface to an XML parser."""
+
+ def __init__(self, *args, **kwargs):
+ kwargs['features'] = 'xml'
+ warnings.warn(
+ 'The BeautifulStoneSoup class is deprecated. Instead of using '
+ 'it, pass features="xml" into the BeautifulSoup constructor.')
+ super(BeautifulStoneSoup, self).__init__(*args, **kwargs)
+
+
+class StopParsing(Exception):
+ pass
+
+class FeatureNotFound(ValueError):
+ pass
+
+
+#By default, act as an HTML pretty-printer.
+if __name__ == '__main__':
+ import sys
+ soup = BeautifulSoup(sys.stdin)
+ print(soup.prettify())
diff --git a/ext3/bs4/builder/__init__.py b/ext3/bs4/builder/__init__.py
new file mode 100644
index 0000000000..b80ad6845c
--- /dev/null
+++ b/ext3/bs4/builder/__init__.py
@@ -0,0 +1,339 @@
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from collections import defaultdict
+import itertools
+import sys
+from bs4.element import (
+ CharsetMetaAttributeValue,
+ ContentMetaAttributeValue,
+ HTMLAwareEntitySubstitution,
+ whitespace_re
+ )
+
+__all__ = [
+ 'HTMLTreeBuilder',
+ 'SAXTreeBuilder',
+ 'TreeBuilder',
+ 'TreeBuilderRegistry',
+ ]
+
+# Some useful features for a TreeBuilder to have.
+FAST = 'fast'
+PERMISSIVE = 'permissive'
+STRICT = 'strict'
+XML = 'xml'
+HTML = 'html'
+HTML_5 = 'html5'
+
+
+class TreeBuilderRegistry(object):
+
+ def __init__(self):
+ self.builders_for_feature = defaultdict(list)
+ self.builders = []
+
+ def register(self, treebuilder_class):
+ """Register a treebuilder based on its advertised features."""
+ for feature in treebuilder_class.features:
+ self.builders_for_feature[feature].insert(0, treebuilder_class)
+ self.builders.insert(0, treebuilder_class)
+
+ def lookup(self, *features):
+ if len(self.builders) == 0:
+ # There are no builders at all.
+ return None
+
+ if len(features) == 0:
+ # They didn't ask for any features. Give them the most
+ # recently registered builder.
+ return self.builders[0]
+
+ # Go down the list of features in order, and eliminate any builders
+ # that don't match every feature.
+ features = list(features)
+ features.reverse()
+ candidates = None
+ candidate_set = None
+ while len(features) > 0:
+ feature = features.pop()
+ we_have_the_feature = self.builders_for_feature.get(feature, [])
+ if len(we_have_the_feature) > 0:
+ if candidates is None:
+ candidates = we_have_the_feature
+ candidate_set = set(candidates)
+ else:
+ # Eliminate any candidates that don't have this feature.
+ candidate_set = candidate_set.intersection(
+ set(we_have_the_feature))
+
+ # The only valid candidates are the ones in candidate_set.
+ # Go through the original list of candidates and pick the first one
+ # that's in candidate_set.
+ if candidate_set is None:
+ return None
+ for candidate in candidates:
+ if candidate in candidate_set:
+ return candidate
+ return None
+
+# The BeautifulSoup class will take feature lists from developers and use them
+# to look up builders in this registry.
+builder_registry = TreeBuilderRegistry()
+
+class TreeBuilder(object):
+ """Turn a document into a Beautiful Soup object tree."""
+
+ NAME = "[Unknown tree builder]"
+ ALTERNATE_NAMES = []
+ features = []
+
+ is_xml = False
+ picklable = False
+ preserve_whitespace_tags = set()
+ empty_element_tags = None # A tag will be considered an empty-element
+ # tag when and only when it has no contents.
+
+ # A value for these tag/attribute combinations is a space- or
+ # comma-separated list of CDATA, rather than a single CDATA.
+ cdata_list_attributes = {}
+
+
+ def __init__(self):
+ self.soup = None
+
+ def reset(self):
+ pass
+
+ def can_be_empty_element(self, tag_name):
+ """Might a tag with this name be an empty-element tag?
+
+ The final markup may or may not actually present this tag as
+ self-closing.
+
+ For instance: an HTMLBuilder does not consider a
tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty
tag + will be presented as "
", not "". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no contents. + "foobaz
" + self.assertSoupEquals(markup) + + soup = self.soup(markup) + comment = soup.find(text="foobar") + self.assertEqual(comment.__class__, Comment) + + # The comment is properly integrated into the tree. + foo = soup.find(text="foo") + self.assertEqual(comment, foo.next_element) + baz = soup.find(text="baz") + self.assertEqual(comment, baz.previous_element) + + def test_preserved_whitespace_in_pre_and_textarea(self): + """Whitespace must be preserved inand