New Upstream Release - python-sure

Ready changes

Summary

Merged new upstream version: 2.0.1 (was: 2.0.0).

Diff

diff --git a/.coveragerc b/.coveragerc
deleted file mode 100644
index 2049cc7..0000000
--- a/.coveragerc
+++ /dev/null
@@ -1,2 +0,0 @@
-[report]
-show_missing = True
\ No newline at end of file
diff --git a/.flake8 b/.flake8
deleted file mode 100644
index ccb4094..0000000
--- a/.flake8
+++ /dev/null
@@ -1,4 +0,0 @@
-[flake8]
-ignore = E501,E731,F401,F821,E901
-max-line-length = 120
-exclude=patterns = .git,__pycache__,.tox,.eggs,*.egg
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 0743995..0000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## Issue Type
-
-Please specify the type of the issue you want to submit:
-
-- [ ] Bug Report
-- [ ] Feature Request
-- [ ] Documentation Report
-- [ ] General Enhancement Idea
-- [ ] ...
-
-## Versions & Configuration
-
-Please specify the following things:
-
-- version of `sure`
-- implementation and version of python
-- operating system
-
-## Steps to reproduce (Expected and Actual Results)
-
-Please specify the steps to reproduce your issue including the expected and the actual results.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 962638e..0000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,13 +0,0 @@
-## Pull Request Type
-
-Please specify the type of the pull request you want to submit:
-
-- [ ] Bugfix
-- [ ] New Feature
-- [ ] Documentation Only
-- [ ] Testing Only
-- [ ] ...
-
-## Summary
-
-Please provide a short summary about your Pull Request.
diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml
deleted file mode 100644
index 4176eff..0000000
--- a/.github/workflows/pythonapp.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: Sure Tests
-on: [push, pull_request]
-
-jobs:
-  python:
-    name: "Python"
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        python:
-          - 3.6.5
-          - 3.7.3
-          - 3.8.6
-          - 3.9.0
-
-    steps:
-    - uses: actions/checkout@v2
-    - name: Install python version
-      uses: gabrielfalcao/pyenv-action@v7
-      with:
-        default: "${{ matrix.python }}"
-        command: pip install -U pip setuptools
-
-    - name: Install dependencies
-      run: pip install -r development.txt
-
-    - name: Install sure
-      run: pip install -e .
-
-    - name: Run tests with nose
-      run: nosetests --verbosity 2
-
-    - name: Test with pytest
-      run: pytest -vv
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 7555a92..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,20 +0,0 @@
-# python bytecode
-*.pyc
-__pycache__
-
-# pip and setuptools
-docs/_build
-build/
-dist/
-*.egg-info/
-sure-*.tar.gz
-
-# temporary test files and dirs
-.coverage
-.tox
-
-# temporary editor files
-*.sublime-project
-*.sublime-workspace
-*.swp
-.venv/
diff --git a/.release b/.release
deleted file mode 100755
index 6225a61..0000000
--- a/.release
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-
-declare newversion
-declare current_version
-declare sure
-
-
-current_version="$(grep -E  version ./sure/version.py | sed 's,version *= *.\(\([0-9]*[.]*\)\{3\,4\}\).,\1,g')"
-echo -en "The current version is \033[1;33m$current_version\033[0m, type a new one\n\033[1;32mnew version:\033[0m "
-read -r newversion
-
-
-function find_files () {
-    for name in $(find . -name 'README.rst' -or -name version.py -or -name conf.py | grep -v '\(\.venv\|build\)[/]'); do
-        echo "${name}"
-    done
-
-}
-
-function update_files (){
-    find_files | xargs gsed -i "s,$current_version,$newversion,g"
-}
-function revert_files (){
-    find_files | xargs gsed -i "s,$newversion,$current_version,g"
-}
-
-echo -en "\033[A\033[A\rI will make a new commit named \033[1;33m'New release $newversion'\033[0m\n"
-echo -en "Are you sure? [\033[1;32myes\033[0m or \033[1;31mno\033[0m]\n"
-read -r sure
-
-
-if [ "${sure}" == "yes" ]; then
-    echo "updating relevant files with new version..."
-    if update_files; then
-        echo "committing and pushing changes..."
-        echo -en "New release: \033[1;32m$newversion\033[0m\n"
-        if git add -f $(find_files); then
-            if git commit $(find_files) -m "New release: $newversion"; then
-                if git push; then
-                    echo "creating tag ${newversion}..."
-                    if git tag "${newversion}"; then
-                        echo "pushing tag ${newversion}..."
-                        git push --tags
-                    else
-                        echo "failed to create tag ${newversion}"
-                        echo "you might want to revert the last commit and check what happened"
-                        exit 1
-                    fi
-                else
-                    echo "failed to push, skipping release and reverting changes"
-                    revert_files
-                    exit 1
-                fi
-            else
-                echo "failed to commit, skipping release and reverting changes"
-                revert_files
-                exit 1
-            fi
-        else
-            echo "no files to git add, skipping release"
-            exit 1
-        fi;
-    else
-        echo "no files were updated, skipping release"
-        exit 1
-    fi
-else
-    echo "kthankxbye"
-fi
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 1fb23ed..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-This project adheres to [Semantic Versioning](http://semver.org/).
-
-## [v2.0.0]
-### Fixed
-- No longer patch the builtin `dir()` function, which fixes pytest in some cases such as projects using gevent.
-
-## [v1.4.11]
-### Fixed
-- Reading the version dinamically was causing import errors that caused error when installing package. Refs #144
-
-## [v1.4.7]
-### Fixed
-- Remove wrong parens for format call. Refs #139
-
-## [v1.4.6]
-### Added
-- Support and test against PyPy 3
-
-### Fixed
-- Fix safe representation in exception messages for bytes and unicode objects. Refs #136
-
-## [v1.4.5]
-### Fixed
-- Correctly escape special character for `str.format()` for assertion messages. Refs #134
-
-## [v1.4.4]
-
-*Nothing to mention here.*
-
-## [v1.4.3]
-### Fixed
-- Bug in setup.py that would break in python > 2
-
-## [v1.4.2]
-### Added
-- `ensure` context manager to provide custom assertion messages. Refs #125
-
-## [v1.4.1]
-### Added
-- Python 3.6 support
-- Python 3.7-dev support (allowed to fail)
-
-### Fixed
-- Do not overwrite existing class and instance attributes with sure properties (when. should, ...). Refs #127, #129
-- Fix patched built-in `dir()` method. Refs #124, #128
-
-## [v1.4.0]
-### Added
-- anything object which is accessible with `sure.anything`
-- interface to extend sure. Refs #31
-
-### Removed
-- Last traces of Python 2.6 support
-
-### Fixed
-- Allow overwriting of monkey-patched properties by sure. Refs #19
-- Assertions for raises
-
-## [v1.3.0]
-### Added
-- Python 3.3, 3.4 and 3.5 support
-- pypy support
-- Support comparison of OrderedDict. Refs #55
-
-### Fixed
-- `contain` assertion. Refs #104
-
-
-## No previous changelog history.
-
-Please see `git log`
-
-[Unreleased]: https://github.com/gabrielfalcao/sure/compare/v1.4.7...HEAD
-[v1.4.7]: https://github.com/gabrielfalcao/sure/compare/1.4.6...v1.4.7
-[v1.4.6]: https://github.com/gabrielfalcao/sure/compare/1.4.5...v1.4.6
-[v1.4.5]: https://github.com/gabrielfalcao/sure/compare/1.4.4...v1.4.5
-[v1.4.4]: https://github.com/gabrielfalcao/sure/compare/1.4.3...v1.4.4
-[v1.4.3]: https://github.com/gabrielfalcao/sure/compare/1.4.2...v1.4.3
-[v1.4.2]: https://github.com/gabrielfalcao/sure/compare/1.4.1...v1.4.2
-[v1.4.1]: https://github.com/gabrielfalcao/sure/compare/1.4.0...v1.4.1
-[v1.4.0]: https://github.com/gabrielfalcao/sure/compare/1.3.0...v1.4.0
-[v1.3.0]: https://github.com/gabrielfalcao/sure/compare/1.2.9...v1.3.0
-[1.2.9]: https://github.com/gabrielfalcao/sure/compare/1.2.5...1.2.9
-[1.2.5]: https://github.com/gabrielfalcao/sure/compare/1.2.4...1.2.5
diff --git a/COPYING b/COPYING
index d61f5f3..a7c19df 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+Copyright (C) <2010-2022>  Gabriel Falcão <gabriel@nacaolivre.org>
 
                     GNU GENERAL PUBLIC LICENSE
                        Version 3, 29 June 2007
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 4ab18e3..0000000
--- a/Makefile
+++ /dev/null
@@ -1,136 +0,0 @@
-MAKEFILE_PATH		:= $(realpath $(firstword $(MAKEFILE_LIST)))
-GIT_ROOT		:= $(shell dirname $(MAKEFILE_PATH))
-VENV_ROOT		:= $(GIT_ROOT)/.venv
-
-PACKAGE_NAME		:= sure
-MAIN_CLI_NAME		:= sure
-REQUIREMENTS_FILE	:= development.txt
-
-PACKAGE_PATH		:= $(GIT_ROOT)/$(PACKAGE_NAME)
-REQUIREMENTS_PATH	:= $(GIT_ROOT)/$(REQUIREMENTS_FILE)
-MAIN_CLI_PATH		:= $(VENV_ROOT)/bin/$(MAIN_CLI_NAME)
-export VENV		?= $(VENV_ROOT)
-
-OSNAME			:= $(shell uname)
-ifeq ($(OSNAME), Linux)
-OPEN_COMMAND		:= gnome-open
-else
-OPEN_COMMAND		:= open
-endif
-export SURE_NO_COLORS := true
-
-######################################################################
-# Phony targets (only exist for typing convenience and don't represent
-#                real paths as Makefile expects)
-######################################################################
-
-# default target when running `make` without arguments
-all: | $(MAIN_CLI_PATH)
-
-# creates virtualenv
-venv: | $(VENV)
-
-# updates pip and setuptools to their latest version
-develop: | $(VENV)/bin/python $(VENV)/bin/pip
-
-# installs the requirements and the package dependencies
-setup: | $(MAIN_CLI_PATH)
-
-# Convenience target to ensure that the venv exists and all
-# requirements are installed
-dependencies:
-	@rm -f $(MAIN_CLI_PATH) # remove MAIN_CLI_PATH to trigger pip install
-	$(MAKE) develop setup
-
-docs:
-	@(cd docs && make html)
-	$(OPEN_COMMAND) docs/build/html/index.html
-
-test:
-	@$(VENV)/bin/nosetests --rednose --immediate -vv --with-coverage --cover-package=sure
-	@$(VENV)/bin/pytest -vv
-
-# run main command-line tool
-run: | $(MAIN_CLI_PATH)
-	@$(MAIN_CLI_PATH) --help
-
-# Pushes release of this package to pypi
-push-release: dist  # pushes distribution tarballs of the current version
-	$(VENV)/bin/twine upload dist/*.tar.gz
-
-# Prepares release of this package prior to pushing to pypi
-build-release:
-	rm -rf ./dist  # remove local packages
-	$(VENV)/bin/twine check dist/*.tar.gz
-	$(VENV)/bin/python setup.py build sdist
-
-# Convenience target that runs all tests then builds and pushes a release to pypi
-release: tests build-release push-release
-	@rm -rf dist/*
-	@./.release
-	$(MAKE) build-release
-	$(MAKE) push-release
-
-# Convenience target to delete the virtualenv
-clean:
-	@rm -rf .venv
-
-# Convenience target to format code with black with PEP8's default
-# 80 character limit per line
-black: | $(VENV)/bin/black
-	@$(VENV)/bin/black -l 80 $(PACKAGE_PATH) tests
-
-##############################################################
-# Real targets (only run target if its file has been "made" by
-#               Makefile yet)
-##############################################################
-
-# creates virtual env if necessary and installs pip and setuptools
-$(VENV): | $(REQUIREMENTS_PATH)  # creates $(VENV) folder if does not exist
-	echo "Creating virtualenv in $(VENV_ROOT)" && python3 -mvenv $(VENV)
-
-# installs pip and setuptools in their latest version, creates virtualenv if necessary
-$(VENV)/bin/python $(VENV)/bin/pip: # installs latest pip
-	@test -e $(VENV)/bin/python || $(MAKE) $(VENV)
-	@test -e $(VENV)/bin/pip || $(MAKE) $(VENV)
-	@echo "Installing latest version of pip and setuptools"
-	@$(VENV)/bin/pip install -U pip setuptools
-
- # installs latest version of the "black" code formatting tool
-$(VENV)/bin/black: | $(VENV)/bin/pip
-	$(VENV)/bin/pip install -U black
-
-# installs this package in "edit" mode after ensuring its requirements are installed
-
-$(VENV)/bin/nosetests $(VENV)/bin/pytest $(MAIN_CLI_PATH): | $(VENV) $(VENV)/bin/pip $(VENV)/bin/python $(REQUIREMENTS_PATH)
-	$(VENV)/bin/pip install -r $(REQUIREMENTS_PATH)
-	$(VENV)/bin/pip install -e .
-
-# ensure that REQUIREMENTS_PATH exists
-$(REQUIREMENTS_PATH):
-	@echo "The requirements file $(REQUIREMENTS_PATH) does not exist"
-	@echo ""
-	@echo "To fix this issue:"
-	@echo "  edit the variable REQUIREMENTS_NAME inside of the file:"
-	@echo "  $(MAKEFILE_PATH)."
-	@echo ""
-	@exit 1
-
-###############################################################
-# Declare all target names that exist for convenience and don't
-# represent real paths, which is what Make expects by default:
-###############################################################
-
-.PHONY: \
-	all \
-	black \
-	build-release \
-	clean \
-	dependencies \
-	develop \
-	push-release \
-	release \
-	setup \
-	run \
-	test \
-	docs
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..0bb87c3
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,125 @@
+Metadata-Version: 2.1
+Name: sure
+Version: 2.0.1
+Summary: utility belt for automated testing in python for python
+Home-page: http://github.com/gabrielfalcao/sure
+Author: Gabriel Falcao
+Author-email: gabriel@nacaolivre.org
+Maintainer: Timo Furrer
+Maintainer-email: tuxtimo@gmail.com
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: Implementation
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Testing
+Description-Content-Type: text/x-rst
+License-File: COPYING
+
+sure
+====
+
+.. image:: https://img.shields.io/pypi/dm/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://github.com/gabrielfalcao/sure/workflows/Sure%20Tests/badge.svg
+   :target: https://github.com/gabrielfalcao/sure/actions?query=workflow%3A%22Sure+Tests%22
+
+.. image:: https://img.shields.io/readthedocs/sure
+   :target: https://sure.readthedocs.io/
+
+.. image:: https://img.shields.io/github/license/gabrielfalcao/sure?label=Github%20License
+   :target: https://github.com/gabrielfalcao/sure/blob/master/LICENSE
+
+.. image:: https://img.shields.io/pypi/v/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/l/sure?label=PyPi%20License
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/format/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/status/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/pyversions/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/implementation/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/github/v/tag/gabrielfalcao/sure
+   :target: https://github.com/gabrielfalcao/sure/releases
+
+.. image:: https://img.shields.io/badge/pydoc-web-ff69b4.svg
+   :target: http://pydoc.net/sure
+
+An idiomatic testing library for python with powerful and flexible assertions, created by `Gabriel Falcão <https://github.com/gabrielfalcao>`_.
+Sure's developer experience is inspired and modeled after `RSpec Expectations
+<http://rspec.info/documentation/3.5/rspec-expectations/>`_ and
+`should.js <https://github.com/shouldjs/should.js>`_.
+
+Installing
+----------
+
+.. code:: bash
+
+    $ pip install sure
+
+Documentation
+-------------
+
+Available in the `website <https://sure.readthedocs.io/en/latest/>`__ or under the
+``docs`` directory.
+
+You can also build the documentation locally using sphinx:
+
+.. code:: bash
+
+    make docs
+
+Here is a tease
+---------------
+
+Equality
+~~~~~~~~
+
+(number).should.equal(number)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: python
+
+    import sure
+
+    (4).should.be.equal(2 + 2)
+    (7.5).should.eql(3.5 + 4)
+
+    (3).shouldnt.be.equal(5)
+
+Assert dictionary and its contents
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: python
+
+    {'foo': 'bar'}.should.equal({'foo': 'bar'})
+    {'foo': 'bar'}.should.have.key('foo').which.should.equal('bar')
+
+"A string".lower().should.equal("a string") also works
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: python
+
+    "Awesome ASSERTIONS".lower().split().should.equal(['awesome', 'assertions'])
diff --git a/README.rst b/README.rst
index 10693da..7a9e94b 100644
--- a/README.rst
+++ b/README.rst
@@ -1,8 +1,6 @@
 sure
 ====
 
-
-
 .. image:: https://img.shields.io/pypi/dm/sure
    :target: https://pypi.org/project/sure
 
@@ -39,7 +37,7 @@ sure
 .. image:: https://img.shields.io/badge/pydoc-web-ff69b4.svg
    :target: http://pydoc.net/sure
 
-An idiomatic testing library for python with powerful and flexible created by `Gabriel Falcão <https://github.com/gabrielfalcao>`_.
+An idiomatic testing library for python with powerful and flexible assertions, created by `Gabriel Falcão <https://github.com/gabrielfalcao>`_.
 Sure's developer experience is inspired and modeled after `RSpec Expectations
 <http://rspec.info/documentation/3.5/rspec-expectations/>`_ and
 `should.js <https://github.com/shouldjs/should.js>`_.
diff --git a/TODO.rst b/TODO.rst
deleted file mode 100644
index 2bbe11d..0000000
--- a/TODO.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-TODO
-----
-
-``.when.py2.should.`` and ``.should.when.py2.``
-``.when.py3.should.`` and ``.should.when.py3.``
-
-
-Mock and Stubbing support
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-.. code:: python
-
-   import sure
-
-
-   def some_helper_function(value):
-       if value == 'foo':
-           return 'expected'
-
-
-   def main_function_that_depends_on_helper(param1, param2):
-       return some_helper_function(param1)
-
-
-   def test_main_function_succeeds_when_helper_returns_expected_result():
-       some_helper_function.stub.called_with('foo').returns(['expected'])
-
-       result = main_function_that_depends_on_helper('foo', 'bar')
-
-       result.should.equal('expected')
diff --git a/debian/changelog b/debian/changelog
index 818e18c..1c590e0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+python-sure (2.0.1-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 24 Aug 2023 08:22:46 -0000
+
 python-sure (2.0.0-3) unstable; urgency=medium
 
   * Added extend-diff-ignore for the egg-info (Closes: #1046255).
diff --git a/development.txt b/development.txt
deleted file mode 100644
index 48afe1a..0000000
--- a/development.txt
+++ /dev/null
@@ -1,10 +0,0 @@
--r requirements.txt
-ipdb==0.13.9
-rednose==1.3.0
-Sphinx==2.3.1
-sphinx-rtd-theme==0.4.3
-tox==3.23.1
-twine==3.4.1
-nose==1.3.7
-pytest==6.2.4
-pytest-cov==2.12.1
diff --git a/docs-requirements.txt b/docs-requirements.txt
deleted file mode 100644
index d8cd29c..0000000
--- a/docs-requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
--r development.txt
-sure==1.4.5
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index fe9d719..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,192 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  applehelp  to make an Apple Help Book"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-	@echo "  coverage   to run coverage check of the documentation (if enabled)"
-
-clean:
-	rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Sure.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Sure.qhc"
-
-applehelp:
-	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
-	@echo
-	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
-	@echo "N.B. You won't be able to view it unless you put it in" \
-	      "~/Library/Documentation/Help or install it in your application" \
-	      "bundle."
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/Sure"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Sure"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-coverage:
-	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
-	@echo "Testing of coverage in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/coverage/python.txt."
-
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/docs/source/about.rst b/docs/source/about.rst
deleted file mode 100644
index 38ff863..0000000
--- a/docs/source/about.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-.. _About:
-
-About sure
-==========
-
-The assertion library is 100% inspired be the awesomeness of
-`should.js <https://github.com/visionmedia/should.js>`__ which is
-simple, declarative and fluent.
-
-Sure strives to provide everything a python developer needs in an
-assertion:
-
--  Assertion messages are easy to understand
-
--  When comparing iterables the comparation is recursive and shows
-   exactly where is the error
-
--  Fluency: the builtin types are changed in order to provide awesome
-   simple assertions
diff --git a/docs/source/api-reference.rst b/docs/source/api-reference.rst
deleted file mode 100644
index 305d28b..0000000
--- a/docs/source/api-reference.rst
+++ /dev/null
@@ -1,941 +0,0 @@
-.. _API Reference:
-
-API Reference
-=============
-
-
-Setup/Teardown
---------------
-
-You might be familiar with to how the :py:mod:`unittest` module
-suggests to `implement setup and teardown callbacks <https://docs.python.org/2/library/unittest.html#class-and-module-fixtures>`_
-for your tests.
-
-But if you prefer to define test cases as functions and use a runner
-like `nose <https://nose.readthedocs.io/en/latest/>`_ then *sure* can
-help you define and activate modular fixtures.
-
-In *sure's* parlance, we call it a *Scenario*
-
-
-Example: Setup a Flask app for testing
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-``my_flask_app.py``
-...................
-
-.. code::
-
-   import json
-   from flask import Response, Flask
-
-   webapp = Flask(__name__)
-
-   @webapp.route('/')
-   def index():
-       data = json.dumps({'hello': 'world'}}
-       return Response(data, headers={'Content-Type': 'application/json'})
-
-
-``tests/scenarios.py``
-......................
-
-.. code:: python
-
-   from sure import scenario
-   from my_flask_app import webapp
-
-   def prepare_webapp(context):
-       context.server = webapp.test_client()
-
-   web_scenario = scenario(prepare_webapp)
-
-
-``tests/test_webapp.py``
-........................
-
-.. code:: python
-
-   import json
-   from sure import scenario
-   from tests.scenarios import web_scenario
-
-   @web_scenario
-   def test_hello_world(context):
-       # Given that I GET /
-       response = context.server.get('/')
-
-       # Then it should have returned a successful json response
-       response.headers.should.have.key('Content-Type').being.equal('application/json')
-       response.status_code.should.equal(200)
-
-       json.loads(response.data).should.equal({'hello': 'world'})
-
-
-Example: Multiple Setup and Teardown functions
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-``tests/scenarios.py``
-......................
-
-.. code:: python
-
-   import os
-   import shutil
-   from sure import scenario
-
-   def prepare_directories(context):
-       context.root = os.path.dirname(os.path.abspath(__file__))
-       context.fixture_path = os.path.join(context.root, 'input_data')
-       context.result_path = os.path.join(context.root, 'output_data')
-       context.directories = [
-           context.fixture_path,
-           context.result_path,
-       ]
-
-       for path in context.directories:
-           if os.path.isdir(path):
-               shutil.rmtree(path)
-
-           os.makedirs(path)
-
-
-   def cleanup_directories(context):
-       for path in context.directories:
-           if os.path.isdir(path):
-               shutil.rmtree(path)
-
-
-   def create_10_dummy_hex_files(context):
-       for index in range(10):
-           filename = os.path.join(context.fixture_path, 'dummy-{}.hex'.format(index))
-           open(filename, 'wb').write(os.urandom(32).encode('hex'))
-
-
-   dummy_files_scenario = scenario([create_directories, create_10_dummy_hex_files], [cleanup_directories])
-
-``tests/test_filesystem.py``
-........................
-
-.. code:: python
-
-   import os
-   from tests.scenarios import dummy_files_scenario
-
-   @dummy_files_scenario
-   def test_files_exist(context):
-       os.listdir(context.fixture_path).should.equal([
-           'dummy-0.hex',
-           'dummy-1.hex',
-           'dummy-2.hex',
-           'dummy-3.hex',
-           'dummy-4.hex',
-           'dummy-5.hex',
-           'dummy-6.hex',
-           'dummy-7.hex',
-           'dummy-8.hex',
-           'dummy-9.hex',
-       ])
-
-
-Number Equality
----------------
-
-``(2 + 2).should.equal(4)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    import sure
-
-    (4).should.be.equal(2 + 2)
-    (7.5).should.eql(3.5 + 4)
-    (2).should.equal(8 / 4)
-
-    (3).shouldnt.be.equal(5)
-
-``.equal(float, epsilon)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    import sure
-
-    (4.242423).should.be.equal(4.242420, epsilon=0.000005)
-    (4.01).should.be.eql(4.00, epsilon=0.01)
-    (6.3699999).should.equal(6.37, epsilon=0.001)
-
-    (4.242423).shouldnt.be.equal(4.249000, epsilon=0.000005)
-
-
-String Equality
----------------
-
-``.should_not.be.different_of(string)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    import sure
-
-    XML1 = '''<root>
-      <a-tag with-attribute="one">AND A VALUE</a-tag>
-    </root>'''
-
-
-    XML1.should_not.be.different_of(XML1)
-
-    XML2 = '''<root>
-      <a-tag with-attribute="two">AND A VALUE</a-tag>
-    </root>'''
-
-    XML2.should.be.different_of(XML1)
-
-this will give you and output like
-
-.. code:: bash
-
-    Difference:
-
-      <root>
-    -   <a-tag with-attribute="one">AND A VALUE</a-tag>
-    ?                           --
-    +   <a-tag with-attribute="two">AND A VALUE</a-tag>
-    ?                          ++
-      </root>'''
-
-``.should.equal("a string")``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    "Awesome ASSERTIONS".lower().split().should.equal(['awesome', 'assertions'])
-
-
-String Similarity
------------------
-
-``.look_like()``
-~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-
-    """
-
-    THIS IS MY loose string
-    """.should.look_like('this is my loose string')
-
-    """this one is different""".should_not.look_like('this is my loose string')
-
-
-Strings Matching Regular-Expressions
-------------------------------------
-
-``should.match()``
-~~~~~~~~~~~~~~~~~~
-
-You can also use the modifiers:
-
--  `re.DEBUG <http://docs.python.org/2/library/re.html#re.DEBUG>`__
--  `re.I and re.IGNORECASE <http://docs.python.org/2/library/re.html#re.IGNORECASE>`_
--  `re.M and re.MULTILINE <http://docs.python.org/2/library/re.html#re.MULTILINE>`_
--  `re.S re.DOTALL <http://docs.python.org/2/library/re.html#re.DOTALL>`_
--  `re.U and re.UNICODE <http://docs.python.org/2/library/re.html#re.UNICODE>`_
--  `re.X and re.VERBOSE <http://docs.python.org/2/library/re.html#re.VERBOSE>`_
-
-.. code:: python
-
-    import re
-
-    "SOME STRING".should.match(r'some \w+', re.I)
-    "FOO BAR CHUCK NORRIS".should_not.match(r'some \w+', re.M)
-
-
-Collections and Iterables
--------------------------
-
-
-Works with:
-
-- Lists, Tuples, Sets
-- Dicts, OrderedDicts
-- Anything that implements ``__iter__()`` / ``next()``
-
-
-``.equal({'a': 'collection'})``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    {'foo': 'bar'}.should.equal({'foo': 'bar'})
-    {'foo': 'bar'}.should.eql({'foo': 'bar'})
-    {'foo': 'bar'}.must.be.equal({'foo': 'bar'})
-
-
-``.contain()``
-~~~~~~~~~~~~~~~~~~~~~
-
-``expect(collection).to.contain(item)`` is a shorthand to
-``expect(item).to.be.within(collection)``
-
-.. code:: python
-
-    ['1.2.5', '1.2.4'].should.contain('1.2.5')
-    '1.2.4'].should.be.within(['1.2.5', '1.2.4'])
-
-    # also works with strings
-    "My bucket of text".should.contain('bucket')
-    "life".should_not.contain('anger')
-    '1.2.3'.should.contain('2')
-
-
-``.should.be.empty``
-~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-
-    [].should.be.empty
-    {}.should.be.empty
-    set().should.be.empty
-    "".should.be.empty
-    ().should.be.empty
-    range(0).should.be.empty
-
-    ## negate with:
-
-    [1, 2, 3].shouldnt.be.empty
-    "Dummy String".shouldnt.be.empty
-    "Dummy String".should_not.be.empty
-
-
-``{number}.should.be.within(0, 10)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-asserts inclusive numeric range
-
-.. code:: python
-
-    (1).should.be.within(0, 2)
-    (5).should.be.within(0, 10)
-
-    ## negate with:
-
-    (1).shouldnt.be.within(5, 6)
-
-
-``.be.within({iterable})``
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-asserts that a member is part of the iterable
-
-.. code:: python
-
-    "g".should.be.within("gabriel")
-    'name'.should.be.within({'name': 'Gabriel'})
-    'Lincoln'.should.be.within(['Lincoln', 'Gabriel'])
-
-    ## negate with:
-
-    'Bug'.shouldnt.be.within(['Sure 1.0'])
-    'Bug'.should_not.be.within(['Sure 1.0'])
-
-
-``.be.none``
-~~~~~~~~~~~~
-
-Assert whether an object is or not ``None``
-
-.. code:: python
-
-
-    value = None
-    value.should.be.none
-    None.should.be.none
-
-    "".should_not.be.none
-    (not None).should_not.be.none
-
-``.be.ok``
-~~~~~~~~~~
-
-Assert truthfulness:
-
-.. code:: python
-
-    from sure import this
-
-    True.should.be.ok
-    'truthy string'.should.be.ok
-    {'truthy': 'dictionary'}.should.be.ok
-
-And negate truthfulness:
-
-.. code:: python
-
-
-    from sure import this
-
-    False.shouldnt.be.ok
-    ''.should_not.be.ok
-    {}.shouldnot.be.ok
-
-
-``.have.property()``
-~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-
-    class Basket(object):
-        fruits = ["apple", "banana"]
-
-
-    basket1 = Basket()
-
-    basket1.should.have.property("fruits")
-
-
-``.have.property().being.*``
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-If the programmer calls ``have.property()`` it returns an assertion
-builder of the property if it exists, so that you can chain up
-assertions for the property value itself.
-
-.. code:: python
-
-    class Basket(object):
-        fruits = ["apple", "banana"]
-
-    basket2 = Basket()
-    basket2.should.have.property("fruits").which.should.be.equal(["apple", "banana"])
-    basket2.should.have.property("fruits").being.equal(["apple", "banana"])
-    basket2.should.have.property("fruits").with_value.equal(["apple", "banana"])
-    basket2.should.have.property("fruits").with_value.being.equal(["apple", "banana"])
-
-``.have.key()``
-~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    basket3 = dict(fruits=["apple", "banana"])
-    basket3.should.have.key("fruits")
-
-``.have.key().being.*``
-^^^^^^^^^^^^^^^^^^^^^^^
-
-If the programmer calls ``have.key()`` it returns an assertion builder
-of the key if it exists, so that you can chain up assertions for the
-dictionary key value itself.
-
-.. code:: python
-
-    person = dict(name=None)
-    person.should.have.key("name").being.none
-    person.should.have.key("name").being.equal(None)
-
-
-``.have.length_of(2)``
-~~~~~~~~~~~~~~~~~~~~~~
-
-Assert the length of objects
-
-.. code:: python
-
-
-    [3, 4].should.have.length_of(2)
-
-    "Python".should.have.length_of(6)
-
-    {'john': 'person'}.should_not.have.length_of(2)
-
-
-``{X}.should.be.greater_than(Y) and {Y}.should.be.lower_than(X)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Assert the magnitude of objects with ``{X}.should.be.greater_than(Y)`` and ``{Y}.should.be.lower_than(X)`` as well as ``{X}.should.be.greater_than_or_equal_to(Y)`` and ``{Y}.should.be.lower_than_or_equal_to(X)``.
-
-
-.. code:: python
-
-    (5).should.be.greater_than(4)
-    (5).should_not.be.greater_than(10)
-    (1).should.be.lower_than(2)
-    (1).should_not.be.lower_than(0)
-
-    (5).should.be.greater_than_or_equal_to(4)
-    (5).should_not.be.greater_than_or_equal_to(10)
-    (1).should.be.lower_than_or_equal_to(2)
-    (1).should_not.be.lower_than_or_equal_to(0)
-
-
-Callables
----------
-
-
-``callable.when.called_with(arg1, kwarg1=2).should.have.raised(Exception)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-You can use this feature to assert that a callable raises an exception:
-
-.. code:: python
-
-    range.when.called_with("chuck norris").should.have.raised(TypeError)
-    range.when.called_with(10).should_not.throw(TypeError)
-
-Regular Expression matching on the exception message
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-You can also match regular expressions with to the expected exception
-messages:
-
-.. code:: python
-
-    import re
-    range.when.called_with(10, step=20).should.have.raised(TypeError, re.compile(r'(does not take|takes no) keyword arguments'))
-    range.when.called_with("chuck norris").should.have.raised(TypeError, re.compile(r'(cannot be interpreted as an integer|integer end argument expected)'))
-
-
-``.should.throw(Exception)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-An idiomatic alias to ``.should.have.raised``.
-
-.. code:: python
-
-    range.when.called_with(10, step="20").should.throw(TypeError, "range() takes no keyword arguments")
-    range.when.called_with(b"chuck norris").should.throw("range() integer end argument expected, got str.")
-
-
-``function.when.called_with(arg1, kwarg1=2).should.return_value(value)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-This is a shorthand for testing that a callable returns the expected
-result
-
-.. code:: python
-
-    list.when.called_with([0, 1]).should.have.returned_the_value([0, 1])
-
-which equates to:
-
-::
-
-    value = range(2)
-    value.should.equal([0, 1])
-
-there are no differences between those 2 possibilities, use at will
-
-``.be.a('typename')``
-~~~~~~~~~~~~~~~~~~~~~
-
-this takes a type name and checks if the class matches that name
-
-.. code:: python
-
-    import sure
-
-    {}.should.be.a('dict')
-    (5).should.be.an('int')
-
-    ## also works with paths to modules
-
-    range(10).should.be.a('collections.Iterable')
-
-``.be.a(type)``
-~~~~~~~~~~~~~~~~~~~~~~
-
-this takes the class (type) itself and checks if the object is an
-instance of it
-
-.. code:: python
-
-    import sure
-    from six import PY3
-
-    if PY3:
-        u"".should.be.an(str)
-    else:
-        u"".should.be.an(unicode)
-    [].should.be.a(list)
-
-``.be.above(num) and .be.below(num)``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-assert the instance value above and below ``num``
-
-.. code:: python
-
-    import sure
-
-    (10).should.be.below(11)
-    (10).should.be.above(9)
-    (10).should_not.be.above(11)
-    (10).should_not.be.below(9)
-
-``it()``, ``this()``, ``those()``, ``these()``
-----------------------------------------------
-
-``.should`` aliases to make your tests more idiomatic.
-
-Whether you don't like the ``object.should`` syntax or you are simply
-not running CPython, sure still allows you to use any of the assertions
-above, all you need to do is wrap the object that is being compared in
-one of the following options: ``it``, ``this``, ``those`` and ``these``.
-
-
-Too long, don't read
-~~~~~~~~~~~~~~~~~~~~
-
-
-All those possibilities below work just as the same
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. code:: python
-
-    from sure import it, this, those, these
-
-    (10).should.be.equal(5 + 5)
-
-    this(10).should.be.equal(5 + 5)
-    it(10).should.be.equal(5 + 5)
-    these(10).should.be.equal(5 + 5)
-    those(10).should.be.equal(5 + 5)
-
-
-Also if you prefer using the assert keyword in your tests just go ahead an do it!
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Every assertion returns ``True`` when succeeded, and if failed the
-AssertionError is already raised internally by sure, with a nice
-description of what failed to match, too.
-
-.. code:: python
-
-    from sure import it, this, those, these, expect
-
-    assert (10).should.be.equal(5 + 5)
-    assert this(10).should.be.equal(5 + 5)
-    assert it(10).should.be.equal(5 + 5)
-    assert these(10).should.be.equal(5 + 5)
-    assert those(10).should.be.equal(5 + 5)
-
-    expect(10).to.be.equal(5 + 5)
-    expect(10).to.not_be.equal(8)
-
-``(lambda: None).should.be.callable``
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Test if something is or not callable
-
-.. code:: python
-
-    import sure
-
-    range.should.be.callable
-    (lambda: None).should.be.callable
-    (123).should_not.be.callable
-
-
-A note about the assert keyword
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. note:: *you can use or not the* ``assert`` *keyword, sure
-          internally already raises an appropriate* ``AssertionError`` *with an
-          assertion message so that you don't have to specify your own, but you
-          can still use* ``assert`` *if you find it more semantic*
-
-Example:
-
-.. code:: python
-
-    import sure
-
-    "Name".lower().should.equal('name')
-
-    ## or you can also use
-
-    assert "Name".lower().should.equal('name')
-
-    ## or still
-
-    from sure import this
-
-    assert this("Name".lower()).should.equal('name')
-
-    ## also without the assert
-
-    this("Name".lower()).should.equal('name')
-
-Any of the examples above will raise their own ``AssertionError`` with a
-meaningful error message.
-
-Synonyms
---------
-
-Sure provides you with a lot of synonyms so that you can pick the ones
-that makes more sense for your tests.
-
-Note that the examples below are merely illustrative, they work not only
-with numbers but with any of the assertions you read early in this
-documentation.
-
-Positive synonyms
-~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-
-    (2 + 2).should.be.equal(4)
-    (2 + 2).must.be.equal(4)
-    (2 + 2).does.equals(4)
-    (2 + 2).do.equals(4)
-
-Negative synonyms
-~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    from sure import expect
-
-    (2).should_not.be.equal(3)
-    (2).shouldnt.be.equal(3)
-    (2).doesnt.equals(3)
-    (2).does_not.equals(3)
-    (2).doesnot.equals(3)
-    (2).dont.equal(3)
-    (2).do_not.equal(3)
-
-    expect(3).to.not_be.equal(1)
-
-Chain-up synonyms
-~~~~~~~~~~~~~~~~~
-
-Any of those synonyms work as an alias to the assertion builder:
-
--  ``be``
--  ``being``
--  ``to``
--  ``when``
--  ``have``
--  ``with_value``
-
-.. code:: python
-
-    from sure import expect
-
-    {"foo": 1}.must.with_value.being.equal({"foo": 1})
-    {"foo": 1}.does.have.key("foo").being.with_value.equal(1)
-
-Equality synonyms
-~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-
-    (2).should.equal(2)
-    (2).should.equals(2)
-    (2).should.eql(2)
-
-Positive boolean synonyms
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    import sure
-    (not None).should.be.ok
-    (not None).should.be.truthy
-    (not None).should.be.true
-
-Negative boolean synonyms
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code:: python
-
-    import sure
-    False.should.be.falsy
-    False.should.be.false
-    False.should_not.be.true
-    False.should_not.be.ok
-    None.should_not.be.true
-    None.should_not.be.ok
-
-Holy guacamole, how did you implement that feature ?
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Differently of `ruby <http://www.ruby-lang.org>`__ python doesn't have
-`open classes
-<http://blog.aizatto.com/2007/06/01/ruby-and-open-classes/>`__, but
-`sure uses a technique
-<https://github.com/gabrielfalcao/sure/blob/master/sure/magic.py>`_
-involving the module :py:mod:`ctypes` to write directly in the private
-``__dict__`` of in-memory objects.
-For more information check out the `Forbidden Fruit <https://github.com/clarete/forbiddenfruit>`_ project.
-
-Yes, it is dangerous, non-pythonic and should not be used in
-production code.
-
-Although ``sure`` is here to be used **ONLY** in test code, therefore
-it should be running in **ONLY** possible environments: your local
-machine or your continuous-integration server.
-
-
-API Builtin Documentation
--------------------------
-
-.. automodule:: sure
-   :members:
-
-.. automodule:: sure.core
-   :members:
-
-.. automodule:: sure.old
-   :members:
-
-
-Add custom assertions, chains and chain properties
---------------------------------------------------
-
-``sure`` allows to add custom assertion methods, chain methods and chain properties.
-
-Custom assertion methods
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-By default ``sure`` comes with a good amount of *assertion methods*. For example:
-
-- ``equals()``
-- ``within()``
-- ``contains()``
-
-And plenty more.
-
-However, in some cases it makes sense to add custom *assertion methods* to improve the test experience.
-
-Let's assume you want to test your web application. Somewhere there is a ``Response`` class with a ``return_code`` property. We could do the following:
-
-.. code:: python
-
-   response = Response(...)
-   response.return_code.should.be.equal(200)
-
-This is already quiet readable, but wouldn't it be awesome do to something like this:
-
-.. code:: python
-
-   response = Response(...)
-   response.should.have.return_code(200)
-
-To achieve this the custom assertion methods come into play:
-
-.. code:: python
-
-   from sure import assertion
-
-   @assertion
-   def return_code(self, expected_return_code):
-       if self.negative:
-           assert expected_return_code != self.obj.return_code, \
-               'Expected return code matches'
-       else:
-           assert expected_return_code == self.obj.return_code, \
-               'Expected return code does not match'
-
-
-   response = Response(...)
-   response.should.have.return_code(200)
-
-
-I'll admit you have to write the assertion method yourself, but the result is a great experience you don't want to miss.
-
-
-Chain methods
-~~~~~~~~~~~~~
-
-*chain methods* are similar to *assertion methods*. The only difference is that the *chain methods*, as the name implies, can be chained with further chains or assertions:
-
-.. code:: python
-
-   from sure import chain
-
-   @chain
-   def header(self, header_name):
-       # check if header name actually exists
-       self.obj.headers.should.have.key(header_name)
-       # return header value
-       return self.obj.headers[header_name]
-
-
-   response = Response(200, headers={'Content-Type': 'text/python'})
-   response.should.have.header('Content-Type').equals('text/python')
-
-
-Chain properties
-~~~~~~~~~~~~~~~~
-
-*chain properties* are simple properties which are available to build an assertion.
-Some of the default chain properties are:
-
-- ``be``
-- ``to``
-- ``when``
-- ``have``
-- ...
-
-Use the ``chainproperty`` decorator like the following to build your own *chain*:
-
-.. code:: python
-
-   from sure import chainproperty, assertion
-
-
-   class Foo:
-       magic = 42
-
-
-   @chainproperty
-   def having(self):
-       return self
-
-
-   @chainproperty
-   def implement(self):
-       return self
-
-
-   @assertion
-   def attribute(self, name):
-       has_it = hasattr(self.obj, name)
-       if self.negative:
-           assert not has_it, 'Expected was that object {0} does not have attr {1}'.format(
-               self.obj, name)
-       else:
-           assert has_it, 'Expected was that object {0} has attr {1}'.format(
-               self.obj, name)
-
-   # Build awesome assertion chains
-   expect(Foo).having.attribute('magic')
-   Foo.doesnt.implement.attribute('nomagic')
-
-Use custom assertion messages with ``ensure``
----------------------------------------------
-
-With the ``ensure`` context manager *sure* provides an easy to use way to override the ``AssertionError`` message raised by ``sure``'s assertion methods. See the following example:
-
-.. code:: python
-
-    import sure
-
-    name = myapi.do_something_that_returns_string()
-
-    with sure.ensure('the return value actually looks like: {0}', name):
-        name.should.contain('whatever')
-
-
-In case ``name`` does not contain the string ``whatever`` it will raise an ``AssertionError`` exception
-with the message *the return value actually looks like: <NAME>* (where *<NAME>* would be the actual value of the variable ``name``) instead of *sure*'s default error message in that particular case.
-
-Only ``AssertionError`` exceptions are re-raised by ``sure.ensure()`` with the custom provided message. Every other exception will be ignored and handled as expected.
diff --git a/docs/source/conf.py b/docs/source/conf.py
deleted file mode 100644
index 0385b40..0000000
--- a/docs/source/conf.py
+++ /dev/null
@@ -1,372 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Sure documentation build configuration file, created by
-# sphinx-quickstart on Tue Aug 11 13:58:30 2015.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-import shlex
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
-    'sphinx.ext.autodoc',
-    'sphinx.ext.doctest',
-    'sphinx.ext.intersphinx',
-    'sphinx.ext.todo',
-    'sphinx.ext.coverage',
-    'sphinx.ext.imgmath',
-    'sphinx.ext.ifconfig',
-    'sphinx.ext.viewcode',
-]
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['sure_docs_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'sure'
-copyright = u'2015-2021, Gabriel Falcão'
-author = u'Gabriel Falcão'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '1.4.7'
-# The full version, including alpha/beta/rc tags.
-release = '1.4.7'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = []
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = True
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-import sphinx_rtd_theme
-html_theme = "sphinx_rtd_theme"
-html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['sure_docs_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Language to be used for generating the HTML full-text search index.
-# Sphinx supports the following languages:
-#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
-#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
-#html_search_language = 'en'
-
-# A dictionary with options for the search language support, empty by default.
-# Now only 'ja' uses this config value
-#html_search_options = {'type': 'default'}
-
-# The name of a javascript file (relative to the configuration directory) that
-# implements a search results scorer. If empty, the default will be used.
-#html_search_scorer = 'scorer.js'
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'Suredoc'
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-
-# Latex figure (float) alignment
-#'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto, manual, or own class]).
-latex_documents = [
-  (master_doc, 'Sure.tex', u'Sure Documentation',
-   u'Gabriel Falcão', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    (master_doc, 'sure', u'Sure Documentation',
-     [author], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-  (master_doc, 'Sure', u'Sure Documentation',
-   author, 'Sure', 'One line description of project.',
-   'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
-
-
-# -- Options for Epub output ----------------------------------------------
-
-# Bibliographic Dublin Core info.
-epub_title = project
-epub_author = author
-epub_publisher = author
-epub_copyright = copyright
-
-# The basename for the epub file. It defaults to the project name.
-#epub_basename = project
-
-# The HTML theme for the epub output. Since the default themes are not optimized
-# for small screen space, using the same theme for HTML and epub output is
-# usually not wise. This defaults to 'epub', a theme designed to save visual
-# space.
-#epub_theme = 'epub'
-
-# The language of the text. It defaults to the language option
-# or 'en' if the language is not set.
-#epub_language = ''
-
-# The scheme of the identifier. Typical schemes are ISBN or URL.
-#epub_scheme = ''
-
-# The unique identifier of the text. This can be a ISBN number
-# or the project homepage.
-#epub_identifier = ''
-
-# A unique identification for the text.
-#epub_uid = ''
-
-# A tuple containing the cover image and cover page html template filenames.
-#epub_cover = ()
-
-# A sequence of (type, uri, title) tuples for the guide element of content.opf.
-#epub_guide = ()
-
-# HTML files that should be inserted before the pages created by sphinx.
-# The format is a list of tuples containing the path and title.
-#epub_pre_files = []
-
-# HTML files shat should be inserted after the pages created by sphinx.
-# The format is a list of tuples containing the path and title.
-#epub_post_files = []
-
-# A list of files that should not be packed into the epub file.
-epub_exclude_files = ['search.html']
-
-# The depth of the table of contents in toc.ncx.
-#epub_tocdepth = 3
-
-# Allow duplicate toc entries.
-#epub_tocdup = True
-
-# Choose between 'default' and 'includehidden'.
-#epub_tocscope = 'default'
-
-# Fix unsupported image types using the Pillow.
-#epub_fix_images = False
-
-# Scale large images.
-#epub_max_image_width = 0
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#epub_show_urls = 'inline'
-
-# If false, no index is generated.
-#epub_use_index = True
-
-
-# Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {
-    'python': ('https://docs.python.org/', None),
-    'redis': ('https://redis-py.readthedocs.io/en/latest/', None)
-}
diff --git a/docs/source/getting-started.rst b/docs/source/getting-started.rst
deleted file mode 100644
index c72209c..0000000
--- a/docs/source/getting-started.rst
+++ /dev/null
@@ -1,72 +0,0 @@
-Getting Started
-===============
-
-Installing
-----------
-
-It is available in PyPi, so you can install through pip:
-
-.. code:: bash
-
-    pip install sure
-    pip3 install sure
-
-Activating
-----------
-
-Sure is activated upon importing it, unless the environment variable
-``SURE_DISABLE_NEW_SYNTAX`` is set to any non-falsy value. (You could
-just use ``true``)
-
-For test code cleaningness it's recommended to import sure only once in
-the ``__init__.py`` of your root test package.
-
-Here is an example:
-
-.. code:: bash
-
-    mymodule.py
-    tests/
-    tests/__init__.py  # this is our guy
-    tests/unit/__init__.py
-    tests/unit/test_mymodule_unit1.py
-    tests/functional/__init__.py
-    tests/functional/test_mymodule_functionality.py
-
-That is unless, of course, you want to explicitly import the assertion
-helpers from sure in every module.
-
-Python version compatibility
-============================
-
-Sure is `continuously tested
-against <https://travis-ci.org/gabrielfalcao/sure/>`__ python versions
-2.7, 3.3, 3.4 and 3.5, but its assertion API is most likely to work anywhere.
-The only real big difference of sure in cpython and even other
-implementations such as `PyPy <http://pypy.org/>`__ is that the
-`monkey-patching <how-it-works.md#monkey-patching>`__ only happens in
-CPython.
-
-You can always get around beautifully with ``expect``:
-
-.. code:: python
-
-    from sure import expect
-
-    expect("this".replace("is", "at")).to.equal("that")
-
-where in cpython you could do:
-
-.. code:: python
-
-    "this".replace("is", "at").should.equal("that")
-
-Disabling the monkey patching
-=============================
-
-Just export the ``SURE_DISABLE_NEW_SYNTAX`` environment variable before
-running your tests.
-
-.. code:: console
-
-    export SURE_DISABLE_NEW_SYNTAX=true
diff --git a/docs/source/how-it-works.rst b/docs/source/how-it-works.rst
deleted file mode 100644
index ede337c..0000000
--- a/docs/source/how-it-works.rst
+++ /dev/null
@@ -1,46 +0,0 @@
-How sure works
-==============
-
-The class ``sure.AssertionBuilder`` creates objects capable of doing
-assertions. The AssertionBuilder simply arranges a vast set of possible
-assertions that are composed by a ``source`` object and a
-``destination`` object.
-
-Every assertion, even implicitly if implicitly like in
-``(2 < 3).should.be.true``, is doing a source/destination matching.
-
-Chainability
-------------
-
-Some specific assertion methods are chainable, it can be useful for
-short assertions like:
-
-.. code:: python
-
-    PERSON = {
-      "name": "John",
-      "facebook_info": {
-        "token": "abcd"
-      }
-    }
-
-    PERSON.should.have.key("facebook_info").being.a(dict)
-
-Monkey-patching
-===============
-
-Lincoln Clarete has written the module [``sure/magic.py``] which I
-simply added to sure. The most exciting part of the story is that
-Lincoln exposed the code with a super clean API, it's called `forbidden
-fruit <http://clarete.github.io/forbiddenfruit/>`__
-
-Why CPython-only ?
-------------------
-
-Sure uses the `ctypes <http://docs.python.org/library/ctypes>`__ module
-to break in python protections against monkey patching.
-
-Although ctypes might also be available in other implementations such as
-`Jython <http://www.jython.org/>`__, only the CPython provide
-```ctypes.pythonapi`` <http://docs.python.org/library/ctypes#loading-shared-libraries>`__
-the features required by sure.
diff --git a/docs/source/index.rst b/docs/source/index.rst
deleted file mode 100644
index 062c596..0000000
--- a/docs/source/index.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-.. Sure documentation master file, created by
-   sphinx-quickstart on Tue Aug 11 13:58:30 2015.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Sure |version| - Documentation
-================================
-
-Contents:
-
-.. toctree::
-   :maxdepth: 3
-
-   intro
-   getting-started
-   how-it-works
-   api-reference
-   about
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/docs/source/intro.rst b/docs/source/intro.rst
deleted file mode 100644
index 6b54f54..0000000
--- a/docs/source/intro.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-Introduction
-============
-
-Sure is a python library for python that leverages a DSL for writing
-assertions created by `Gabriel Falcão <https://github.com/gabrielfalcao>`_.
-
-In CPython it monkey-patches the ``object`` type, adding some methods
-and properties purely for test purposes.
-
-Any python code writen after ``import sure`` gains testing superpowers,
-so you can write assertions like this:
-
-.. code:: python
-
-    import sure
-
-
-    def some_bratty_function(parameter):
-        raise ValueError("Me no likey {0}".format(parameter))
-
-
-    some_bratty_function.when.called_with("Scooby").should.throw(ValueError, "Me no likey Scooby")
-
-Let's `get it started <getting-started.html>`__
diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst
deleted file mode 100644
index 073a13f..0000000
--- a/docs/source/tutorial.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. _Tutorial:
-
-# WORK IN PROGRESS, please don't add this to the table of contents
-
-How to organize your tests
-==========================
-
-Here is a proposal on how to organize your tests.
-I have been using this manner of project organization
-
-Python Testing: how to organize your project
-forget about test cases, welcome scenarios
-
-
-Pro tips
---------
-
-Adding test coverage to existing code
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-* If your test needs to manually set a side-effect on the target
-  object it means that you should write a method for your class that
-  will perform the side-effect, then you can simply call a single
-  method from your test.
diff --git a/renovate.json b/renovate.json
deleted file mode 100644
index f45d8f1..0000000
--- a/renovate.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "extends": [
-    "config:base"
-  ]
-}
diff --git a/setup.cfg b/setup.cfg
index dc45a06..a984434 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,19 +1,23 @@
 [nosetests]
-verbosity=3
-rednose=1
-with-coverage=1
-cover-inclusive=1
-cover-package=sure
-cover-branches=1
-nocapture=1
-nologcapture=1
-stop=1
-
+verbosity = 3
+rednose = 1
+with-coverage = 1
+cover-inclusive = 1
+cover-package = sure
+cover-branches = 1
+nocapture = 1
+nologcapture = 1
+stop = 1
 
 [tool:pytest]
 log_auto_indent = True
-addopts =  --maxfail=1 --capture=no -vv --cov=sure
-testpaths =
-    tests
-filterwarnings =
-    ignore::DeprecationWarning
+addopts = --maxfail=1 --capture=no -vv --cov=sure
+testpaths = 
+	tests
+filterwarnings = 
+	ignore::DeprecationWarning
+
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/setup.py b/setup.py
index 016a14b..ebc24c5 100755
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -99,6 +99,7 @@ if __name__ == "__main__":
         include_package_data=True,
         packages=find_packages(exclude=["*tests*"]),
         install_requires=install_requires,
+        long_description_content_type='text/x-rst',
         entry_points={
             "console_scripts": ["sure = sure.cli:entrypoint"],
         },
@@ -112,13 +113,13 @@ if __name__ == "__main__":
             "Operating System :: POSIX",
             "Operating System :: POSIX :: Linux",
             "Programming Language :: Python",
-            "Programming Language :: Python :: 2",
-            "Programming Language :: Python :: 2.7",
             "Programming Language :: Python :: 3",
-            "Programming Language :: Python :: 3.4",
-            "Programming Language :: Python :: 3.5",
             "Programming Language :: Python :: 3.6",
             "Programming Language :: Python :: 3.7",
+            "Programming Language :: Python :: 3.8",
+            "Programming Language :: Python :: 3.9",
+            "Programming Language :: Python :: 3.10",
+            "Programming Language :: Python :: 3.11",
             "Programming Language :: Python :: Implementation",
             "Programming Language :: Python :: Implementation :: CPython",
             "Programming Language :: Python :: Implementation :: PyPy",
diff --git a/sure.egg-info/PKG-INFO b/sure.egg-info/PKG-INFO
new file mode 100644
index 0000000..0bb87c3
--- /dev/null
+++ b/sure.egg-info/PKG-INFO
@@ -0,0 +1,125 @@
+Metadata-Version: 2.1
+Name: sure
+Version: 2.0.1
+Summary: utility belt for automated testing in python for python
+Home-page: http://github.com/gabrielfalcao/sure
+Author: Gabriel Falcao
+Author-email: gabriel@nacaolivre.org
+Maintainer: Timo Furrer
+Maintainer-email: tuxtimo@gmail.com
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: POSIX :: Linux
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: Implementation
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Testing
+Description-Content-Type: text/x-rst
+License-File: COPYING
+
+sure
+====
+
+.. image:: https://img.shields.io/pypi/dm/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://github.com/gabrielfalcao/sure/workflows/Sure%20Tests/badge.svg
+   :target: https://github.com/gabrielfalcao/sure/actions?query=workflow%3A%22Sure+Tests%22
+
+.. image:: https://img.shields.io/readthedocs/sure
+   :target: https://sure.readthedocs.io/
+
+.. image:: https://img.shields.io/github/license/gabrielfalcao/sure?label=Github%20License
+   :target: https://github.com/gabrielfalcao/sure/blob/master/LICENSE
+
+.. image:: https://img.shields.io/pypi/v/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/l/sure?label=PyPi%20License
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/format/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/status/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/pyversions/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/pypi/implementation/sure
+   :target: https://pypi.org/project/sure
+
+.. image:: https://img.shields.io/github/v/tag/gabrielfalcao/sure
+   :target: https://github.com/gabrielfalcao/sure/releases
+
+.. image:: https://img.shields.io/badge/pydoc-web-ff69b4.svg
+   :target: http://pydoc.net/sure
+
+An idiomatic testing library for python with powerful and flexible assertions, created by `Gabriel Falcão <https://github.com/gabrielfalcao>`_.
+Sure's developer experience is inspired and modeled after `RSpec Expectations
+<http://rspec.info/documentation/3.5/rspec-expectations/>`_ and
+`should.js <https://github.com/shouldjs/should.js>`_.
+
+Installing
+----------
+
+.. code:: bash
+
+    $ pip install sure
+
+Documentation
+-------------
+
+Available in the `website <https://sure.readthedocs.io/en/latest/>`__ or under the
+``docs`` directory.
+
+You can also build the documentation locally using sphinx:
+
+.. code:: bash
+
+    make docs
+
+Here is a tease
+---------------
+
+Equality
+~~~~~~~~
+
+(number).should.equal(number)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: python
+
+    import sure
+
+    (4).should.be.equal(2 + 2)
+    (7.5).should.eql(3.5 + 4)
+
+    (3).shouldnt.be.equal(5)
+
+Assert dictionary and its contents
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: python
+
+    {'foo': 'bar'}.should.equal({'foo': 'bar'})
+    {'foo': 'bar'}.should.have.key('foo').which.should.equal('bar')
+
+"A string".lower().should.equal("a string") also works
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code:: python
+
+    "Awesome ASSERTIONS".lower().split().should.equal(['awesome', 'assertions'])
diff --git a/sure.egg-info/SOURCES.txt b/sure.egg-info/SOURCES.txt
new file mode 100644
index 0000000..2528b31
--- /dev/null
+++ b/sure.egg-info/SOURCES.txt
@@ -0,0 +1,39 @@
+COPYING
+MANIFEST.in
+README.rst
+requirements.txt
+setup.cfg
+setup.py
+tox.ini
+sure/__init__.py
+sure/cli.py
+sure/compat.py
+sure/core.py
+sure/deprecated.py
+sure/magic.py
+sure/old.py
+sure/registry.py
+sure/stubs.py
+sure/terminal.py
+sure/version.py
+sure.egg-info/PKG-INFO
+sure.egg-info/SOURCES.txt
+sure.egg-info/dependency_links.txt
+sure.egg-info/entry_points.txt
+sure.egg-info/requires.txt
+sure.egg-info/top_level.txt
+tests/__init__.py
+tests/test_assertion_builder.py
+tests/test_cpython_patches.py
+tests/test_custom_assertions.py
+tests/test_ensure_ctxmgr.py
+tests/test_old_api.py
+tests/test_safe_repr.py
+tests/issues/__init__.py
+tests/issues/test_issue_104.py
+tests/issues/test_issue_134.py
+tests/issues/test_issue_136.py
+tests/issues/test_issue_139.py
+tests/issues/test_issue_148.py
+tests/issues/test_issue_19.py
+tests/issues/test_issue_48.py
\ No newline at end of file
diff --git a/sure.egg-info/dependency_links.txt b/sure.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/sure.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/sure.egg-info/entry_points.txt b/sure.egg-info/entry_points.txt
new file mode 100644
index 0000000..2ce6f85
--- /dev/null
+++ b/sure.egg-info/entry_points.txt
@@ -0,0 +1,2 @@
+[console_scripts]
+sure = sure.cli:entrypoint
diff --git a/sure.egg-info/requires.txt b/sure.egg-info/requires.txt
new file mode 100644
index 0000000..43c1ff5
--- /dev/null
+++ b/sure.egg-info/requires.txt
@@ -0,0 +1,2 @@
+mock
+six
diff --git a/sure.egg-info/top_level.txt b/sure.egg-info/top_level.txt
new file mode 100644
index 0000000..3784245
--- /dev/null
+++ b/sure.egg-info/top_level.txt
@@ -0,0 +1 @@
+sure
diff --git a/sure/__init__.py b/sure/__init__.py
index ef50bd4..a0aeafc 100644
--- a/sure/__init__.py
+++ b/sure/__init__.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -127,9 +127,8 @@ class CallBack(object):
             err = err.replace("{0}:".format(exc_klass.__name__), "").strip()
 
             if err.startswith(self.callback_name) and (
-                "takes no arguments (1 given)" in err
-                or "takes 0 positional arguments but 1 was given" in err
-            ):
+                "takes no arguments (1 given)" in err) or \
+                "takes 0 positional arguments but 1 was given" in err:
                 raise TypeError(
                     self.context_error
                     % (
diff --git a/sure/core.py b/sure/core.py
index da59e7c..e953c52 100644
--- a/sure/core.py
+++ b/sure/core.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/sure/deprecated.py b/sure/deprecated.py
index fe2bca0..12d2632 100644
--- a/sure/deprecated.py
+++ b/sure/deprecated.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/sure/old.py b/sure/old.py
index 4594f12..c6a4fa0 100644
--- a/sure/old.py
+++ b/sure/old.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/sure/terminal.py b/sure/terminal.py
index 1926b65..b25ab2b 100644
--- a/sure/terminal.py
+++ b/sure/terminal.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/sure/version.py b/sure/version.py
index 1b23640..78155c2 100644
--- a/sure/version.py
+++ b/sure/version.py
@@ -1 +1 @@
-version = "2.0.0"
+version = "2.0.1"
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/test_assertion_builder.py b/tests/test_assertion_builder.py
index 9ce637f..2653f1a 100644
--- a/tests/test_assertion_builder.py
+++ b/tests/test_assertion_builder.py
@@ -1,7 +1,7 @@
 ## #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/tests/test_cpython_patches.py b/tests/test_cpython_patches.py
index 77cab50..8dc7af7 100644
--- a/tests/test_cpython_patches.py
+++ b/tests/test_cpython_patches.py
@@ -1,7 +1,7 @@
 ## #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/tests/test_old_api.py b/tests/test_old_api.py
index 086c921..5b0b37b 100644
--- a/tests/test_old_api.py
+++ b/tests/test_old_api.py
@@ -1,7 +1,7 @@
 ## #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # <sure - utility belt for automated testing in python>
-# Copyright (C) <2010-2021>  Gabriel Falcão <gabriel@nacaolivre.org>
+# Copyright (C) <2010-2023>  Gabriel Falcão <gabriel@nacaolivre.org>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

More details

Full run details

Historical runs