mirror of https://github.com/searxng/searxng.git
Merge branch 'master' of https://github.com/asciimoo/searx
Conflicts: searx/tests/test_engines.py
This commit is contained in:
commit
4130b3dfd6
|
@ -5,24 +5,13 @@ env
|
||||||
robot_log.html
|
robot_log.html
|
||||||
robot_output.xml
|
robot_output.xml
|
||||||
robot_report.html
|
robot_report.html
|
||||||
|
test_basic/
|
||||||
setup.cfg
|
setup.cfg
|
||||||
|
|
||||||
*.pyc
|
*.pyc
|
||||||
*/*.pyc
|
*/*.pyc
|
||||||
*~
|
*~
|
||||||
|
|
||||||
bin/
|
|
||||||
build/
|
|
||||||
coverage/
|
|
||||||
develop-eggs/
|
|
||||||
dist/
|
|
||||||
eggs/
|
|
||||||
include/
|
|
||||||
lib/
|
|
||||||
local/
|
|
||||||
parts/
|
|
||||||
searx.egg-info/
|
|
||||||
var/
|
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
.tx/
|
.tx/
|
||||||
|
|
14
.travis.yml
14
.travis.yml
|
@ -11,16 +11,16 @@ before_install:
|
||||||
- "export DISPLAY=:99.0"
|
- "export DISPLAY=:99.0"
|
||||||
- "sh -e /etc/init.d/xvfb start"
|
- "sh -e /etc/init.d/xvfb start"
|
||||||
- npm install -g less grunt-cli
|
- npm install -g less grunt-cli
|
||||||
- ( cd searx/static/themes/oscar;npm install )
|
- ( cd searx/static/themes/oscar;npm install; cd - )
|
||||||
install:
|
install:
|
||||||
- "make"
|
- ./manage.sh update_dev_packages
|
||||||
- pip install coveralls
|
- pip install coveralls
|
||||||
script:
|
script:
|
||||||
- "make flake8"
|
- ./manage.sh pep8_check
|
||||||
- "make robot"
|
- ./manage.sh styles
|
||||||
- "make styles"
|
- ./manage.sh grunt_build
|
||||||
- "make grunt"
|
- ./manage.sh py_test_coverage
|
||||||
- make coverage
|
- ./manage.sh robot_tests
|
||||||
after_success:
|
after_success:
|
||||||
coveralls
|
coveralls
|
||||||
notifications:
|
notifications:
|
||||||
|
|
66
Makefile
66
Makefile
|
@ -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
|
|
117
README.rst
117
README.rst
|
@ -7,31 +7,16 @@ engine <https://en.wikipedia.org/wiki/Metasearch_engine>`__.
|
||||||
List of `running
|
List of `running
|
||||||
instances <https://github.com/asciimoo/searx/wiki/Searx-instances>`__.
|
instances <https://github.com/asciimoo/searx/wiki/Searx-instances>`__.
|
||||||
|
|
||||||
See the `wiki <https://github.com/asciimoo/searx/wiki>`__ for more information.
|
See the `documentation <https://asciimoo.github.io/searx>`__ and the `wiki <https://github.com/asciimoo/searx/wiki>`__ for more information.
|
||||||
|
|
||||||
|Flattr searx|
|
|Flattr searx|
|
||||||
|
|
||||||
Features
|
|
||||||
~~~~~~~~
|
|
||||||
|
|
||||||
- Tracking free
|
|
||||||
- Supports multiple output formats
|
|
||||||
|
|
||||||
- json ``curl https://searx.me/?format=json&q=[query]``
|
|
||||||
- csv ``curl https://searx.me/?format=csv&q=[query]``
|
|
||||||
- opensearch/rss ``curl https://searx.me/?format=rss&q=[query]``
|
|
||||||
- Opensearch support (you can set as default search engine)
|
|
||||||
- Configurable search engines/categories
|
|
||||||
- Different search languages
|
|
||||||
- Duckduckgo like !bang functionality with engine shortcuts
|
|
||||||
- Parallel queries - relatively fast
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
- clone source:
|
- clone source:
|
||||||
``git clone git@github.com:asciimoo/searx.git && cd searx``
|
``git clone git@github.com:asciimoo/searx.git && cd searx``
|
||||||
- install dependencies: ``pip install -r requirements.txt``
|
- install dependencies: ``./manage.sh update_packages``
|
||||||
- edit your
|
- edit your
|
||||||
`settings.yml <https://github.com/asciimoo/searx/blob/master/settings.yml>`__
|
`settings.yml <https://github.com/asciimoo/searx/blob/master/settings.yml>`__
|
||||||
(set your ``secret_key``!)
|
(set your ``secret_key``!)
|
||||||
|
@ -40,104 +25,6 @@ Installation
|
||||||
For all the details, follow this `step by step
|
For all the details, follow this `step by step
|
||||||
installation <https://github.com/asciimoo/searx/wiki/Installation>`__
|
installation <https://github.com/asciimoo/searx/wiki/Installation>`__
|
||||||
|
|
||||||
Alternative (Recommended) Installation
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
- clone source:
|
|
||||||
``git clone git@github.com:asciimoo/searx.git && cd searx``
|
|
||||||
- build in current folder: ``make minimal``
|
|
||||||
- run ``bin/searx-run`` to start the application
|
|
||||||
|
|
||||||
Development
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
Just run ``make``. Versions of dependencies are pinned down inside
|
|
||||||
``versions.cfg`` to produce most stable build. Also remember, NO make
|
|
||||||
command should be run as root, not even ``make production``
|
|
||||||
|
|
||||||
Deployment
|
|
||||||
~~~~~~~~~~
|
|
||||||
|
|
||||||
- clone source:
|
|
||||||
``git clone git@github.com:asciimoo/searx.git && cd searx``
|
|
||||||
- build in current folder: ``make production``
|
|
||||||
- run ``bin/supervisord`` to start the application
|
|
||||||
|
|
||||||
Upgrading
|
|
||||||
~~~~~~~~~
|
|
||||||
|
|
||||||
- inside previously cloned searx directory run: ``git stash`` to
|
|
||||||
temporarily save any changes you have made
|
|
||||||
- pull source: ``git pull origin master``
|
|
||||||
- re-build in current folder: ``make production``
|
|
||||||
- run ``bin/supervisorctl stop searx`` to stop searx, if it does not,
|
|
||||||
then run ``fuser -k 8888/tcp``
|
|
||||||
- run ``bin/supervisorctl reload`` to re-read supervisor config and
|
|
||||||
start searx
|
|
||||||
|
|
||||||
Command make
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
``make``
|
|
||||||
''''''''
|
|
||||||
|
|
||||||
Builds development environment with testing support.
|
|
||||||
|
|
||||||
``make tests``
|
|
||||||
''''''''''''''
|
|
||||||
|
|
||||||
Runs tests. You can write tests
|
|
||||||
`here <https://github.com/asciimoo/searx/tree/master/searx/tests>`__ and
|
|
||||||
remember 'untested code is broken code'.
|
|
||||||
|
|
||||||
``make robot``
|
|
||||||
''''''''''''''
|
|
||||||
|
|
||||||
Runs robot (Selenium) tests, you must have ``firefox`` installed because
|
|
||||||
this functional tests actually run the browser and perform operations on
|
|
||||||
it. Also searx is executed with
|
|
||||||
`settings\_robot <https://github.com/asciimoo/searx/blob/master/searx/settings_robot.yml>`__.
|
|
||||||
|
|
||||||
``make flake8``
|
|
||||||
'''''''''''''''
|
|
||||||
|
|
||||||
'pep8 is a tool to check your Python code against some of the style
|
|
||||||
conventions in `PEP 8 <http://www.python.org/dev/peps/pep-0008/>`__.'
|
|
||||||
|
|
||||||
``make coverage``
|
|
||||||
'''''''''''''''''
|
|
||||||
|
|
||||||
Checks coverage of tests, after running this, execute this:
|
|
||||||
``firefox ./coverage/index.html``
|
|
||||||
|
|
||||||
``make production``
|
|
||||||
'''''''''''''''''''
|
|
||||||
|
|
||||||
Used to make co-called production environment - without tests (you
|
|
||||||
should ran tests before deploying searx on the server). This installs
|
|
||||||
supervisord, so if searx crashes, it will try to pick itself up again.
|
|
||||||
And crontab entry is added to start supervisord at server boot.
|
|
||||||
|
|
||||||
``make minimal``
|
|
||||||
''''''''''''''''
|
|
||||||
|
|
||||||
Minimal build - without test frameworks, the quickest build option.
|
|
||||||
|
|
||||||
``make clean``
|
|
||||||
''''''''''''''
|
|
||||||
|
|
||||||
Deletes several folders and files (see ``Makefile`` for more), so that
|
|
||||||
next time you run any other ``make`` command it will rebuild everithing.
|
|
||||||
|
|
||||||
TODO
|
|
||||||
~~~~
|
|
||||||
|
|
||||||
- Moar engines
|
|
||||||
- Better ui
|
|
||||||
- Browser integration
|
|
||||||
- Documentation
|
|
||||||
- Tests
|
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
~~~~
|
~~~~
|
||||||
|
|
||||||
|
|
17
base.cfg
17
base.cfg
|
@ -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}
|
|
210
bootstrap.py
210
bootstrap.py
|
@ -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)
|
|
30
buildout.cfg
30
buildout.cfg
|
@ -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']
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#!/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() {
|
||||||
|
update_packages
|
||||||
|
pip install --upgrade -r "$BASE_DIR/requirements-dev.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
pep8_check() {
|
||||||
|
echo '[!] Running pep8 check'
|
||||||
|
pep8 --max-line-length=120 "$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'
|
||||||
|
PYTHONPATH=`pwd` python "$SEARX_DIR/testing.py" robot
|
||||||
|
}
|
||||||
|
|
||||||
|
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_build() {
|
||||||
|
grunt --gruntfile "$SEARX_DIR/static/themes/oscar/gruntfile.js"
|
||||||
|
}
|
||||||
|
|
||||||
|
locales() {
|
||||||
|
pybabel compile -d "$SEARX_DIR/translations"
|
||||||
|
}
|
||||||
|
|
||||||
|
help() {
|
||||||
|
[ -z "$1" ] || echo "Error: $1\n"
|
||||||
|
echo "Searx manage.sh help
|
||||||
|
|
||||||
|
Commands
|
||||||
|
========
|
||||||
|
grunt_build - Build js files
|
||||||
|
help - This text
|
||||||
|
locales - Compile locales
|
||||||
|
pep8_check - Pep8 validation
|
||||||
|
py_test_coverage - Unit test coverage
|
||||||
|
robot_tests - Run selenium tests
|
||||||
|
styles - Build less files
|
||||||
|
tests - Run all python tests (pep8, unit, robot)
|
||||||
|
unit_tests - Run unit tests
|
||||||
|
update_dev_packages - Check & update development and production dependency changes
|
||||||
|
update_packages - Check & update dependency changes
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
if type $ACTION 1>/dev/null; then
|
||||||
|
$ACTION
|
||||||
|
else
|
||||||
|
help "action not found"
|
||||||
|
fi
|
15
minimal.cfg
15
minimal.cfg
|
@ -1,15 +0,0 @@
|
||||||
[buildout]
|
|
||||||
extends = base.cfg
|
|
||||||
develop = .
|
|
||||||
|
|
||||||
eggs =
|
|
||||||
searx
|
|
||||||
|
|
||||||
parts +=
|
|
||||||
pyscripts
|
|
||||||
|
|
||||||
|
|
||||||
[pyscripts]
|
|
||||||
recipe = zc.recipe.egg:script
|
|
||||||
eggs = ${buildout:eggs}
|
|
||||||
interpreter = py
|
|
|
@ -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
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
babel==2.2.0
|
||||||
|
flake8==2.5.1
|
||||||
|
mock==1.0.1
|
||||||
|
nose2[coverage-plugin]
|
||||||
|
plone.testing==4.0.15
|
||||||
|
robotframework-selenium2library==1.7.4
|
||||||
|
robotsuite==1.7.0
|
||||||
|
transifex-client==0.11
|
||||||
|
unittest2==1.1.0
|
||||||
|
zope.testrunner==4.4.10
|
|
@ -1,12 +1,12 @@
|
||||||
flask
|
certifi==2015.11.20.1
|
||||||
flask-babel
|
flask==0.10.1
|
||||||
requests
|
flask-babel==0.9
|
||||||
lxml
|
lxml==3.5.0
|
||||||
pyyaml
|
ndg-httpsclient==0.4.0
|
||||||
pygments
|
pyasn1==0.1.9
|
||||||
python-dateutil
|
pyasn1-modules==0.0.8
|
||||||
ndg-httpsclient
|
pygments==2.0.2
|
||||||
pyopenssl
|
pyopenssl==0.15.1
|
||||||
pyasn1
|
python-dateutil==2.4.2
|
||||||
pyasn1-modules
|
pyyaml==3.11
|
||||||
certifi
|
requests==2.9.1
|
||||||
|
|
|
@ -90,7 +90,7 @@ url_map = 'https://www.openstreetmap.org/'\
|
||||||
search_path = '/search'
|
search_path = '/search'
|
||||||
search_url = ('https://{hostname}' +
|
search_url = ('https://{hostname}' +
|
||||||
search_path +
|
search_path +
|
||||||
'?{query}&start={offset}&gbv=1&gws_rd=cr')
|
'?{query}&start={offset}&gbv=1&gws_rd=ssl')
|
||||||
|
|
||||||
# other URLs
|
# other URLs
|
||||||
map_hostname_start = 'maps.google.'
|
map_hostname_start = 'maps.google.'
|
||||||
|
@ -99,7 +99,7 @@ redirect_path = '/url'
|
||||||
images_path = '/images'
|
images_path = '/images'
|
||||||
|
|
||||||
# specific xpath variables
|
# specific xpath variables
|
||||||
results_xpath = '//li[@class="g"]'
|
results_xpath = '//div[@class="g"]'
|
||||||
url_xpath = './/h3/a/@href'
|
url_xpath = './/h3/a/@href'
|
||||||
title_xpath = './/h3'
|
title_xpath = './/h3'
|
||||||
content_xpath = './/span[@class="st"]'
|
content_xpath = './/span[@class="st"]'
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
from plone.testing import Layer
|
from plone.testing import Layer
|
||||||
from unittest2 import TestCase
|
from unittest2 import TestCase
|
||||||
|
from os.path import dirname, join, abspath
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
@ -42,11 +43,11 @@ class SearxRobotLayer(Layer):
|
||||||
os.path.abspath(os.path.dirname(os.path.realpath(__file__))),
|
os.path.abspath(os.path.dirname(os.path.realpath(__file__))),
|
||||||
'webapp.py'
|
'webapp.py'
|
||||||
)
|
)
|
||||||
exe = os.path.abspath(os.path.dirname(__file__) + '/../bin/py')
|
exe = 'python'
|
||||||
|
|
||||||
# set robot settings path
|
# set robot settings path
|
||||||
os.environ['SEARX_SETTINGS_PATH'] = os.path.abspath(
|
os.environ['SEARX_SETTINGS_PATH'] = abspath(
|
||||||
os.path.dirname(__file__) + '/settings_robot.yml')
|
dirname(__file__) + '/settings_robot.yml')
|
||||||
|
|
||||||
# run the server
|
# run the server
|
||||||
self.server = subprocess.Popen(
|
self.server = subprocess.Popen(
|
||||||
|
@ -68,3 +69,16 @@ class SearxTestCase(TestCase):
|
||||||
"""Base test case for non-robot tests."""
|
"""Base test case for non-robot tests."""
|
||||||
|
|
||||||
layer = SearxTestLayer
|
layer = SearxTestLayer
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from tests.test_robot import test_suite
|
||||||
|
import sys
|
||||||
|
from zope.testrunner.runner import Runner
|
||||||
|
|
||||||
|
base_dir = abspath(join(dirname(__file__), '../tests'))
|
||||||
|
if sys.argv[1] == 'robot':
|
||||||
|
Runner(['--color',
|
||||||
|
'--auto-progress',
|
||||||
|
'--path', base_dir],
|
||||||
|
found_suites=[test_suite()]).run()
|
||||||
|
|
|
@ -1,47 +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_wolframalpha_api import * # noqa
|
|
||||||
from searx.tests.engines.test_wolframalpha_noapi 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
|
|
35
setup.py
35
setup.py
|
@ -17,6 +17,8 @@ def read(*rnames):
|
||||||
|
|
||||||
|
|
||||||
long_description = read('README.rst')
|
long_description = read('README.rst')
|
||||||
|
requirements = map(str.strip, open('requirements.txt').readlines())
|
||||||
|
dev_requirements = map(str.strip, open('requirements-dev.txt').readlines())
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='searx',
|
name='searx',
|
||||||
|
@ -38,35 +40,9 @@ setup(
|
||||||
license='GNU Affero General Public License',
|
license='GNU Affero General Public License',
|
||||||
packages=find_packages('.'),
|
packages=find_packages('.'),
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
install_requires=[
|
install_requires=requirements,
|
||||||
'flask',
|
|
||||||
'flask-babel',
|
|
||||||
'requests',
|
|
||||||
'lxml',
|
|
||||||
'pyyaml',
|
|
||||||
'pygments',
|
|
||||||
'setuptools',
|
|
||||||
'python-dateutil',
|
|
||||||
'pyopenssl',
|
|
||||||
'ndg-httpsclient',
|
|
||||||
'pyasn1',
|
|
||||||
'pyasn1-modules',
|
|
||||||
'certifi'
|
|
||||||
],
|
|
||||||
extras_require={
|
extras_require={
|
||||||
'test': [
|
'test': dev_requirements
|
||||||
'coverage',
|
|
||||||
'flake8',
|
|
||||||
'mock',
|
|
||||||
'plone.testing',
|
|
||||||
'robotframework',
|
|
||||||
'robotframework-debuglibrary',
|
|
||||||
'robotframework-httplibrary',
|
|
||||||
'robotframework-selenium2library',
|
|
||||||
'robotsuite',
|
|
||||||
'unittest2',
|
|
||||||
'zope.testrunner',
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
entry_points={
|
entry_points={
|
||||||
'console_scripts': [
|
'console_scripts': [
|
||||||
|
@ -86,6 +62,9 @@ setup(
|
||||||
'static/*/*/*/*/*.*',
|
'static/*/*/*/*/*.*',
|
||||||
'templates/*/*.*',
|
'templates/*/*.*',
|
||||||
'templates/*/*/*.*',
|
'templates/*/*/*.*',
|
||||||
|
'tests/*',
|
||||||
|
'tests/*/*',
|
||||||
|
'tests/*/*/*',
|
||||||
'translations/*/*/*'
|
'translations/*/*/*'
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
@ -40,7 +40,7 @@ class TestGoogleEngine(SearxTestCase):
|
||||||
self.assertEqual(google.response(response), [])
|
self.assertEqual(google.response(response), [])
|
||||||
|
|
||||||
html = """
|
html = """
|
||||||
<li class="g">
|
<div class="g">
|
||||||
<h3 class="r">
|
<h3 class="r">
|
||||||
<a href="http://this.should.be.the.link/">
|
<a href="http://this.should.be.the.link/">
|
||||||
<b>This</b> is <b>the</b> title
|
<b>This</b> is <b>the</b> title
|
||||||
|
@ -94,35 +94,35 @@ class TestGoogleEngine(SearxTestCase):
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</div>
|
||||||
<li class="g">
|
<div class="g">
|
||||||
<h3 class="r">
|
<h3 class="r">
|
||||||
<a href="http://www.google.com/images?q=toto">
|
<a href="http://www.google.com/images?q=toto">
|
||||||
<b>This</b>
|
<b>This</b>
|
||||||
</a>
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
</li>
|
</div>
|
||||||
<li class="g">
|
<div class="g">
|
||||||
<h3 class="r">
|
<h3 class="r">
|
||||||
<a href="http://www.google.com/search?q=toto">
|
<a href="http://www.google.com/search?q=toto">
|
||||||
<b>This</b> is
|
<b>This</b> is
|
||||||
</a>
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
</li>
|
</div>
|
||||||
<li class="g">
|
<div class="g">
|
||||||
<h3 class="r">
|
<h3 class="r">
|
||||||
<a href="€">
|
<a href="€">
|
||||||
<b>This</b> is <b>the</b>
|
<b>This</b> is <b>the</b>
|
||||||
</a>
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
</li>
|
</div>
|
||||||
<li class="g">
|
<div class="g">
|
||||||
<h3 class="r">
|
<h3 class="r">
|
||||||
<a href="/url?q=url">
|
<a href="/url?q=url">
|
||||||
<b>This</b> is <b>the</b>
|
<b>This</b> is <b>the</b>
|
||||||
</a>
|
</a>
|
||||||
</h3>
|
</h3>
|
||||||
</li>
|
</div>
|
||||||
<p class="_Bmc" style="margin:3px 8px">
|
<p class="_Bmc" style="margin:3px 8px">
|
||||||
<a href="/search?num=20&safe=off&q=t&revid=1754833769&sa=X&ei=-&ved=">
|
<a href="/search?num=20&safe=off&q=t&revid=1754833769&sa=X&ei=-&ved=">
|
||||||
suggestion <b>title</b>
|
suggestion <b>title</b>
|
122
versions.cfg
122
versions.cfg
|
@ -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
|
|
Loading…
Reference in New Issue