mirror of
				https://github.com/searxng/searxng.git
				synced 2025-10-31 02:27:06 -04:00 
			
		
		
		
	Merge remote-tracking branch 'origin/install-refactor'
This commit is contained in:
		
						commit
						db615aa1a3
					
				
							
								
								
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -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'] |  | ||||||
							
								
								
									
										94
									
								
								manage.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										94
									
								
								manage.sh
									
									
									
									
									
										Executable file
									
								
							| @ -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 only 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 |  | ||||||
							
								
								
									
										10
									
								
								requirements-dev.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								requirements-dev.txt
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||||
|  | |||||||
| @ -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,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 |  | ||||||
							
								
								
									
										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/*/*/*' | ||||||
|         ], |         ], | ||||||
|     }, |     }, | ||||||
|  | |||||||
							
								
								
									
										0
									
								
								tests/unit/engines/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								tests/unit/engines/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user