Skip to content

Instantly share code, notes, and snippets.

@datakurre
Last active November 19, 2018 16:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save datakurre/681bd6ca3e7baaff96104e90e84702df to your computer and use it in GitHub Desktop.
Save datakurre/681bd6ca3e7baaff96104e90e84702df to your computer and use it in GitHub Desktop.
RobotKernel Jupyter notebook
{ pkgs ? import <nixpkgs> {}
, pythonPackages ? pkgs.python36Packages
}:
with pkgs;
let self = rec {
# patches
robot_mode = ./robotframework.js;
notebook = pythonPackages.notebook.overridePythonAttrs(old: {
postInstall = ''
ls $out/${pythonPackages.python.sitePackages}/notebook/static/components/codemirror/mode/
mkdir $out/${pythonPackages.python.sitePackages}/notebook/static/components/codemirror/mode/robotframework
cp ${robot_mode} $out/${pythonPackages.python.sitePackages}/notebook/static/components/codemirror/mode/robotframework/robotframework.js
'';
doCheck = false;
});
# kernels
python36_with_packages = python36.buildEnv.override {
extraLibs = with python36Packages; [
iplantuml
ipykernel
ipywidgets
lti
magic
requests
];
};
python36_kernel = stdenv.mkDerivation rec {
name = "python36";
buildInputs = [ python36_with_packages ];
json = builtins.toJSON {
argv = [ "${python36_with_packages}/bin/python3.6"
"-m" "ipykernel" "-f" "{connection_file}" ];
display_name = "Python 3.6";
language = "python";
env = { PYTHONPATH = ""; };
};
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
mkdir -p $out
cat > $out/kernel.json << EOF
$json
EOF
'';
};
lti = pythonPackages.buildPythonPackage rec {
pname = "lti";
version = "0.9.2";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "0k9d6ii7wf0iym0jspw0bpc4vvkk7xz7wibvmbzjjzn5rrnb3ak4";
};
propagatedBuildInputs = with pythonPackages; [
lxml
requests_oauthlib
];
doCheck = false;
};
iplantuml = pythonPackages.buildPythonPackage rec {
pname = "IPlantUML";
version = "0.1.1";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "0p1w48iik5cl137b4xy3g5x52wl5b9fayxlr97bzd5v65dqxz1hg";
};
buildInputs = with pythonPackages; [ notebook ];
propagatedBuildInputs = [
plantweb
plantuml
];
doCheck = false;
};
plantweb = pythonPackages.buildPythonPackage rec {
pname = "plantweb";
version = "1.1.0";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "1974022rpmwjg1amc7k8n3274bfj0vychd5c81r6q4mm02kysksz";
};
propagatedBuildInputs = with pythonPackages; [
docutils
requests
];
};
robot_with_packages = buildEnv {
name = "robotkernel";
paths = [
pkgs.geckodriver
(import ./setup.nix {
inherit pkgs pythonPackages;
}).env
];
};
robot_kernel = stdenv.mkDerivation rec {
name = "robot";
buildInputs = [ robot_with_packages ];
json = builtins.toJSON {
argv = [ "${robot_with_packages}/bin/python3.6"
"-m" "robotkernel" "-f" "{connection_file}" ];
display_name = "Robot Framework";
language = "robotframework";
env = { PYTHONPATH = ""; };
};
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
mkdir -p $out
cat > $out/kernel.json << EOF
$json
EOF
'';
};
# extensions
rise = pythonPackages.buildPythonPackage rec {
pname = "rise";
version = "5.1.0";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "0b5rimnzd6zkgs7f286vr58a5rlzv275zd49xw48mn4dc06wfpz9";
};
buildInputs = [ notebook ];
postPatch = ''
sed -i "s|README.md'|README.md', encoding='utf-8'|" setup.py
'';
};
jupyter_nbextensions_configurator = pythonPackages.buildPythonPackage rec {
pname = "jupyter_nbextensions_configurator";
version = "0.3.0";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "11qq1di2gas8r302xpa0h2xndd5qgrz4a77myd2bd43c0grffa6b";
};
doCheck = false;
installFlags = [ "--no-dependencies" ];
propagatedBuildInputs = with pythonPackages; [ pyyaml ];
};
jupyter_contrib_nbextensions = pythonPackages.buildPythonPackage rec {
pname = "jupyter_contrib_nbextensions";
version = "0.3.3";
name = "${pname}-${version}";
src = pkgs.fetchurl {
url = "mirror://pypi/${builtins.substring 0 1 pname}/${pname}/${name}.tar.gz";
sha256 = "0v730d5sqx6g106ii5r08mghbmbqi12pm6mpvjc0vsx703syd83f";
};
doCheck = false;
installFlags = [ "--no-dependencies" ];
propagatedBuildInputs = with pythonPackages; [ lxml ];
};
vim_binding = fetchFromGitHub {
owner = "lambdalisue";
repo = "jupyter-vim-binding";
rev = "c9822c753b6acad8b1084086d218eb4ce69950e9";
sha256 = "1951wnf0k91h07nfsz8rr0c9nw68dbyflkjvw5pbx9dmmzsa065j";
};
# notebook
jupyter = pythonPackages.jupyter.overridePythonAttrs (old: {
propagatedBuildInputs = old.propagatedBuildInputs ++ [
jupyter_contrib_nbextensions
jupyter_nbextensions_configurator
rise
];
postInstall = with pythonPackages; ''
mkdir -p $out/bin
ln -s ${jupyter_core}/bin/jupyter $out/bin
wrapProgram $out/bin/jupyter \
--prefix PYTHONPATH : "${notebook}/${python.sitePackages}:$PYTHONPATH" \
--prefix PATH : "${notebook}/bin:$PATH"
'';
});
jupyter_nbconfig = stdenv.mkDerivation rec {
name = "jupyter";
json = builtins.toJSON {
load_extensions = {
"rise/main" = true;
"python-markdown/main" = true;
"vim_binding/vim_binding" = true;
};
keys = {
command = {
bind = {
"Ctrl-7" = "RISE:toggle-slide";
"Ctrl-8" = "RISE:toggle-subslide";
"Ctrl-9" = "RISE:toggle-fragment";
};
};
};
};
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup
mkdir -p $out
cat > $out/notebook.json << EOF
$json
EOF
'';
};
jupyter_config_dir = stdenv.mkDerivation {
name = "jupyter";
buildInputs = [
python36_kernel
robot_kernel
rise
vim_binding
];
builder = writeText "builder.sh" ''
source $stdenv/setup
mkdir -p $out/etc/jupyter/nbextensions
mkdir -p $out/etc/jupyter/kernels
mkdir -p $out/etc/jupyter/migrated
ln -s ${python36_kernel} $out/etc/jupyter/kernels/${python36_kernel.name}
ln -s ${robot_kernel} $out/etc/jupyter/kernels/${robot_kernel.name}
ln -s ${jupyter_nbconfig} $out/etc/jupyter/nbconfig
ln -s ${jupyter_contrib_nbextensions}/${pythonPackages.python.sitePackages}/jupyter_contrib_nbextensions/nbextensions/* $out/etc/jupyter/nbextensions
ln -s ${rise}/${pythonPackages.python.sitePackages}/rise/static $out/etc/jupyter/nbextensions/rise
ln -s ${vim_binding} $out/etc/jupyter/nbextensions/vim_binding
cat > $out/etc/jupyter/jupyter_notebook_config.py << EOF
import os
import rise
c.KernelSpecManager.whitelist = {
'${python36_kernel.name}',
'${robot_kernel.name}'
}
c.NotebookApp.ip = os.environ.get('JUPYTER_NOTEBOOK_IP', 'localhost')
EOF
cat > $out/etc/jupyter/jupyter_nbconvert_config.py << EOF
c = get_config()
c.Exporter.preprocessors = ['jupyter_contrib_nbextensions.nbconvert_support.pre_pymarkdown.PyMarkdownPreprocessor']
EOF
'';
};
};
in with self;
stdenv.mkDerivation rec {
name = "jupyter";
env = buildEnv { name = name; paths = buildInputs; };
builder = builtins.toFile "builder.sh" ''
source $stdenv/setup; ln -s $env $out
'';
buildInputs = [
jupyter
jupyter_config_dir
geckodriver
plantweb
plantuml
pandoc
inkscape
(texlive.combine {
inherit (texlive)
adjustbox
collectbox
enumitem
mathpazo
palatino
scheme-small
ucs;
})
] ++ stdenv.lib.optionals stdenv.isLinux [ bash fontconfig tini ];
shellHook = ''
mkdir -p $PWD/.jupyter
export JUPYTER_CONFIG_DIR=${jupyter_config_dir}/etc/jupyter
export JUPYTER_PATH=${jupyter_config_dir}/etc/jupyter
export JUPYTER_DATA_DIR=$PWD/.jupyter
export JUPYTER_RUNTIME_DIR=$PWD/.jupyter
'';
}
# Generated by pip2nix 0.7.0.dev1
# See https://github.com/johbo/pip2nix
{ pkgs, fetchurl, fetchgit, fetchhg }:
self: super: {
"robotkernel" = super.buildPythonPackage {
name = "robotkernel-unreleased";
doCheck = false;
src = pkgs.fetchFromGitHub {
owner = "datakurre";
repo = "robotkernel";
rev = "0a9113b91c6b01fb68b5d0762199a9e4d99994f6";
sha256 = "05q6rsxkxlxkx42bjpgz6xyf67kqr79xdjyy5afislsp7p7wxwii";
};
propagatedBuildInputs = [
self."ipykernel"
self."pillow"
self."pygments"
self."robotframework"
self."robotframework-selenium2library"
];
};
"GenSON" = super.buildPythonPackage {
name = "GenSON-0.2.3";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/2b/70/4eea716b647e7b11bf029d05d72eb3b783f20a39ef3a58ed82df8a6bde6b/genson-0.2.3.tar.gz";
sha256 = "1nnq4hhd2yni807c0c26axcgb31w3z15rbxil13fcp83zw678mhp";
};
};
"PyYAML" = super.buildPythonPackage {
name = "PyYAML-3.12";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz";
sha256 = "1aqjl8dk9amd4zr99n8v2qxzgmr2hdvqfma4zh7a41rj6336c9sr";
};
};
"RESTinstance" = super.buildPythonPackage {
name = "RESTinstance-1.0.0b4";
doCheck = false;
propagatedBuildInputs = [
self."robotframework"
self."flex"
self."GenSON"
self."jsonschema"
self."pygments"
self."requests"
self."rfc3987"
self."strict-rfc3339"
];
src = fetchurl {
url = "https://pypi.python.org/packages/08/56/80f5ad168b1c322d38563aa08b02b9b813160343a59f84a1526fa4c17975/RESTinstance-1.0.0b4.tar.gz";
sha256 = "0ngq9iqjd0a5wdz4syd12k9ykgavalkbycxshwnr7pyq1j1ff06l";
};
};
"attrs" = super.buildPythonPackage {
name = "attrs-17.4.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/8b/0b/a06cfcb69d0cb004fde8bc6f0fd192d96d565d1b8aa2829f0f20adb796e5/attrs-17.4.0.tar.gz";
sha256 = "1jafnn1kzd6qhxgprhx6y6ik1r5m2rilx25syzcmq03azp660y8w";
};
};
"bleach" = super.buildPythonPackage {
name = "bleach-2.1.2";
doCheck = false;
propagatedBuildInputs = [
self."six"
self."html5lib"
];
src = fetchurl {
url = "https://pypi.python.org/packages/b3/5f/0da670d30d3ffbc57cc97fa82947f81bbe3eab8d441e2d42e661f215baf2/bleach-2.1.2.tar.gz";
sha256 = "068s5m2j0ydcq5193nvh5cv78zqch8jg7mjmvgc8grx4psz8rz1q";
};
};
"certifi" = super.buildPythonPackage {
name = "certifi-2018.1.18";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/15/d4/2f888fc463d516ff7bf2379a4e9a552fef7f22a94147655d9b1097108248/certifi-2018.1.18.tar.gz";
sha256 = "0z9zyry30znikglm66d3r9y0yaqa2sxr4xlsyxqzbvi76hh3zg7d";
};
};
"chardet" = super.buildPythonPackage {
name = "chardet-3.0.4";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz";
sha256 = "1bpalpia6r5x1kknbk11p1fzph56fmmnp405ds8icksd3knr5aw4";
};
};
"check-manifest" = super.buildPythonPackage {
name = "check-manifest-0.36";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/6f/6f/38f3ad250b69a174e8c054572f29450959d4e3cab94645f5b1835ee9af58/check-manifest-0.36.tar.gz";
sha256 = "111dynjqs8vfr9n10w3xg8yknyc1ljsxmh6nbz62dw506skhdf9b";
};
};
"click" = super.buildPythonPackage {
name = "click-6.7";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/95/d9/c3336b6b5711c3ab9d1d3a80f1a3e2afeb9d8c02a7166462f6cc96570897/click-6.7.tar.gz";
sha256 = "02qkfpykbq35id8glfgwc38yc430427yd05z1wc5cnld8zgicmgi";
};
};
"colorama" = super.buildPythonPackage {
name = "colorama-0.3.9";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/e6/76/257b53926889e2835355d74fec73d82662100135293e17d382e2b74d1669/colorama-0.3.9.tar.gz";
sha256 = "1wd1szk0z3073ghx26ynw43gnc140ibln1safgsis6s6z3s25ss8";
};
};
"coverage" = super.buildPythonPackage {
name = "coverage-4.4.2";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/0b/e1/190ef1a264144c9b073b7353c259ca5431b5ddc8861b452e858fcbd0e9de/coverage-4.4.2.tar.gz";
sha256 = "1k1l1xdpzni35xrffwv3nvqb7ylb912mdmz4l33kw1imgayr379h";
};
};
"decorator" = super.buildPythonPackage {
name = "decorator-4.2.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/70/f1/cb9373195639db13063f55eb06116310ad691e1fd125e6af057734dc44ea/decorator-4.2.1.tar.gz";
sha256 = "03iaf116rm3w8b4agb8hzf6z9331mrvi4khfxq35zkx17sgxsikx";
};
};
"docutils" = super.buildPythonPackage {
name = "docutils-0.14";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/84/f4/5771e41fdf52aabebbadecc9381d11dea0fa34e4759b4071244fa094804c/docutils-0.14.tar.gz";
sha256 = "0x22fs3pdmr42kvz6c654756wja305qv6cx1zbhwlagvxgr4xrji";
};
};
"flake8" = super.buildPythonPackage {
name = "flake8-3.5.0";
doCheck = false;
propagatedBuildInputs = [
self."pyflakes"
self."pycodestyle"
self."mccabe"
self."setuptools"
];
src = fetchurl {
url = "https://pypi.python.org/packages/1e/ab/7730f6d6cdf73a3b7f98a2fe3b2cdf68e9e760a4a133e083607497d4c3a6/flake8-3.5.0.tar.gz";
sha256 = "184b33grvvjmiwlv9kyd7yng9qv5ld24154j70z332xxg9gjclvj";
};
};
"flake8-blind-except" = super.buildPythonPackage {
name = "flake8-blind-except-0.1.1";
doCheck = false;
propagatedBuildInputs = [
self."setuptools"
];
src = fetchurl {
url = "https://pypi.python.org/packages/ff/f2/ab635e6e420e78c94eab50cd3f53abd3ec27e411793e50b14f29edbb9f0b/flake8-blind-except-0.1.1.tar.gz";
sha256 = "16g58mkr3fcn2vlfhp3rlahj93qswc7jd5qrqp748mc26dk3b8xc";
};
};
"flake8-coding" = super.buildPythonPackage {
name = "flake8-coding-1.3.0";
doCheck = false;
propagatedBuildInputs = [
self."flake8"
];
src = fetchurl {
url = "https://pypi.python.org/packages/ae/26/3c6304d646f8ee27d6c40bfcd9874fea870098c3ef3cf60e284ea9db29ef/flake8-coding-1.3.0.tar.gz";
sha256 = "1gjhzv85gaviwszp04l3win3h69bhfd4kwvi7mm7cxwkhxpyj0ds";
};
};
"flake8-debugger" = super.buildPythonPackage {
name = "flake8-debugger-3.0.0";
doCheck = false;
propagatedBuildInputs = [
self."flake8"
self."pycodestyle"
];
src = fetchurl {
url = "https://pypi.python.org/packages/2c/a7/45823a26ef0c5fa7a0c099b772a5b6aa2d8e686284490ef738fc8691ffc0/flake8-debugger-3.0.0.tar.gz";
sha256 = "1m6jqgdbpq7plf24kknnxlkw3rig7bjf17xqzgrv57c11ncarj75";
};
};
"flake8-polyfill" = super.buildPythonPackage {
name = "flake8-polyfill-1.0.2";
doCheck = false;
propagatedBuildInputs = [
self."flake8"
];
src = fetchurl {
url = "https://pypi.python.org/packages/e6/67/1c26634a770db5c442e361311bee73cb3a177adb2eb3f7af8953cfd9f553/flake8-polyfill-1.0.2.tar.gz";
sha256 = "1nlf1mkqw856vi6782qcglqhaacb23khk9wkcgn55npnjxshhjz4";
};
};
"flake8-quotes" = super.buildPythonPackage {
name = "flake8-quotes-0.13.0";
doCheck = false;
propagatedBuildInputs = [
self."flake8"
];
src = fetchurl {
url = "https://pypi.python.org/packages/46/c7/43f042f47b65bf1006fee98fb21938d55cee720d43c7373e063c3664fae2/flake8-quotes-0.13.0.tar.gz";
sha256 = "0js5ckpgphri088h5i3v2qd7g32j8nyvc1agna9jg5kadihrh69a";
};
};
"flex" = super.buildPythonPackage {
name = "flex-6.11.1";
doCheck = false;
propagatedBuildInputs = [
self."six"
self."PyYAML"
self."validate-email"
self."rfc3987"
self."requests"
self."strict-rfc3339"
self."click"
self."jsonpointer"
];
src = fetchurl {
url = "https://pypi.python.org/packages/47/3b/f4d851e11a5462b433c9dfd4dc0c0ac95ac85630247d8e29d1baf46a438f/flex-6.11.1.tar.gz";
sha256 = "0s4d0n4jbyz9dpfja22vaazj26x0icghhhjv9l62cv96nz88vbdj";
};
};
"html5lib" = super.buildPythonPackage {
name = "html5lib-1.0.1";
doCheck = false;
propagatedBuildInputs = [
self."six"
self."webencodings"
];
src = fetchurl {
url = "https://pypi.python.org/packages/85/3e/cf449cf1b5004e87510b9368e7a5f1acd8831c2d6691edd3c62a0823f98f/html5lib-1.0.1.tar.gz";
sha256 = "0dipzfrycv6j1jw82v9b7d8lzggx3x8xngx6l4xrqkxwvg7hvjv6";
};
};
"idna" = super.buildPythonPackage {
name = "idna-2.6";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/f4/bd/0467d62790828c23c47fc1dfa1b1f052b24efdf5290f071c7a91d0d82fd3/idna-2.6.tar.gz";
sha256 = "13qaab6d0s15gknz8v3zbcfmbj6v86hn9pjxgkdf62ch13imssic";
};
};
"ipykernel" = super.buildPythonPackage {
name = "ipykernel-4.8.0";
doCheck = false;
propagatedBuildInputs = [
self."ipython"
self."traitlets"
self."jupyter-client"
self."tornado"
];
src = fetchurl {
url = "https://pypi.python.org/packages/74/54/0fdcd1db1e02b02022b6aa96826973645c60ef7e152c5b57f3db0bf5e74f/ipykernel-4.8.0.tar.gz";
sha256 = "0x371kc76nrh1hxb76g91zzbhpr4dihglvcq6b3jb1x3ysfikp6y";
};
};
"ipython" = super.buildPythonPackage {
name = "ipython-6.2.1";
doCheck = false;
propagatedBuildInputs = [
self."setuptools"
self."jedi"
self."decorator"
self."pickleshare"
self."simplegeneric"
self."traitlets"
self."prompt-toolkit"
self."pygments"
self."pexpect"
self."pexpect"
];
src = fetchurl {
url = "https://pypi.python.org/packages/fa/50/974211502bd72873728d44c3013fe79875c819c8fb69f778bcfd67bc7d38/ipython-6.2.1.tar.gz";
sha256 = "022n6lcqx1x51yzgj1f9bj0rc08i6hdbbili3j6qk6dqr2k5ihai";
};
};
"ipython-genutils" = super.buildPythonPackage {
name = "ipython-genutils-0.2.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/e8/69/fbeffffc05236398ebfcfb512b6d2511c622871dca1746361006da310399/ipython_genutils-0.2.0.tar.gz";
sha256 = "1a4bc9y8hnvq6cp08qs4mckgm6i6ajpndp4g496rvvzcfmp12bpb";
};
};
"isort" = super.buildPythonPackage {
name = "isort-4.2.15";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/4d/d5/7c8657126a43bcd3b0173e880407f48be4ac91b4957b51303eab744824cf/isort-4.2.15.tar.gz";
sha256 = "10rr1grpsxnjrxgnfdjwabn8nlwbgb667rhnf0zfbqm4sdr63x3r";
};
};
"jedi" = super.buildPythonPackage {
name = "jedi-0.11.1";
doCheck = false;
propagatedBuildInputs = [
self."parso"
];
src = fetchurl {
url = "https://pypi.python.org/packages/d2/41/430b325e411d564b1afc37bc7286c3549f4c415ada750a617fb1943c593d/jedi-0.11.1.tar.gz";
sha256 = "15zsb7pqvjfkhg87g9jni51qa8igqd3xw80gxmcr9phs9p89kryn";
};
};
"jsonpointer" = super.buildPythonPackage {
name = "jsonpointer-2.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/52/e7/246d9ef2366d430f0ce7bdc494ea2df8b49d7a2a41ba51f5655f68cfe85f/jsonpointer-2.0.tar.gz";
sha256 = "0qjkjy1qlyc1nl3k95wd03ssxac0a717x8889ypgs1cfcj3bm4n1";
};
};
"jsonschema" = super.buildPythonPackage {
name = "jsonschema-2.6.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/58/b9/171dbb07e18c6346090a37f03c7e74410a1a56123f847efed59af260a298/jsonschema-2.6.0.tar.gz";
sha256 = "00kf3zmpp9ya4sydffpifn0j0mzm342a2vzh82p6r0vh10cg7xbg";
};
};
"jupyter-client" = super.buildPythonPackage {
name = "jupyter-client-5.2.2";
doCheck = false;
propagatedBuildInputs = [
self."traitlets"
self."jupyter-core"
self."pyzmq"
self."python-dateutil"
self."tornado"
];
src = fetchurl {
url = "https://pypi.python.org/packages/bf/0b/7e1725b5ef8925867a604ab74e0618e84fbe4b171996631996b02b99a752/jupyter_client-5.2.2.tar.gz";
sha256 = "1i06kf88c3ldqi6i31bai65gi5zsp4zzaf9rrnfggn7h68qy5mc3";
};
};
"jupyter-core" = super.buildPythonPackage {
name = "jupyter-core-4.4.0";
doCheck = false;
propagatedBuildInputs = [
self."traitlets"
];
src = fetchurl {
url = "https://pypi.python.org/packages/b6/2d/2804f4de3a95583f65e5dcb4d7c8c7183124882323758996e867f47e72af/jupyter_core-4.4.0.tar.gz";
sha256 = "1dy083rarba8prn9f9srxq3c7n7vyql02ycrqq306c40lr57aw5s";
};
};
"mccabe" = super.buildPythonPackage {
name = "mccabe-0.6.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/06/18/fa675aa501e11d6d6ca0ae73a101b2f3571a565e0f7d38e062eec18a91ee/mccabe-0.6.1.tar.gz";
sha256 = "07w3p1qm44hgxf3vvwz84kswpsx6s7kvaibzrsx5dzm0hli1i3fx";
};
};
"metakernel" = super.buildPythonPackage {
name = "metakernel-0.20.14";
doCheck = false;
propagatedBuildInputs = [
self."ipykernel"
self."pexpect"
];
src = fetchurl {
url = "https://pypi.python.org/packages/f0/62/4db0c6b78cebf9b6ac40ebd688abc0aaa5c5cb92ab53270b3bb79f7fe024/metakernel-0.20.14.tar.gz";
sha256 = "0b5dl86470s57qsznp7ldv9fz81nshadak19rvjrzwgx96x05zvv";
};
};
"parso" = super.buildPythonPackage {
name = "parso-0.1.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/14/3b/15cfd9c7a8bd9e3a2fe956e20fbc4e7c5768e06aea347d8eb68a05a71653/parso-0.1.1.tar.gz";
sha256 = "1yyg0d15cnhvb50i7a9inrf060i5dh44zxfnqprnamjf4pzg65aq";
};
};
"pep8-naming" = super.buildPythonPackage {
name = "pep8-naming-0.5.0";
doCheck = false;
propagatedBuildInputs = [
self."flake8-polyfill"
];
src = fetchurl {
url = "https://pypi.python.org/packages/ce/19/53001b4f04ca7044da07dddafb891db159fb4702522cdadd86f98b75e5c8/pep8-naming-0.5.0.tar.gz";
sha256 = "17dyzvbczkdskmwwxsjq9i847gikcj0rcjkzb9h31mdi819hhajs";
};
};
"pexpect" = super.buildPythonPackage {
name = "pexpect-4.3.1";
doCheck = false;
propagatedBuildInputs = [
self."ptyprocess"
];
src = fetchurl {
url = "https://pypi.python.org/packages/14/05/47c8bca66390c9b18c91f6152db4b74eb850382e8e13aa2f06dfb3036466/pexpect-4.3.1.tar.gz";
sha256 = "0xamqp9p0cdqridw3f6hs98lcsbyrf42wpvbn384kwms3lbpna4f";
};
};
"pickleshare" = super.buildPythonPackage {
name = "pickleshare-0.7.4";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
sha256 = "0yvk14dzxk7g6qpr7iw23vzqbsr0dh4ij4xynkhnzpfz4xr2bac4";
};
};
"pillow" = super.buildPythonPackage {
name = "pillow-5.0.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/0f/57/25be1a4c2d487942c3ed360f6eee7f41c5b9196a09ca71c54d1a33c968d9/Pillow-5.0.0.tar.gz";
sha256 = "1fz1n1cq65dqdbiwy1cn8l21amqbzq18rdmmcr670ks24dn9vwhj";
};
};
"pkginfo" = super.buildPythonPackage {
name = "pkginfo-1.4.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/58/54/57f7c5638fecdf232a5b6b767da467b0ff31467d7f86a7364c252acf2321/pkginfo-1.4.1.tar.gz";
sha256 = "17pqjfpq3c6xzdmk8pski6jcjgjv78q00zjf2bgzb668pzm6l6mv";
};
};
"pluggy" = super.buildPythonPackage {
name = "pluggy-0.6.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz";
sha256 = "1zqckndfn85l1cd8pndw212zg1bq9fkg1nnj32kp2mppppsyg2kz";
};
};
"prompt-toolkit" = super.buildPythonPackage {
name = "prompt-toolkit-1.0.15";
doCheck = false;
propagatedBuildInputs = [
self."six"
self."wcwidth"
];
src = fetchurl {
url = "https://pypi.python.org/packages/8a/ad/cf6b128866e78ad6d7f1dc5b7f99885fb813393d9860778b2984582e81b5/prompt_toolkit-1.0.15.tar.gz";
sha256 = "05v9h5nydljwpj5nm8n804ms0glajwfy1zagrzqrg91wk3qqi1c5";
};
};
"ptyprocess" = super.buildPythonPackage {
name = "ptyprocess-0.5.2";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/51/83/5d07dc35534640b06f9d9f1a1d2bc2513fb9cc7595a1b0e28ae5477056ce/ptyprocess-0.5.2.tar.gz";
sha256 = "0ra31k10v3629xq0kdn8lwmfbi97anmk48r03yvh7mks0kq96hg6";
};
};
"py" = super.buildPythonPackage {
name = "py-1.5.2";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/90/e3/e075127d39d35f09a500ebb4a90afd10f9ef0a1d28a6d09abeec0e444fdd/py-1.5.2.tar.gz";
sha256 = "0vd7i2lspzfwj0k68cnm1pk3rclnrnkavgqncdsifm1350z9866a";
};
};
"pycodestyle" = super.buildPythonPackage {
name = "pycodestyle-2.3.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/e1/88/0e2cbf412bd849ea6f1af1f97882add46a374f4ba1d2aea39353609150ad/pycodestyle-2.3.1.tar.gz";
sha256 = "0rk78b66p57ala26mdldl9lafr48blv5s659sah9q50qnfjmc8k8";
};
};
"pyflakes" = super.buildPythonPackage {
name = "pyflakes-1.6.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/26/85/f6a315cd3c1aa597fb3a04cc7d7dbea5b3cc66ea6bd13dfa0478bf4876e6/pyflakes-1.6.0.tar.gz";
sha256 = "01c87qiadz71sbqrclrsr85vx601p20g4hs7nlcvyg945ww6lqcd";
};
};
"pygments" = super.buildPythonPackage {
name = "pygments-2.2.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/71/2a/2e4e77803a8bd6408a2903340ac498cb0a2181811af7c9ec92cb70b0308a/Pygments-2.2.0.tar.gz";
sha256 = "1k78qdvir1yb1c634nkv6rbga8wv4289xarghmsbbvzhvr311bnv";
};
};
"pyroma" = super.buildPythonPackage {
name = "pyroma-2.2";
doCheck = false;
propagatedBuildInputs = [
self."setuptools"
self."docutils"
];
src = fetchurl {
url = "https://pypi.python.org/packages/de/f3/104ae27624982cd4b6de786d9afe23a2dc0b8c0999443ba370b3755848c7/pyroma-2.2.tar.gz";
sha256 = "0l5ab84plqf6gy2xphm92dazpa6c5r1xcj20f35zhlbwd1aq1zfk";
};
};
"pytest" = super.buildPythonPackage {
name = "pytest-3.3.2";
doCheck = false;
propagatedBuildInputs = [
self."py"
self."six"
self."setuptools"
self."attrs"
self."pluggy"
];
src = fetchurl {
url = "https://pypi.python.org/packages/d0/00/2546e70b2cc1d3df4e736a43871dfde54855277446cec376f871e36f7e03/pytest-3.3.2.tar.gz";
sha256 = "1i2vya1kazprnv7g4x1qrb12rbh8ky5n15mdq96qz0g7xn084m2k";
};
};
"pytest-cov" = super.buildPythonPackage {
name = "pytest-cov-2.5.1";
doCheck = false;
propagatedBuildInputs = [
self."pytest"
self."coverage"
];
src = fetchurl {
url = "https://pypi.python.org/packages/24/b4/7290d65b2f3633db51393bdf8ae66309b37620bc3ec116c5e357e3e37238/pytest-cov-2.5.1.tar.gz";
sha256 = "0bbfpwdh9k3636bxc88vz9fa7vf4akchgn513ql1vd0xy4n7bah3";
};
};
"pytest-runner" = super.buildPythonPackage {
name = "pytest-runner-3.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/65/b4/ae89338cd2d81e2cc54bd6db2e962bfe948f612303610d68ab24539ac2d1/pytest-runner-3.0.tar.gz";
sha256 = "00v7pi09q60yx0l1kzyklnmr5bp597mir85a9gsi7bdfyly3lz0g";
};
};
"python-dateutil" = super.buildPythonPackage {
name = "python-dateutil-2.6.1";
doCheck = false;
propagatedBuildInputs = [
self."six"
];
src = fetchurl {
url = "https://pypi.python.org/packages/54/bb/f1db86504f7a49e1d9b9301531181b00a1c7325dc85a29160ee3eaa73a54/python-dateutil-2.6.1.tar.gz";
sha256 = "1jkahssf0ir5ssxc3ydbp8cpv77limn8d4s77szb2nrgl2r3h749";
};
};
"pyzmq" = super.buildPythonPackage {
name = "pyzmq-16.0.4";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/52/ab/aad6fda6fb247893613629920472770da19bf94af5617852fd49d3047c4b/pyzmq-16.0.4.tar.gz";
sha256 = "1cl60244sjwfy8bdp3n5qk8ydvxnlxab584yx20j1a3dbp8zl8xw";
};
};
"readme-renderer" = super.buildPythonPackage {
name = "readme-renderer-17.2";
doCheck = false;
propagatedBuildInputs = [
self."bleach"
self."docutils"
self."pygments"
self."six"
];
src = fetchurl {
url = "https://pypi.python.org/packages/b6/a8/f27c15837fcbcb6110bd0f1dfa04b5fae658a1da3c07f186dba89818a613/readme_renderer-17.2.tar.gz";
sha256 = "1nm8rg4g27ca4arz8mr3bacp6i443hdmigwlnhdafqrsjr1b9slx";
};
};
"requests" = super.buildPythonPackage {
name = "requests-2.18.4";
doCheck = false;
propagatedBuildInputs = [
self."chardet"
self."idna"
self."urllib3"
self."certifi"
];
src = fetchurl {
url = "https://pypi.python.org/packages/b0/e1/eab4fc3752e3d240468a8c0b284607899d2fbfb236a56b7377a329aa8d09/requests-2.18.4.tar.gz";
sha256 = "0zi3v9nsmv9j27d0c0m1dvqyvaxz53g8m0aa1h3qanxs4irkwi4w";
};
};
"requests-toolbelt" = super.buildPythonPackage {
name = "requests-toolbelt-0.8.0";
doCheck = false;
propagatedBuildInputs = [
self."requests"
];
src = fetchurl {
url = "https://pypi.python.org/packages/86/f9/e80fa23edca6c554f1994040064760c12b51daff54b55f9e379e899cd3d4/requests-toolbelt-0.8.0.tar.gz";
sha256 = "1dc7l42i4080r8i4m9fj51jx367lqkai170vrv7wd93gdj9k39gn";
};
};
"rfc3987" = super.buildPythonPackage {
name = "rfc3987-1.3.7";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/b1/fb/4c6eb50dcca68e8b1cbe2a550946a21223c10a8080e13f6580be5f6b5596/rfc3987-1.3.7.tar.gz";
sha256 = "192pclzs2y0yaywqkrlvd0x73740q310kvqvm6jldhi619mq59wi";
};
};
"robotframework" = super.buildPythonPackage {
name = "robotframework-3.0.2";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/3e/79/d8b9a7ea833cf4f33d51c0d5f24b825ac72105bf30c147b472da10895143/robotframework-3.0.2.tar.gz";
sha256 = "1xqzxv00lxf9xi4vdxdsyd1bfmx18gi96vrnijpzj9w2aqrz4610";
};
};
"robotframework-selenium2library" = super.buildPythonPackage {
name = "robotframework-selenium2library-3.0.0";
doCheck = false;
propagatedBuildInputs = [
self."robotframework-seleniumlibrary"
];
src = fetchurl {
url = "https://pypi.python.org/packages/c4/7d/3c07081e7f0f1844aa21fd239a0139db4da5a8dc219d1e81cb004ba1f4e2/robotframework-selenium2library-3.0.0.tar.gz";
sha256 = "19zxf2f5f6ply2ab4q9l52cn3d6j6j5h0f9h4pnnvcc80wmr93ia";
};
};
"robotframework-selenium2screenshots" = super.buildPythonPackage {
name = "robotframework-selenium2screenshots-0.8.0";
doCheck = false;
propagatedBuildInputs = [
self."setuptools"
self."robotframework"
self."robotframework-selenium2library"
];
src = fetchurl {
url = "https://pypi.python.org/packages/de/57/62c447ad1313b8e4192cae37da47cad3add3667bc859ee1c3b336a09f632/robotframework-selenium2screenshots-0.8.0.tar.gz";
sha256 = "1r7isxgm3pibnzrg0pvw9h70zdpzmly7v6wh0rbyg0lxfdg31dbz";
};
};
"robotframework-seleniumlibrary" = super.buildPythonPackage {
name = "robotframework-seleniumlibrary-3.0.1";
doCheck = false;
propagatedBuildInputs = [
self."selenium"
self."robotframework"
];
src = fetchurl {
url = "https://pypi.python.org/packages/19/24/8c2259193aa8a6ca919623e2313ac5ae8d85152795c6772c1d303cd13768/robotframework-seleniumlibrary-3.0.1.tar.gz";
sha256 = "0bkan2j39784cifgfxjl2m1zcqn4x2ygqay5plkk2icpxv0f9p8p";
};
};
"selenium" = super.buildPythonPackage {
name = "selenium-3.8.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/59/2e/43cc1233703228e6752dc5ddfa59a254c430312c96ea6817419239fac137/selenium-3.8.1.tar.gz";
sha256 = "1lqm2md84g11g7lqi94xqb5lydm93vgmlznfhf27g6sy9ayjvgcs";
};
};
"setuptools" = super.buildPythonPackage {
name = "setuptools-38.4.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/41/5f/6da80400340fd48ba4ae1c673be4dc3821ac06cd9821ea60f9c7d32a009f/setuptools-38.4.0.zip";
sha256 = "0x9gs4zmh21snz3h389frx95z5qviyj5pikfscz5pv05ylrgq0b5";
};
};
"setuptools-scm" = super.buildPythonPackage {
name = "setuptools-scm-1.15.6";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/03/6d/aafdd01edd227ee879b691455bf19895091872af7e48192bea1758c82032/setuptools_scm-1.15.6.tar.gz";
sha256 = "0pzvfmx8s20yrgkgwfbxaspz2x1g38qv61jpm0ns91lrb22ldas9";
};
};
"simplegeneric" = super.buildPythonPackage {
name = "simplegeneric-0.8.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/3d/57/4d9c9e3ae9a255cd4e1106bb57e24056d3d0709fc01b2e3e345898e49d5b/simplegeneric-0.8.1.zip";
sha256 = "0wwi1c6md4vkbcsfsf8dklf3vr4mcdj4mpxkanwgb6jb1432x5yw";
};
};
"six" = super.buildPythonPackage {
name = "six-1.11.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/16/d8/bc6316cf98419719bd59c91742194c111b6f2e85abac88e496adefaf7afe/six-1.11.0.tar.gz";
sha256 = "1scqzwc51c875z23phj48gircqjgnn3af8zy2izjwmnlxrxsgs3h";
};
};
"strict-rfc3339" = super.buildPythonPackage {
name = "strict-rfc3339-0.7";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/56/e4/879ef1dbd6ddea1c77c0078cd59b503368b0456bcca7d063a870ca2119d3/strict-rfc3339-0.7.tar.gz";
sha256 = "0xqjbsn0g1h88rayh5yrpdagq60zfwrfs3yvk6rmgby3vyz1gbaw";
};
};
"tornado" = super.buildPythonPackage {
name = "tornado-4.5.3";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/e3/7b/e29ab3d51c8df66922fea216e2bddfcb6430fb29620e5165b16a216e0d3c/tornado-4.5.3.tar.gz";
sha256 = "02jzd23l4r6fswmwxaica9ldlyc2p6q8dk6dyff7j58fmdzf853d";
};
};
"tqdm" = super.buildPythonPackage {
name = "tqdm-4.19.5";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/19/c6/4d74a16323f5045e6d4444bd1e3104b8ba52507700bc152a9c6bd88d1cfb/tqdm-4.19.5.tar.gz";
sha256 = "0xvkffm77nqckk29xjy5fkqvig5b97vk7nzafp3cn36w4zqyccnz";
};
};
"traitlets" = super.buildPythonPackage {
name = "traitlets-4.3.2";
doCheck = false;
propagatedBuildInputs = [
self."ipython-genutils"
self."six"
self."decorator"
];
src = fetchurl {
url = "https://pypi.python.org/packages/a5/98/7f5ef2fe9e9e071813aaf9cb91d1a732e0a68b6c44a32b38cb8e14c3f069/traitlets-4.3.2.tar.gz";
sha256 = "0dbq7sx26xqz5ixs711k5nc88p8a0nqyz6162pwks5dpcz9d4jww";
};
};
"twine" = super.buildPythonPackage {
name = "twine-1.9.1";
doCheck = false;
propagatedBuildInputs = [
self."tqdm"
self."pkginfo"
self."requests"
self."requests-toolbelt"
self."setuptools"
];
src = fetchurl {
url = "https://pypi.python.org/packages/7e/b4/ecc6aaf0eb287c6577e796bcc3089ce6286d273d5caa70655050cc3462f9/twine-1.9.1.tar.gz";
sha256 = "1ay1b6kdq6k4bfbjsvf6ymj41wrgpvinhxndb09355pwhxwmp96a";
};
};
"urllib3" = super.buildPythonPackage {
name = "urllib3-1.22";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/ee/11/7c59620aceedcc1ef65e156cc5ce5a24ef87be4107c2b74458464e437a5d/urllib3-1.22.tar.gz";
sha256 = "0kyvc9zdlxr5r96bng5rhm9a6sfqidrbvvkz64s76qs5267dli6c";
};
};
"validate-email" = super.buildPythonPackage {
name = "validate-email-1.3";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/84/a0/cb53fb64b52123513d04f9b913b905f3eb6fda7264e639b4573cc715c29f/validate_email-1.3.tar.gz";
sha256 = "1bxffaf5yz2cph8ki55vdvdypbwkvn2xr1firlcy62vqbzf1jivq";
};
};
"vcversioner" = super.buildPythonPackage {
name = "vcversioner-2.16.0.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/c5/cc/33162c0a7b28a4d8c83da07bc2b12cee58c120b4a9e8bba31c41c8d35a16/vcversioner-2.16.0.0.tar.gz";
sha256 = "16z10sm78jd7ca3jbkgc3q5i8a8q7y1h21q1li21yy3rlhbhrrns";
};
};
"wcwidth" = super.buildPythonPackage {
name = "wcwidth-0.1.7";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/55/11/e4a2bb08bb450fdbd42cc709dd40de4ed2c472cf0ccb9e64af22279c5495/wcwidth-0.1.7.tar.gz";
sha256 = "0pn6dflzm609m4r3i8ik5ni9ijjbb5fa3vg1n7hn6vkd49r77wrx";
};
};
"webencodings" = super.buildPythonPackage {
name = "webencodings-0.5.1";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz";
sha256 = "08qrgrc4hrximb2gqnl69g01s93rhf2842jfxdjljc1dbwj1qsmk";
};
};
"wheel" = super.buildPythonPackage {
name = "wheel-0.30.0";
doCheck = false;
src = fetchurl {
url = "https://pypi.python.org/packages/fa/b4/f9886517624a4dcb81a1d766f68034344b7565db69f13d52697222daeb72/wheel-0.30.0.tar.gz";
sha256 = "1j2knvhzgv71yli5nw6fxn87rrdxsx2xw8ldn28gs8z8jh5gw5cm";
};
};
"zest.releaser" = super.buildPythonPackage {
name = "zest.releaser-6.13.3";
doCheck = false;
propagatedBuildInputs = [
self."setuptools"
self."colorama"
self."six"
self."twine"
self."chardet"
self."check-manifest"
self."pyroma"
self."readme-renderer"
self."wheel"
];
src = fetchurl {
url = "https://pypi.python.org/packages/0e/ed/5a27b8732f739feaf2789f846c5e81045b022b4f0a2cc1f261158d849401/zest.releaser-6.13.3.tar.gz";
sha256 = "0gqxr73himv61hszywpsg6mix3m062jh38mvkr9fcmzapiaq3mms";
};
};
### Test requirements
}
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
// https://github.com/boakley/brackets-robotframework/blob/master/main.js
CodeMirror.defineMode("robotframework", function() {
function canonicalTableName(name) {
// This returns the canonical (internal) name for a table,
// which will be one of "settings", "test_cases",
// "keywords", or "variables"
//
// This function will return null if name isn't one of the
// strings supported by robot
name = name.trim().toLowerCase();
if (name.match("settings?|metadata")) {return "settings"; }
if (name.match("test ?cases?")) {return "test_cases"; }
if (name.match("(user )?keywords?")) {return "keywords"; }
if (name.match("variables?")) {return "variables"; }
return null;
}
function isHeading(stream, state) {
// this matches things like "*** Test Cases ***", "*** Keywors ***", etc
// It tries to strictly follow the robot specification, which implies you
// can have more than one asterisk, and trailing asterisks are optional,
// and the table names must be one of the recognized table names
if (stream.sol()) {
var match = stream.match(/^\s*\*+\s*(settings?|metadata|variables?|test ?cases?|(user )?keywords?)[ *]*$/i);
if (match !== null) {
state.table_name = canonicalTableName(match[1]);
state.tc_or_kw_name = null;
stream.skipToEnd();
return true;
}
}
return false;
}
function isSpecial(stream, state) {
var cell = stream.current().trim()
// this isn't 100% precise, but it's good enough for now.
if ([":FOR", "IN", "IN RANGE", "WITH NAME", "AND"].indexOf(cell) >= 0) {
return true;
}
}
function isContinuation(stream, state) {
// Return true if the stream is currently in a
// continuation cell. This will catch random data
// that is not the first non-empty cell on a line,
// but that's such a rare thing that it's not a
// big deal.
return (stream.current().trim() === "...");
}
function isSetting(stream, state) {
// Return true if the stream is in a settings table and the
// token is a valid setting
if (state.isSettingsTable() && state.column === 0) {
var s = stream.current().trim().toLowerCase();
if (s.match("^(library|resource|variables|documentation|metadata|" +
"suite setup|suite teardown|suite precondition|" +
"suite postcondition|force tags|default tags|test setup|" +
"test teardown|test precondition|test postcondition|" +
"test template|test timeout)$")) {
return true;
}
}
return false;
}
function isLocalSetting(stream, state) {
var s = stream.current().trim().toLowerCase();
if (state.isTestCasesTable()) {
if (s.match("\\[(documentation|tags|setup|teardown|precondition|postcondition|template|timeout)\\]")) {
return true;
}
} else if (state.isKeywordsTable()) {
if (s.match("\\[(documentation|arguments|return|timeout)\\]")) {
return true;
}
}
return false;
}
function isName(stream, state) {
// Return true if this is the first column in a test case or keyword table
if (state.column === 0 && (state.isTestCasesTable() || state.isKeywordsTable())) {
state.tc_or_kw_name = stream.current();
return true;
}
return false;
}
function isSubheading(stream, state) {
// Return true if a cell begins with two or more colons
// (eg: ":: Log in") Admittedly, this is a non-standard
// feature, but it should be pretty harmless (or useful!)
// for others. My team defines a keyword named ":: {$text}"
// which we use to organize our code in a long test case
// or keyword.
if (stream.match(/^\s*:::? \S.*$/)) {
return true;
}
return false;
}
function isComment(stream, state) {
// Return true if a cell begins with a hash (and optional leading whitesp
if (stream.match(/^\s*#/)) {
return true;
}
return false;
}
function isSeparator(stream) {
// Return true if the stream is currently in a separator
// (read: tab, or two or more whitespace characters
var match = stream.match(/(\t|\s{2,})/);
return match;
}
function eatCellContents(stream, state) {
// gobble up characters until the end of the line or we find a separator
var ch;
while ((ch = stream.next()) != null) {
if (ch === "\\") {
// escaped character; gobble up the following character
stream.next();
} else if (ch === "\t") {
stream.backUp(1);
break;
} else if (ch === " ") {
if (stream.match(/\s/, false)) {
stream.backUp(1);
break;
}
}
}
return (stream.current().length > 0);
}
return {
startState: function () {
return {
table_name: null,
tc_or_kw_name: null,
column: -1,
separator: "pipes", // maybe we should get this from preferences?
isSettingsTable: function () {return (this.table_name === "settings"); },
isVariablesTable: function () {return (this.table_name === "variables"); },
isTestCasesTable: function () {return (this.table_name === "test_cases"); },
isKeywordsTable: function () {return (this.table_name === "keywords"); },
pipeSeparated: function () {return (this.separator == "pipes"); },
spaceSeparated: function () {return (this.separator == "spaces"); },
tabSeparated: function () {return (this.separator == "tabs"); }
};
},
token: function (stream, state) {
// determine separator mode for this line -- pipes or spaces
if (stream.sol()) {
state.column = 0;
state.separator = "spaces";
}
// comments
if (isComment(stream, state)) {
stream.skipToEnd();
return "comment";
}
// table headings (eg: *** Test Cases ***)
if (isHeading(stream, state)) {
return "header";
}
// subheadings
// A subheading is a nonstandard thing my team uses. See
// the definition of isSubheading for more information...
if (isSubheading(stream, state)) {
// It makes sense to use "header" here, but we're already
// using "header", and it has behavior assocated with it.
//
// "def" isn't pendantically correct, but this extension
// doesn't use "def" for anything else, so we might as well
// use it for this. Pretend "def" means "defines a section"
return "def"
}
// N.B. Don't ever use "cell-separator" for anything
// but cell separators. We use this for parsing tokens
// in other places in the code.
if (isSeparator(stream, state)) {
state.column += 1;
// this is a custom class (cm-cell-separator)
// defined in main.js
return "cell-separator";
}
var c;
if ((c = eatCellContents(stream, state))) {
// a table cell; it may be one of several flavors
if (isContinuation(stream, state)) {return "meta"; }
if (isLocalSetting(stream, state)) {return "builtin"; }
if (isSetting(stream, state)) {return "attribute"; }
if (isName(stream, state)) {return "keyword"; }
}
// special constructs, like :FOR
if (isSpecial(stream, state)) {
return "builtin"
}
return null;
}
};
});
});
{ pkgs ? import <nixpkgs> {}
, pythonPackages ? pkgs.python3Packages
, setup ? import (pkgs.fetchFromGitHub {
owner = "datakurre";
repo = "setup.nix";
rev = "3660563b961d2cfb81e197288ae9df2d0d9dc648";
sha256 = "173r6800bds7ignmcai1a5v264awl7y5smy0a3ccip6g4myb1759";
})
}:
let overrides = self: super: {
"robotframework-seleniumlibrary" = super."robotframework-seleniumlibrary".overridePythonAttrs(old: {
src = pkgs.fetchFromGitHub {
owner = "robotframework";
repo = "seleniumlibrary";
rev = "34cea295575c5f69e3325ec12b295a6167092acd";
sha256 = "07x6krwzvlba3087v38q53ww3spn1lmzva5kn9163l1m6kafpvii";
};
});
};
in setup {
inherit pkgs pythonPackages overrides;
# "backports.shutil-get-terminal-size" = pythonPackages.backports_shutil_get_terminal_size;
# certifi = pythonPackages.certifi;
# decorator = pythonPackages.decorator;
# docutils = pythonPackages.docutils;
# enum34 = pythonPackages.enum34;
# idna = pythonPackages.idna;
# ipykernel = pythonPackages.ipykernel;
# ipython-genutils = pythonPackages.ipython_genutils;
# ipython = pythonPackages.ipython;
# jedi = pythonPackages.jedi;
# jupyter-client = pythonPackages.jupyter_client;
# jupyter-core = pythonPackages.jupyter_core;
# jsonschema = pythonPackages.jsonschema;
# parso = pythonPackages.parso;
# pexpect = pythonPackages.pexpect;
# pillow = pythonPackages.pillow;
# prompt-toolkit = pythonPackages.prompt_toolkit;
# ptyprocess = pythonPackages.ptyprocess;
# pygments = pythonPackages.pygments;
# py = pythonPackages.py;
# python-dateutil = pythonPackages.dateutil;
# pyzmq = pythonPackages.pyzmq;
# requests = pythonPackages.requests;
# singledispatch = pythonPackages.singledispatch;
# six = pythonPackages.six;
# tornado = pythonPackages.tornado;
# traitlets = pythonPackages.traitlets;
# urllib3 = pythonPackages.urllib3;
# wcwidth = pythonPackages.wcwidth;
# chardet = pythonPackages.chardet;
src = ./requirements.nix;
propagatedBuildInputs = with pkgs; [ geckodriver pythonPackages.opencv3 ];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment