summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore12
-rw-r--r--.travis.yml15
-rw-r--r--Makefile66
-rw-r--r--base.cfg17
-rw-r--r--bootstrap.py210
-rw-r--r--buildout.cfg30
-rwxr-xr-xmanage.sh70
-rw-r--r--minimal.cfg15
-rw-r--r--production.cfg34
-rw-r--r--requirements-dev.txt9
-rw-r--r--searx/tests/test_engines.py45
-rw-r--r--tests/__init__.py (renamed from searx/tests/__init__.py)0
-rw-r--r--tests/robot/__init__.py (renamed from searx/tests/engines/__init__.py)0
-rw-r--r--tests/robot/test_basic.robot (renamed from searx/tests/robot/test_basic.robot)0
-rw-r--r--tests/test_robot.py (renamed from searx/tests/test_robot.py)0
-rw-r--r--tests/unit/__init__.py (renamed from searx/tests/robot/__init__.py)0
-rw-r--r--tests/unit/engines/__init__.py0
-rw-r--r--tests/unit/engines/test_bing.py (renamed from searx/tests/engines/test_bing.py)0
-rw-r--r--tests/unit/engines/test_bing_images.py (renamed from searx/tests/engines/test_bing_images.py)0
-rw-r--r--tests/unit/engines/test_bing_news.py (renamed from searx/tests/engines/test_bing_news.py)0
-rw-r--r--tests/unit/engines/test_blekko_images.py (renamed from searx/tests/engines/test_blekko_images.py)0
-rw-r--r--tests/unit/engines/test_btdigg.py (renamed from searx/tests/engines/test_btdigg.py)0
-rw-r--r--tests/unit/engines/test_currency_convert.py (renamed from searx/tests/engines/test_currency_convert.py)0
-rw-r--r--tests/unit/engines/test_dailymotion.py (renamed from searx/tests/engines/test_dailymotion.py)0
-rw-r--r--tests/unit/engines/test_deezer.py (renamed from searx/tests/engines/test_deezer.py)0
-rw-r--r--tests/unit/engines/test_deviantart.py (renamed from searx/tests/engines/test_deviantart.py)0
-rw-r--r--tests/unit/engines/test_digg.py (renamed from searx/tests/engines/test_digg.py)0
-rw-r--r--tests/unit/engines/test_duckduckgo.py (renamed from searx/tests/engines/test_duckduckgo.py)0
-rw-r--r--tests/unit/engines/test_duckduckgo_definitions.py (renamed from searx/tests/engines/test_duckduckgo_definitions.py)0
-rw-r--r--tests/unit/engines/test_dummy.py (renamed from searx/tests/engines/test_dummy.py)0
-rw-r--r--tests/unit/engines/test_faroo.py (renamed from searx/tests/engines/test_faroo.py)0
-rw-r--r--tests/unit/engines/test_flickr.py (renamed from searx/tests/engines/test_flickr.py)0
-rw-r--r--tests/unit/engines/test_flickr_noapi.py (renamed from searx/tests/engines/test_flickr_noapi.py)0
-rw-r--r--tests/unit/engines/test_gigablast.py (renamed from searx/tests/engines/test_gigablast.py)0
-rw-r--r--tests/unit/engines/test_github.py (renamed from searx/tests/engines/test_github.py)0
-rw-r--r--tests/unit/engines/test_google.py (renamed from searx/tests/engines/test_google.py)0
-rw-r--r--tests/unit/engines/test_google_images.py (renamed from searx/tests/engines/test_google_images.py)0
-rw-r--r--tests/unit/engines/test_google_news.py (renamed from searx/tests/engines/test_google_news.py)0
-rw-r--r--tests/unit/engines/test_kickass.py (renamed from searx/tests/engines/test_kickass.py)0
-rw-r--r--tests/unit/engines/test_mediawiki.py (renamed from searx/tests/engines/test_mediawiki.py)0
-rw-r--r--tests/unit/engines/test_mixcloud.py (renamed from searx/tests/engines/test_mixcloud.py)0
-rw-r--r--tests/unit/engines/test_openstreetmap.py (renamed from searx/tests/engines/test_openstreetmap.py)0
-rw-r--r--tests/unit/engines/test_photon.py (renamed from searx/tests/engines/test_photon.py)0
-rw-r--r--tests/unit/engines/test_piratebay.py (renamed from searx/tests/engines/test_piratebay.py)0
-rw-r--r--tests/unit/engines/test_qwant.py (renamed from searx/tests/engines/test_qwant.py)0
-rw-r--r--tests/unit/engines/test_searchcode_code.py (renamed from searx/tests/engines/test_searchcode_code.py)0
-rw-r--r--tests/unit/engines/test_searchcode_doc.py (renamed from searx/tests/engines/test_searchcode_doc.py)0
-rw-r--r--tests/unit/engines/test_soundcloud.py (renamed from searx/tests/engines/test_soundcloud.py)0
-rw-r--r--tests/unit/engines/test_spotify.py (renamed from searx/tests/engines/test_spotify.py)0
-rw-r--r--tests/unit/engines/test_stackoverflow.py (renamed from searx/tests/engines/test_stackoverflow.py)0
-rw-r--r--tests/unit/engines/test_startpage.py (renamed from searx/tests/engines/test_startpage.py)0
-rw-r--r--tests/unit/engines/test_subtitleseeker.py (renamed from searx/tests/engines/test_subtitleseeker.py)0
-rw-r--r--tests/unit/engines/test_swisscows.py (renamed from searx/tests/engines/test_swisscows.py)0
-rw-r--r--tests/unit/engines/test_twitter.py (renamed from searx/tests/engines/test_twitter.py)0
-rw-r--r--tests/unit/engines/test_vimeo.py (renamed from searx/tests/engines/test_vimeo.py)0
-rw-r--r--tests/unit/engines/test_www1x.py (renamed from searx/tests/engines/test_www1x.py)0
-rw-r--r--tests/unit/engines/test_www500px.py (renamed from searx/tests/engines/test_www500px.py)0
-rw-r--r--tests/unit/engines/test_yacy.py (renamed from searx/tests/engines/test_yacy.py)0
-rw-r--r--tests/unit/engines/test_yahoo.py (renamed from searx/tests/engines/test_yahoo.py)0
-rw-r--r--tests/unit/engines/test_yahoo_news.py (renamed from searx/tests/engines/test_yahoo_news.py)0
-rw-r--r--tests/unit/engines/test_youtube_api.py (renamed from searx/tests/engines/test_youtube_api.py)0
-rw-r--r--tests/unit/engines/test_youtube_noapi.py (renamed from searx/tests/engines/test_youtube_noapi.py)0
-rw-r--r--tests/unit/test_plugins.py (renamed from searx/tests/test_plugins.py)0
-rw-r--r--tests/unit/test_results.py (renamed from searx/tests/test_results.py)0
-rw-r--r--tests/unit/test_search.py (renamed from searx/tests/test_search.py)0
-rw-r--r--tests/unit/test_utils.py (renamed from searx/tests/test_utils.py)0
-rw-r--r--tests/unit/test_webapp.py (renamed from searx/tests/test_webapp.py)0
-rw-r--r--versions.cfg122
68 files changed, 87 insertions, 558 deletions
diff --git a/.gitignore b/.gitignore
index 760b1a8f3..d29971645 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,18 +11,6 @@ setup.cfg
*/*.pyc
*~
-bin/
-build/
-coverage/
-develop-eggs/
-dist/
-eggs/
-include/
-lib/
-local/
-parts/
-searx.egg-info/
-var/
node_modules/
.tx/
diff --git a/.travis.yml b/.travis.yml
index be6683510..57d623060 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,16 +11,17 @@ before_install:
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
- npm install -g less grunt-cli
- - ( cd searx/static/themes/oscar;npm install )
+ - ( cd searx/static/themes/oscar;npm install; cd - )
install:
- - "make"
+ - ./manage.sh update_packages
+ - ./manage.sh update_dev_packages
- pip install coveralls
script:
- - "make flake8"
- - "make robot"
- - "make styles"
- - "make grunt"
- - make coverage
+ - ./manage.sh pep8_check
+ - ./manage.sh styles
+ - ./manage.sh grunt
+ - ./manage.sh coverage
+ - ./manage.sh robot
after_success:
coveralls
notifications:
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 5573e5447..000000000
--- a/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-# convenience makefile to boostrap & run buildout
-# use `make options=-v` to run buildout with extra options
-
-version = 2.7
-python = bin/python
-options =
-
-all: .installed.cfg
-
-.installed.cfg: bin/buildout buildout.cfg setup.py
- bin/buildout $(options)
-
-bin/buildout: $(python) buildout.cfg bootstrap.py
- $(python) bootstrap.py
- @touch $@
-
-$(python):
- virtualenv -p python$(version) --no-site-packages .
- @touch $@
-
-robot: .installed.cfg
- @bin/robot
-
-flake8: .installed.cfg
- @bin/flake8 setup.py
- @bin/flake8 ./searx/
-
-tests: .installed.cfg flake8
- @bin/test
- @grunt test --gruntfile searx/static/themes/oscar/gruntfile.js
-
-coverage: .installed.cfg
- @bin/coverage run bin/test
- @bin/coverage report
- @bin/coverage html
-
-production: bin/buildout production.cfg setup.py
- bin/buildout -c production.cfg $(options)
- @echo "* Please modify `readlink --canonicalize-missing ./searx/settings.py`"
- @echo "* Hint 1: on production, disable debug mode and change secret_key"
- @echo "* Hint 2: searx will be executed at server startup by crontab"
- @echo "* Hint 3: to run immediatley, execute 'bin/supervisord'"
-
-minimal: bin/buildout minimal.cfg setup.py
- bin/buildout -c minimal.cfg $(options)
-
-styles:
- @lessc -x searx/static/themes/default/less/style.less > searx/static/themes/default/css/style.css
- @lessc -x searx/static/themes/default/less/style-rtl.less > searx/static/themes/default/css/style-rtl.css
- @lessc -x searx/static/themes/courgette/less/style.less > searx/static/themes/courgette/css/style.css
- @lessc -x searx/static/themes/courgette/less/style-rtl.less > searx/static/themes/courgette/css/style-rtl.css
- @lessc -x searx/static/less/bootstrap/bootstrap.less > searx/static/css/bootstrap.min.css
- @lessc -x searx/static/themes/oscar/less/oscar/oscar.less > searx/static/themes/oscar/css/oscar.min.css
- @lessc -x searx/static/themes/pix-art/less/style.less > searx/static/themes/pix-art/css/style.css
-
-grunt:
- @grunt --gruntfile searx/static/themes/oscar/gruntfile.js
-
-locales:
- @pybabel compile -d searx/translations
-
-clean:
- @rm -rf .installed.cfg .mr.developer.cfg bin parts develop-eggs eggs \
- searx.egg-info lib include .coverage coverage
-
-.PHONY: all tests robot flake8 coverage production minimal styles locales clean
diff --git a/base.cfg b/base.cfg
deleted file mode 100644
index 6e46e9eb7..000000000
--- a/base.cfg
+++ /dev/null
@@ -1,17 +0,0 @@
-[buildout]
-extends = versions.cfg
-unzip = true
-newest = false
-prefer-final = true
-develop = .
-
-eggs =
- searx
-
-parts =
- omelette
-
-
-[omelette]
-recipe = collective.recipe.omelette
-eggs = ${buildout:eggs}
diff --git a/bootstrap.py b/bootstrap.py
deleted file mode 100644
index a4599211f..000000000
--- a/bootstrap.py
+++ /dev/null
@@ -1,210 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Bootstrap a buildout-based project
-
-Simply run this script in a directory containing a buildout.cfg.
-The script accepts buildout command-line options, so you can
-use the -c option to specify an alternate configuration file.
-"""
-
-import os
-import shutil
-import sys
-import tempfile
-
-from optparse import OptionParser
-
-__version__ = '2015-07-01'
-# See zc.buildout's changelog if this version is up to date.
-
-tmpeggs = tempfile.mkdtemp(prefix='bootstrap-')
-
-usage = '''\
-[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
-
-Bootstraps a buildout-based project.
-
-Simply run this script in a directory containing a buildout.cfg, using the
-Python that you want bin/buildout to use.
-
-Note that by using --find-links to point to local resources, you can keep
-this script from going over the network.
-'''
-
-parser = OptionParser(usage=usage)
-parser.add_option("--version",
- action="store_true", default=False,
- help=("Return bootstrap.py version."))
-parser.add_option("-t", "--accept-buildout-test-releases",
- dest='accept_buildout_test_releases',
- action="store_true", default=False,
- help=("Normally, if you do not specify a --version, the "
- "bootstrap script and buildout gets the newest "
- "*final* versions of zc.buildout and its recipes and "
- "extensions for you. If you use this flag, "
- "bootstrap and buildout will get the newest releases "
- "even if they are alphas or betas."))
-parser.add_option("-c", "--config-file",
- help=("Specify the path to the buildout configuration "
- "file to be used."))
-parser.add_option("-f", "--find-links",
- help=("Specify a URL to search for buildout releases"))
-parser.add_option("--allow-site-packages",
- action="store_true", default=False,
- help=("Let bootstrap.py use existing site packages"))
-parser.add_option("--buildout-version",
- help="Use a specific zc.buildout version")
-parser.add_option("--setuptools-version",
- help="Use a specific setuptools version")
-parser.add_option("--setuptools-to-dir",
- help=("Allow for re-use of existing directory of "
- "setuptools versions"))
-
-options, args = parser.parse_args()
-if options.version:
- print("bootstrap.py version %s" % __version__)
- sys.exit(0)
-
-
-######################################################################
-# load/install setuptools
-
-try:
- from urllib.request import urlopen
-except ImportError:
- from urllib2 import urlopen
-
-ez = {}
-if os.path.exists('ez_setup.py'):
- exec(open('ez_setup.py').read(), ez)
-else:
- exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
-
-if not options.allow_site_packages:
- # ez_setup imports site, which adds site packages
- # this will remove them from the path to ensure that incompatible versions
- # of setuptools are not in the path
- import site
- # inside a virtualenv, there is no 'getsitepackages'.
- # We can't remove these reliably
- if hasattr(site, 'getsitepackages'):
- for sitepackage_path in site.getsitepackages():
- # Strip all site-packages directories from sys.path that
- # are not sys.prefix; this is because on Windows
- # sys.prefix is a site-package directory.
- if sitepackage_path != sys.prefix:
- sys.path[:] = [x for x in sys.path
- if sitepackage_path not in x]
-
-setup_args = dict(to_dir=tmpeggs, download_delay=0)
-
-if options.setuptools_version is not None:
- setup_args['version'] = options.setuptools_version
-if options.setuptools_to_dir is not None:
- setup_args['to_dir'] = options.setuptools_to_dir
-
-ez['use_setuptools'](**setup_args)
-import setuptools
-import pkg_resources
-
-# This does not (always?) update the default working set. We will
-# do it.
-for path in sys.path:
- if path not in pkg_resources.working_set.entries:
- pkg_resources.working_set.add_entry(path)
-
-######################################################################
-# Install buildout
-
-ws = pkg_resources.working_set
-
-setuptools_path = ws.find(
- pkg_resources.Requirement.parse('setuptools')).location
-
-# Fix sys.path here as easy_install.pth added before PYTHONPATH
-cmd = [sys.executable, '-c',
- 'import sys; sys.path[0:0] = [%r]; ' % setuptools_path +
- 'from setuptools.command.easy_install import main; main()',
- '-mZqNxd', tmpeggs]
-
-find_links = os.environ.get(
- 'bootstrap-testing-find-links',
- options.find_links or
- ('http://downloads.buildout.org/'
- if options.accept_buildout_test_releases else None)
- )
-if find_links:
- cmd.extend(['-f', find_links])
-
-requirement = 'zc.buildout'
-version = options.buildout_version
-if version is None and not options.accept_buildout_test_releases:
- # Figure out the most recent final version of zc.buildout.
- import setuptools.package_index
- _final_parts = '*final-', '*final'
-
- def _final_version(parsed_version):
- try:
- return not parsed_version.is_prerelease
- except AttributeError:
- # Older setuptools
- for part in parsed_version:
- if (part[:1] == '*') and (part not in _final_parts):
- return False
- return True
-
- index = setuptools.package_index.PackageIndex(
- search_path=[setuptools_path])
- if find_links:
- index.add_find_links((find_links,))
- req = pkg_resources.Requirement.parse(requirement)
- if index.obtain(req) is not None:
- best = []
- bestv = None
- for dist in index[req.project_name]:
- distv = dist.parsed_version
- if _final_version(distv):
- if bestv is None or distv > bestv:
- best = [dist]
- bestv = distv
- elif distv == bestv:
- best.append(dist)
- if best:
- best.sort()
- version = best[-1].version
-if version:
- requirement = '=='.join((requirement, version))
-cmd.append(requirement)
-
-import subprocess
-if subprocess.call(cmd) != 0:
- raise Exception(
- "Failed to execute command:\n%s" % repr(cmd)[1:-1])
-
-######################################################################
-# Import and run buildout
-
-ws.add_entry(tmpeggs)
-ws.require(requirement)
-import zc.buildout.buildout
-
-if not [a for a in args if '=' not in a]:
- args.append('bootstrap')
-
-# if -c was provided, we push it back into args for buildout' main function
-if options.config_file is not None:
- args[0:0] = ['-c', options.config_file]
-
-zc.buildout.buildout.main(args)
-shutil.rmtree(tmpeggs)
diff --git a/buildout.cfg b/buildout.cfg
deleted file mode 100644
index b9e6d24ed..000000000
--- a/buildout.cfg
+++ /dev/null
@@ -1,30 +0,0 @@
-[buildout]
-extends = base.cfg
-develop = .
-
-eggs =
- searx [test]
-
-parts +=
- pyscripts
- robot
- test
-
-
-[pyscripts]
-recipe = zc.recipe.egg:script
-eggs = ${buildout:eggs}
-interpreter = py
-dependent-scripts = true
-
-
-[robot]
-recipe = zc.recipe.testrunner
-eggs = ${buildout:eggs}
-defaults = ['--color', '--auto-progress', '--layer', 'SearxRobotLayer']
-
-
-[test]
-recipe = zc.recipe.testrunner
-eggs = ${buildout:eggs}
-defaults = ['--color', '--auto-progress', '--layer', 'SearxTestLayer', '--layer', '!SearxRobotLayer']
diff --git a/manage.sh b/manage.sh
new file mode 100755
index 000000000..39a8e27d3
--- /dev/null
+++ b/manage.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+BASE_DIR=$(dirname `readlink -f $0`)
+PYTHONPATH=$BASE_DIR
+SEARX_DIR="$BASE_DIR/searx"
+ACTION=$1
+
+update_packages() {
+ pip install --upgrade -r "$BASE_DIR/requirements.txt"
+}
+
+update_dev_packages() {
+ pip install --upgrade -r "$BASE_DIR/requirements-dev.txt"
+}
+
+pep8_check() {
+ echo '[!] Running pep8 check'
+ pep8 "$SEARX_DIR" "$BASE_DIR/tests"
+}
+
+unit_tests() {
+ echo '[!] Running unit tests'
+ python -m nose2 -s "$BASE_DIR/tests/unit"
+}
+
+py_test_coverage() {
+ echo '[!] Running python test coverage'
+ PYTHONPATH=`pwd` python -m nose2 -C --coverage "$SEARX_DIR" -s "$BASE_DIR/tests/unit"
+ coverage report
+ coverage html
+}
+
+robot_tests() {
+ echo '[!] Running robot tests'
+ python -c "import zope.testrunner; import sys; sys.exit(zope.testrunner.run("\
+"['--color', '--auto-progress', '--layer', 'SearxRobotLayer', '--test-path', '$BASE_DIR']))"
+}
+
+tests() {
+ set -e
+ pep8_check
+ unit_tests
+ robot_tests
+ set +e
+}
+
+build_style() {
+ lessc -x "$BASE_DIR/searx/static/$1" "$BASE_DIR/searx/static/$2"
+}
+
+styles() {
+ echo '[!] Building styles'
+ build_style themes/default/less/style.less themes/default/css/style.css
+ build_style themes/default/less/style-rtl.less themes/default/css/style-rtl.css
+ build_style themes/courgette/less/style.less themes/courgette/css/style.css
+ build_style themes/courgette/less/style-rtl.less themes/courgette/css/style-rtl.css
+ build_style less/bootstrap/bootstrap.less css/bootstrap.min.css
+ build_style themes/oscar/less/oscar/oscar.less themes/oscar/css/oscar.min.css
+ build_style themes/pix-art/less/style.less themes/pix-art/css/style.css
+}
+
+grunt() {
+ grunt --gruntfile "$SEARX_DIR/static/themes/oscar/gruntfile.js"
+}
+
+locales() {
+ pybabel compile -d "$SEARX_DIR/translations"
+}
+
+$ACTION
diff --git a/minimal.cfg b/minimal.cfg
deleted file mode 100644
index 339a2939f..000000000
--- a/minimal.cfg
+++ /dev/null
@@ -1,15 +0,0 @@
-[buildout]
-extends = base.cfg
-develop = .
-
-eggs =
- searx
-
-parts +=
- pyscripts
-
-
-[pyscripts]
-recipe = zc.recipe.egg:script
-eggs = ${buildout:eggs}
-interpreter = py
diff --git a/production.cfg b/production.cfg
deleted file mode 100644
index ea40682d8..000000000
--- a/production.cfg
+++ /dev/null
@@ -1,34 +0,0 @@
-[buildout]
-extends = base.cfg
-develop = .
-
-eggs =
- searx
-
-parts +=
- pyscripts
- supervisor
- crontab_reboot
-
-
-[pyscripts]
-recipe = zc.recipe.egg:script
-eggs = ${buildout:eggs}
-interpreter = py
-
-
-[supervisor]
-recipe = collective.recipe.supervisor
-http-socket = unix
-user = searxer
-password = ohpleasedochangeme
-file = /tmp/supervisor.sock
-chmod = 0700
-programs =
- 50 searx ${buildout:bin-directory}/searx-run
-
-
-[crontab_reboot]
-recipe = z3c.recipe.usercrontab
-times = @reboot
-command = ${buildout:bin-directory}/supervisord
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 000000000..d8c2395dd
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,9 @@
+flake8==2.5.1
+mock==1.0.1
+nose2==0.4.7
+nose2[coverage-plugin]
+plone.testing==4.0.15
+robotframework-selenium2library==1.7.4
+robotsuite==1.7.0
+unittest2==1.1.0
+zope.testrunner==4.4.10
diff --git a/searx/tests/test_engines.py b/searx/tests/test_engines.py
deleted file mode 100644
index 793b77460..000000000
--- a/searx/tests/test_engines.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from searx.tests.engines.test_bing import * # noqa
-from searx.tests.engines.test_bing_images import * # noqa
-from searx.tests.engines.test_bing_news import * # noqa
-from searx.tests.engines.test_blekko_images import * # noqa
-from searx.tests.engines.test_btdigg import * # noqa
-from searx.tests.engines.test_currency_convert import * # noqa
-from searx.tests.engines.test_dailymotion import * # noqa
-from searx.tests.engines.test_deezer import * # noqa
-from searx.tests.engines.test_deviantart import * # noqa
-from searx.tests.engines.test_digg import * # noqa
-from searx.tests.engines.test_duckduckgo import * # noqa
-from searx.tests.engines.test_duckduckgo_definitions import * # noqa
-from searx.tests.engines.test_dummy import * # noqa
-from searx.tests.engines.test_faroo import * # noqa
-from searx.tests.engines.test_flickr import * # noqa
-from searx.tests.engines.test_flickr_noapi import * # noqa
-from searx.tests.engines.test_gigablast import * # noqa
-from searx.tests.engines.test_github import * # noqa
-from searx.tests.engines.test_google import * # noqa
-from searx.tests.engines.test_google_images import * # noqa
-from searx.tests.engines.test_google_news import * # noqa
-from searx.tests.engines.test_kickass import * # noqa
-from searx.tests.engines.test_mediawiki import * # noqa
-from searx.tests.engines.test_mixcloud import * # noqa
-from searx.tests.engines.test_openstreetmap import * # noqa
-from searx.tests.engines.test_photon import * # noqa
-from searx.tests.engines.test_piratebay import * # noqa
-from searx.tests.engines.test_qwant import * # noqa
-from searx.tests.engines.test_searchcode_code import * # noqa
-from searx.tests.engines.test_searchcode_doc import * # noqa
-from searx.tests.engines.test_soundcloud import * # noqa
-from searx.tests.engines.test_spotify import * # noqa
-from searx.tests.engines.test_stackoverflow import * # noqa
-from searx.tests.engines.test_startpage import * # noqa
-from searx.tests.engines.test_subtitleseeker import * # noqa
-from searx.tests.engines.test_swisscows import * # noqa
-from searx.tests.engines.test_twitter import * # noqa
-from searx.tests.engines.test_vimeo import * # noqa
-from searx.tests.engines.test_www1x import * # noqa
-from searx.tests.engines.test_www500px import * # noqa
-from searx.tests.engines.test_yacy import * # noqa
-from searx.tests.engines.test_yahoo import * # noqa
-from searx.tests.engines.test_youtube_api import * # noqa
-from searx.tests.engines.test_youtube_noapi import * # noqa
-from searx.tests.engines.test_yahoo_news import * # noqa
diff --git a/searx/tests/__init__.py b/tests/__init__.py
index e69de29bb..e69de29bb 100644
--- a/searx/tests/__init__.py
+++ b/tests/__init__.py
diff --git a/searx/tests/engines/__init__.py b/tests/robot/__init__.py
index e69de29bb..e69de29bb 100644
--- a/searx/tests/engines/__init__.py
+++ b/tests/robot/__init__.py
diff --git a/searx/tests/robot/test_basic.robot b/tests/robot/test_basic.robot
index 1b8e78fff..1b8e78fff 100644
--- a/searx/tests/robot/test_basic.robot
+++ b/tests/robot/test_basic.robot
diff --git a/searx/tests/test_robot.py b/tests/test_robot.py
index b48153fe4..b48153fe4 100644
--- a/searx/tests/test_robot.py
+++ b/tests/test_robot.py
diff --git a/searx/tests/robot/__init__.py b/tests/unit/__init__.py
index e69de29bb..e69de29bb 100644
--- a/searx/tests/robot/__init__.py
+++ b/tests/unit/__init__.py
diff --git a/tests/unit/engines/__init__.py b/tests/unit/engines/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/unit/engines/__init__.py
diff --git a/searx/tests/engines/test_bing.py b/tests/unit/engines/test_bing.py
index bce221440..bce221440 100644
--- a/searx/tests/engines/test_bing.py
+++ b/tests/unit/engines/test_bing.py
diff --git a/searx/tests/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py
index f42dff7e8..f42dff7e8 100644
--- a/searx/tests/engines/test_bing_images.py
+++ b/tests/unit/engines/test_bing_images.py
diff --git a/searx/tests/engines/test_bing_news.py b/tests/unit/engines/test_bing_news.py
index a64d59b7b..a64d59b7b 100644
--- a/searx/tests/engines/test_bing_news.py
+++ b/tests/unit/engines/test_bing_news.py
diff --git a/searx/tests/engines/test_blekko_images.py b/tests/unit/engines/test_blekko_images.py
index beb0853e3..beb0853e3 100644
--- a/searx/tests/engines/test_blekko_images.py
+++ b/tests/unit/engines/test_blekko_images.py
diff --git a/searx/tests/engines/test_btdigg.py b/tests/unit/engines/test_btdigg.py
index 2721f4e7c..2721f4e7c 100644
--- a/searx/tests/engines/test_btdigg.py
+++ b/tests/unit/engines/test_btdigg.py
diff --git a/searx/tests/engines/test_currency_convert.py b/tests/unit/engines/test_currency_convert.py
index 84ec3b742..84ec3b742 100644
--- a/searx/tests/engines/test_currency_convert.py
+++ b/tests/unit/engines/test_currency_convert.py
diff --git a/searx/tests/engines/test_dailymotion.py b/tests/unit/engines/test_dailymotion.py
index 4c31ff5d5..4c31ff5d5 100644
--- a/searx/tests/engines/test_dailymotion.py
+++ b/tests/unit/engines/test_dailymotion.py
diff --git a/searx/tests/engines/test_deezer.py b/tests/unit/engines/test_deezer.py
index ad09d2a2c..ad09d2a2c 100644
--- a/searx/tests/engines/test_deezer.py
+++ b/tests/unit/engines/test_deezer.py
diff --git a/searx/tests/engines/test_deviantart.py b/tests/unit/engines/test_deviantart.py
index 78a391334..78a391334 100644
--- a/searx/tests/engines/test_deviantart.py
+++ b/tests/unit/engines/test_deviantart.py
diff --git a/searx/tests/engines/test_digg.py b/tests/unit/engines/test_digg.py
index 6e7c9cc99..6e7c9cc99 100644
--- a/searx/tests/engines/test_digg.py
+++ b/tests/unit/engines/test_digg.py
diff --git a/searx/tests/engines/test_duckduckgo.py b/tests/unit/engines/test_duckduckgo.py
index 14cd9cd87..14cd9cd87 100644
--- a/searx/tests/engines/test_duckduckgo.py
+++ b/tests/unit/engines/test_duckduckgo.py
diff --git a/searx/tests/engines/test_duckduckgo_definitions.py b/tests/unit/engines/test_duckduckgo_definitions.py
index 71c84235c..71c84235c 100644
--- a/searx/tests/engines/test_duckduckgo_definitions.py
+++ b/tests/unit/engines/test_duckduckgo_definitions.py
diff --git a/searx/tests/engines/test_dummy.py b/tests/unit/engines/test_dummy.py
index 9399beaaf..9399beaaf 100644
--- a/searx/tests/engines/test_dummy.py
+++ b/tests/unit/engines/test_dummy.py
diff --git a/searx/tests/engines/test_faroo.py b/tests/unit/engines/test_faroo.py
index acebdda86..acebdda86 100644
--- a/searx/tests/engines/test_faroo.py
+++ b/tests/unit/engines/test_faroo.py
diff --git a/searx/tests/engines/test_flickr.py b/tests/unit/engines/test_flickr.py
index 8b39e922f..8b39e922f 100644
--- a/searx/tests/engines/test_flickr.py
+++ b/tests/unit/engines/test_flickr.py
diff --git a/searx/tests/engines/test_flickr_noapi.py b/tests/unit/engines/test_flickr_noapi.py
index 3b337a2d8..3b337a2d8 100644
--- a/searx/tests/engines/test_flickr_noapi.py
+++ b/tests/unit/engines/test_flickr_noapi.py
diff --git a/searx/tests/engines/test_gigablast.py b/tests/unit/engines/test_gigablast.py
index 4ae0c51a9..4ae0c51a9 100644
--- a/searx/tests/engines/test_gigablast.py
+++ b/tests/unit/engines/test_gigablast.py
diff --git a/searx/tests/engines/test_github.py b/tests/unit/engines/test_github.py
index 460be8c3d..460be8c3d 100644
--- a/searx/tests/engines/test_github.py
+++ b/tests/unit/engines/test_github.py
diff --git a/searx/tests/engines/test_google.py b/tests/unit/engines/test_google.py
index 37a83cae3..37a83cae3 100644
--- a/searx/tests/engines/test_google.py
+++ b/tests/unit/engines/test_google.py
diff --git a/searx/tests/engines/test_google_images.py b/tests/unit/engines/test_google_images.py
index 876d0af1e..876d0af1e 100644
--- a/searx/tests/engines/test_google_images.py
+++ b/tests/unit/engines/test_google_images.py
diff --git a/searx/tests/engines/test_google_news.py b/tests/unit/engines/test_google_news.py
index 31d674121..31d674121 100644
--- a/searx/tests/engines/test_google_news.py
+++ b/tests/unit/engines/test_google_news.py
diff --git a/searx/tests/engines/test_kickass.py b/tests/unit/engines/test_kickass.py
index 4cfcaa63c..4cfcaa63c 100644
--- a/searx/tests/engines/test_kickass.py
+++ b/tests/unit/engines/test_kickass.py
diff --git a/searx/tests/engines/test_mediawiki.py b/tests/unit/engines/test_mediawiki.py
index 63f7da6b2..63f7da6b2 100644
--- a/searx/tests/engines/test_mediawiki.py
+++ b/tests/unit/engines/test_mediawiki.py
diff --git a/searx/tests/engines/test_mixcloud.py b/tests/unit/engines/test_mixcloud.py
index a2ea47cf9..a2ea47cf9 100644
--- a/searx/tests/engines/test_mixcloud.py
+++ b/tests/unit/engines/test_mixcloud.py
diff --git a/searx/tests/engines/test_openstreetmap.py b/tests/unit/engines/test_openstreetmap.py
index 7b7783f04..7b7783f04 100644
--- a/searx/tests/engines/test_openstreetmap.py
+++ b/tests/unit/engines/test_openstreetmap.py
diff --git a/searx/tests/engines/test_photon.py b/tests/unit/engines/test_photon.py
index 734497884..734497884 100644
--- a/searx/tests/engines/test_photon.py
+++ b/tests/unit/engines/test_photon.py
diff --git a/searx/tests/engines/test_piratebay.py b/tests/unit/engines/test_piratebay.py
index 5699380be..5699380be 100644
--- a/searx/tests/engines/test_piratebay.py
+++ b/tests/unit/engines/test_piratebay.py
diff --git a/searx/tests/engines/test_qwant.py b/tests/unit/engines/test_qwant.py
index 7d79d13d8..7d79d13d8 100644
--- a/searx/tests/engines/test_qwant.py
+++ b/tests/unit/engines/test_qwant.py
diff --git a/searx/tests/engines/test_searchcode_code.py b/tests/unit/engines/test_searchcode_code.py
index c0ac2025c..c0ac2025c 100644
--- a/searx/tests/engines/test_searchcode_code.py
+++ b/tests/unit/engines/test_searchcode_code.py
diff --git a/searx/tests/engines/test_searchcode_doc.py b/tests/unit/engines/test_searchcode_doc.py
index b9dcf380b..b9dcf380b 100644
--- a/searx/tests/engines/test_searchcode_doc.py
+++ b/tests/unit/engines/test_searchcode_doc.py
diff --git a/searx/tests/engines/test_soundcloud.py b/tests/unit/engines/test_soundcloud.py
index 85495dc57..85495dc57 100644
--- a/searx/tests/engines/test_soundcloud.py
+++ b/tests/unit/engines/test_soundcloud.py
diff --git a/searx/tests/engines/test_spotify.py b/tests/unit/engines/test_spotify.py
index fd274abbd..fd274abbd 100644
--- a/searx/tests/engines/test_spotify.py
+++ b/tests/unit/engines/test_spotify.py
diff --git a/searx/tests/engines/test_stackoverflow.py b/tests/unit/engines/test_stackoverflow.py
index 18a1ff4bd..18a1ff4bd 100644
--- a/searx/tests/engines/test_stackoverflow.py
+++ b/tests/unit/engines/test_stackoverflow.py
diff --git a/searx/tests/engines/test_startpage.py b/tests/unit/engines/test_startpage.py
index 9a1a09bc7..9a1a09bc7 100644
--- a/searx/tests/engines/test_startpage.py
+++ b/tests/unit/engines/test_startpage.py
diff --git a/searx/tests/engines/test_subtitleseeker.py b/tests/unit/engines/test_subtitleseeker.py
index a641601b2..a641601b2 100644
--- a/searx/tests/engines/test_subtitleseeker.py
+++ b/tests/unit/engines/test_subtitleseeker.py
diff --git a/searx/tests/engines/test_swisscows.py b/tests/unit/engines/test_swisscows.py
index 3b4ce7b0f..3b4ce7b0f 100644
--- a/searx/tests/engines/test_swisscows.py
+++ b/tests/unit/engines/test_swisscows.py
diff --git a/searx/tests/engines/test_twitter.py b/tests/unit/engines/test_twitter.py
index b444b48ee..b444b48ee 100644
--- a/searx/tests/engines/test_twitter.py
+++ b/tests/unit/engines/test_twitter.py
diff --git a/searx/tests/engines/test_vimeo.py b/tests/unit/engines/test_vimeo.py
index 50b1cb563..50b1cb563 100644
--- a/searx/tests/engines/test_vimeo.py
+++ b/tests/unit/engines/test_vimeo.py
diff --git a/searx/tests/engines/test_www1x.py b/tests/unit/engines/test_www1x.py
index 9df8de6bf..9df8de6bf 100644
--- a/searx/tests/engines/test_www1x.py
+++ b/tests/unit/engines/test_www1x.py
diff --git a/searx/tests/engines/test_www500px.py b/tests/unit/engines/test_www500px.py
index 8df15b945..8df15b945 100644
--- a/searx/tests/engines/test_www500px.py
+++ b/tests/unit/engines/test_www500px.py
diff --git a/searx/tests/engines/test_yacy.py b/tests/unit/engines/test_yacy.py
index f49532cf4..f49532cf4 100644
--- a/searx/tests/engines/test_yacy.py
+++ b/tests/unit/engines/test_yacy.py
diff --git a/searx/tests/engines/test_yahoo.py b/tests/unit/engines/test_yahoo.py
index 11ef9db22..11ef9db22 100644
--- a/searx/tests/engines/test_yahoo.py
+++ b/tests/unit/engines/test_yahoo.py
diff --git a/searx/tests/engines/test_yahoo_news.py b/tests/unit/engines/test_yahoo_news.py
index 4d7fc0a10..4d7fc0a10 100644
--- a/searx/tests/engines/test_yahoo_news.py
+++ b/tests/unit/engines/test_yahoo_news.py
diff --git a/searx/tests/engines/test_youtube_api.py b/tests/unit/engines/test_youtube_api.py
index 0d4d478c3..0d4d478c3 100644
--- a/searx/tests/engines/test_youtube_api.py
+++ b/tests/unit/engines/test_youtube_api.py
diff --git a/searx/tests/engines/test_youtube_noapi.py b/tests/unit/engines/test_youtube_noapi.py
index 9fa8fd20e..9fa8fd20e 100644
--- a/searx/tests/engines/test_youtube_noapi.py
+++ b/tests/unit/engines/test_youtube_noapi.py
diff --git a/searx/tests/test_plugins.py b/tests/unit/test_plugins.py
index 98d39ec14..98d39ec14 100644
--- a/searx/tests/test_plugins.py
+++ b/tests/unit/test_plugins.py
diff --git a/searx/tests/test_results.py b/tests/unit/test_results.py
index 274b5b37a..274b5b37a 100644
--- a/searx/tests/test_results.py
+++ b/tests/unit/test_results.py
diff --git a/searx/tests/test_search.py b/tests/unit/test_search.py
index af5fffd8b..af5fffd8b 100644
--- a/searx/tests/test_search.py
+++ b/tests/unit/test_search.py
diff --git a/searx/tests/test_utils.py b/tests/unit/test_utils.py
index 04480791d..04480791d 100644
--- a/searx/tests/test_utils.py
+++ b/tests/unit/test_utils.py
diff --git a/searx/tests/test_webapp.py b/tests/unit/test_webapp.py
index 071c01df3..071c01df3 100644
--- a/searx/tests/test_webapp.py
+++ b/tests/unit/test_webapp.py
diff --git a/versions.cfg b/versions.cfg
deleted file mode 100644
index 2cb86aba1..000000000
--- a/versions.cfg
+++ /dev/null
@@ -1,122 +0,0 @@
-[versions]
-Babel = 1.3
-Flask = 0.10.1
-Flask-Babel = 0.9
-Jinja2 = 2.7.3
-MarkupSafe = 0.23
-Pygments = 2.0.2
-WebOb = 1.4.1
-WebTest = 2.0.18
-Werkzeug = 0.10.4
-collective.recipe.omelette = 0.16
-coverage = 3.7.1
-decorator = 3.4.2
-docutils = 0.12
-flake8 = 2.4.1
-itsdangerous = 0.24
-mccabe = 0.3.1
-mock = 1.0.1
-pep8 = 1.5.7
-plone.testing = 4.0.13
-pyflakes = 0.8.1
-pytz = 2015.4
-pyyaml = 3.11
-requests = 2.7.0
-robotframework-debuglibrary = 0.3
-robotframework-httplibrary = 0.4.2
-robotframework-selenium2library = 1.7.1
-robotsuite = 1.6.1
-selenium = 2.46.0
-speaklater = 1.3
-unittest2 = 1.0.1
-waitress = 0.8.9
-zc.recipe.testrunner = 2.0.0
-pyopenssl = 0.15.1
-ndg-httpsclient = 0.4.0
-pyasn1 = 0.1.8
-pyasn1-modules = 0.0.6
-certifi = 2015.11.20.1
-
-cffi = 1.1.2
-cryptography = 0.9.1
-
-# Required by:
-# robotsuite==1.6.1
-# searx==0.7.0
-lxml = 3.4.4
-
-# Required by:
-# searx==0.7.0
-python-dateutil = 2.4.2
-
-# Required by:
-# searx==0.7.0
-# zope.exceptions==4.0.7
-# zope.interface==4.1.2
-# zope.testrunner==4.4.9
-setuptools = 18.0.1
-
-# Required by:
-# WebTest==2.0.18
-beautifulsoup4 = 4.3.2
-
-# Required by:
-# cryptography==0.9.1
-enum34 = 1.0.4
-
-# Required by:
-# cryptography==0.9.1
-idna = 2.0
-
-# Required by:
-# cryptography==0.9.1
-ipaddress = 1.0.7
-
-# Required by:
-# robotframework-httplibrary==0.4.2
-jsonpatch = 1.11
-
-# Required by:
-# robotframework-httplibrary==0.4.2
-jsonpointer = 1.9
-
-# Required by:
-# traceback2==1.4.0
-linecache2 = 1.0.0
-
-# Required by:
-# cffi==1.1.2
-pycparser = 2.12
-
-# Required by:
-# robotframework-httplibrary==0.4.2
-robotframework = 2.8.7
-
-# Required by:
-# robotsuite==1.6.1
-# zope.testrunner==4.4.9
-six = 1.9.0
-
-# Required by:
-# unittest2==1.0.1
-traceback2 = 1.4.0
-
-# Required by:
-# collective.recipe.omelette==0.16
-zc.recipe.egg = 2.0.1
-
-# Required by:
-# zope.testrunner==4.4.9
-zope.exceptions = 4.0.7
-
-# Required by:
-# zope.testrunner==4.4.9
-zope.interface = 4.1.2
-
-# Required by:
-# plone.testing==4.0.13
-zope.testing = 4.2.0
-
-# Required by:
-# zc.recipe.testrunner==2.0.0
-zope.testrunner = 4.4.9