summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 06:48:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 06:48:59 +0000
commitd835b2cae8abc71958b69362162e6a70c3d7ef63 (patch)
tree81052e3d2ce3e1bcda085f73d925e9d6257dec15 /contrib
parentInitial commit. (diff)
downloadcrmsh-d835b2cae8abc71958b69362162e6a70c3d7ef63.tar.xz
crmsh-d835b2cae8abc71958b69362162e6a70c3d7ef63.zip
Adding upstream version 4.6.0.upstream/4.6.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'contrib')
-rw-r--r--contrib/README.vimsyntax35
-rw-r--r--contrib/bash_completion.sh256
-rwxr-xr-xcontrib/git-hook-pre-commit14
-rw-r--r--contrib/pcmk-ftdetect.vim2
-rw-r--r--contrib/pcmk.vim114
-rw-r--r--contrib/pygments_crmsh_lexers/__init__.py3
-rw-r--r--contrib/pygments_crmsh_lexers/ansiclr.py50
-rw-r--r--contrib/pygments_crmsh_lexers/crmsh.py88
-rw-r--r--contrib/setup.py33
9 files changed, 595 insertions, 0 deletions
diff --git a/contrib/README.vimsyntax b/contrib/README.vimsyntax
new file mode 100644
index 0000000..3bf5a7a
--- /dev/null
+++ b/contrib/README.vimsyntax
@@ -0,0 +1,35 @@
+There were two VIM syntax files contributed:
+
+pacemaker-crm.vim
+pcmk.vim
+
+The first one got removed because it didn't work with newer CRM
+shell syntax anymore; most of the text was highlighted as "Error".
+
+Neither matches colours used in crm configure show and both need
+to be improved. Still, you may want to edit a more colorful
+configuration. To have that in "crm configure edit" do the
+following:
+
+ 1. Copy pcmk.vim to ~/.vim/syntax/pcmk.vim.
+
+ 2. Make sure the following is added to your VIM rc file
+ (~/.vimrc or ~/.exrc):
+
+ syntax on
+ set modeline
+ set modelines=5
+
+ 3. Copy the pcmk-ftdetect.vim to ~/.vim/ftdetect/ to
+ make files being identified automatically.
+
+
+If you're editing a file directly, just type:
+
+ :setf pcmk
+
+Many thanks to the contributors:
+
+Trevor Hemsley <themsley@voiceflex.com>
+Dan Frincu <df.cluster@gmail.com>
+Lars Ellenberg <lars@linbit.com>
diff --git a/contrib/bash_completion.sh b/contrib/bash_completion.sh
new file mode 100644
index 0000000..f497942
--- /dev/null
+++ b/contrib/bash_completion.sh
@@ -0,0 +1,256 @@
+#-*- mode: shell-script;-*-
+#
+# bash completion support for crmsh.
+#
+# Copyright (C) 2013 Kristoffer Gronlund <kgronlund@suse.com>
+# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
+# Distributed under the GNU General Public License, version 2.0.
+#
+# To use these routines:
+#
+# 1) Copy this file to somewhere (e.g. ~/.crm-completion.sh).
+# 2) Add the following line to your .bashrc/.zshrc:
+# source ~/.crm-completion.sh
+
+shopt -s extglob
+
+# The following function is based on code from:
+#
+# bash_completion - programmable completion functions for bash 3.2+
+#
+# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
+# © 2009-2010, Bash Completion Maintainers
+# <bash-completion-devel@lists.alioth.debian.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The latest version of this software can be obtained here:
+#
+# http://bash-completion.alioth.debian.org/
+#
+# RELEASE: 2.x
+
+# This function can be used to access a tokenized list of words
+# on the command line:
+#
+# __git_reassemble_comp_words_by_ref '=:'
+# if test "${words_[cword_-1]}" = -w
+# then
+# ...
+# fi
+#
+# The argument should be a collection of characters from the list of
+# word completion separators (COMP_WORDBREAKS) to treat as ordinary
+# characters.
+#
+# This is roughly equivalent to going back in time and setting
+# COMP_WORDBREAKS to exclude those characters. The intent is to
+# make option types like --date=<type> and <rev>:<path> easy to
+# recognize by treating each shell word as a single token.
+#
+# It is best not to set COMP_WORDBREAKS directly because the value is
+# shared with other completion scripts. By the time the completion
+# function gets called, COMP_WORDS has already been populated so local
+# changes to COMP_WORDBREAKS have no effect.
+#
+# Output: words_, cword_, cur_.
+
+__crm_reassemble_comp_words_by_ref()
+{
+ local exclude i j first
+ # Which word separators to exclude?
+ exclude="${1//[^$COMP_WORDBREAKS]}"
+ cword_=$COMP_CWORD
+ if [ -z "$exclude" ]; then
+ words_=("${COMP_WORDS[@]}")
+ return
+ fi
+ # List of word completion separators has shrunk;
+ # re-assemble words to complete.
+ for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
+ # Append each nonempty word consisting of just
+ # word separator characters to the current word.
+ first=t
+ while
+ [ $i -gt 0 ] &&
+ [ -n "${COMP_WORDS[$i]}" ] &&
+ # word consists of excluded word separators
+ [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
+ do
+ # Attach to the previous token,
+ # unless the previous token is the command name.
+ if [ $j -ge 2 ] && [ -n "$first" ]; then
+ ((j--))
+ fi
+ first=
+ words_[$j]=${words_[j]}${COMP_WORDS[i]}
+ if [ $i = $COMP_CWORD ]; then
+ cword_=$j
+ fi
+ if (($i < ${#COMP_WORDS[@]} - 1)); then
+ ((i++))
+ else
+ # Done.
+ return
+ fi
+ done
+ words_[$j]=${words_[j]}${COMP_WORDS[i]}
+ if [ $i = $COMP_CWORD ]; then
+ cword_=$j
+ fi
+ done
+}
+
+if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
+_get_comp_words_by_ref ()
+{
+ local exclude cur_ words_ cword_
+ if [ "$1" = "-n" ]; then
+ exclude=$2
+ shift 2
+ fi
+ __crm_reassemble_comp_words_by_ref "$exclude"
+ cur_=${words_[cword_]}
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ cur)
+ cur=$cur_
+ ;;
+ prev)
+ prev=${words_[$cword_-1]}
+ ;;
+ words)
+ words=("${words_[@]}")
+ ;;
+ cword)
+ cword=$cword_
+ ;;
+ esac
+ shift
+ done
+}
+fi
+
+__crmcompadd ()
+{
+ local i=0
+ for x in $1; do
+ if [[ "$x" == "$3"* ]]; then
+ if [[ "$x" =~ .*(=|:)$ ]];then
+ if [[ "$x" =~ ^id=$ ]];then
+ :
+ else
+ COMPREPLY[i++]="$2$x"
+ fi
+ else
+ COMPREPLY[i++]="$2$x$4"
+ fi
+ fi
+ done
+}
+
+# Generates completion reply, appending a space to possible completion words,
+# if necessary.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word (optional).
+__crmcomp ()
+{
+ local cur_="${3-$cur}"
+
+ case "$cur_" in
+ --*=)
+ ;;
+ *)
+ local c i=0 IFS=$' \t\n'
+ for c in $1; do
+ c="$c${4-}"
+ if [[ $c == "$cur_"* ]]; then
+ case $c in
+ --*=*|*.) ;;
+ *) c="$c " ;;
+ esac
+ COMPREPLY[i++]="${2-}$c"
+ fi
+ done
+ ;;
+ esac
+}
+
+# Generates completion reply from newline-separated possible completion words
+# by appending a space to all of them.
+# It accepts 1 to 4 arguments:
+# 1: List of possible completion words, separated by a single newline.
+# 2: A prefix to be added to each possible completion word (optional).
+# 3: Generate possible completion matches for this word (optional).
+# 4: A suffix to be appended to each possible completion word instead of
+# the default space (optional). If specified but empty, nothing is
+# appended.
+__crmcomp_nl ()
+{
+ local IFS=$'\n'
+ __crmcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
+}
+
+__crm_compgen ()
+{
+ local cur_="$cur" cmd="${words[1]}"
+ local pfx=""
+
+ case "$cur_" in
+ *:*)
+ case "$COMP_WORDBREAKS" in
+ *:*) : great ;;
+ *) pfx="${cur_%%:*}:" ;;
+ esac
+ cur_="${cur_##*:}"
+ ;;
+ esac
+
+ __crmcomp_nl "$(2>/dev/null crm --compgen "${COMP_POINT}" "${COMP_LINE}")" "$pfx" "$cur_"
+}
+
+_crm() {
+ local cur words cword prev
+
+ _get_comp_words_by_ref -n =: cur words cword prev
+
+ for ((i=1; $i<=$cword; i++)); do
+ if [[ ${words[i]} != -* ]]; then
+ if [[ ${words[i-1]} != @(-f|--file|-H|--history|-D|--display|-X|-c|--cib) ]]; then
+ arg="${words[i]}"
+ argi=$i
+ break
+ fi
+ fi
+ done
+
+ case $prev in
+ -f|--file|-H|--history|-D|--display|-X|-c|--cib)
+ # use default completion
+ return
+ ;;
+ esac
+
+ if [[ "$cur" == -* ]]; then
+ __crmcomp '-w -h -d -F -R -f --file -H --history -D --display -X -c --cib'
+ return 0
+ fi
+
+ __crm_compgen
+} &&
+complete -o bashdefault -o default -o nospace -F _crm crm || complete -o default -o nospace -F _crm crm
diff --git a/contrib/git-hook-pre-commit b/contrib/git-hook-pre-commit
new file mode 100755
index 0000000..f4bd35a
--- /dev/null
+++ b/contrib/git-hook-pre-commit
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+root="$(git rev-parse --show-toplevel)"
+[ -d "$root" ] || exit 1
+
+./update-data-manifest.sh
+git add ./data-manifest
diff --git a/contrib/pcmk-ftdetect.vim b/contrib/pcmk-ftdetect.vim
new file mode 100644
index 0000000..e8e5387
--- /dev/null
+++ b/contrib/pcmk-ftdetect.vim
@@ -0,0 +1,2 @@
+" test for match at first character
+au BufNewFile,BufRead * if match(getline(1), 'node ')==0 | set ft=pcmk | endif
diff --git a/contrib/pcmk.vim b/contrib/pcmk.vim
new file mode 100644
index 0000000..19a93b6
--- /dev/null
+++ b/contrib/pcmk.vim
@@ -0,0 +1,114 @@
+" Vim syntax file
+" Author: Trevor Hemsley <themsley@voiceflex.com>
+" Author: Dan Frincu <df.cluster@gmail.com>
+" Language: pcmk
+" Filenames: *.pcmk
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+set modeline
+
+" setlocal iskeyword+=-
+
+" Errors
+syn match pcmkParErr ")"
+syn match pcmkBrackErr "]"
+syn match pcmkBraceErr "}"
+
+" Enclosing delimiters
+syn region pcmkEncl transparent matchgroup=pcmkParEncl start="(" matchgroup=pcmkParEncl end=")" contains=ALLBUT,pcmkParErr
+syn region pcmkEncl transparent matchgroup=pcmkBrackEncl start="\[" matchgroup=pcmkBrackEncl end="\]" contains=ALLBUT,pcmkBrackErr
+syn region pcmkEncl transparent matchgroup=pcmkBraceEncl start="{" matchgroup=pcmkBraceEncl end="}" contains=ALLBUT,pcmkBraceErr
+
+" Comments
+syn region pcmkComment start="//" end="$" contains=pcmkComment,pcmkTodo
+syn region pcmkComment start="/\*" end="\*/" contains=pcmkComment,pcmkTodo
+syn keyword pcmkTodo contained TODO FIXME XXX
+
+" Strings
+syn region pcmkString start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+" General keywords
+syn keyword pcmkKeyword node primitive property rsc_defaults op_defaults group clone nextgroup=pcmkName skipwhite
+syn keyword pcmkKey2 location nextgroup=pcmkResource skipwhite
+syn keyword pcmkKey3 colocation order nextgroup=pcmkName3 skipwhite
+syn match pcmkResource /\<\f\+\>/ nextgroup=pcmkName2 skipwhite
+syn match pcmkName /\<\f\+\>/
+syn match pcmkName2 /\<\f\+\>/ nextgroup=pcmkPrio skipwhite
+syn match pcmkName3 /\<\f\+\>/ nextgroup=pcmkPrio skipwhite
+syn match pcmkPrio /\<\w\+\>/
+syn match pcmkNumbers /[[:digit:]]\+\:/
+syn match pcmkInf /inf\:/
+
+" Graph attributes
+syn keyword pcmkType attributes params op meta
+syn keyword pcmkTag monitor start stop migrate_from migrate_to notify demote promote Master Slave
+
+" Special chars
+"syn match pcmkKeyChar "="
+syn match pcmkKeyChar ";"
+syn match pcmkKeyChar "->"
+syn match pcmkKeyChar "\$"
+"syn match pcmkKeyChar "\\"
+syn match pcmkKeyChar ":"
+syn match pcmkKeyChar "-"
+syn match pcmkKeyChar "+"
+
+" Identifier
+syn match pcmkIdentifier /\<\w\+\>/
+syn match pcmkKeyword "^ms\s*" nextgroup=pcmkName skipwhite
+
+" Synchronization
+syn sync minlines=50
+syn sync maxlines=500
+
+" Define the default highlighting.
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later: only when an item doesn't have highlighting yet
+if version >= 508 || !exists("did_pcmk_syntax_inits")
+ if version < 508
+ let did_pcmk_syntax_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+ HiLink pcmkParErr Error
+ HiLink pcmkBraceErr Error
+ HiLink pcmkBrackErr Error
+
+ HiLink pcmkComment Comment
+ HiLink pcmkTodo Todo
+
+ HiLink pcmkParEncl Keyword
+ HiLink pcmkBrackEncl Keyword
+ HiLink pcmkBraceEncl Keyword
+
+ HiLink pcmkKeyword Keyword
+ HiLink pcmkKey2 Keyword
+ HiLink pcmkKey3 Keyword
+ HiLink pcmkType Keyword
+ HiLink pcmkKeyChar Keyword
+
+" hi Normal ctermfg=yellow ctermbg=NONE cterm=NONE
+ HiLink pcmkString String
+ HiLink pcmkIdentifier Identifier
+ HiLink pcmkTag Tag
+ HiLink pcmkName Type
+ HiLink pcmkName2 Tag
+ HiLink pcmkName3 Type
+ HiLink pcmkResource Type
+ HiLink pcmkPrio Number
+ HiLink pcmkNumbers String
+ HiLink pcmkInf String
+
+ delcommand HiLink
+endif
+
+let b:current_syntax = "pcmk"
diff --git a/contrib/pygments_crmsh_lexers/__init__.py b/contrib/pygments_crmsh_lexers/__init__.py
new file mode 100644
index 0000000..938d6e8
--- /dev/null
+++ b/contrib/pygments_crmsh_lexers/__init__.py
@@ -0,0 +1,3 @@
+from __future__ import unicode_literals
+from .ansiclr import ANSIColorsLexer
+from .crmsh import CrmshLexer
diff --git a/contrib/pygments_crmsh_lexers/ansiclr.py b/contrib/pygments_crmsh_lexers/ansiclr.py
new file mode 100644
index 0000000..b30ee85
--- /dev/null
+++ b/contrib/pygments_crmsh_lexers/ansiclr.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+"""
+ pygments.lexers.console
+ ~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lexers for misc console output.
+
+ :copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+from __future__ import unicode_literals
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Generic, Text
+
+__all__ = ['ANSIColorsLexer']
+
+_ESC = "\x1b\["
+# this is normally to reset (reset attributes, set primary font)
+# there could be however other reset sequences and in that case
+# sgr0 needs to be updated
+_SGR0 = "%s(?:0;10|10;0)m" % _ESC
+# BLACK RED GREEN YELLOW
+# BLUE MAGENTA CYAN WHITE
+_ANSI_COLORS = (Generic.Emph, Generic.Error, Generic.Inserted, Generic.Keyword,
+ Generic.Keyword, Generic.Prompt, Generic.Traceback, Generic.Output)
+
+
+def _ansi2rgb(lexer, match):
+ code = match.group(1)
+ text = match.group(2)
+ yield match.start(), _ANSI_COLORS[int(code)-30], text
+
+
+class ANSIColorsLexer(RegexLexer):
+ """
+ Interpret ANSI colors.
+ """
+ name = 'ANSI Colors'
+ aliases = ['ansiclr']
+ filenames = ["*.typescript"]
+
+ tokens = {
+ 'root': [
+ (r'%s(3[0-7]+)m(.*?)%s' % (_ESC, _SGR0), _ansi2rgb),
+ (r'[^\x1b]+', Text),
+ # drop the rest of the graphic codes
+ (r'(%s[0-9;]+m)()' % _ESC, bygroups(None, Text)),
+ ]
+ }
diff --git a/contrib/pygments_crmsh_lexers/crmsh.py b/contrib/pygments_crmsh_lexers/crmsh.py
new file mode 100644
index 0000000..d4f1b14
--- /dev/null
+++ b/contrib/pygments_crmsh_lexers/crmsh.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+"""
+ pygments.lexers.dsls
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Lexers for various domain-specific languages.
+
+ :copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+from __future__ import unicode_literals
+
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, Punctuation, Whitespace
+
+__all__ = ['CrmshLexer']
+
+
+class CrmshLexer(RegexLexer):
+ """
+ Lexer for `crmsh <http://crmsh.github.io/>`_ configuration files
+ for Pacemaker clusters.
+
+ .. versionadded:: 2.1
+ """
+ name = 'Crmsh'
+ aliases = ['crmsh', 'pcmk']
+ filenames = ['*.crmsh', '*.pcmk']
+ mimetypes = []
+
+ elem = words((
+ 'node', 'primitive', 'group', 'clone', 'ms', 'location',
+ 'colocation', 'order', 'fencing_topology', 'rsc_ticket',
+ 'rsc_template', 'property', 'rsc_defaults',
+ 'op_defaults', 'acl_target', 'acl_group', 'user', 'role',
+ 'tag'), suffix=r'(?![\w#$-])')
+ sub = words((
+ 'params', 'meta', 'operations', 'op', 'rule',
+ 'attributes', 'utilization'), suffix=r'(?![\w#$-])')
+ acl = words(('read', 'write', 'deny'), suffix=r'(?![\w#$-])')
+ bin_rel = words(('and', 'or'), suffix=r'(?![\w#$-])')
+ un_ops = words(('defined', 'not_defined'), suffix=r'(?![\w#$-])')
+ date_exp = words(('in_range', 'date', 'spec', 'in'), suffix=r'(?![\w#$-])')
+ acl_mod = (r'(?:tag|ref|reference|attribute|type|xpath)')
+ bin_ops = (r'(?:lt|gt|lte|gte|eq|ne)')
+ val_qual = (r'(?:string|version|number)')
+ rsc_role_action = (r'(?:Master|Started|Slave|Stopped|'
+ r'start|promote|demote|stop)')
+
+ tokens = {
+ 'root': [
+ (r'^#.*\n?', Comment),
+ # attr=value (nvpair)
+ (r'([\w#$-]+)(=)("(?:""|[^"])*"|\S+)',
+ bygroups(Name.Attribute, Punctuation, String)),
+ # need this construct, otherwise numeric node ids
+ # are matched as scores
+ # elem id:
+ (r'(node)(\s+)([\w#$-]+)(:)',
+ bygroups(Keyword, Whitespace, Name, Punctuation)),
+ # scores
+ (r'([+-]?([0-9]+|inf)):', Number),
+ # keywords (elements and other)
+ (elem, Keyword),
+ (sub, Keyword),
+ (acl, Keyword),
+ # binary operators
+ (r'(?:%s:)?(%s)(?![\w#$-])' % (val_qual, bin_ops),
+ Operator.Word),
+ # other operators
+ (bin_rel, Operator.Word),
+ (un_ops, Operator.Word),
+ (date_exp, Operator.Word),
+ # builtin attributes (e.g. #uname)
+ (r'#[a-z]+(?![\w#$-])', Name.Builtin),
+ # acl_mod:blah
+ (r'(%s)(:)("(?:""|[^"])*"|\S+)' % acl_mod,
+ bygroups(Keyword, Punctuation, Name)),
+ # rsc_id[:(role|action)]
+ # NB: this matches all other identifiers
+ (r'([\w#$-]+)(?:(:)(%s))?(?![\w#$-])' % rsc_role_action,
+ bygroups(Name, Punctuation, Operator.Word)),
+ # punctuation
+ (r'(\\(?=\n)|[[\](){}/:@])', Punctuation),
+ (r'\s+|\n', Whitespace),
+ ],
+ }
diff --git a/contrib/setup.py b/contrib/setup.py
new file mode 100644
index 0000000..30330b8
--- /dev/null
+++ b/contrib/setup.py
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+
+from __future__ import unicode_literals
+from setuptools import setup
+
+setup(name='pygments-crmsh-lexers',
+ version='0.0.5',
+ description='Pygments crmsh custom lexers.',
+ keywords='pygments crmsh lexer',
+ license='BSD',
+
+ author='Kristoffer Gronlund',
+ author_email='kgronlund@suse.com',
+
+ url='https://github.com/ClusterLabs/crmsh',
+
+ packages=['pygments_crmsh_lexers'],
+ install_requires=['pygments>=2.0.2'],
+
+ entry_points='''[pygments.lexers]
+ ANSIColorsLexer=pygments_crmsh_lexers:ANSIColorsLexer
+ CrmshLexer=pygments_crmsh_lexers:CrmshLexer''',
+
+ classifiers=[
+ 'Environment :: Plugins',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: BSD License',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2',
+ 'Programming Language :: Python :: 3',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ ],)