Best Python code snippet using gherkin-python
gherkin_template_processor.py
Source:gherkin_template_processor.py  
1import json2print("Make sure script is run using python3")3def generate_keyword_body(keywords):4    first_keyword = keywords[0].replace("'", "\\'")5    body = "\n\t("6    body += "'" +  keywords[0].replace("'", "\\'") + "'"7    8    if len(body) > 1:9        for keyword in range(1,len(keywords)): 10            body += "\n\t\t| '{k}'".format(k=keywords[keyword].replace("'", "\\'"))11    body += "\n\t) "12    return body13 14language_data = json.load(open('languages/gherkin-languages.json'))15template = """lexer grammar GherkinLexer;16fragment LANGUAGE_KEYWORD : WS* '#' WS* 'language' WS* ':' WS*;17LANGUAGE_HEADER : LANGUAGE_KEYWORD 'en' LINE_END -> mode(DEFAULT_MODE) ;18"""19for language in language_data.keys():20    l = language_data[language]21    ul = language.upper().replace("-", "_")22    template += "\n" + ul + "_LANGUAGE_HEADER : LANGUAGE_KEYWORD '" + language + "' LINE_END -> mode(" + ul + "), type(LANGUAGE_HEADER) ;"23template += "\n//////////////////////////////////////////////////////////////////////////"24template += '''25FEATURE_KEYWORD : ('Feature'26	| 'Business Need'27	| 'Ability') ':' -> channel(HIDDEN) ;28SCENARIO_KEYWORD : ('Scenario' | 'Example') ':' -> channel(HIDDEN) ;29SCENARIO_OUTLINE_KEYWORD : 'Scenario Outline:' -> channel(HIDDEN);30BACKGROUND_KEYWORD : 'Background:' ;31EXAMPLES_KEYWORD : 'Examples:' | 'Scenarios:';32RULE_KEYWORD : 'Rule:' ;33STARTING_STEP_KEYWORD : GIVEN_KEYWORD34	| WHEN_KEYWORD35	| THEN_KEYWORD36	| WILD_KEYWORD37	;38ALTERNATIVE_STEP_KEYWORD : AND_KEYWORD39	| BUT_KEYWORD40	| GIVEN_KEYWORD41	;42GIVEN_KEYWORD : 'Given ' ;43WHEN_KEYWORD : 'When ' ;44THEN_KEYWORD : 'Then ' ;45WILD_KEYWORD : '* ' ;46AND_KEYWORD : 'And ';47BUT_KEYWORD : 'But ';48fragment CAPTURE_DATA : '<' ~[>\\t\\r\\n ]'>' ;49fragment DOCSTRING_DOUBLE_QUOTES : WS* '"""' (CAPTURE_DATA | ~'"' | '"' ~'"')*?  '"""' LINE_END ;50fragment DOCSTRING_BACKTICKS : WS* '```' (~'`' | CAPTURE_DATA | '`' ~'`').*? '```' LINE_END;51fragment TAG : '@'~[ \\r\\n\\t@]+ ;52fragment ESCAPE_SEQUENCE : '\\\\' [\\\\|\\n]* ;53fragment CELL_CHARACTER54	:	CAPTURE_DATA55	| ~[\\r\\n|\\\\]56	|	ESCAPE_SEQUENCE57	;58fragment CELL_DATA : WS* CELL_CHARACTER* '|';59DOCSTRING : DOCSTRING_DOUBLE_QUOTES | DOCSTRING_BACKTICKS ;60TAGS : WS* TAG (WS* TAG)* (COMMENT? | LINE_END);61FEATURE_TITLE : WS* FEATURE_KEYWORD ~[\\r\\n]* LINE_END ;62BACKGROUND_TITLE : WS* BACKGROUND_KEYWORD ~[\\r\\n]* COMMENT? LINE_END ;63EXAMPLES_TITLE : WS* EXAMPLES_KEYWORD ~[\\r\\n]* COMMENT? LINE_END ;64SCENARIO_TITLE : WS* SCENARIO_KEYWORD ~[\\r\\n]* LINE_END ;65SCENARIO_OUTLINE_TITLE : WS* SCENARIO_OUTLINE_KEYWORD (CAPTURE_DATA | ~[\\r\\n])* LINE_END ;66RULE_TITLE : WS* RULE_KEYWORD ~[\\r\\n]* LINE_END ;67GIVEN_STEP : WS* GIVEN_KEYWORD ~[ @\\r\\n|] ~[\\r\\n]* LINE_END;68WHEN_STEP : WS* WHEN_KEYWORD ~[ @\\r\\n|] ~[\\r\\n]* LINE_END;69THEN_STEP : WS* THEN_KEYWORD ~[ @\\r\\n|] ~[\\r\\n]* LINE_END;70AND_STEP : WS* AND_KEYWORD ~[ @\\r\\n|] ~[\\r\\n]* LINE_END;71BUT_STEP : WS* BUT_KEYWORD ~[ @\\r\\n|] ~[\\r\\n]* LINE_END;72WILD_STEP : WS* WILD_KEYWORD ~[ @\\r\\n|] ~[\\r\\n]* LINE_END;73DATA_ROW : WS* '|' CELL_DATA+ LINE_END ;74INVALID_LANGUAGE_HEADER : LANGUAGE_KEYWORD ~[\\r\\n]* LINE_END ;75COMMENT : WS* '#' ~[\\r\\n]* LINE_END -> channel(HIDDEN) ;76LINE_END : WS* (NEWLINE+ | EOF) -> skip;77NEWLINE : [\\r\\n] -> skip ;78WS : [ \\t] -> skip;79LONG_DESCRIPTION : WS* ~[ @\\r\\n|] ~[\\r\\n]* LINE_END ;80///////////////////////////////////////////////////81'''82for language in language_data.keys():83    print(language)84    ul = language.upper().replace('-', '_')85    ld = language_data[language]86    template += "\n//" + ld["name"]87    template += "\n//" + ld["native"]88    template += "\nmode " + ul + ";"89    # Feature90    template += "\n\t" + ul + "_FEATURE : ( "91    template += generate_keyword_body(ld["feature"]) + "':'"92    template += "\n\t\t) -> type(FEATURE_KEYWORD) ;"93    # Background94    template += """95    {lc}_BACKGROUND : (96    """.format(lc=ul)97    template += generate_keyword_body(ld["background"]) + "':'"98    template += "\n\t\t) -> type(BACKGROUND_KEYWORD);"99    # Scenario100    template += "\n\t" + ul + "_SCENARIO : (\n"101    template += generate_keyword_body(ld["scenario"]) + "':'"102    template += "\n\t) -> type(SCENARIO_KEYWORD);\n"103    # Scenario Outline104    template += "\n\t" + ul + "_SCENARIO_OUTLINE : (\n"105    template += generate_keyword_body(ld["scenarioOutline"])106    template += "\n\t) -> type(SCENARIO_OUTLINE_KEYWORD);\n"107    # Examples108    template += "\n\t" + ul + "_EXAMPLES : (\n"109    template += generate_keyword_body(ld["examples"]) + "':'"110    template += "  ) -> type(EXAMPLES_KEYWORD) ;\n"111    # Rule112    template += "\n\t" + ul + "_RULE : (\n"113    template += generate_keyword_body(ld["rule"]) + "':'"114    template += "  ) -> type(RULE_KEYWORD) ;\n"115    # Given116    template += "\n\t" + ul + "_GIVEN : (\n"117    given_keywords = ld["given"]118    if "* " in given_keywords: given_keywords.remove("* ")119    template += generate_keyword_body(given_keywords)120    template += "  ) -> type(GIVEN_KEYWORD) ;\n"121    # When122    template += "\n\t" + ul + "_WHEN : (\n"123    when_keywords = ld["when"]124    if "* " in when_keywords: when_keywords.remove("* ")125    template += generate_keyword_body(when_keywords)126    template += "  ) -> type(WHEN_KEYWORD) ;\n"127    # Then128    template += "\n\t" + ul + "_THEN : (\n"129    then_keywords = ld["then"]130    if "* " in then_keywords: then_keywords.remove("* ")131    template += generate_keyword_body(then_keywords)132    template += "  ) -> type(THEN_KEYWORD) ;\n"133    # And134    template += "\n\t" + ul + "_AND : (\n"135    and_keywords = ld["and"]136    if "* " in and_keywords: and_keywords.remove("* ")137    template += generate_keyword_body(and_keywords)138    template += "  ) -> type(AND_KEYWORD) ;\n"139    # But140    template += "\n\t" + ul + "_BUT : (\n"141    but_keywords = ld["but"]142    if "* " in but_keywords: but_keywords.remove("* ")143    template += generate_keyword_body(but_keywords)144    template += "  ) -> type(BUT_KEYWORD) ;\n"145    # Starting step146    template += "\n\t" + ul + """_STARTING_STEP_KEYWORD : (\n147                {lc}_GIVEN148		| {lc}_WHEN149		| {lc}_THEN150		| WILD_KEYWORD151		) -> type(STARTING_STEP_KEYWORD);152    """.format(lc=ul)153    template += "\n\t" + ul + """_ALTERNATIVE_STEP_KEYWORD : (\n154                {lc}_AND155		| {lc}_BUT156		) -> type(ALTERNATIVE_STEP_KEYWORD);157    """.format(lc=ul)158    template += """159    {language_code}_FEATURE_TITLE : WS* {language_code}_FEATURE ~[\\r\\n]* WS* LINE_END -> type(FEATURE_TITLE) ;160    {language_code}_BACKGROUND_TITLE : WS* {language_code}_BACKGROUND ~[\\r\\n]* COMMENT? LINE_END -> type(BACKGROUND_TITLE) ;161    {language_code}_EXAMPLES_TITLE : WS* {language_code}_EXAMPLES ~[\\r\\n]* COMMENT? LINE_END -> type(EXAMPLES_TITLE);162    {language_code}_SCENARIO_TITLE : WS* {language_code}_SCENARIO ~[\\r\\n]* LINE_END -> type(SCENARIO_TITLE);163    {language_code}_SCENARIO_OUTLINE_TITLE : WS* {language_code}_SCENARIO_OUTLINE ~[\\r\\n]* LINE_END -> type(SCENARIO_OUTLINE_TITLE) ;164    {language_code}_RULE_TITLE : WS* {language_code}_RULE ~[\\r\\n]* LINE_END -> type(RULE_TITLE);165        {language_code}_GIVEN_STEP : WS* {language_code}_GIVEN ~[ @\\r\\n|] ~[\\r\\n]* LINE_END -> type(GIVEN_STEP);166	{language_code}_WHEN_STEP : WS* {language_code}_WHEN ~[ @\\r\\n|] ~[\\r\\n]* LINE_END -> type(WHEN_STEP);167	{language_code}_THEN_STEP : WS* {language_code}_THEN ~[ @\\r\\n|] ~[\\r\\n]* LINE_END -> type(THEN_STEP);168	{language_code}_AND_STEP : WS* {language_code}_AND ~[ @\\r\\n|] ~[\\r\\n]* LINE_END -> type(AND_STEP);169	{language_code}_BUT_STEP : WS* {language_code}_BUT ~[ @\\r\\n|] ~[\\r\\n]* LINE_END -> type(BUT_STEP);170""".format(language_code = ul)171    f = open("GherkinLexer.g4", "w")172    f.write(template)173    f.close()174print("GherkinLexer.g4 regenerated")...token_matcher.py
Source:token_matcher.py  
1import re2from .dialect import Dialect3from .errors import NoSuchLanguageException4class TokenMatcher(object):5    LANGUAGE_RE = re.compile(r"^\s*#\s*language\s*:\s*([a-zA-Z\-_]+)\s*$")6    def __init__(self, dialect_name='en'):7        self._default_dialect_name = dialect_name8        self._change_dialect(dialect_name)9        self.reset()10    def reset(self):11        if self.dialect_name != self._default_dialect_name:12            self._change_dialect(self._default_dialect_name)13        self._indent_to_remove = 014        self._active_doc_string_separator = None15    def match_FeatureLine(self, token):16        return self._match_title_line(token, 'FeatureLine', self.dialect.feature_keywords)17    def match_ScenarioLine(self, token):18        return self._match_title_line(token, 'ScenarioLine', self.dialect.scenario_keywords)19    def match_ScenarioOutlineLine(self, token):20        return self._match_title_line(token, 'ScenarioOutlineLine',21                                      self.dialect.scenario_outline_keywords)22    def match_BackgroundLine(self, token):23        return self._match_title_line(token, 'BackgroundLine', self.dialect.background_keywords)24    def match_ExamplesLine(self, token):25        return self._match_title_line(token, 'ExamplesLine', self.dialect.examples_keywords)26    def match_TableRow(self, token):27        if not token.line.startswith('|'):28            return False29        # TODO: indent30        self._set_token_matched(token, 'TableRow', items=token.line.table_cells)31        return True32    def match_StepLine(self, token):33        keywords = (self.dialect.given_keywords +34                    self.dialect.when_keywords +35                    self.dialect.then_keywords +36                    self.dialect.and_keywords +37                    self.dialect.but_keywords)38        for keyword in (k for k in keywords if token.line.startswith(k)):39            title = token.line.get_rest_trimmed(len(keyword))40            self._set_token_matched(token, 'StepLine', title, keyword)41            return True42        return False43    def match_Comment(self, token):44        if not token.line.startswith('#'):45            return False46        text = token.line._line_text  # take the entire line, including leading space47        self._set_token_matched(token, 'Comment', text, indent=0)48        return True49    def match_Empty(self, token):50        if not token.line.is_empty():51            return False52        self._set_token_matched(token, 'Empty', indent=0)53        return True54    def match_Language(self, token):55        match = self.LANGUAGE_RE.match(token.line.get_line_text())56        if not match:57            return False58        dialect_name = match.group(1)59        self._set_token_matched(token, 'Language', dialect_name)60        self._change_dialect(dialect_name, token.location)61        return True62    def match_TagLine(self, token):63        if not token.line.startswith('@'):64            return False65        self._set_token_matched(token, 'TagLine', items=token.line.tags)66        return True67    def match_DocStringSeparator(self, token):68        if not self._active_doc_string_separator:69            # open70            return (self._match_DocStringSeparator(token, '"""', True) or71                    self._match_DocStringSeparator(token, '```', True))72        else:73            # close74            return self._match_DocStringSeparator(token, self._active_doc_string_separator, False)75    def _match_DocStringSeparator(self, token, separator, is_open):76        if not token.line.startswith(separator):77            return False78        content_type = None79        if is_open:80            content_type = token.line.get_rest_trimmed(len(separator))81            self._active_doc_string_separator = separator82            self._indent_to_remove = token.line.indent83        else:84            self._active_doc_string_separator = None85            self._indent_to_remove = 086        # TODO: Use the separator as keyword. That's needed for pretty printing.87        self._set_token_matched(token, 'DocStringSeparator', content_type)88        return True89    def match_Other(self, token):90        # take the entire line, except removing DocString indents91        text = token.line.get_line_text(self._indent_to_remove)92        self._set_token_matched(token, 'Other', self._unescaped_docstring(text), indent=0)93        return True94    def match_EOF(self, token):95        if not token.eof():96            return False97        self._set_token_matched(token, 'EOF')98        return True99    def _match_title_line(self, token, token_type, keywords):100        for keyword in (k for k in keywords if token.line.startswith_title_keyword(k)):101            title = token.line.get_rest_trimmed(len(keyword) + len(':'))102            self._set_token_matched(token, token_type, title, keyword)103            return True104        return False105    def _set_token_matched(self, token, matched_type, text=None,106                           keyword=None, indent=None, items=None):107        if items is None:108            items = []109        token.matched_type = matched_type110        # text == '' should not result in None111        token.matched_text = text.rstrip('\r\n') if text is not None else None112        token.matched_keyword = keyword113        if indent is not None:114            token.matched_indent = indent115        else:116            token.matched_indent = token.line.indent if token.line else 0117        token.matched_items = items118        token.location['column'] = token.matched_indent + 1119        token.matched_gherkin_dialect = self.dialect_name120    def _change_dialect(self, dialect_name, location=None):121        dialect = Dialect.for_name(dialect_name)122        if not dialect:123            raise NoSuchLanguageException(dialect_name, location)124        self.dialect_name = dialect_name125        self.dialect = dialect126    def _unescaped_docstring(self, text):...dialect.py
Source:dialect.py  
...39    @property40    def and_keywords(self):41        return self.spec['and']42    @property43    def but_keywords(self):...custom_keywords.py
Source:custom_keywords.py  
1@property2def concurrent_keywords(self):3    return ['*','Concurrently ', '(background) Given ', '(background) When ', '(background) Then ', '(background) And ']4def match_stepline(self,token):5    keywords = (self.dialect.given_keywords +6                self.dialect.when_keywords +7                self.dialect.then_keywords +8                self.dialect.and_keywords +9                self.dialect.concurrent_keywords +10                self.dialect.but_keywords)11    for keyword in (k for k in keywords if token.line.startswith(k)):12        title = token.line.get_rest_trimmed(len(keyword))13        self._set_token_matched(token, 'StepLine', title, keyword)14        return True...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
