├── docs ├── .nojekyll ├── update.sh ├── nbconvert.tpl └── Introduction to SeleniumScreenshots.robot ├── setup.py ├── MANIFEST.in ├── .gitignore ├── src └── SeleniumScreenshots │ ├── resources │ ├── remove_element.js │ ├── update_element_style.js │ ├── get_viewport_box.js │ ├── align_elements_horizontally.js │ ├── bootstrap_jquery.js │ ├── add_pointer.js │ ├── get_bounding_box.js │ ├── add_dot.js │ └── add_note.js │ └── __init__.py ├── requirements-python3-travis.txt ├── .travis.yml ├── requirements-python2.txt ├── README.rst ├── CHANGELOG.rst ├── setup.nix ├── LICENSE ├── requirements-python3.txt ├── setup.cfg ├── shell.nix ├── Makefile ├── requirements-python3-travis.nix ├── requirements-python2.nix └── requirements-python3.nix /docs/.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from setuptools import setup; setup(package_dir={'': 'src'}) # noqa: E702 -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | graft src/SeleniumScreenshots 2 | recursive-include src/SeleniumScreenshots *.js 3 | include *.rst *.txt *.nix setup.py setup.cfg LICENSE 4 | exclude Makefile 5 | global-exclude *.py[co] 6 | prune docs 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | *.egg-info 3 | *.mo 4 | *.pyc 5 | .DS_Store 6 | .idea 7 | .jupyter 8 | .jupyterlab 9 | .ipynb_checkpoints 10 | /geckodriver.log 11 | /html 12 | /log.html 13 | /output.xml 14 | /report.html 15 | /result 16 | /selenium-screenshot-*.png 17 | 18 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/remove_element.js: -------------------------------------------------------------------------------- 1 | (function (selector, callback) { 2 | var $el = jQuery(selector); 3 | if ($el.length > 0) { 4 | $el.remove(); 5 | callback(true); 6 | } else { 7 | callback(false); 8 | } 9 | })( 10 | arguments[0], /* selector */ 11 | arguments[1] /* callback */ 12 | ); 13 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/update_element_style.js: -------------------------------------------------------------------------------- 1 | (function (selector, name, value, callback) { 2 | var $el = jQuery(selector); 3 | if ($el.length > 0) { 4 | $el.css(name, value); 5 | callback(true); 6 | } else { 7 | callback(false); 8 | } 9 | })( 10 | arguments[0], /* selector */ 11 | arguments[1], /* name */ 12 | arguments[2], /* value */ 13 | arguments[3] /* callback */ 14 | ); 15 | -------------------------------------------------------------------------------- /docs/update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | LIBDOC="python -m robot.libdoc -F REST" 3 | 4 | $LIBDOC --name="SeleniumScreenshots" SeleniumScreenshots keywords.html 5 | 6 | jupyter nbconvert --to html --output index.html --TemplateExporter.exclude_input_prompt=True --TemplateExporter.exclude_output_prompt=True --TemplateExporter.template_file=nbconvert.tpl Introduction\ to\ SeleniumScreenshots.ipynb 7 | 8 | jupyter nbconvert --to script Introduction\ to\ SeleniumScreenshots.ipynb 9 | 10 | -------------------------------------------------------------------------------- /requirements-python3-travis.txt: -------------------------------------------------------------------------------- 1 | atomicwrites==1.2.1 2 | attrs==18.2.0 3 | flake8==3.6.0 4 | flake8-blind-except==0.1.1 5 | flake8-coding==1.3.1 6 | flake8-debugger==3.1.0 7 | flake8-isort==2.6.0 8 | flake8-polyfill==1.0.2 9 | flake8-quotes==1.0.0 10 | isort==4.3.4 11 | mccabe==0.6.1 12 | more-itertools==5.0.0 13 | pillow==5.3.0 14 | pluggy==0.8.0 15 | py==1.7.0 16 | pycodestyle==2.4.0 17 | pyflakes==2.0.0 18 | pytest==4.0.2 19 | pytest-runner==4.2 20 | robotframework==3.1 21 | robotframework-seleniumlibrary==3.3.0 22 | selenium==3.141.0 23 | setuptools==40.6.3 24 | setuptools-scm==3.1.0 25 | six==1.12.0 26 | testfixtures==6.4.1 27 | urllib3==1.24.1 28 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: nix 2 | before_install: 3 | - sudo mkdir -p /etc/nix 4 | - echo "substituters = https://cache.nixos.org/ https://datakurre.cachix.org/" | sudo tee -a /etc/nix/nix.conf 5 | - echo "trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= datakurre.cachix.org-1:ayZJTy5BDd8K4PW9uc9LHV+WCsdi/fu1ETIYZMooK78=" | sudo tee -a /etc/nix/nix.conf 6 | script: 7 | - nix-shell setup.nix -A develop --argstr python $PYTHON --argstr requirements "$(pwd)/requirements-$REQUIREMENTS.nix" --run "flake8 src && robot -v BROWSER:headlessfirefox docs" 8 | env: 9 | - PYTHON=python2 REQUIREMENTS=python2 10 | - PYTHON=python3 REQUIREMENTS=python3-travis 11 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/get_viewport_box.js: -------------------------------------------------------------------------------- 1 | (function (callback) { 2 | var w = window, d = document, e = d.documentElement, 3 | g = d.getElementsByTagName('body')[0], x = 0, y = 0, 4 | width = w.innerWidth || e.clientWidth || g.clientWidth, 5 | height = w.innerHeight || e.clientHeight || g.clientHeight; 6 | if (typeof pageYOffset != 'undefined') { 7 | y = pageYOffset; 8 | } else { 9 | if (e.clientHeight) { 10 | y = e.scrollTop; /* IE 'stdsmode' */ 11 | } else { 12 | y = d.body.scrollTop; /* IE 'quirksmode' */ 13 | } 14 | } 15 | callback([x, y, width, height]); 16 | })( 17 | arguments[0] /* callback */ 18 | ); 19 | -------------------------------------------------------------------------------- /requirements-python2.txt: -------------------------------------------------------------------------------- 1 | atomicwrites==1.2.1 2 | attrs==18.2.0 3 | configparser==3.5.0 4 | enum34==1.1.6 5 | flake8==3.6.0 6 | flake8-blind-except==0.1.1 7 | flake8-coding==1.3.1 8 | flake8-debugger==3.1.0 9 | flake8-isort==2.6.0 10 | flake8-polyfill==1.0.2 11 | flake8-quotes==1.0.0 12 | funcsigs==1.0.2 13 | futures==3.2.0 14 | isort==4.3.4 15 | mccabe==0.6.1 16 | more-itertools==5.0.0 17 | pathlib2==2.3.3 18 | pillow==5.3.0 19 | pluggy==0.8.0 20 | py==1.7.0 21 | pycodestyle==2.4.0 22 | pyflakes==2.0.0 23 | pytest==3.10.1 24 | pytest-runner==4.2 25 | robotframework==3.1 26 | robotframework-seleniumlibrary==3.3.0 27 | scandir==1.9.0 28 | selenium==3.141.0 29 | setuptools==40.6.3 30 | setuptools-scm==3.1.0 31 | six==1.12.0 32 | testfixtures==6.4.1 33 | urllib3==1.24.1 34 | yapf==0.25.0 35 | -------------------------------------------------------------------------------- /docs/nbconvert.tpl: -------------------------------------------------------------------------------- 1 | {# usage: jupyter nbconvert --to html --TemplateExporter.exclude_input=True --TemplateExporter.exclude_input_prompt=True --TemplateExporter.exclude_output_prompt=True --TemplateExporter.template_file=nbconvert.tpl notebook.ipynb #} 2 | {% extends 'full.tpl'%} 3 | {% block header %} 4 | {{ super() }} 5 | 10 | {% endblock header %} 11 | {% block any_cell %} 12 | {% if cell['cell_type'] != 'code' %} 13 | {{ super() }} 14 | {% elif cell['outputs']|length > 0 %} 15 | {# drop log and report links output: #} 16 | {{ cell['outputs'].pop(0) and super() }} 17 | {% else %} 18 | {{ super() }} 19 | {% endif %} 20 | {% endblock any_cell %} 21 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | SeleniumScreenshots library for Robot Framework 2 | =============================================== 3 | 4 | SeleniumScreenshots library for `Robot Framework`_ provides keywords for annotating and cropping screenshots taken with SeleniumLibrary_. It is useful for scripting automatically updated screenshots for documentation or visual regression testing purposes. 5 | 6 | SeleniumScreenshots is the maintained version of Selenium2Screenshots_. 7 | 8 | `Read the docs for more detailed information.`__ 9 | 10 | .. _Robot Framework: https://pypi.org/project/robotframework/ 11 | .. _SeleniumLibrary: https://pypi.org/project/robotframework-seleniumlibrary/ 12 | .. _Selenium2Screenshots: https://pypi.org/project/robotframework-selenium2screenshots/ 13 | __ https://marketsquare.github.io/robotframework-seleniumscreenshots/ 14 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/align_elements_horizontally.js: -------------------------------------------------------------------------------- 1 | (function (selectors, crop_margin, callback) { 2 | var center = null, $el, max, i; 3 | for (i = 0; i < selectors.length; i++) { 4 | $el = jQuery(selectors[i]); 5 | if ($el.length > 0 && center === null) { 6 | center = $el.offset().left + $el.outerWidth() / 2; 7 | } else if ($el.length > 0) { 8 | max = jQuery('html').width() - $el.outerWidth() - crop_margin; 9 | $el.css({ 10 | 'left': Math.max(crop_margin, Math.min( 11 | center - ($el.outerWidth() / 2), max 12 | )).toString() + 'px' 13 | }); 14 | } 15 | } 16 | callback(true); 17 | })( 18 | arguments[0], /* selectors */ 19 | arguments[1], /* crop_margin */ 20 | arguments[2] /* callback */ 21 | ); 22 | -------------------------------------------------------------------------------- /CHANGELOG.rst: -------------------------------------------------------------------------------- 1 | Changelog 2 | ========= 3 | 4 | 0.9.6 (unreleased) 5 | ------------------ 6 | 7 | - Nothing changed yet. 8 | 9 | 10 | 0.9.5 (2019-01-10) 11 | ------------------ 12 | 13 | - Change license to BSD-3 and update package trove classifiers 14 | [datakurre] 15 | 16 | 0.9.4 (2019-01-06) 17 | ------------------ 18 | 19 | - Remove trailing slash from resources to fix build on Windows 20 | [bollwyvl] 21 | 22 | 0.9.3 (2019-01-05) 23 | ------------------ 24 | 25 | - Fix issue where support for name:-selector was broken 26 | [datakurre] 27 | 28 | - Fix issue where capture and crop page screenshot did not return filename of 29 | the captured screenshot 30 | [datakurre] 31 | 32 | 0.9.2 (2019-01-01) 33 | ------------------ 34 | 35 | - Update README and documentation 36 | [datakurre] 37 | 38 | 0.9.1 (2019-01-01) 39 | ------------------ 40 | 41 | - Update README 42 | [datakurre] 43 | 44 | 0.9.0 (2019-01-01) 45 | ------------------ 46 | 47 | - Forked from robotframework-selenium2screenshots 48 | [datakurre] 49 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/bootstrap_jquery.js: -------------------------------------------------------------------------------- 1 | (function (callback) { 2 | var inject_missing_jquery, wait_for_bootstrapped_jquery; 3 | inject_missing_jquery = function () { 4 | if (typeof window.jQuery !== 'function') { 5 | var script = window.document.createElement('script'); 6 | script.src = '//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js'; 7 | window.document.body.appendChild(script); 8 | } 9 | }; 10 | wait_for_bootstrapped_jquery = function () { 11 | if (typeof window.jQuery !== 'function') { 12 | window.setTimeout(wait_for_bootstrapped_jquery, 1000); 13 | } else { 14 | jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) { 15 | return function (elem) { 16 | return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; 17 | }; 18 | }); 19 | callback(true); 20 | } 21 | }; 22 | inject_missing_jquery(); 23 | wait_for_bootstrapped_jquery(); 24 | })( 25 | arguments[0] /* callback */ 26 | ); 27 | -------------------------------------------------------------------------------- /setup.nix: -------------------------------------------------------------------------------- 1 | { pkgs ? import (fetchTarball { 2 | url = "https://github.com/NixOS/nixpkgs-channels/archive/76aafbf4bf4992c82da41ccefd8c6d481744524c.tar.gz"; 3 | sha256 = "1xz8249i9yag4sxfzd5lkhqsyg7n6h3n2klb1cqqmcsav87f6x65"; 4 | }) { overlays = []; } 5 | , setup ? import (fetchTarball { 6 | url = "https://github.com/datakurre/setup.nix/archive/9f8529e003ea4d2f433d2999dc50b8938548e7d0.tar.gz"; 7 | sha256 = "15qzhz28jvgkna5zv7pj0gfnd0vcvafpckxcp850j64z7761apnm"; 8 | }) 9 | , python ? "python3" 10 | , pythonPackages ? builtins.getAttr (python + "Packages") pkgs 11 | , requirements ? ./. + "/requirements-${python}.nix" 12 | }: 13 | 14 | let overrides = self: super: { 15 | "flake8" = super."flake8".overrideDerivation(old: { 16 | patches = []; 17 | }); 18 | "robotframework" = super."robotframework".overridePythonAttrs(old: { 19 | buildInputs = [ pkgs.unzip ]; 20 | }); 21 | "testfixtures" = super."testfixtures".overrideDerivation(old: { 22 | patches = []; 23 | }); 24 | "selenium" = super."selenium".overrideDerivation(old: { 25 | # patch name to tweak around bad archive at cachix 26 | name = "${old.name}-2019-01-01"; 27 | }); 28 | }; in 29 | 30 | setup { 31 | inherit pkgs pythonPackages overrides requirements; 32 | src = ./.; 33 | propagatedBuildInputs = with pkgs; [ 34 | geckodriver 35 | firefox 36 | ]; 37 | } 38 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/add_pointer.js: -------------------------------------------------------------------------------- 1 | (function (selector, size, top, left, callback) { 2 | var id = 'robot-' + Math.random().toString().substring(2); 3 | var $annotation = jQuery('
'); 4 | var $target = jQuery(selector); 5 | if ($target.length === 0) { 6 | return callback(false) 7 | } 8 | var offset = $target.offset(); 9 | var height = $target.outerHeight(); 10 | var width = $target.outerWidth(); 11 | $annotation.attr('id', id); 12 | $annotation.css({ 13 | 'display': 'block', 14 | 'font-family': 'serif', 15 | 'text-align': 'center', 16 | 'opacity': '0.3', 17 | '-moz-box-sizing': 'border-box', 18 | '-webkit-box-sizing': 'border-box', 19 | 'box-sizing': 'border-box', 20 | 'position': 'absolute', 21 | 'color': 'white', 22 | 'background': 'black', 23 | 'width': size + 'px', 24 | 'height': size + 'px', 25 | 'top': (offset.top + (height * (left / 100.0))) - (size / 2) + 'px', 26 | 'left': (offset.left + (width * (top / 100.0))) - (size / 2) + 'px', 27 | 'border-radius': (size / 2).toString() + 'px', 28 | 'z-index': '9999' 29 | }); 30 | jQuery('body').append($annotation); 31 | callback(id); 32 | })( 33 | arguments[0], /* selector */ 34 | arguments[1], /* size */ 35 | arguments[2], /* top */ 36 | arguments[3], /* left */ 37 | arguments[4] /* callback */ 38 | ); 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2019, Asko Soukka 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/get_bounding_box.js: -------------------------------------------------------------------------------- 1 | (function (selectors, crop_margin, callback) { 2 | var i, $target, offset, left = null, top = null, width = null, 3 | height = null; 4 | for (i = 0; i < selectors.length; i++) { 5 | $target = jQuery(selectors[i]); 6 | if ($target.length === 0) { 7 | return callback([selectors[i]]); 8 | } 9 | offset = $target.offset(); 10 | if (left === null || width === null) { 11 | width = $target.outerWidth(); 12 | } else { 13 | width = Math.max( 14 | left + width, offset.left + $target.outerWidth() 15 | ) - Math.min(left, offset.left); 16 | } 17 | if (top === null || height === null) { 18 | height = $target.outerHeight(); 19 | } else { 20 | height = Math.max( 21 | top + height, offset.top + $target.outerHeight() 22 | ) - Math.min(top, offset.top); 23 | } 24 | if (left === null) { 25 | left = offset.left; 26 | } else { 27 | left = Math.min(left, offset.left); 28 | } 29 | if (top === null) { 30 | top = offset.top; 31 | } else { 32 | top = Math.min(top, offset.top); 33 | } 34 | } 35 | callback([Math.max(0, left - crop_margin), 36 | Math.max(0, top - crop_margin), 37 | Math.min(window.outerWidth, width + crop_margin * 2), 38 | height + crop_margin * 2]); 39 | })( 40 | arguments[0], /* selectors */ 41 | arguments[1], /* crop_margin */ 42 | arguments[2] /* callback */ 43 | ); 44 | -------------------------------------------------------------------------------- /requirements-python3.txt: -------------------------------------------------------------------------------- 1 | MarkupSafe==1.1.0 2 | Send2Trash==1.5.0 3 | atomicwrites==1.2.1 4 | attrs==18.2.0 5 | backcall==0.1.0 6 | bleach==3.0.2 7 | decorator==4.3.0 8 | defusedxml==0.5.0 9 | docutils==0.14 10 | entrypoints==0.2.3 11 | flake8==3.6.0 12 | flake8-blind-except==0.1.1 13 | flake8-coding==1.3.1 14 | flake8-debugger==3.1.0 15 | flake8-isort==2.6.0 16 | flake8-polyfill==1.0.2 17 | flake8-quotes==1.0.0 18 | future==0.17.1 19 | ipykernel==5.1.0 20 | ipython==7.2.0 21 | ipython-genutils==0.2.0 22 | ipywidgets==7.4.2 23 | isort==4.3.4 24 | jedi==0.13.2 25 | jinja2==2.10 26 | jsonschema==3.0.0a3 27 | jupyter==1.0.0 28 | jupyter-client==5.2.4 29 | jupyter-console==6.0.0 30 | jupyter-core==4.4.0 31 | jupyterlab==0.35.4 32 | jupyterlab-server==0.2.0 33 | lunr==0.5.4 34 | mccabe==0.6.1 35 | mistune==0.8.4 36 | more-itertools==5.0.0 37 | nbconvert==5.4.0 38 | nbformat==4.4.0 39 | notebook==5.7.4 40 | pandocfilters==1.4.2 41 | parso==0.3.1 42 | pexpect==4.6.0 43 | pickleshare==0.7.5 44 | pillow==5.3.0 45 | pluggy==0.8.0 46 | prometheus-client==0.5.0 47 | prompt-toolkit==2.0.7 48 | ptyprocess==0.6.0 49 | py==1.7.0 50 | pycodestyle==2.4.0 51 | pyflakes==2.0.0 52 | pygments==2.3.1 53 | pyrsistent==0.14.8 54 | pytest==4.0.2 55 | pytest-runner==4.2 56 | python-dateutil==2.7.5 57 | pyzmq==17.1.2 58 | qtconsole==4.4.3 59 | robotframework==3.1 60 | robotframework-seleniumlibrary==3.3.0 61 | robotkernel==0.9.0 62 | selenium==3.141.0 63 | setuptools==40.6.3 64 | setuptools-scm==3.1.0 65 | six==1.12.0 66 | terminado==0.8.1 67 | testfixtures==6.4.1 68 | testpath==0.4.2 69 | tornado==5.1.1 70 | traitlets==4.3.2 71 | urllib3==1.24.1 72 | wcwidth==0.1.7 73 | webencodings==0.5.1 74 | widgetsnbextension==3.4.2 75 | yapf==0.25.0 76 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/add_dot.js: -------------------------------------------------------------------------------- 1 | (function (selector, text, color, background, size, top, left, callback) { 2 | var id = 'robot-' + Math.random().toString().substring(2); 3 | var $annotation = jQuery(''); 4 | var $target = jQuery(selector); 5 | if ($target.length === 0) { 6 | return callback(false) 7 | } 8 | var offset = $target.offset(); 9 | var height = $target.outerHeight(); 10 | var width = $target.outerWidth(); 11 | $annotation.attr('id', id); 12 | $annotation.css({ 13 | 'display': 'flex', 14 | 'align-items': 'center', 15 | 'justify-content': 'center', 16 | 'font-family': 'serif', 17 | 'text-align': 'center', 18 | 'opacity': '1', 19 | '-moz-box-sizing': 'border-box', 20 | '-webkit-box-sizing': 'border-box', 21 | 'box-sizing': 'border-box', 22 | 'position': 'absolute', 23 | 'color': color, 24 | 'background': background, 25 | 'width': size + 'px', 26 | 'height': size + 'px', 27 | 'font-size': Math.floor(size / 1.5) + 'px', 28 | 'top': (offset.top + (height * (top / 100.0))) - (size / 2) + 'px', 29 | 'left': (offset.left + (width * (left / 100.0))) - (size / 2) + 'px', 30 | 'border-radius': (size / 2).toString() + 'px', 31 | 'box-shadow': '0 0 5px #888', 32 | 'z-index': '9999' 33 | }); 34 | $annotation.text(text); 35 | jQuery('body').append($annotation); 36 | callback(id); 37 | })( 38 | arguments[0], /* selector */ 39 | arguments[1], /* text */ 40 | arguments[2], /* color */ 41 | arguments[3], /* background */ 42 | arguments[4], /* size */ 43 | arguments[5], /* top */ 44 | arguments[6], /* left */ 45 | arguments[7] /* callback */ 46 | ); 47 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = robotframework-seleniumscreenshots 3 | version = 0.9.6.dev0 4 | description = Robot Framework keyword library for capturing annotated screenshots with SeleniumLibrary 5 | long_description = file: README.rst, CHANGELOG.rst 6 | keywords = robotframework selenium 7 | author = Asko Soukka 8 | author_email = asko.soukka@iki.fi 9 | url = https://github.com/datakurre/robotframework-seleniumscreenshots 10 | license = BSD-3-Clause 11 | classifiers = 12 | Intended Audience :: Developers 13 | Intended Audience :: Information Technology 14 | Framework :: Robot Framework 15 | Framework :: Robot Framework :: Library 16 | License :: OSI Approved :: BSD License 17 | Programming Language :: Python :: 2.7 18 | Programming Language :: Python :: 3.6 19 | Programming Language :: Python :: 3.7 20 | Topic :: Software Development :: Quality Assurance 21 | Topic :: Software Development :: Testing 22 | 23 | [options] 24 | install_requires = 25 | setuptools 26 | robotframework>=3.0.2 27 | robotframework-seleniumlibrary>=3.2.0 28 | package_dir = 29 | = src 30 | packages = find: 31 | zip_safe = False 32 | include_package_data = True 33 | 34 | [options.package_data] 35 | * = 36 | resources 37 | 38 | [options.packages.find] 39 | where = 40 | src 41 | 42 | [options.extras_require] 43 | docs = 44 | sphinx 45 | pillow 46 | sphinxcontrib-robotframework 47 | PIL = 48 | PIL 49 | Pillow = 50 | pillow 51 | 52 | [aliases] 53 | test = pytest 54 | 55 | [flake8] 56 | exclude = .git,__pycache__,build,dist 57 | max-complexity = 20 58 | 59 | [isort] 60 | force_alphabetical_sort = True 61 | force_single_line = True 62 | lines_after_imports = 2 63 | line_length = 200 64 | not_skip = __init__.py 65 | 66 | [yapf] 67 | based_on_style = pep8 68 | allow_split_before_dict_value = False 69 | allow_multiline_lambdas = True 70 | coalesce_brackets = True 71 | dedent_closing_brackets = True 72 | join_multiple_lines = False 73 | space_between_ending_comma_and_closing_bracket = True 74 | split_arguments_when_comma_terminated = True 75 | split_before_expression_after_opening_paren = True 76 | split_before_first_argument = True 77 | split_complex_comprehension = True 78 | -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | { pkgs ? import (fetchTarball { 2 | url = "https://github.com/NixOS/nixpkgs-channels/archive/76aafbf4bf4992c82da41ccefd8c6d481744524c.tar.gz"; 3 | sha256 = "1xz8249i9yag4sxfzd5lkhqsyg7n6h3n2klb1cqqmcsav87f6x65"; 4 | }) { overlays = []; } 5 | }: 6 | 7 | let self = rec { 8 | 9 | # Update pythonPackages with setup.nix 10 | pythonPackages = (import ./setup.nix { 11 | inherit pkgs; 12 | python = "python3"; 13 | pythonPackages = pkgs.python3Packages; 14 | }).pythonPackages; 15 | 16 | "robotframework-seleniumscreenshots" = (import ./setup.nix { 17 | inherit pkgs; 18 | python = "python3"; 19 | pythonPackages = pkgs.python3Packages; 20 | }).build; 21 | 22 | # Build jupyter with robotkernel 23 | jupyter = pythonPackages.jupyter.overridePythonAttrs (old: { 24 | propagatedBuildInputs = 25 | with pythonPackages; old.propagatedBuildInputs ++ [ 26 | jupyterlab 27 | # Packages available in the default Python kernel 28 | robotframework 29 | robotframework-seleniumlibrary 30 | robotframework-seleniumscreenshots 31 | robotkernel 32 | ]; 33 | }); 34 | 35 | # Configure Jupyter environment 36 | jupyter_config_dir = pkgs.stdenv.mkDerivation { 37 | name = "jupyter"; 38 | builder = with pythonPackages; pkgs.writeText "builder.sh" '' 39 | source $stdenv/setup 40 | mkdir -p $out/share/jupyter/nbextensions 41 | mkdir -p $out/share/jupyter/migrated 42 | ${pythonPackages.python.withPackages (ps: with ps; [ robotkernel ])}/bin/python -m robotkernel.install --prefix=$out 43 | # in the future we might build JupyterLab configuration here 44 | ''; 45 | }; 46 | }; 47 | 48 | in with self; 49 | 50 | pkgs.stdenv.mkDerivation { 51 | name = "jupyter"; 52 | buildInputs = [ 53 | pkgs.firefox 54 | pkgs.geckodriver 55 | jupyter 56 | jupyter_config_dir 57 | ]; 58 | shellHook = '' 59 | mkdir -p $PWD/.jupyter 60 | export JUPYTER_CONFIG_DIR=${jupyter_config_dir}/share/jupyter 61 | export JUPYTER_PATH=${jupyter_config_dir}/share/jupyter 62 | export JUPYTER_DATA_DIR=$PWD/.jupyter 63 | export JUPYTER_RUNTIME_DIR=$PWD/.jupyter 64 | export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt 65 | ''; 66 | } 67 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | requirements-python2.nix: requirements-python2.txt 2 | @nix-shell -p libffi \ 3 | --run 'nix-shell setup.nix --argstr python python2 -A pip2nix \ 4 | --run "pip2nix generate -r requirements-python2.txt --output=requirements-python2.nix"' 5 | 6 | requirements-python3.nix: requirements-python3.txt 7 | @nix-shell -p libffi \ 8 | --run 'nix-shell setup.nix --argstr python python3 -A pip2nix \ 9 | --run "pip2nix generate -r requirements-python3.txt --output=requirements-python3.nix"' 10 | 11 | requirements-python3-travis.nix: requirements-python3-travis.txt 12 | @nix-shell -p libffi \ 13 | --run 'nix-shell setup.nix --argstr python python3 -A pip2nix \ 14 | --run "pip2nix generate -r requirements-python3-travis.txt --output=requirements-python3-travis.nix"' 15 | 16 | .PHONY: freeze 17 | freeze-python3: 18 | @grep "name" requirements-python3.nix |grep -Eo "\"(.*)\""|grep -Eo "[^\"]+"|sed -r "s|-([0-9\.]+)|==\1|g" 19 | 20 | .PHONY: freeze 21 | freeze-python2: 22 | @grep "name" requirements-python2.nix |grep -Eo "\"(.*)\""|grep -Eo "[^\"]+"|sed -r "s|-([0-9\.]+)|==\1|g" 23 | 24 | .PHONY: freeze 25 | freeze-python3-travis: 26 | @grep "name" requirements-python3-travis.nix |grep -Eo "\"(.*)\""|grep -Eo "[^\"]+"|sed -r "s|-([0-9\.]+)|==\1|g" 27 | 28 | .PHONY: upgrade 29 | upgrade: 30 | @echo "Updating nixpkgs 18.09 revision"; \ 31 | rev=$$(curl https://api.github.com/repos/NixOS/nixpkgs-channels/branches/nixos-18.09|jq -r .commit.sha); \ 32 | echo "Updating nixpkgs $$rev hash"; \ 33 | sha=$$(nix-prefetch-url --unpack https://github.com/NixOS/nixpkgs-channels/archive/$$rev.tar.gz); \ 34 | sed -i "2s|.*| url = \"https://github.com/NixOS/nixpkgs-channels/archive/$$rev.tar.gz\";|" setup.nix; \ 35 | sed -i "3s|.*| sha256 = \"$$sha\";|" setup.nix; \ 36 | sed -i "2s|.*| url = \"https://github.com/NixOS/nixpkgs-channels/archive/$$rev.tar.gz\";|" shell.nix; \ 37 | sed -i "3s|.*| sha256 = \"$$sha\";|" shell.nix; 38 | @echo "Updating setup.nix version"; \ 39 | rev=$$(curl https://api.github.com/repos/datakurre/setup.nix/branches/master|jq -r ".commit.sha"); \ 40 | echo "Updating setup.nix $$rev hash"; \ 41 | sha=$$(nix-prefetch-url --unpack https://github.com/datakurre/setup.nix/archive/$$rev.tar.gz); \ 42 | sed -i "6s|.*| url = \"https://github.com/datakurre/setup.nix/archive/$$rev.tar.gz\";|" setup.nix; \ 43 | sed -i "7s|.*| sha256 = \"$$sha\";|" setup.nix 44 | -------------------------------------------------------------------------------- /docs/Introduction to SeleniumScreenshots.robot: -------------------------------------------------------------------------------- 1 | 2 | *** Settings *** 3 | 4 | Library SeleniumLibrary 5 | Library SeleniumScreenshots 6 | 7 | *** Variables *** 8 | 9 | ${BROWSER} firefox 10 | 11 | *** Keywords *** 12 | 13 | Open robotframework.org 14 | Set window size 800 600 15 | Go to https://robotframework.org 16 | 17 | *** Test Cases *** 18 | 19 | Open browser 20 | Open browser about:blank browser=${BROWSER} 21 | 22 | *** Test Cases *** 23 | 24 | Capture and crop page screenshot 25 | Open robotframework.org 26 | Capture and crop page screenshot 27 | ... screenshot.png 28 | ... css:H1.main-header 29 | ... css:NAV[id='navigation'] > DIV > IMG 30 | 31 | *** Test Cases *** 32 | 33 | Highlighting an area 34 | Open robotframework.org 35 | Highlight 36 | ... link:INTRODUCTION # locator (id, css, name or link) 37 | Capture and crop page screenshot 38 | ... screenshot.png # filename 39 | ... link:INTRODUCTION # locator 40 | 41 | *** Test Cases *** 42 | 43 | Clear highlighting 44 | Clear highlight link:INTRODUCTION 45 | Capture and crop page screenshot 46 | ... screenshot.png 47 | ... link:INTRODUCTION 48 | 49 | *** Test Cases *** 50 | 51 | Update style 52 | Open robotframework.org 53 | Update element style 54 | ... link:INTRODUCTION # locator (id, css, name or link) 55 | ... outline # style 56 | ... dotted yellow 3px # value 57 | Capture and crop page screenshot 58 | ... screenshot-1.png 59 | ... link:INTRODUCTION 60 | Update element style 61 | ... link:INTRODUCTION 62 | ... outline 63 | ... none 64 | Capture and crop page screenshot 65 | ... screenshot-2.png 66 | ... link:INTRODUCTION 67 | 68 | *** Test Cases *** 69 | 70 | Add dot 71 | Open robotframework.org 72 | Add dot 73 | ... link:INTRODUCTION 74 | ... left=8 75 | Capture and crop page screenshot 76 | ... screenshot.png 77 | ... link:INTRODUCTION 78 | 79 | *** Test Cases *** 80 | 81 | Add numbered dots dots 82 | Open robotframework.org 83 | Add dot 84 | ... link:INTRODUCTION 85 | ... text=1 86 | ... left=8 87 | Add dot 88 | ... link:EXAMPLES 89 | ... text=2 90 | ... left=8 91 | Capture and crop page screenshot 92 | ... screenshot.png 93 | ... link:INTRODUCTION 94 | ... link:EXAMPLES 95 | 96 | *** Test Cases *** 97 | 98 | Add and remove dot 99 | Open robotframework.org 100 | ${dot}= Add dot 101 | ... link:INTRODUCTION 102 | ... left=8 background=red 103 | Capture and crop page screenshot 104 | ... screenshot-1.png 105 | ... link:INTRODUCTION 106 | Remove element ${dot} 107 | Capture and crop page screenshot 108 | ... screenshot-2.png 109 | ... link:INTRODUCTION 110 | 111 | *** Test Cases *** 112 | 113 | Add note 114 | Open robotframework.org 115 | ${note} = Add note 116 | ... css:NAV[id='navigation'] > DIV > IMG 117 | ... text=I am a robot. With opinions. 118 | ... width=160 119 | ... position=right 120 | Capture and crop page screenshot 121 | ... screenshot.png 122 | ... css:NAV[id='navigation'] > DIV > IMG 123 | ... ${note} 124 | 125 | *** Test Cases *** 126 | 127 | Add pointy note 128 | Open robotframework.org 129 | ${note} = Add pointy note 130 | ... link:INTRODUCTION 131 | ... text=Start here. 132 | ... position=right 133 | Capture and crop page screenshot 134 | ... screenshot.png 135 | ... link:INTRODUCTION 136 | ... ${note} 137 | 138 | *** Settings *** 139 | 140 | Suite Teardown Close all browsers 141 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/resources/add_note.js: -------------------------------------------------------------------------------- 1 | (function (selector, text, width, color, background, border, position, pointy, crop_margin, display, callback) { 2 | crop_margin = 0; // this was not a good idea after all 3 | 4 | var annHeight, annWidth; 5 | var id = 'robot-' + Math.random().toString().substring(2); 6 | var $annotation = jQuery(''); 7 | var $pointer = jQuery(''); 8 | var $target = jQuery(selector); 9 | if ($target.length === 0) { 10 | return callback(false); 11 | } 12 | var offset = $target.offset(); 13 | var outerWidth = $target.outerWidth(); 14 | var outerHeight = $target.outerHeight(); 15 | var maxLeft = jQuery('html').width() - outerWidth - crop_margin; 16 | $annotation.attr('id', id); 17 | $annotation.text(text); 18 | $annotation.css({ 19 | 'display': display, 20 | 'position': 'absolute', 21 | 'font-family': 'serif', 22 | 'box-shadow': '0 0 5px #888', 23 | 'box-sizing': 'border-box', 24 | 'padding': '0.75ex 0.5em 0.5ex 0.5em', 25 | 'border': border, 26 | 'border-radius': '2px', 27 | 'background': background, 28 | 'color': color, 29 | 'z-index': '9999', 30 | 'width': width ? width + 'px' : 'auto', 31 | 'top': Math.max( 32 | (offset.top + outerHeight / 2), 33 | crop_margin 34 | ).toString() + 'px', 35 | 'left': Math.max(crop_margin, Math.min( 36 | (offset.left + outerWidth / 2 - (outerWidth / 2)), 37 | maxLeft 38 | )).toString() + 'px' 39 | }); 40 | $pointer.css({ 41 | 'position': 'absolute', 42 | 'display': 'block', 43 | 'width': 0, 44 | 'height': 0, 45 | 'border': '10px solid transparent', 46 | 'bottom': 0, 47 | 'filter': 'drop-shadow(0 0 5px #888)' 48 | }); 49 | if (position === 'top') { 50 | $annotation.css({ 51 | 'top': 'auto', 52 | 'bottom': ( 53 | window.innerHeight - offset.top + crop_margin 54 | ).toString() + 'px' 55 | }); 56 | $pointer.css({ 57 | 'bottom': 0, 58 | 'left': '50%', 59 | 'border-top-color': background, 60 | 'border-bottom': 0, 61 | 'border-top-width': '15px', 62 | 'margin-left': '-10px', 63 | 'margin-bottom': '-15px' 64 | }); 65 | } else if (position === 'bottom') { 66 | $annotation.css({ 67 | 'top': ( 68 | offset.top + outerHeight + crop_margin 69 | ).toString() + 'px' 70 | }); 71 | $pointer.css({ 72 | 'top': 0, 73 | 'left': '50%', 74 | 'border-bottom-color': background, 75 | 'border-top': 0, 76 | 'border-bottom-width': '15px', 77 | 'margin-left': '-10px', 78 | 'margin-top': '-15px' 79 | }); 80 | } else if (position === 'left') { 81 | $annotation.css({ 82 | 'left': ( 83 | offset.left - outerWidth - crop_margin / 2 84 | ).toString() + 'px' 85 | }); 86 | $pointer.css({ 87 | 'top': '50%', 88 | 'right': 0, 89 | 'border-left-color': background, 90 | 'border-right': 0, 91 | 'border-left-width': '15px', 92 | 'margin-top': '-10px', 93 | 'margin-right': '-15px' 94 | }); 95 | } else if (position === 'right') { 96 | $annotation.css({ 97 | 'left': (Math.min( 98 | offset.left + outerWidth + crop_margin / 2, 99 | maxLeft 100 | )).toString() + 'px' 101 | }); 102 | $pointer.css({ 103 | 'top': '50%', 104 | 'left': 0, 105 | 'border-right-color': background, 106 | 'border-left': 0, 107 | 'border-right-width': '15px', 108 | 'margin-top': '-10px', 109 | 'margin-left': '-15px' 110 | }); 111 | } else { 112 | pointy = false; 113 | } 114 | if (pointy) { 115 | $annotation.clone().css({ 116 | 'top': 0, 117 | 'right': 0, 118 | 'bottom': 0, 119 | 'left': 0, 120 | 'box-shadow': 'none', 121 | 'font-family': 'inherit' 122 | }).appendTo($annotation); 123 | $pointer.prependTo($annotation); 124 | } 125 | jQuery('body').append($annotation); 126 | if (position === 'left' || position === 'right') { 127 | annHeight = $annotation.outerHeight(); 128 | $annotation.css({ 129 | 'top': Math.max(( 130 | offset.top + outerHeight / 2 - annHeight / 2 131 | ), crop_margin).toString() + 'px' 132 | }); 133 | } else if (position === 'top' || position === 'bottom') { 134 | annWidth = $annotation.outerWidth(); 135 | $annotation.css({ 136 | 'left': Math.max(( 137 | offset.left + outerWidth / 2 - annWidth / 2 138 | ), crop_margin).toString() + 'px' 139 | }); 140 | } else { 141 | annHeight = $annotation.outerHeight(); 142 | annWidth = $annotation.outerWidth(); 143 | $annotation.css({ 144 | 'top': Math.max(( 145 | offset.top + outerHeight / 2 - annHeight / 2 146 | ), crop_margin).toString() + 'px', 147 | 'left': Math.max(( 148 | offset.left + outerWidth / 2 - annWidth / 2 149 | ), crop_margin).toString() + 'px' 150 | }); 151 | } 152 | callback(id); 153 | })( 154 | arguments[0], /* selector */ 155 | arguments[1], /* text */ 156 | arguments[2], /* width*/ 157 | arguments[3], /* color */ 158 | arguments[4], /* background */ 159 | arguments[5], /* border */ 160 | arguments[6], /* position */ 161 | arguments[7], /* pointy */ 162 | arguments[8], /* crop_margin */ 163 | arguments[9], /* display */ 164 | arguments[10] /* callback */ 165 | ); 166 | -------------------------------------------------------------------------------- /requirements-python3-travis.nix: -------------------------------------------------------------------------------- 1 | # Generated by pip2nix 0.8.0.dev1 2 | # See https://github.com/johbo/pip2nix 3 | 4 | { pkgs, fetchurl, fetchgit, fetchhg }: 5 | 6 | self: super: { 7 | "atomicwrites" = super.buildPythonPackage { 8 | name = "atomicwrites-1.2.1"; 9 | doCheck = false; 10 | src = fetchurl { 11 | url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz"; 12 | sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc"; 13 | }; 14 | }; 15 | "attrs" = super.buildPythonPackage { 16 | name = "attrs-18.2.0"; 17 | doCheck = false; 18 | src = fetchurl { 19 | url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz"; 20 | sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh"; 21 | }; 22 | }; 23 | "flake8" = super.buildPythonPackage { 24 | name = "flake8-3.6.0"; 25 | doCheck = false; 26 | propagatedBuildInputs = [ 27 | self."mccabe" 28 | self."pycodestyle" 29 | self."pyflakes" 30 | self."setuptools" 31 | ]; 32 | src = fetchurl { 33 | url = "https://files.pythonhosted.org/packages/d0/27/c0d1274b86a8f71ec1a6e4d4c1cfe3b20d6f95b090ec7545320150952c93/flake8-3.6.0.tar.gz"; 34 | sha256 = "0w0nprx22rbvrrkbfx9v5jc5gskbm08g219l7r8wai8zfswgadba"; 35 | }; 36 | }; 37 | "flake8-blind-except" = super.buildPythonPackage { 38 | name = "flake8-blind-except-0.1.1"; 39 | doCheck = false; 40 | propagatedBuildInputs = [ 41 | self."setuptools" 42 | ]; 43 | src = fetchurl { 44 | url = "https://files.pythonhosted.org/packages/ff/f2/ab635e6e420e78c94eab50cd3f53abd3ec27e411793e50b14f29edbb9f0b/flake8-blind-except-0.1.1.tar.gz"; 45 | sha256 = "16g58mkr3fcn2vlfhp3rlahj93qswc7jd5qrqp748mc26dk3b8xc"; 46 | }; 47 | }; 48 | "flake8-coding" = super.buildPythonPackage { 49 | name = "flake8-coding-1.3.1"; 50 | doCheck = false; 51 | propagatedBuildInputs = [ 52 | self."flake8" 53 | ]; 54 | src = fetchurl { 55 | url = "https://files.pythonhosted.org/packages/f9/d7/889f7961ed549f15a280fa36edfc9b9016df38cd25cd0a8a7e4edc06efcf/flake8-coding-1.3.1.tar.gz"; 56 | sha256 = "0i7qh5wmwh5bgf1lgi82nq2n6qks2jgv8pvr27dgw4c7q0i2p72l"; 57 | }; 58 | }; 59 | "flake8-debugger" = super.buildPythonPackage { 60 | name = "flake8-debugger-3.1.0"; 61 | doCheck = false; 62 | propagatedBuildInputs = [ 63 | self."flake8" 64 | self."pycodestyle" 65 | ]; 66 | src = fetchurl { 67 | url = "https://files.pythonhosted.org/packages/39/4b/90548607282483dd15f9ce1f4434d735ae756e16e1faf60621b0f8877fcc/flake8-debugger-3.1.0.tar.gz"; 68 | sha256 = "15qxrb2d7sr0pf024fkknsx58aqa5iz38b9s0panv3zfwf6vhkxy"; 69 | }; 70 | }; 71 | "flake8-isort" = super.buildPythonPackage { 72 | name = "flake8-isort-2.6.0"; 73 | doCheck = false; 74 | propagatedBuildInputs = [ 75 | self."flake8" 76 | self."isort" 77 | self."testfixtures" 78 | ]; 79 | src = fetchurl { 80 | url = "https://files.pythonhosted.org/packages/85/fb/f2a33e47cf7520fd391e5f180cae5b8d2977ad7a5ddf897213137fe8a171/flake8-isort-2.6.0.tar.gz"; 81 | sha256 = "0ajz616bif7sc02pm6fd41qs0n3dsx4lby5jrkfdpqynbm07q41w"; 82 | }; 83 | }; 84 | "flake8-polyfill" = super.buildPythonPackage { 85 | name = "flake8-polyfill-1.0.2"; 86 | doCheck = false; 87 | propagatedBuildInputs = [ 88 | self."flake8" 89 | ]; 90 | src = fetchurl { 91 | url = "https://files.pythonhosted.org/packages/e6/67/1c26634a770db5c442e361311bee73cb3a177adb2eb3f7af8953cfd9f553/flake8-polyfill-1.0.2.tar.gz"; 92 | sha256 = "1nlf1mkqw856vi6782qcglqhaacb23khk9wkcgn55npnjxshhjz4"; 93 | }; 94 | }; 95 | "flake8-quotes" = super.buildPythonPackage { 96 | name = "flake8-quotes-1.0.0"; 97 | doCheck = false; 98 | propagatedBuildInputs = [ 99 | self."flake8" 100 | ]; 101 | src = fetchurl { 102 | url = "https://files.pythonhosted.org/packages/83/ff/0461010959158bb7d197691c696f1a85b20f2d3eea7aa23f73a8d07f30f3/flake8-quotes-1.0.0.tar.gz"; 103 | sha256 = "09ib440hrf5bbsmdbqzbcpkkqqnqdwkaawbqz93bbwxwifnjg4gx"; 104 | }; 105 | }; 106 | "isort" = super.buildPythonPackage { 107 | name = "isort-4.3.4"; 108 | doCheck = false; 109 | src = fetchurl { 110 | url = "https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz"; 111 | sha256 = "1y0yfv56cqyh9wyg7kxxv9y5wmfgcq18n7a49mp7xmzka2bhxi5r"; 112 | }; 113 | }; 114 | "mccabe" = super.buildPythonPackage { 115 | name = "mccabe-0.6.1"; 116 | doCheck = false; 117 | src = fetchurl { 118 | url = "https://files.pythonhosted.org/packages/06/18/fa675aa501e11d6d6ca0ae73a101b2f3571a565e0f7d38e062eec18a91ee/mccabe-0.6.1.tar.gz"; 119 | sha256 = "07w3p1qm44hgxf3vvwz84kswpsx6s7kvaibzrsx5dzm0hli1i3fx"; 120 | }; 121 | }; 122 | "more-itertools" = super.buildPythonPackage { 123 | name = "more-itertools-5.0.0"; 124 | doCheck = false; 125 | propagatedBuildInputs = [ 126 | self."six" 127 | ]; 128 | src = fetchurl { 129 | url = "https://files.pythonhosted.org/packages/dd/26/30fc0d541d9fdf55faf5ba4b0fd68f81d5bd2447579224820ad525934178/more-itertools-5.0.0.tar.gz"; 130 | sha256 = "1r12cm6mcdwdzz7d47a6g4l437xsvapdlgyhqay3i2nrlv03da9q"; 131 | }; 132 | }; 133 | "pillow" = super.buildPythonPackage { 134 | name = "pillow-5.3.0"; 135 | doCheck = false; 136 | src = fetchurl { 137 | url = "https://files.pythonhosted.org/packages/1b/e1/1118d60e9946e4e77872b69c58bc2f28448ec02c99a2ce456cd1a272c5fd/Pillow-5.3.0.tar.gz"; 138 | sha256 = "14sgpkwccpkdnr9p1d1sw29ki3fdld4j773mibg4763psmy538rf"; 139 | }; 140 | }; 141 | "pluggy" = super.buildPythonPackage { 142 | name = "pluggy-0.8.0"; 143 | doCheck = false; 144 | src = fetchurl { 145 | url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz"; 146 | sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4"; 147 | }; 148 | }; 149 | "py" = super.buildPythonPackage { 150 | name = "py-1.7.0"; 151 | doCheck = false; 152 | src = fetchurl { 153 | url = "https://files.pythonhosted.org/packages/c7/fa/eb6dd513d9eb13436e110aaeef9a1703437a8efa466ce6bb2ff1d9217ac7/py-1.7.0.tar.gz"; 154 | sha256 = "152nyjvd8phqbm9pwlnfx0xi4c6343hakjzg42sp4qw3k1qn74mz"; 155 | }; 156 | }; 157 | "pycodestyle" = super.buildPythonPackage { 158 | name = "pycodestyle-2.4.0"; 159 | doCheck = false; 160 | src = fetchurl { 161 | url = "https://files.pythonhosted.org/packages/28/ad/cae9654d7fd64eb3d2ab2c44c9bf8dc5bd4fb759625beab99532239aa6e8/pycodestyle-2.4.0.tar.gz"; 162 | sha256 = "0fhy4vnlgpjq4qd1wdnl6pvdw7rah0ypmn8c9mkhz8clsndskz6b"; 163 | }; 164 | }; 165 | "pyflakes" = super.buildPythonPackage { 166 | name = "pyflakes-2.0.0"; 167 | doCheck = false; 168 | src = fetchurl { 169 | url = "https://files.pythonhosted.org/packages/92/9e/386c0d9deef14996eb90d9deebbcb9d3ceb70296840b09615cb61b2ae231/pyflakes-2.0.0.tar.gz"; 170 | sha256 = "0jba28czyvimdc72llms3f17swp3i8jdcabf5w0j00adfbn64xls"; 171 | }; 172 | }; 173 | "pytest" = super.buildPythonPackage { 174 | name = "pytest-4.0.2"; 175 | doCheck = false; 176 | propagatedBuildInputs = [ 177 | self."atomicwrites" 178 | self."attrs" 179 | self."more-itertools" 180 | self."pluggy" 181 | self."py" 182 | self."setuptools" 183 | self."six" 184 | ]; 185 | src = fetchurl { 186 | url = "https://files.pythonhosted.org/packages/9d/a9/3688b67467527c25e7a4d02c3b22565f15158a0a5d681870bfda8af210c6/pytest-4.0.2.tar.gz"; 187 | sha256 = "1sgq8nm7yb9ygapdjgn52zr0ny47gps5dpa86d08aiccq4pvz2gn"; 188 | }; 189 | }; 190 | "pytest-runner" = super.buildPythonPackage { 191 | name = "pytest-runner-4.2"; 192 | doCheck = false; 193 | src = fetchurl { 194 | url = "https://files.pythonhosted.org/packages/9e/b7/fe6e8f87f9a756fd06722216f1b6698ccba4d269eac6329d9f0c441d0f93/pytest-runner-4.2.tar.gz"; 195 | sha256 = "1gkpyphawxz38ni1gdq1fmwyqcg02m7ypzqvv46z06crwdxi2gyj"; 196 | }; 197 | }; 198 | "robotframework" = super.buildPythonPackage { 199 | name = "robotframework-3.1"; 200 | doCheck = false; 201 | src = fetchurl { 202 | url = "https://files.pythonhosted.org/packages/dc/c9/34687fa751f6b3ad1a4b5b35f5ae1371b1c1b01e95007fbb03ac0732dc67/robotframework-3.1.zip"; 203 | sha256 = "09r1rng8pngcfqmsnbl9d1dfvac2yx7zgjlym59zy0j4y70sb2xj"; 204 | }; 205 | }; 206 | "robotframework-seleniumlibrary" = super.buildPythonPackage { 207 | name = "robotframework-seleniumlibrary-3.3.0"; 208 | doCheck = false; 209 | propagatedBuildInputs = [ 210 | self."robotframework" 211 | self."selenium" 212 | ]; 213 | src = fetchurl { 214 | url = "https://files.pythonhosted.org/packages/ec/44/d6efee0ea0bff85cf5618327184f8342659d338f98e8f71e0deb04542f95/robotframework-seleniumlibrary-3.3.0.tar.gz"; 215 | sha256 = "1yrqm9sjkc9zcy2djvdx3aqslvpwv3p15q5fizyljig0qif9inda"; 216 | }; 217 | }; 218 | "selenium" = super.buildPythonPackage { 219 | name = "selenium-3.141.0"; 220 | doCheck = false; 221 | propagatedBuildInputs = [ 222 | self."urllib3" 223 | ]; 224 | src = fetchurl { 225 | url = "https://files.pythonhosted.org/packages/ed/9c/9030520bf6ff0b4c98988448a93c04fcbd5b13cd9520074d8ed53569ccfe/selenium-3.141.0.tar.gz"; 226 | sha256 = "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy"; 227 | }; 228 | }; 229 | "setuptools" = super.buildPythonPackage { 230 | name = "setuptools-40.6.3"; 231 | doCheck = false; 232 | src = fetchurl { 233 | url = "https://files.pythonhosted.org/packages/37/1b/b25507861991beeade31473868463dad0e58b1978c209de27384ae541b0b/setuptools-40.6.3.zip"; 234 | sha256 = "1y085dnk574sxw9aymdng9gijvrsbw86hsv9hqnhv7y4d6nlsirv"; 235 | }; 236 | }; 237 | "setuptools-scm" = super.buildPythonPackage { 238 | name = "setuptools-scm-3.1.0"; 239 | doCheck = false; 240 | src = fetchurl { 241 | url = "https://files.pythonhosted.org/packages/09/b4/d148a70543b42ff3d81d57381f33104f32b91f970ad7873f463e75bf7453/setuptools_scm-3.1.0.tar.gz"; 242 | sha256 = "0h4bglwfz8b9prqljv8z3w9rgydfyxzaj05bm1y6zs5m6shz548i"; 243 | }; 244 | }; 245 | "six" = super.buildPythonPackage { 246 | name = "six-1.12.0"; 247 | doCheck = false; 248 | src = fetchurl { 249 | url = "https://files.pythonhosted.org/packages/dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca/six-1.12.0.tar.gz"; 250 | sha256 = "0wxs1q74v07ssjywbbm7x6h5v9qx209ld2yfsif4060sxi0h2sni"; 251 | }; 252 | }; 253 | "testfixtures" = super.buildPythonPackage { 254 | name = "testfixtures-6.4.1"; 255 | doCheck = false; 256 | src = fetchurl { 257 | url = "https://files.pythonhosted.org/packages/16/1c/0b694fbfd318e325888c3ac16776e9d1df452a90693d1d3734a5256fc793/testfixtures-6.4.1.tar.gz"; 258 | sha256 = "0aa8jikyj2pl94b5i58ncs8dh44a53m66d3x2lprr04902gbah5h"; 259 | }; 260 | }; 261 | "urllib3" = super.buildPythonPackage { 262 | name = "urllib3-1.24.1"; 263 | doCheck = false; 264 | src = fetchurl { 265 | url = "https://files.pythonhosted.org/packages/b1/53/37d82ab391393565f2f831b8eedbffd57db5a718216f82f1a8b4d381a1c1/urllib3-1.24.1.tar.gz"; 266 | sha256 = "08lwd9f3hqznyf32vnzwvp87pchx062nkbgyrf67rwlkgj0jk5fy"; 267 | }; 268 | }; 269 | } 270 | -------------------------------------------------------------------------------- /requirements-python2.nix: -------------------------------------------------------------------------------- 1 | # Generated by pip2nix 0.8.0.dev1 2 | # See https://github.com/johbo/pip2nix 3 | 4 | { pkgs, fetchurl, fetchgit, fetchhg }: 5 | 6 | self: super: { 7 | "atomicwrites" = super.buildPythonPackage { 8 | name = "atomicwrites-1.2.1"; 9 | doCheck = false; 10 | src = fetchurl { 11 | url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz"; 12 | sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc"; 13 | }; 14 | }; 15 | "attrs" = super.buildPythonPackage { 16 | name = "attrs-18.2.0"; 17 | doCheck = false; 18 | src = fetchurl { 19 | url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz"; 20 | sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh"; 21 | }; 22 | }; 23 | "configparser" = super.buildPythonPackage { 24 | name = "configparser-3.5.0"; 25 | doCheck = false; 26 | src = fetchurl { 27 | url = "https://files.pythonhosted.org/packages/7c/69/c2ce7e91c89dc073eb1aa74c0621c3eefbffe8216b3f9af9d3885265c01c/configparser-3.5.0.tar.gz"; 28 | sha256 = "0fi7vf09vi1588jd8f16a021m5y6ih2hy7rpbjb408xw45qb822k"; 29 | }; 30 | }; 31 | "enum34" = super.buildPythonPackage { 32 | name = "enum34-1.1.6"; 33 | doCheck = false; 34 | src = fetchurl { 35 | url = "https://files.pythonhosted.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz"; 36 | sha256 = "1cgm5ng2gcfrkrm3hc22brl6chdmv67b9zvva9sfs7gn7dwc9n4a"; 37 | }; 38 | }; 39 | "flake8" = super.buildPythonPackage { 40 | name = "flake8-3.6.0"; 41 | doCheck = false; 42 | propagatedBuildInputs = [ 43 | self."configparser" 44 | self."enum34" 45 | self."mccabe" 46 | self."pycodestyle" 47 | self."pyflakes" 48 | self."setuptools" 49 | ]; 50 | src = fetchurl { 51 | url = "https://files.pythonhosted.org/packages/d0/27/c0d1274b86a8f71ec1a6e4d4c1cfe3b20d6f95b090ec7545320150952c93/flake8-3.6.0.tar.gz"; 52 | sha256 = "0w0nprx22rbvrrkbfx9v5jc5gskbm08g219l7r8wai8zfswgadba"; 53 | }; 54 | }; 55 | "flake8-blind-except" = super.buildPythonPackage { 56 | name = "flake8-blind-except-0.1.1"; 57 | doCheck = false; 58 | propagatedBuildInputs = [ 59 | self."setuptools" 60 | ]; 61 | src = fetchurl { 62 | url = "https://files.pythonhosted.org/packages/ff/f2/ab635e6e420e78c94eab50cd3f53abd3ec27e411793e50b14f29edbb9f0b/flake8-blind-except-0.1.1.tar.gz"; 63 | sha256 = "16g58mkr3fcn2vlfhp3rlahj93qswc7jd5qrqp748mc26dk3b8xc"; 64 | }; 65 | }; 66 | "flake8-coding" = super.buildPythonPackage { 67 | name = "flake8-coding-1.3.1"; 68 | doCheck = false; 69 | propagatedBuildInputs = [ 70 | self."flake8" 71 | ]; 72 | src = fetchurl { 73 | url = "https://files.pythonhosted.org/packages/f9/d7/889f7961ed549f15a280fa36edfc9b9016df38cd25cd0a8a7e4edc06efcf/flake8-coding-1.3.1.tar.gz"; 74 | sha256 = "0i7qh5wmwh5bgf1lgi82nq2n6qks2jgv8pvr27dgw4c7q0i2p72l"; 75 | }; 76 | }; 77 | "flake8-debugger" = super.buildPythonPackage { 78 | name = "flake8-debugger-3.1.0"; 79 | doCheck = false; 80 | propagatedBuildInputs = [ 81 | self."flake8" 82 | self."pycodestyle" 83 | ]; 84 | src = fetchurl { 85 | url = "https://files.pythonhosted.org/packages/39/4b/90548607282483dd15f9ce1f4434d735ae756e16e1faf60621b0f8877fcc/flake8-debugger-3.1.0.tar.gz"; 86 | sha256 = "15qxrb2d7sr0pf024fkknsx58aqa5iz38b9s0panv3zfwf6vhkxy"; 87 | }; 88 | }; 89 | "flake8-isort" = super.buildPythonPackage { 90 | name = "flake8-isort-2.6.0"; 91 | doCheck = false; 92 | propagatedBuildInputs = [ 93 | self."flake8" 94 | self."isort" 95 | self."testfixtures" 96 | ]; 97 | src = fetchurl { 98 | url = "https://files.pythonhosted.org/packages/85/fb/f2a33e47cf7520fd391e5f180cae5b8d2977ad7a5ddf897213137fe8a171/flake8-isort-2.6.0.tar.gz"; 99 | sha256 = "0ajz616bif7sc02pm6fd41qs0n3dsx4lby5jrkfdpqynbm07q41w"; 100 | }; 101 | }; 102 | "flake8-polyfill" = super.buildPythonPackage { 103 | name = "flake8-polyfill-1.0.2"; 104 | doCheck = false; 105 | propagatedBuildInputs = [ 106 | self."flake8" 107 | ]; 108 | src = fetchurl { 109 | url = "https://files.pythonhosted.org/packages/e6/67/1c26634a770db5c442e361311bee73cb3a177adb2eb3f7af8953cfd9f553/flake8-polyfill-1.0.2.tar.gz"; 110 | sha256 = "1nlf1mkqw856vi6782qcglqhaacb23khk9wkcgn55npnjxshhjz4"; 111 | }; 112 | }; 113 | "flake8-quotes" = super.buildPythonPackage { 114 | name = "flake8-quotes-1.0.0"; 115 | doCheck = false; 116 | propagatedBuildInputs = [ 117 | self."flake8" 118 | ]; 119 | src = fetchurl { 120 | url = "https://files.pythonhosted.org/packages/83/ff/0461010959158bb7d197691c696f1a85b20f2d3eea7aa23f73a8d07f30f3/flake8-quotes-1.0.0.tar.gz"; 121 | sha256 = "09ib440hrf5bbsmdbqzbcpkkqqnqdwkaawbqz93bbwxwifnjg4gx"; 122 | }; 123 | }; 124 | "funcsigs" = super.buildPythonPackage { 125 | name = "funcsigs-1.0.2"; 126 | doCheck = false; 127 | src = fetchurl { 128 | url = "https://files.pythonhosted.org/packages/94/4a/db842e7a0545de1cdb0439bb80e6e42dfe82aaeaadd4072f2263a4fbed23/funcsigs-1.0.2.tar.gz"; 129 | sha256 = "0l4g5818ffyfmfs1a924811azhjj8ax9xd1cffr1mzd3ycn0zfx7"; 130 | }; 131 | }; 132 | "futures" = super.buildPythonPackage { 133 | name = "futures-3.2.0"; 134 | doCheck = false; 135 | src = fetchurl { 136 | url = "https://files.pythonhosted.org/packages/1f/9e/7b2ff7e965fc654592269f2906ade1c7d705f1bf25b7d469fa153f7d19eb/futures-3.2.0.tar.gz"; 137 | sha256 = "0rdjmmsab550kxsssdq49jcniz77zlkpw4pvi9hvib3lsskjmh4y"; 138 | }; 139 | }; 140 | "isort" = super.buildPythonPackage { 141 | name = "isort-4.3.4"; 142 | doCheck = false; 143 | propagatedBuildInputs = [ 144 | self."futures" 145 | self."futures" 146 | ]; 147 | src = fetchurl { 148 | url = "https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz"; 149 | sha256 = "1y0yfv56cqyh9wyg7kxxv9y5wmfgcq18n7a49mp7xmzka2bhxi5r"; 150 | }; 151 | }; 152 | "mccabe" = super.buildPythonPackage { 153 | name = "mccabe-0.6.1"; 154 | doCheck = false; 155 | src = fetchurl { 156 | url = "https://files.pythonhosted.org/packages/06/18/fa675aa501e11d6d6ca0ae73a101b2f3571a565e0f7d38e062eec18a91ee/mccabe-0.6.1.tar.gz"; 157 | sha256 = "07w3p1qm44hgxf3vvwz84kswpsx6s7kvaibzrsx5dzm0hli1i3fx"; 158 | }; 159 | }; 160 | "more-itertools" = super.buildPythonPackage { 161 | name = "more-itertools-5.0.0"; 162 | doCheck = false; 163 | propagatedBuildInputs = [ 164 | self."six" 165 | ]; 166 | src = fetchurl { 167 | url = "https://files.pythonhosted.org/packages/dd/26/30fc0d541d9fdf55faf5ba4b0fd68f81d5bd2447579224820ad525934178/more-itertools-5.0.0.tar.gz"; 168 | sha256 = "1r12cm6mcdwdzz7d47a6g4l437xsvapdlgyhqay3i2nrlv03da9q"; 169 | }; 170 | }; 171 | "pathlib2" = super.buildPythonPackage { 172 | name = "pathlib2-2.3.3"; 173 | doCheck = false; 174 | propagatedBuildInputs = [ 175 | self."scandir" 176 | self."six" 177 | ]; 178 | src = fetchurl { 179 | url = "https://files.pythonhosted.org/packages/bf/d7/a2568f4596b75d2c6e2b4094a7e64f620decc7887f69a1f2811931ea15b9/pathlib2-2.3.3.tar.gz"; 180 | sha256 = "0hpp92vqqgcd8h92msm9slv161b1q160igjwnkf2ag6cx0c96695"; 181 | }; 182 | }; 183 | "pillow" = super.buildPythonPackage { 184 | name = "pillow-5.3.0"; 185 | doCheck = false; 186 | src = fetchurl { 187 | url = "https://files.pythonhosted.org/packages/1b/e1/1118d60e9946e4e77872b69c58bc2f28448ec02c99a2ce456cd1a272c5fd/Pillow-5.3.0.tar.gz"; 188 | sha256 = "14sgpkwccpkdnr9p1d1sw29ki3fdld4j773mibg4763psmy538rf"; 189 | }; 190 | }; 191 | "pluggy" = super.buildPythonPackage { 192 | name = "pluggy-0.8.0"; 193 | doCheck = false; 194 | src = fetchurl { 195 | url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz"; 196 | sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4"; 197 | }; 198 | }; 199 | "py" = super.buildPythonPackage { 200 | name = "py-1.7.0"; 201 | doCheck = false; 202 | src = fetchurl { 203 | url = "https://files.pythonhosted.org/packages/c7/fa/eb6dd513d9eb13436e110aaeef9a1703437a8efa466ce6bb2ff1d9217ac7/py-1.7.0.tar.gz"; 204 | sha256 = "152nyjvd8phqbm9pwlnfx0xi4c6343hakjzg42sp4qw3k1qn74mz"; 205 | }; 206 | }; 207 | "pycodestyle" = super.buildPythonPackage { 208 | name = "pycodestyle-2.4.0"; 209 | doCheck = false; 210 | src = fetchurl { 211 | url = "https://files.pythonhosted.org/packages/28/ad/cae9654d7fd64eb3d2ab2c44c9bf8dc5bd4fb759625beab99532239aa6e8/pycodestyle-2.4.0.tar.gz"; 212 | sha256 = "0fhy4vnlgpjq4qd1wdnl6pvdw7rah0ypmn8c9mkhz8clsndskz6b"; 213 | }; 214 | }; 215 | "pyflakes" = super.buildPythonPackage { 216 | name = "pyflakes-2.0.0"; 217 | doCheck = false; 218 | src = fetchurl { 219 | url = "https://files.pythonhosted.org/packages/92/9e/386c0d9deef14996eb90d9deebbcb9d3ceb70296840b09615cb61b2ae231/pyflakes-2.0.0.tar.gz"; 220 | sha256 = "0jba28czyvimdc72llms3f17swp3i8jdcabf5w0j00adfbn64xls"; 221 | }; 222 | }; 223 | "pytest" = super.buildPythonPackage { 224 | name = "pytest-3.10.1"; 225 | doCheck = false; 226 | propagatedBuildInputs = [ 227 | self."atomicwrites" 228 | self."attrs" 229 | self."funcsigs" 230 | self."more-itertools" 231 | self."pathlib2" 232 | self."pluggy" 233 | self."py" 234 | self."setuptools" 235 | self."six" 236 | ]; 237 | src = fetchurl { 238 | url = "https://files.pythonhosted.org/packages/b5/96/37011e484665fab8b51add4f707d2aa28f1a06c68dd1c8a50e03551693b3/pytest-3.10.1.tar.gz"; 239 | sha256 = "0q4n1p47p2bdblima035ga6yf5hkgd5jc1zw2yb9n5h17hbwyip2"; 240 | }; 241 | }; 242 | "pytest-runner" = super.buildPythonPackage { 243 | name = "pytest-runner-4.2"; 244 | doCheck = false; 245 | src = fetchurl { 246 | url = "https://files.pythonhosted.org/packages/9e/b7/fe6e8f87f9a756fd06722216f1b6698ccba4d269eac6329d9f0c441d0f93/pytest-runner-4.2.tar.gz"; 247 | sha256 = "1gkpyphawxz38ni1gdq1fmwyqcg02m7ypzqvv46z06crwdxi2gyj"; 248 | }; 249 | }; 250 | "robotframework" = super.buildPythonPackage { 251 | name = "robotframework-3.1"; 252 | doCheck = false; 253 | src = fetchurl { 254 | url = "https://files.pythonhosted.org/packages/dc/c9/34687fa751f6b3ad1a4b5b35f5ae1371b1c1b01e95007fbb03ac0732dc67/robotframework-3.1.zip"; 255 | sha256 = "09r1rng8pngcfqmsnbl9d1dfvac2yx7zgjlym59zy0j4y70sb2xj"; 256 | }; 257 | }; 258 | "robotframework-seleniumlibrary" = super.buildPythonPackage { 259 | name = "robotframework-seleniumlibrary-3.3.0"; 260 | doCheck = false; 261 | propagatedBuildInputs = [ 262 | self."robotframework" 263 | self."selenium" 264 | ]; 265 | src = fetchurl { 266 | url = "https://files.pythonhosted.org/packages/ec/44/d6efee0ea0bff85cf5618327184f8342659d338f98e8f71e0deb04542f95/robotframework-seleniumlibrary-3.3.0.tar.gz"; 267 | sha256 = "1yrqm9sjkc9zcy2djvdx3aqslvpwv3p15q5fizyljig0qif9inda"; 268 | }; 269 | }; 270 | "scandir" = super.buildPythonPackage { 271 | name = "scandir-1.9.0"; 272 | doCheck = false; 273 | src = fetchurl { 274 | url = "https://files.pythonhosted.org/packages/16/2a/557af1181e6b4e30254d5a6163b18f5053791ca66e251e77ab08887e8fe3/scandir-1.9.0.tar.gz"; 275 | sha256 = "0r3hvf1a9jm1rkqgx40gxkmccknkaiqjavs8lccgq9s8khh5x5s4"; 276 | }; 277 | }; 278 | "selenium" = super.buildPythonPackage { 279 | name = "selenium-3.141.0"; 280 | doCheck = false; 281 | propagatedBuildInputs = [ 282 | self."urllib3" 283 | ]; 284 | src = fetchurl { 285 | url = "https://files.pythonhosted.org/packages/ed/9c/9030520bf6ff0b4c98988448a93c04fcbd5b13cd9520074d8ed53569ccfe/selenium-3.141.0.tar.gz"; 286 | sha256 = "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy"; 287 | }; 288 | }; 289 | "setuptools" = super.buildPythonPackage { 290 | name = "setuptools-40.6.3"; 291 | doCheck = false; 292 | src = fetchurl { 293 | url = "https://files.pythonhosted.org/packages/37/1b/b25507861991beeade31473868463dad0e58b1978c209de27384ae541b0b/setuptools-40.6.3.zip"; 294 | sha256 = "1y085dnk574sxw9aymdng9gijvrsbw86hsv9hqnhv7y4d6nlsirv"; 295 | }; 296 | }; 297 | "setuptools-scm" = super.buildPythonPackage { 298 | name = "setuptools-scm-3.1.0"; 299 | doCheck = false; 300 | src = fetchurl { 301 | url = "https://files.pythonhosted.org/packages/09/b4/d148a70543b42ff3d81d57381f33104f32b91f970ad7873f463e75bf7453/setuptools_scm-3.1.0.tar.gz"; 302 | sha256 = "0h4bglwfz8b9prqljv8z3w9rgydfyxzaj05bm1y6zs5m6shz548i"; 303 | }; 304 | }; 305 | "six" = super.buildPythonPackage { 306 | name = "six-1.12.0"; 307 | doCheck = false; 308 | src = fetchurl { 309 | url = "https://files.pythonhosted.org/packages/dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca/six-1.12.0.tar.gz"; 310 | sha256 = "0wxs1q74v07ssjywbbm7x6h5v9qx209ld2yfsif4060sxi0h2sni"; 311 | }; 312 | }; 313 | "testfixtures" = super.buildPythonPackage { 314 | name = "testfixtures-6.4.1"; 315 | doCheck = false; 316 | src = fetchurl { 317 | url = "https://files.pythonhosted.org/packages/16/1c/0b694fbfd318e325888c3ac16776e9d1df452a90693d1d3734a5256fc793/testfixtures-6.4.1.tar.gz"; 318 | sha256 = "0aa8jikyj2pl94b5i58ncs8dh44a53m66d3x2lprr04902gbah5h"; 319 | }; 320 | }; 321 | "urllib3" = super.buildPythonPackage { 322 | name = "urllib3-1.24.1"; 323 | doCheck = false; 324 | src = fetchurl { 325 | url = "https://files.pythonhosted.org/packages/b1/53/37d82ab391393565f2f831b8eedbffd57db5a718216f82f1a8b4d381a1c1/urllib3-1.24.1.tar.gz"; 326 | sha256 = "08lwd9f3hqznyf32vnzwvp87pchx062nkbgyrf67rwlkgj0jk5fy"; 327 | }; 328 | }; 329 | "yapf" = super.buildPythonPackage { 330 | name = "yapf-0.25.0"; 331 | doCheck = false; 332 | src = fetchurl { 333 | url = "https://files.pythonhosted.org/packages/2a/78/066d92807c532b4bdbfece8fcb5a20130df0476dfa924d6108f72f4efabf/yapf-0.25.0.tar.gz"; 334 | sha256 = "0mbdyhqwlm4pcd0wr5haxypxm0kr8y46nc17696xmd4pvfmzk9wa"; 335 | }; 336 | }; 337 | } 338 | -------------------------------------------------------------------------------- /src/SeleniumScreenshots/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from robot.api.deco import keyword 3 | from robot.libraries.BuiltIn import BuiltIn 4 | 5 | import os.path 6 | import re 7 | 8 | 9 | def resource(name): 10 | return os.path.join( 11 | os.path.dirname(__file__), 12 | 'resources', 13 | name, 14 | ) 15 | 16 | 17 | class Image(object): 18 | @keyword('Crop image') 19 | def crop_image(self, output_dir, filename, left, top, width, height): 20 | """Crop the saved image at the given ``output_dir`` with the given 21 | ``filename`` down to the given dimensions. 22 | 23 | This keyword is primarily for the internal use of this keyword library. 24 | """ 25 | from PIL import Image 26 | 27 | img = Image.open(os.path.join(output_dir, filename)) 28 | box = (int(left), int(top), int(left + width), int(top + height)) 29 | 30 | area = img.crop(box) 31 | 32 | with open(os.path.join(output_dir, filename), 'wb') as output: 33 | area.save(output, 'png') 34 | 35 | return os.path.join(output_dir, filename) 36 | 37 | 38 | class SeleniumScreenshots(Image): 39 | """SeleniumScreenshots library for Robot Framework provides keywords for 40 | annotating and cropping screenshots taken with SeleniumLibrary. 41 | 42 | The library requires SeleniumLibrary 3.2 or later. 43 | """ 44 | crop_margin = 10 45 | 46 | def __init__(self, crop_margin=10): 47 | """Accepts the following optional keyword arguments: 48 | 49 | ``crop_margin`` 50 | desired margin added around the selected areas in cropped 51 | screenshots. 52 | """ 53 | self.crop_margin = crop_margin 54 | 55 | @property 56 | def selenium_library(self): 57 | return BuiltIn().get_library_instance('SeleniumLibrary') 58 | 59 | @keyword('Bootstrap jQuery') 60 | def bootstrap_jquery(self): 61 | """Injects jQuery into the currently active window when it does not 62 | exist already. 63 | 64 | Most of the SeleniumScreenshots library keywords rely on jQuery 65 | being available on the current page. If jQuery is not globally 66 | available on the current page, it can be injected using this 67 | keyword. Otherwise the keywords will fail. 68 | 69 | This keyword is primarily for the internal use of this keyword library. 70 | """ 71 | return self.selenium_library.execute_async_javascript( 72 | resource('bootstrap_jquery.js'), 73 | ) 74 | 75 | @keyword('Normalize annotation locator') 76 | def normalize_annotation_locator(self, locator): 77 | """Normalizes the given *SeleniumLibrary*-locator into 78 | *Sizzle*-selector, which is the supported selector format in the jQuery 79 | based keywords of this library. 80 | 81 | Returns a normalized version of the given locator. 82 | 83 | This keyword is primarily for the internal use of this keyword library. 84 | """ 85 | if re.match(r'^jquery[=:]', locator): 86 | locator = locator[len('jquery='):] 87 | elif re.match(r'^css[=:]', locator): 88 | locator = locator[len('css='):] 89 | elif re.match(r'^name[=:]', locator): 90 | locator = '[name="' + locator[len('name='):] + '"]' 91 | elif re.match(r'^link[=:]', locator): 92 | locator = 'a:icontains("' + locator[len('name='):] + '"):eq(0)' 93 | elif re.match(r'^id[=:]', locator): 94 | locator = '#' + locator[len('id='):] 95 | else: 96 | locator = '#' + locator 97 | 98 | return locator 99 | 100 | @keyword('Add pointer') 101 | def add_pointer(self, locator, size=20, top=50, left=50): 102 | """Adds a round transparent dot at the center of the given ``locator``. 103 | 104 | Accepts the following optional keyword arguments: 105 | 106 | ``size`` 107 | size of the pointer in pixels 108 | 109 | ``top`` 110 | top alignment of the pointer in percents 111 | 112 | ``left`` 113 | left alignment of the pointer in percents. 114 | 115 | Returns id of the created element. 116 | """ 117 | assert self.bootstrap_jquery() 118 | selector = self.normalize_annotation_locator(locator) 119 | id_ = self.selenium_library.execute_async_javascript( 120 | resource('add_pointer.js'), 121 | 'ARGUMENTS', 122 | selector, 123 | size, 124 | top, 125 | left, 126 | ) 127 | if not id_: 128 | raise AssertionError( 129 | selector + ' not found and no pointer was created', 130 | ) 131 | return id_ 132 | 133 | @keyword('Add dot') 134 | def add_dot( 135 | self, 136 | locator, 137 | text='', 138 | color='black', 139 | background='#fcf0ad', 140 | size=20, 141 | top=50, 142 | left=50 143 | ): 144 | """Adds a colored round dot at the center of the given ``locator`` 145 | with optional text. 146 | 147 | Accepts the following optional keyword arguments: 148 | 149 | ``text`` 150 | text rendered inside the dot 151 | 152 | ``color`` 153 | foreground color of the dot 154 | 155 | ``background`` 156 | background color of the dot 157 | 158 | ``size`` 159 | size of the dot in pixels 160 | 161 | ``top`` 162 | top alignment of the dot in percents 163 | 164 | ``left`` 165 | left alignment of the dot in percents. 166 | 167 | Returns id of the created element. 168 | """ 169 | assert self.bootstrap_jquery() 170 | selector = self.normalize_annotation_locator(locator) 171 | id_ = self.selenium_library.execute_async_javascript( 172 | resource('add_dot.js'), 173 | 'ARGUMENTS', 174 | selector, 175 | text, 176 | color, 177 | background, 178 | size, 179 | top, 180 | left, 181 | ) 182 | if not id_: 183 | raise AssertionError( 184 | selector + ' not found and no dot was created', 185 | ) 186 | return id_ 187 | 188 | @keyword('Add note') 189 | def add_note( 190 | self, 191 | locator, 192 | text, 193 | width=None, 194 | color='black', 195 | background='#fcf0ad', 196 | border='none', 197 | position='center', 198 | display='block' 199 | ): 200 | """Adds a colored note at the given ``locator`` with the given 201 | ``text``. 202 | 203 | Accepts the following optional keyword arguments: 204 | 205 | ``width`` 206 | width of the note in pixels 207 | 208 | ``color`` 209 | foreground color of note note 210 | 211 | ``background`` 212 | background color of the note 213 | 214 | ``border`` 215 | border style of the note 216 | 217 | ``position`` 218 | position of the note relative to the given ``locator`` and must be 219 | one of the following values: ``center``, ``top``, ``right``, 220 | ``bottom`` or ``left`` 221 | 222 | ``display`` 223 | display style property value of the note. 224 | 225 | Returns id of the created element. 226 | """ 227 | assert self.bootstrap_jquery() 228 | selector = self.normalize_annotation_locator(locator) 229 | id_ = self.selenium_library.execute_async_javascript( 230 | resource('add_note.js'), 231 | 'ARGUMENTS', 232 | selector, 233 | text, 234 | width, 235 | color, 236 | background, 237 | border, 238 | position, 239 | False, 240 | self.crop_margin, 241 | display, 242 | ) 243 | if not id_: 244 | raise AssertionError( 245 | selector + ' not found and no note was created', 246 | ) 247 | return id_ 248 | 249 | @keyword('Add pointy note') 250 | def add_pointy_note( 251 | self, 252 | locator, 253 | text, 254 | width=None, 255 | color='black', 256 | background='#fcf0ad', 257 | border='none', 258 | position='center', 259 | display='block' 260 | ): 261 | """Adds a colored pointy note at the given ``locator`` with the given 262 | ``text``. 263 | 264 | Accepts the following optional keyword arguments: 265 | 266 | ``width`` 267 | width of the note in pixels (leave empty for auto) 268 | 269 | ``color`` 270 | foreground color of note note 271 | 272 | ``background`` 273 | background color of the note 274 | 275 | ``border`` 276 | border style of the note 277 | 278 | ``position`` 279 | position of the note relative to the given ``locator`` and must be 280 | one of the following values: ``center``, ``top``, ``right``, 281 | ``bottom`` or ``left`` 282 | 283 | ``display`` 284 | display style property value of the note. 285 | 286 | Returns id of the created element. 287 | """ 288 | assert self.bootstrap_jquery() 289 | selector = self.normalize_annotation_locator(locator) 290 | id_ = self.selenium_library.execute_async_javascript( 291 | resource('add_note.js'), 292 | 'ARGUMENTS', 293 | selector, 294 | text, 295 | width, 296 | color, 297 | background, 298 | border, 299 | position, 300 | True, 301 | self.crop_margin, 302 | display, 303 | ) 304 | if not id_: 305 | raise AssertionError( 306 | selector + ' not found and no note was created', 307 | ) 308 | return id_ 309 | 310 | @keyword('Remove element') 311 | def remove_element(self, locator): 312 | """Removes the element at the given ``locator`` from the current 313 | page. 314 | """ 315 | assert self.bootstrap_jquery() 316 | selector = self.normalize_annotation_locator(locator) 317 | return self.selenium_library.execute_async_javascript( 318 | resource('remove_element.js'), 319 | 'ARGUMENTS', 320 | selector, 321 | ) 322 | 323 | @keyword('Remove elements') 324 | def remove_elements(self, *locators): 325 | """Removes the elements at the given ``locators`` from the current 326 | page. 327 | """ 328 | assert self.bootstrap_jquery() 329 | results = [] 330 | for locator in locators: 331 | selector = self.normalize_annotation_locator(locator) 332 | results.append( 333 | self.selenium_library.execute_async_javascript( 334 | resource('remove_element.js'), 335 | 'ARGUMENTS', 336 | selector, 337 | ) 338 | ) 339 | return False not in results 340 | 341 | @keyword('Update element style') 342 | def update_element_style(self, locator, name, value): 343 | """Updates style for elements at the ``locator`` matching the given 344 | ``name`` with the given ``value``, 345 | """ 346 | assert self.bootstrap_jquery() 347 | selector = self.normalize_annotation_locator(locator) 348 | return self.selenium_library.execute_async_javascript( 349 | resource('update_element_style.js'), 350 | 'ARGUMENTS', 351 | selector, 352 | name, 353 | value, 354 | ) 355 | 356 | @keyword('Align elements horizontally') 357 | def align_elements_horizontally(self, *locators): 358 | """Aligns the elements matching the given ``locators`` so that the 359 | subsequent elements are aligned after the first element. 360 | """ 361 | assert self.bootstrap_jquery() 362 | selectors = map(self.normalize_annotation_locator, locators) 363 | return self.selenium_library.execute_async_javascript( 364 | resource('align_elements_horizontally.js'), 365 | 'ARGUMENTS', 366 | list(selectors), 367 | self.crop_margin, 368 | ) 369 | 370 | @keyword('Crop page screenshot') 371 | def crop_page_screenshot(self, filename, *locators): 372 | """Crops the given ``filename`` to match the combined bounding box of 373 | the elements matching the given ``locators``. 374 | 375 | This keyword is primarily for the internal use of this keyword library. 376 | """ 377 | assert self.bootstrap_jquery() 378 | selectors = map(self.normalize_annotation_locator, locators) 379 | dimensions = self.selenium_library.execute_async_javascript( 380 | resource('get_bounding_box.js'), 381 | 'ARGUMENTS', 382 | list(selectors), 383 | self.crop_margin, 384 | ) 385 | if len(dimensions) != 4: 386 | raise AssertionError( 387 | dimensions[0] + ' not found and no image was cropped', 388 | ) 389 | output_dir = BuiltIn().get_variable_value('${OUTPUT_DIR}') 390 | return self.crop_image(output_dir, filename, *dimensions) 391 | 392 | @keyword('Capture and crop page screenshot') 393 | def capture_and_crop_page_screenshot(self, filename, *locators): 394 | """Captures a page screenshot with the given ``filename`` and crops it to 395 | match the combined bounding box of the elements matching the given 396 | ``locators``. 397 | """ 398 | self.selenium_library.capture_page_screenshot(filename, ) 399 | return self.crop_page_screenshot(filename, *locators) 400 | 401 | @keyword('Capture viewport screenshot') 402 | def capture_viewport_screenshot(self, filename): 403 | """Captures a page screenshot with the given ``filename`` and crops it 404 | to match the current browser window dimensions and scroll position. 405 | """ 406 | assert self.bootstrap_jquery() 407 | dimensions = self.selenium_library.execute_async_javascript( 408 | resource('get_viewport_box.js'), 409 | ) 410 | self.selenium_library.capture_page_screenshot(filename, ) 411 | output_dir = BuiltIn().get_variable_value('${OUTPUT_DIR}') 412 | return self.crop_image(output_dir, filename, *dimensions) 413 | 414 | @keyword('Highlight') 415 | def highlight(self, locator, width=3, style='dotted', color='red'): 416 | """Adds a simple highlighting for the elements at the given 417 | ``locator``. 418 | """ 419 | return self.update_element_style( 420 | locator, 421 | 'outline', 422 | str(width) + 'px ' + style + ' ' + color, 423 | ) 424 | 425 | @keyword('Clear highlight') 426 | def clear_highlight(self, locator): 427 | """Clears the highlighting from the elements at the given ``locator``. 428 | """ 429 | return self.update_element_style( 430 | locator, 431 | 'outline', 432 | 'none', 433 | ) 434 | -------------------------------------------------------------------------------- /requirements-python3.nix: -------------------------------------------------------------------------------- 1 | # Generated by pip2nix 0.8.0.dev1 2 | # See https://github.com/johbo/pip2nix 3 | 4 | { pkgs, fetchurl, fetchgit, fetchhg }: 5 | 6 | self: super: { 7 | "MarkupSafe" = super.buildPythonPackage { 8 | name = "MarkupSafe-1.1.0"; 9 | doCheck = false; 10 | src = fetchurl { 11 | url = "https://files.pythonhosted.org/packages/ac/7e/1b4c2e05809a4414ebce0892fe1e32c14ace86ca7d50c70f00979ca9b3a3/MarkupSafe-1.1.0.tar.gz"; 12 | sha256 = "1lxirjypbdd3l9jl4vliilhfnhy7c7f2vlldqg1b0i74khn375sf"; 13 | }; 14 | }; 15 | "Send2Trash" = super.buildPythonPackage { 16 | name = "Send2Trash-1.5.0"; 17 | doCheck = false; 18 | src = fetchurl { 19 | url = "https://files.pythonhosted.org/packages/13/2e/ea40de0304bb1dc4eb309de90aeec39871b9b7c4bd30f1a3cdcb3496f5c0/Send2Trash-1.5.0.tar.gz"; 20 | sha256 = "1ci8vcwjmjlp11ljj1ckrfmml9fkq1mclx2gr53y4zvhgp01q030"; 21 | }; 22 | }; 23 | "atomicwrites" = super.buildPythonPackage { 24 | name = "atomicwrites-1.2.1"; 25 | doCheck = false; 26 | src = fetchurl { 27 | url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz"; 28 | sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc"; 29 | }; 30 | }; 31 | "attrs" = super.buildPythonPackage { 32 | name = "attrs-18.2.0"; 33 | doCheck = false; 34 | src = fetchurl { 35 | url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz"; 36 | sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh"; 37 | }; 38 | }; 39 | "backcall" = super.buildPythonPackage { 40 | name = "backcall-0.1.0"; 41 | doCheck = false; 42 | src = fetchurl { 43 | url = "https://files.pythonhosted.org/packages/84/71/c8ca4f5bb1e08401b916c68003acf0a0655df935d74d93bf3f3364b310e0/backcall-0.1.0.tar.gz"; 44 | sha256 = "1r01dqch3f8fdj3n6fviw8hxqrs6w5v0qw4izmvqzry1w9dxiv1q"; 45 | }; 46 | }; 47 | "bleach" = super.buildPythonPackage { 48 | name = "bleach-3.0.2"; 49 | doCheck = false; 50 | propagatedBuildInputs = [ 51 | self."six" 52 | self."webencodings" 53 | ]; 54 | src = fetchurl { 55 | url = "https://files.pythonhosted.org/packages/ae/31/680afc7d44040004296a2d8f0584983c2f2386448cd9d0964197e6c1160e/bleach-3.0.2.tar.gz"; 56 | sha256 = "06474zg7f73hv8h1xw2wcsmvn2ygj73zxgxxqg8zcx8ap1srdls8"; 57 | }; 58 | }; 59 | "decorator" = super.buildPythonPackage { 60 | name = "decorator-4.3.0"; 61 | doCheck = false; 62 | src = fetchurl { 63 | url = "https://files.pythonhosted.org/packages/6f/24/15a229626c775aae5806312f6bf1e2a73785be3402c0acdec5dbddd8c11e/decorator-4.3.0.tar.gz"; 64 | sha256 = "0308djallnh00v112y5b7nadl657ysmkp6vc8xn51d6yzc9zm7n3"; 65 | }; 66 | }; 67 | "defusedxml" = super.buildPythonPackage { 68 | name = "defusedxml-0.5.0"; 69 | doCheck = false; 70 | src = fetchurl { 71 | url = "https://files.pythonhosted.org/packages/74/ba/4ba4e89e21b5a2e267d80736ea674609a0a33cc4435a6d748ef04f1f9374/defusedxml-0.5.0.tar.gz"; 72 | sha256 = "1x54n0h8hl92vvwyymx883fbqpqjwn2mc8fb383bcg3z9zwz5mr4"; 73 | }; 74 | }; 75 | "docutils" = super.buildPythonPackage { 76 | name = "docutils-0.14"; 77 | doCheck = false; 78 | src = fetchurl { 79 | url = "https://files.pythonhosted.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz"; 80 | sha256 = "0x22fs3pdmr42kvz6c654756wja305qv6cx1zbhwlagvxgr4xrji"; 81 | }; 82 | }; 83 | "entrypoints" = super.buildPythonPackage { 84 | name = "entrypoints-0.2.3"; 85 | doCheck = false; 86 | src = fetchurl { 87 | url = "https://files.pythonhosted.org/packages/27/e8/607697e6ab8a961fc0b141a97ea4ce72cd9c9e264adeb0669f6d194aa626/entrypoints-0.2.3.tar.gz"; 88 | sha256 = "17q21k8igjb47b73jn4w6lgzza1nscn3sf1sn5gm96bgw3fqgmfj"; 89 | }; 90 | }; 91 | "flake8" = super.buildPythonPackage { 92 | name = "flake8-3.6.0"; 93 | doCheck = false; 94 | propagatedBuildInputs = [ 95 | self."mccabe" 96 | self."pycodestyle" 97 | self."pyflakes" 98 | self."setuptools" 99 | ]; 100 | src = fetchurl { 101 | url = "https://files.pythonhosted.org/packages/d0/27/c0d1274b86a8f71ec1a6e4d4c1cfe3b20d6f95b090ec7545320150952c93/flake8-3.6.0.tar.gz"; 102 | sha256 = "0w0nprx22rbvrrkbfx9v5jc5gskbm08g219l7r8wai8zfswgadba"; 103 | }; 104 | }; 105 | "flake8-blind-except" = super.buildPythonPackage { 106 | name = "flake8-blind-except-0.1.1"; 107 | doCheck = false; 108 | propagatedBuildInputs = [ 109 | self."setuptools" 110 | ]; 111 | src = fetchurl { 112 | url = "https://files.pythonhosted.org/packages/ff/f2/ab635e6e420e78c94eab50cd3f53abd3ec27e411793e50b14f29edbb9f0b/flake8-blind-except-0.1.1.tar.gz"; 113 | sha256 = "16g58mkr3fcn2vlfhp3rlahj93qswc7jd5qrqp748mc26dk3b8xc"; 114 | }; 115 | }; 116 | "flake8-coding" = super.buildPythonPackage { 117 | name = "flake8-coding-1.3.1"; 118 | doCheck = false; 119 | propagatedBuildInputs = [ 120 | self."flake8" 121 | ]; 122 | src = fetchurl { 123 | url = "https://files.pythonhosted.org/packages/f9/d7/889f7961ed549f15a280fa36edfc9b9016df38cd25cd0a8a7e4edc06efcf/flake8-coding-1.3.1.tar.gz"; 124 | sha256 = "0i7qh5wmwh5bgf1lgi82nq2n6qks2jgv8pvr27dgw4c7q0i2p72l"; 125 | }; 126 | }; 127 | "flake8-debugger" = super.buildPythonPackage { 128 | name = "flake8-debugger-3.1.0"; 129 | doCheck = false; 130 | propagatedBuildInputs = [ 131 | self."flake8" 132 | self."pycodestyle" 133 | ]; 134 | src = fetchurl { 135 | url = "https://files.pythonhosted.org/packages/39/4b/90548607282483dd15f9ce1f4434d735ae756e16e1faf60621b0f8877fcc/flake8-debugger-3.1.0.tar.gz"; 136 | sha256 = "15qxrb2d7sr0pf024fkknsx58aqa5iz38b9s0panv3zfwf6vhkxy"; 137 | }; 138 | }; 139 | "flake8-isort" = super.buildPythonPackage { 140 | name = "flake8-isort-2.6.0"; 141 | doCheck = false; 142 | propagatedBuildInputs = [ 143 | self."flake8" 144 | self."isort" 145 | self."testfixtures" 146 | ]; 147 | src = fetchurl { 148 | url = "https://files.pythonhosted.org/packages/85/fb/f2a33e47cf7520fd391e5f180cae5b8d2977ad7a5ddf897213137fe8a171/flake8-isort-2.6.0.tar.gz"; 149 | sha256 = "0ajz616bif7sc02pm6fd41qs0n3dsx4lby5jrkfdpqynbm07q41w"; 150 | }; 151 | }; 152 | "flake8-polyfill" = super.buildPythonPackage { 153 | name = "flake8-polyfill-1.0.2"; 154 | doCheck = false; 155 | propagatedBuildInputs = [ 156 | self."flake8" 157 | ]; 158 | src = fetchurl { 159 | url = "https://files.pythonhosted.org/packages/e6/67/1c26634a770db5c442e361311bee73cb3a177adb2eb3f7af8953cfd9f553/flake8-polyfill-1.0.2.tar.gz"; 160 | sha256 = "1nlf1mkqw856vi6782qcglqhaacb23khk9wkcgn55npnjxshhjz4"; 161 | }; 162 | }; 163 | "flake8-quotes" = super.buildPythonPackage { 164 | name = "flake8-quotes-1.0.0"; 165 | doCheck = false; 166 | propagatedBuildInputs = [ 167 | self."flake8" 168 | ]; 169 | src = fetchurl { 170 | url = "https://files.pythonhosted.org/packages/83/ff/0461010959158bb7d197691c696f1a85b20f2d3eea7aa23f73a8d07f30f3/flake8-quotes-1.0.0.tar.gz"; 171 | sha256 = "09ib440hrf5bbsmdbqzbcpkkqqnqdwkaawbqz93bbwxwifnjg4gx"; 172 | }; 173 | }; 174 | "future" = super.buildPythonPackage { 175 | name = "future-0.17.1"; 176 | doCheck = false; 177 | src = fetchurl { 178 | url = "https://files.pythonhosted.org/packages/90/52/e20466b85000a181e1e144fd8305caf2cf475e2f9674e797b222f8105f5f/future-0.17.1.tar.gz"; 179 | sha256 = "1f2rlqn9rh7adgir52dlbqz69gsab44x0mlm8gf1cs7xvhv54137"; 180 | }; 181 | }; 182 | "ipykernel" = super.buildPythonPackage { 183 | name = "ipykernel-5.1.0"; 184 | doCheck = false; 185 | propagatedBuildInputs = [ 186 | self."ipython" 187 | self."jupyter-client" 188 | self."tornado" 189 | self."traitlets" 190 | ]; 191 | src = fetchurl { 192 | url = "https://files.pythonhosted.org/packages/11/0b/95330660f8cc5d63428b9886c800ea8d68842fd866389cf579acca4915be/ipykernel-5.1.0.tar.gz"; 193 | sha256 = "0br95qhrd5k65g10djngiy27hs0642301hlf2q142i8djabvzh0g"; 194 | }; 195 | }; 196 | "ipython" = super.buildPythonPackage { 197 | name = "ipython-7.2.0"; 198 | doCheck = false; 199 | propagatedBuildInputs = [ 200 | self."backcall" 201 | self."decorator" 202 | self."jedi" 203 | self."pexpect" 204 | self."pickleshare" 205 | self."prompt-toolkit" 206 | self."pygments" 207 | self."setuptools" 208 | self."traitlets" 209 | ]; 210 | src = fetchurl { 211 | url = "https://files.pythonhosted.org/packages/42/bb/0ed1fb1d57d697326f9e9b827d9a74b81dee56031ed7c252bc716195ad7a/ipython-7.2.0.tar.gz"; 212 | sha256 = "04nxpgv05qizmwcr5swbndaizbwsj4lbjshjxhfkyiknkch9d53a"; 213 | }; 214 | }; 215 | "ipython-genutils" = super.buildPythonPackage { 216 | name = "ipython-genutils-0.2.0"; 217 | doCheck = false; 218 | src = fetchurl { 219 | url = "https://files.pythonhosted.org/packages/e8/69/fbeffffc05236398ebfcfb512b6d2511c622871dca1746361006da310399/ipython_genutils-0.2.0.tar.gz"; 220 | sha256 = "1a4bc9y8hnvq6cp08qs4mckgm6i6ajpndp4g496rvvzcfmp12bpb"; 221 | }; 222 | }; 223 | "ipywidgets" = super.buildPythonPackage { 224 | name = "ipywidgets-7.4.2"; 225 | doCheck = false; 226 | propagatedBuildInputs = [ 227 | self."ipykernel" 228 | self."ipython" 229 | self."nbformat" 230 | self."traitlets" 231 | self."widgetsnbextension" 232 | ]; 233 | src = fetchurl { 234 | url = "https://files.pythonhosted.org/packages/88/8d/c5d3ac1bdcd74c7327c733c9d02354ff12d7d72744f262ed1e26560962b2/ipywidgets-7.4.2.tar.gz"; 235 | sha256 = "18qbvygzii06ygwnrgjbqaqcmnssqlph96mb8xq7cgqn63s29qm3"; 236 | }; 237 | }; 238 | "isort" = super.buildPythonPackage { 239 | name = "isort-4.3.4"; 240 | doCheck = false; 241 | src = fetchurl { 242 | url = "https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz"; 243 | sha256 = "1y0yfv56cqyh9wyg7kxxv9y5wmfgcq18n7a49mp7xmzka2bhxi5r"; 244 | }; 245 | }; 246 | "jedi" = super.buildPythonPackage { 247 | name = "jedi-0.13.2"; 248 | doCheck = false; 249 | propagatedBuildInputs = [ 250 | self."parso" 251 | ]; 252 | src = fetchurl { 253 | url = "https://files.pythonhosted.org/packages/e4/83/4c05db437252694660c972b5374b35a68a8a0a8cd012dc95e5fd4d7e71b0/jedi-0.13.2.tar.gz"; 254 | sha256 = "1za944msp0f8x36qa8l309jhv0kzlsdh7r9nj3z12y8npnsh45sp"; 255 | }; 256 | }; 257 | "jinja2" = super.buildPythonPackage { 258 | name = "jinja2-2.10"; 259 | doCheck = false; 260 | propagatedBuildInputs = [ 261 | self."MarkupSafe" 262 | ]; 263 | src = fetchurl { 264 | url = "https://files.pythonhosted.org/packages/56/e6/332789f295cf22308386cf5bbd1f4e00ed11484299c5d7383378cf48ba47/Jinja2-2.10.tar.gz"; 265 | sha256 = "190l36hfw3wb2n3n68yacjabxyb1pnxwn7vjx96cmjj002xy2jzq"; 266 | }; 267 | }; 268 | "jsonschema" = super.buildPythonPackage { 269 | name = "jsonschema-3.0.0a3"; 270 | doCheck = false; 271 | propagatedBuildInputs = [ 272 | self."attrs" 273 | self."pyrsistent" 274 | self."six" 275 | ]; 276 | src = fetchurl { 277 | url = "https://files.pythonhosted.org/packages/47/e1/afd760aa29665e61142811ef6ea8b8f79e43574ac8427473a11f6e918a10/jsonschema-3.0.0a3.tar.gz"; 278 | sha256 = "0pkhsq91rhk6384p0jxjkhc9yml2ya2l0mysyq78sb4981h45n6z"; 279 | }; 280 | }; 281 | "jupyter" = super.buildPythonPackage { 282 | name = "jupyter-1.0.0"; 283 | doCheck = false; 284 | propagatedBuildInputs = [ 285 | self."ipykernel" 286 | self."ipywidgets" 287 | self."jupyter-console" 288 | self."nbconvert" 289 | self."notebook" 290 | self."qtconsole" 291 | ]; 292 | src = fetchurl { 293 | url = "https://files.pythonhosted.org/packages/c9/a9/371d0b8fe37dd231cf4b2cff0a9f0f25e98f3a73c3771742444be27f2944/jupyter-1.0.0.tar.gz"; 294 | sha256 = "0pwf3pminkzyzgx5kcplvvbvwrrzd3baa7lmh96f647k30rlpp6r"; 295 | }; 296 | }; 297 | "jupyter-client" = super.buildPythonPackage { 298 | name = "jupyter-client-5.2.4"; 299 | doCheck = false; 300 | propagatedBuildInputs = [ 301 | self."jupyter-core" 302 | self."python-dateutil" 303 | self."pyzmq" 304 | self."tornado" 305 | self."traitlets" 306 | ]; 307 | src = fetchurl { 308 | url = "https://files.pythonhosted.org/packages/e5/5c/f9b2182a445e3a6a8204daf04193154c474220f836dbcedc7d139276600e/jupyter_client-5.2.4.tar.gz"; 309 | sha256 = "0l9mh7ccrpl3lppym3dnky8n1nk7xarzzdcxf4q2s7aw203cpydm"; 310 | }; 311 | }; 312 | "jupyter-console" = super.buildPythonPackage { 313 | name = "jupyter-console-6.0.0"; 314 | doCheck = false; 315 | propagatedBuildInputs = [ 316 | self."ipykernel" 317 | self."ipython" 318 | self."jupyter-client" 319 | self."prompt-toolkit" 320 | self."pygments" 321 | ]; 322 | src = fetchurl { 323 | url = "https://files.pythonhosted.org/packages/92/c8/b7e768a3dec19b09d8ad5296a479e03c19a741a1bb4abab27c09236b8562/jupyter_console-6.0.0.tar.gz"; 324 | sha256 = "1xdjw11cppf1fxvwkw2bk13ckkwas3bdah8baingn9296mvfi31h"; 325 | }; 326 | }; 327 | "jupyter-core" = super.buildPythonPackage { 328 | name = "jupyter-core-4.4.0"; 329 | doCheck = false; 330 | propagatedBuildInputs = [ 331 | self."traitlets" 332 | ]; 333 | src = fetchurl { 334 | url = "https://files.pythonhosted.org/packages/b6/2d/2804f4de3a95583f65e5dcb4d7c8c7183124882323758996e867f47e72af/jupyter_core-4.4.0.tar.gz"; 335 | sha256 = "1dy083rarba8prn9f9srxq3c7n7vyql02ycrqq306c40lr57aw5s"; 336 | }; 337 | }; 338 | "jupyterlab" = super.buildPythonPackage { 339 | name = "jupyterlab-0.35.4"; 340 | doCheck = false; 341 | propagatedBuildInputs = [ 342 | self."jupyterlab-server" 343 | self."notebook" 344 | ]; 345 | src = fetchurl { 346 | url = "https://files.pythonhosted.org/packages/39/4f/e8f51e797e6c4a580551141a9cc9ef38235d0cc3b1920d8bb3bacb58c927/jupyterlab-0.35.4.tar.gz"; 347 | sha256 = "0mdlzsgn4brvbrnmhqar05rm356m27znndk15kbwl3v40cl0pfny"; 348 | }; 349 | }; 350 | "jupyterlab-server" = super.buildPythonPackage { 351 | name = "jupyterlab-server-0.2.0"; 352 | doCheck = false; 353 | propagatedBuildInputs = [ 354 | self."jsonschema" 355 | self."notebook" 356 | ]; 357 | src = fetchurl { 358 | url = "https://files.pythonhosted.org/packages/b6/8c/5013d8e1e1c9cac3754344cc1d8693de6021cb717569bf18c455555558f4/jupyterlab_server-0.2.0.tar.gz"; 359 | sha256 = "10xp3f6ixak5srdclpggc0kinvaacvcgdpl5p36q1a2p76kidnbj"; 360 | }; 361 | }; 362 | "lunr" = super.buildPythonPackage { 363 | name = "lunr-0.5.4"; 364 | doCheck = false; 365 | propagatedBuildInputs = [ 366 | self."future" 367 | self."six" 368 | ]; 369 | src = fetchurl { 370 | url = "https://files.pythonhosted.org/packages/a9/a2/d73f932f990e37410a333e8d6de17064cfc07aac90fad15399a368c00b39/lunr-0.5.4.tar.gz"; 371 | sha256 = "11r30vr46savspdk31qmw1xk5f6v7j135aqxadc1f3bdfyk58lhq"; 372 | }; 373 | }; 374 | "mccabe" = super.buildPythonPackage { 375 | name = "mccabe-0.6.1"; 376 | doCheck = false; 377 | src = fetchurl { 378 | url = "https://files.pythonhosted.org/packages/06/18/fa675aa501e11d6d6ca0ae73a101b2f3571a565e0f7d38e062eec18a91ee/mccabe-0.6.1.tar.gz"; 379 | sha256 = "07w3p1qm44hgxf3vvwz84kswpsx6s7kvaibzrsx5dzm0hli1i3fx"; 380 | }; 381 | }; 382 | "mistune" = super.buildPythonPackage { 383 | name = "mistune-0.8.4"; 384 | doCheck = false; 385 | src = fetchurl { 386 | url = "https://files.pythonhosted.org/packages/2d/a4/509f6e7783ddd35482feda27bc7f72e65b5e7dc910eca4ab2164daf9c577/mistune-0.8.4.tar.gz"; 387 | sha256 = "0vkmsh0x480rni51lhyvigfdf06b9247z868pk3bal1wnnfl58sr"; 388 | }; 389 | }; 390 | "more-itertools" = super.buildPythonPackage { 391 | name = "more-itertools-5.0.0"; 392 | doCheck = false; 393 | propagatedBuildInputs = [ 394 | self."six" 395 | ]; 396 | src = fetchurl { 397 | url = "https://files.pythonhosted.org/packages/dd/26/30fc0d541d9fdf55faf5ba4b0fd68f81d5bd2447579224820ad525934178/more-itertools-5.0.0.tar.gz"; 398 | sha256 = "1r12cm6mcdwdzz7d47a6g4l437xsvapdlgyhqay3i2nrlv03da9q"; 399 | }; 400 | }; 401 | "nbconvert" = super.buildPythonPackage { 402 | name = "nbconvert-5.4.0"; 403 | doCheck = false; 404 | propagatedBuildInputs = [ 405 | self."bleach" 406 | self."defusedxml" 407 | self."entrypoints" 408 | self."jinja2" 409 | self."jupyter-core" 410 | self."mistune" 411 | self."nbformat" 412 | self."pandocfilters" 413 | self."pygments" 414 | self."testpath" 415 | self."traitlets" 416 | ]; 417 | src = fetchurl { 418 | url = "https://files.pythonhosted.org/packages/88/68/0417164f344ad702245424d8f998b5c99f1c6147ad1ad645a465ae932134/nbconvert-5.4.0.tar.gz"; 419 | sha256 = "01vqq099xk4mr6i27r9p4grkfwvbmw2575yva29am4i5jygp98m8"; 420 | }; 421 | }; 422 | "nbformat" = super.buildPythonPackage { 423 | name = "nbformat-4.4.0"; 424 | doCheck = false; 425 | propagatedBuildInputs = [ 426 | self."ipython-genutils" 427 | self."jsonschema" 428 | self."jupyter-core" 429 | self."traitlets" 430 | ]; 431 | src = fetchurl { 432 | url = "https://files.pythonhosted.org/packages/6e/0e/160754f7ae3e984863f585a3743b0ed1702043a81245907c8fae2d537155/nbformat-4.4.0.tar.gz"; 433 | sha256 = "00nlf08h8yc4q73nphfvfhxrcnilaqanb8z0mdy6nxk0vzq4wjgp"; 434 | }; 435 | }; 436 | "notebook" = super.buildPythonPackage { 437 | name = "notebook-5.7.4"; 438 | doCheck = false; 439 | propagatedBuildInputs = [ 440 | self."Send2Trash" 441 | self."ipykernel" 442 | self."ipython-genutils" 443 | self."jinja2" 444 | self."jupyter-client" 445 | self."jupyter-core" 446 | self."nbconvert" 447 | self."nbformat" 448 | self."prometheus-client" 449 | self."pyzmq" 450 | self."terminado" 451 | self."tornado" 452 | self."traitlets" 453 | ]; 454 | src = fetchurl { 455 | url = "https://files.pythonhosted.org/packages/6e/22/b5dcce67559d63d0f22e46d806305710808c698a1b91c07eb09e389785e0/notebook-5.7.4.tar.gz"; 456 | sha256 = "0jm7324mbxljmn9hgapj66q7swyz5ai92blmr0jpcy0h80x6f26r"; 457 | }; 458 | }; 459 | "pandocfilters" = super.buildPythonPackage { 460 | name = "pandocfilters-1.4.2"; 461 | doCheck = false; 462 | src = fetchurl { 463 | url = "https://files.pythonhosted.org/packages/4c/ea/236e2584af67bb6df960832731a6e5325fd4441de001767da328c33368ce/pandocfilters-1.4.2.tar.gz"; 464 | sha256 = "1a8d9b7s48gmq9zj0pmbyv2sivn5i7m6mybgpkk4jm5vd7hp1pdk"; 465 | }; 466 | }; 467 | "parso" = super.buildPythonPackage { 468 | name = "parso-0.3.1"; 469 | doCheck = false; 470 | src = fetchurl { 471 | url = "https://files.pythonhosted.org/packages/46/31/60de7c9cbb97cac56b193a5b61a1fd4d21df84843a570b370ec34781316b/parso-0.3.1.tar.gz"; 472 | sha256 = "18p89iwcm8mnf380f92g9w0bhx5km8wxp392vvjcq4y1ld1llw1m"; 473 | }; 474 | }; 475 | "pexpect" = super.buildPythonPackage { 476 | name = "pexpect-4.6.0"; 477 | doCheck = false; 478 | propagatedBuildInputs = [ 479 | self."ptyprocess" 480 | ]; 481 | src = fetchurl { 482 | url = "https://files.pythonhosted.org/packages/89/43/07d07654ee3e25235d8cea4164cdee0ec39d1fda8e9203156ebe403ffda4/pexpect-4.6.0.tar.gz"; 483 | sha256 = "1fla85g47iaxxpjhp9vkxdnv4pgc7rplfy6ja491smrrk0jqi3ia"; 484 | }; 485 | }; 486 | "pickleshare" = super.buildPythonPackage { 487 | name = "pickleshare-0.7.5"; 488 | doCheck = false; 489 | src = fetchurl { 490 | url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz"; 491 | sha256 = "1jmghg3c53yp1i8cm6pcrm280ayi8621rwyav9fac7awjr3kss47"; 492 | }; 493 | }; 494 | "pillow" = super.buildPythonPackage { 495 | name = "pillow-5.3.0"; 496 | doCheck = false; 497 | src = fetchurl { 498 | url = "https://files.pythonhosted.org/packages/1b/e1/1118d60e9946e4e77872b69c58bc2f28448ec02c99a2ce456cd1a272c5fd/Pillow-5.3.0.tar.gz"; 499 | sha256 = "14sgpkwccpkdnr9p1d1sw29ki3fdld4j773mibg4763psmy538rf"; 500 | }; 501 | }; 502 | "pluggy" = super.buildPythonPackage { 503 | name = "pluggy-0.8.0"; 504 | doCheck = false; 505 | src = fetchurl { 506 | url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz"; 507 | sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4"; 508 | }; 509 | }; 510 | "prometheus-client" = super.buildPythonPackage { 511 | name = "prometheus-client-0.5.0"; 512 | doCheck = false; 513 | src = fetchurl { 514 | url = "https://files.pythonhosted.org/packages/bc/e1/3cddac03c8992815519c5f50493097f6508fa153d067b494db8ab5e9c4ce/prometheus_client-0.5.0.tar.gz"; 515 | sha256 = "0g7rpv1pq2lab1nfqdx98z9d3bqwc400alg1j4ynrpjkrbsizhg8"; 516 | }; 517 | }; 518 | "prompt-toolkit" = super.buildPythonPackage { 519 | name = "prompt-toolkit-2.0.7"; 520 | doCheck = false; 521 | propagatedBuildInputs = [ 522 | self."six" 523 | self."wcwidth" 524 | ]; 525 | src = fetchurl { 526 | url = "https://files.pythonhosted.org/packages/d9/a5/4b2dd1a05403e34c3ba0d9c00f237c01967c0a4f59a427c9b241129cdfe4/prompt_toolkit-2.0.7.tar.gz"; 527 | sha256 = "0fgacqk73w7s932vy46pan2yp8rvjmlkag20xvaydh9mhf6h85zx"; 528 | }; 529 | }; 530 | "ptyprocess" = super.buildPythonPackage { 531 | name = "ptyprocess-0.6.0"; 532 | doCheck = false; 533 | src = fetchurl { 534 | url = "https://files.pythonhosted.org/packages/7d/2d/e4b8733cf79b7309d84c9081a4ab558c89d8c89da5961bf4ddb050ca1ce0/ptyprocess-0.6.0.tar.gz"; 535 | sha256 = "1h4lcd3w5nrxnsk436ar7fwkiy5rfn5wj2xwy9l0r4mdqnf2jgwj"; 536 | }; 537 | }; 538 | "py" = super.buildPythonPackage { 539 | name = "py-1.7.0"; 540 | doCheck = false; 541 | src = fetchurl { 542 | url = "https://files.pythonhosted.org/packages/c7/fa/eb6dd513d9eb13436e110aaeef9a1703437a8efa466ce6bb2ff1d9217ac7/py-1.7.0.tar.gz"; 543 | sha256 = "152nyjvd8phqbm9pwlnfx0xi4c6343hakjzg42sp4qw3k1qn74mz"; 544 | }; 545 | }; 546 | "pycodestyle" = super.buildPythonPackage { 547 | name = "pycodestyle-2.4.0"; 548 | doCheck = false; 549 | src = fetchurl { 550 | url = "https://files.pythonhosted.org/packages/28/ad/cae9654d7fd64eb3d2ab2c44c9bf8dc5bd4fb759625beab99532239aa6e8/pycodestyle-2.4.0.tar.gz"; 551 | sha256 = "0fhy4vnlgpjq4qd1wdnl6pvdw7rah0ypmn8c9mkhz8clsndskz6b"; 552 | }; 553 | }; 554 | "pyflakes" = super.buildPythonPackage { 555 | name = "pyflakes-2.0.0"; 556 | doCheck = false; 557 | src = fetchurl { 558 | url = "https://files.pythonhosted.org/packages/92/9e/386c0d9deef14996eb90d9deebbcb9d3ceb70296840b09615cb61b2ae231/pyflakes-2.0.0.tar.gz"; 559 | sha256 = "0jba28czyvimdc72llms3f17swp3i8jdcabf5w0j00adfbn64xls"; 560 | }; 561 | }; 562 | "pygments" = super.buildPythonPackage { 563 | name = "pygments-2.3.1"; 564 | doCheck = false; 565 | src = fetchurl { 566 | url = "https://files.pythonhosted.org/packages/64/69/413708eaf3a64a6abb8972644e0f20891a55e621c6759e2c3f3891e05d63/Pygments-2.3.1.tar.gz"; 567 | sha256 = "0ji87g09jph8jqcvclgb02qvxasdnr9pzvk90rl66d90yqcxmyjz"; 568 | }; 569 | }; 570 | "pyrsistent" = super.buildPythonPackage { 571 | name = "pyrsistent-0.14.8"; 572 | doCheck = false; 573 | propagatedBuildInputs = [ 574 | self."six" 575 | ]; 576 | src = fetchurl { 577 | url = "https://files.pythonhosted.org/packages/b8/63/7c1cb7359d3c4170bc5415d9d204b2f37b7f09bea8982f125d905833192b/pyrsistent-0.14.8.tar.gz"; 578 | sha256 = "0qmwid31090gwb2f82xx5icyqb7dyjl9m5mjj9c534y27b1hr22r"; 579 | }; 580 | }; 581 | "pytest" = super.buildPythonPackage { 582 | name = "pytest-4.0.2"; 583 | doCheck = false; 584 | propagatedBuildInputs = [ 585 | self."atomicwrites" 586 | self."attrs" 587 | self."more-itertools" 588 | self."pluggy" 589 | self."py" 590 | self."setuptools" 591 | self."six" 592 | ]; 593 | src = fetchurl { 594 | url = "https://files.pythonhosted.org/packages/9d/a9/3688b67467527c25e7a4d02c3b22565f15158a0a5d681870bfda8af210c6/pytest-4.0.2.tar.gz"; 595 | sha256 = "1sgq8nm7yb9ygapdjgn52zr0ny47gps5dpa86d08aiccq4pvz2gn"; 596 | }; 597 | }; 598 | "pytest-runner" = super.buildPythonPackage { 599 | name = "pytest-runner-4.2"; 600 | doCheck = false; 601 | src = fetchurl { 602 | url = "https://files.pythonhosted.org/packages/9e/b7/fe6e8f87f9a756fd06722216f1b6698ccba4d269eac6329d9f0c441d0f93/pytest-runner-4.2.tar.gz"; 603 | sha256 = "1gkpyphawxz38ni1gdq1fmwyqcg02m7ypzqvv46z06crwdxi2gyj"; 604 | }; 605 | }; 606 | "python-dateutil" = super.buildPythonPackage { 607 | name = "python-dateutil-2.7.5"; 608 | doCheck = false; 609 | propagatedBuildInputs = [ 610 | self."six" 611 | ]; 612 | src = fetchurl { 613 | url = "https://files.pythonhosted.org/packages/0e/01/68747933e8d12263d41ce08119620d9a7e5eb72c876a3442257f74490da0/python-dateutil-2.7.5.tar.gz"; 614 | sha256 = "00ngwcdw36w5b37b51mdwn3qxid9zdf3kpffv2q6n9kl05y2iyc8"; 615 | }; 616 | }; 617 | "pyzmq" = super.buildPythonPackage { 618 | name = "pyzmq-17.1.2"; 619 | doCheck = false; 620 | src = fetchurl { 621 | url = "https://files.pythonhosted.org/packages/b9/6a/bc9277b78f5c3236e36b8c16f4d2701a7fd4fa2eb697159d3e0a3a991573/pyzmq-17.1.2.tar.gz"; 622 | sha256 = "1pyxxrz60f88ffm0y6vpbx3q8jcr9ybz8fcilihwzwhh36n84ax7"; 623 | }; 624 | }; 625 | "qtconsole" = super.buildPythonPackage { 626 | name = "qtconsole-4.4.3"; 627 | doCheck = false; 628 | propagatedBuildInputs = [ 629 | self."ipykernel" 630 | self."ipython-genutils" 631 | self."jupyter-client" 632 | self."jupyter-core" 633 | self."pygments" 634 | self."traitlets" 635 | ]; 636 | src = fetchurl { 637 | url = "https://files.pythonhosted.org/packages/77/ab/43b1f5e27d712d9b7bb599afff32686465c32765e14f05a5c92b991b706d/qtconsole-4.4.3.tar.gz"; 638 | sha256 = "1b03n1ixzscm0jw97l4dq5iy4fslnqxq5bb8287xb7n2a1gs26xw"; 639 | }; 640 | }; 641 | "robotframework" = super.buildPythonPackage { 642 | name = "robotframework-3.1"; 643 | doCheck = false; 644 | src = fetchurl { 645 | url = "https://files.pythonhosted.org/packages/dc/c9/34687fa751f6b3ad1a4b5b35f5ae1371b1c1b01e95007fbb03ac0732dc67/robotframework-3.1.zip"; 646 | sha256 = "09r1rng8pngcfqmsnbl9d1dfvac2yx7zgjlym59zy0j4y70sb2xj"; 647 | }; 648 | }; 649 | "robotframework-seleniumlibrary" = super.buildPythonPackage { 650 | name = "robotframework-seleniumlibrary-3.3.0"; 651 | doCheck = false; 652 | propagatedBuildInputs = [ 653 | self."robotframework" 654 | self."selenium" 655 | ]; 656 | src = fetchurl { 657 | url = "https://files.pythonhosted.org/packages/ec/44/d6efee0ea0bff85cf5618327184f8342659d338f98e8f71e0deb04542f95/robotframework-seleniumlibrary-3.3.0.tar.gz"; 658 | sha256 = "1yrqm9sjkc9zcy2djvdx3aqslvpwv3p15q5fizyljig0qif9inda"; 659 | }; 660 | }; 661 | "robotkernel" = super.buildPythonPackage { 662 | name = "robotkernel-0.9.0"; 663 | doCheck = false; 664 | propagatedBuildInputs = [ 665 | self."docutils" 666 | self."ipykernel" 667 | self."lunr" 668 | self."nbformat" 669 | self."pillow" 670 | self."pygments" 671 | self."robotframework" 672 | ]; 673 | src = fetchurl { 674 | url = "https://files.pythonhosted.org/packages/4d/14/4468f42869c575d23af4f2dec22c665e483e4c8047fca239213fe25b429b/robotkernel-0.9.0.tar.gz"; 675 | sha256 = "1y7yc1xiyccwr25qk6i94zy4406hrib6l1wn6i9r3ij3fkn01yfi"; 676 | }; 677 | }; 678 | "selenium" = super.buildPythonPackage { 679 | name = "selenium-3.141.0"; 680 | doCheck = false; 681 | propagatedBuildInputs = [ 682 | self."urllib3" 683 | ]; 684 | src = fetchurl { 685 | url = "https://files.pythonhosted.org/packages/ed/9c/9030520bf6ff0b4c98988448a93c04fcbd5b13cd9520074d8ed53569ccfe/selenium-3.141.0.tar.gz"; 686 | sha256 = "039hf9knvl4s3hp21bzwsp1g5ri9gxsh504dp48lc6nr1av35byy"; 687 | }; 688 | }; 689 | "setuptools" = super.buildPythonPackage { 690 | name = "setuptools-40.6.3"; 691 | doCheck = false; 692 | src = fetchurl { 693 | url = "https://files.pythonhosted.org/packages/37/1b/b25507861991beeade31473868463dad0e58b1978c209de27384ae541b0b/setuptools-40.6.3.zip"; 694 | sha256 = "1y085dnk574sxw9aymdng9gijvrsbw86hsv9hqnhv7y4d6nlsirv"; 695 | }; 696 | }; 697 | "setuptools-scm" = super.buildPythonPackage { 698 | name = "setuptools-scm-3.1.0"; 699 | doCheck = false; 700 | src = fetchurl { 701 | url = "https://files.pythonhosted.org/packages/09/b4/d148a70543b42ff3d81d57381f33104f32b91f970ad7873f463e75bf7453/setuptools_scm-3.1.0.tar.gz"; 702 | sha256 = "0h4bglwfz8b9prqljv8z3w9rgydfyxzaj05bm1y6zs5m6shz548i"; 703 | }; 704 | }; 705 | "six" = super.buildPythonPackage { 706 | name = "six-1.12.0"; 707 | doCheck = false; 708 | src = fetchurl { 709 | url = "https://files.pythonhosted.org/packages/dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca/six-1.12.0.tar.gz"; 710 | sha256 = "0wxs1q74v07ssjywbbm7x6h5v9qx209ld2yfsif4060sxi0h2sni"; 711 | }; 712 | }; 713 | "terminado" = super.buildPythonPackage { 714 | name = "terminado-0.8.1"; 715 | doCheck = false; 716 | propagatedBuildInputs = [ 717 | self."ptyprocess" 718 | self."tornado" 719 | ]; 720 | src = fetchurl { 721 | url = "https://files.pythonhosted.org/packages/67/84/ce0ebd0f60e1cbe040f8e065eef7063855d59d9cf5e6438b3f8439fc7e15/terminado-0.8.1.tar.gz"; 722 | sha256 = "0yh69k6579g848rmjyllb5h75pkvgcy27r1l3yzgkf33wnnzkasm"; 723 | }; 724 | }; 725 | "testfixtures" = super.buildPythonPackage { 726 | name = "testfixtures-6.4.1"; 727 | doCheck = false; 728 | src = fetchurl { 729 | url = "https://files.pythonhosted.org/packages/16/1c/0b694fbfd318e325888c3ac16776e9d1df452a90693d1d3734a5256fc793/testfixtures-6.4.1.tar.gz"; 730 | sha256 = "0aa8jikyj2pl94b5i58ncs8dh44a53m66d3x2lprr04902gbah5h"; 731 | }; 732 | }; 733 | "testpath" = super.buildPythonPackage { 734 | name = "testpath-0.4.2"; 735 | doCheck = false; 736 | src = fetchurl { 737 | url = "https://files.pythonhosted.org/packages/06/30/9a7e917066d851d8b4117e85794b5f14516419ea714a8a2681ec6aa8a981/testpath-0.4.2.tar.gz"; 738 | sha256 = "1y40hywscnnyb734pnzm55nd8r8kp1072bjxbil83gcd53cv755n"; 739 | }; 740 | }; 741 | "tornado" = super.buildPythonPackage { 742 | name = "tornado-5.1.1"; 743 | doCheck = false; 744 | src = fetchurl { 745 | url = "https://files.pythonhosted.org/packages/e6/78/6e7b5af12c12bdf38ca9bfe863fcaf53dc10430a312d0324e76c1e5ca426/tornado-5.1.1.tar.gz"; 746 | sha256 = "02clqk2116jbnq8lnaqmdw3p52nqrd9ib59r4xz2ll43fpcmhlaf"; 747 | }; 748 | }; 749 | "traitlets" = super.buildPythonPackage { 750 | name = "traitlets-4.3.2"; 751 | doCheck = false; 752 | propagatedBuildInputs = [ 753 | self."decorator" 754 | self."ipython-genutils" 755 | self."six" 756 | ]; 757 | src = fetchurl { 758 | url = "https://files.pythonhosted.org/packages/a5/98/7f5ef2fe9e9e071813aaf9cb91d1a732e0a68b6c44a32b38cb8e14c3f069/traitlets-4.3.2.tar.gz"; 759 | sha256 = "0dbq7sx26xqz5ixs711k5nc88p8a0nqyz6162pwks5dpcz9d4jww"; 760 | }; 761 | }; 762 | "urllib3" = super.buildPythonPackage { 763 | name = "urllib3-1.24.1"; 764 | doCheck = false; 765 | src = fetchurl { 766 | url = "https://files.pythonhosted.org/packages/b1/53/37d82ab391393565f2f831b8eedbffd57db5a718216f82f1a8b4d381a1c1/urllib3-1.24.1.tar.gz"; 767 | sha256 = "08lwd9f3hqznyf32vnzwvp87pchx062nkbgyrf67rwlkgj0jk5fy"; 768 | }; 769 | }; 770 | "wcwidth" = super.buildPythonPackage { 771 | name = "wcwidth-0.1.7"; 772 | doCheck = false; 773 | src = fetchurl { 774 | url = "https://files.pythonhosted.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz"; 775 | sha256 = "0pn6dflzm609m4r3i8ik5ni9ijjbb5fa3vg1n7hn6vkd49r77wrx"; 776 | }; 777 | }; 778 | "webencodings" = super.buildPythonPackage { 779 | name = "webencodings-0.5.1"; 780 | doCheck = false; 781 | src = fetchurl { 782 | url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz"; 783 | sha256 = "08qrgrc4hrximb2gqnl69g01s93rhf2842jfxdjljc1dbwj1qsmk"; 784 | }; 785 | }; 786 | "widgetsnbextension" = super.buildPythonPackage { 787 | name = "widgetsnbextension-3.4.2"; 788 | doCheck = false; 789 | propagatedBuildInputs = [ 790 | self."notebook" 791 | ]; 792 | src = fetchurl { 793 | url = "https://files.pythonhosted.org/packages/cb/37/ec01aac3e510645959795337bf652155cd7efb28aecc940b0773e8ba8e4d/widgetsnbextension-3.4.2.tar.gz"; 794 | sha256 = "0rc2nivdy7k4m3vljx7wdh2jh11djapcgwhvzlbs0isl8gl8nqgs"; 795 | }; 796 | }; 797 | "yapf" = super.buildPythonPackage { 798 | name = "yapf-0.25.0"; 799 | doCheck = false; 800 | src = fetchurl { 801 | url = "https://files.pythonhosted.org/packages/2a/78/066d92807c532b4bdbfece8fcb5a20130df0476dfa924d6108f72f4efabf/yapf-0.25.0.tar.gz"; 802 | sha256 = "0mbdyhqwlm4pcd0wr5haxypxm0kr8y46nc17696xmd4pvfmzk9wa"; 803 | }; 804 | }; 805 | } 806 | --------------------------------------------------------------------------------