Permalink
Browse files

fixing inline comments support. closes #301 Thanks @medwards 👍

  • Loading branch information...
1 parent 3398152 commit eafddd9bf9cc789807bf5bb63f63219d08223713 @gabrielfalcao committed Nov 24, 2012
Showing with 82 additions and 15 deletions.
  1. +10 −0 lettuce/core.py
  2. +72 −15 tests/unit/test_scenario_parsing.py
View
@@ -47,6 +47,8 @@ class REP(object):
only_whitespace = re.compile('^\s*$')
tag_extraction_regex = re.compile(r'(?:(?:^|\s+)[@]([^@\s]+))')
tag_strip_regex = re.compile(ur'(?:(?:^\s*|\s+)[@]\S+\s*)+$', re.DOTALL)
+ comment_strip1 = re.compile(ur'(^[^\'"]*)[#]([^\'"]*)$')
+ comment_strip2 = re.compile(ur'(^[^\'"]+)[#](.*)$')
class HashList(list):
@@ -414,6 +416,12 @@ def run(self, ignore_case):
self.passed = True
return True
+ @classmethod
+ def _handle_inline_comments(klass, line):
+ line = REP.comment_strip1.sub(r'\g<1>\g<2>', line)
+ line = REP.comment_strip2.sub(r'\g<1>', line)
+ return line
+
@staticmethod
def run_all(steps, outline=None, run_callbacks=False, ignore_case=True):
"""Runs each step in the given list of steps.
@@ -491,6 +499,8 @@ def many_from_lines(klass, lines, filename=None, original_string=None):
step_strings[-1] += "\n%s" % line
elif strings.wise_startswith(line, u"|") or in_multiline:
step_strings[-1] += "\n%s" % line
+ elif '#' in line:
+ step_strings.append(klass._handle_inline_comments(line))
else:
step_strings.append(line)
@@ -14,6 +14,15 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+from sure import expect
+from lettuce.core import Step
+from lettuce.core import Scenario
+from lettuce.core import Feature
+from lettuce.exceptions import LettuceSyntaxError
+
+from nose.tools import assert_equals
+from nose.tools import assert_raises
+
SCENARIO1 = """
Scenario: Adding some students to my university database
@@ -175,14 +184,24 @@
"""
-from sure import that
-from lettuce.core import Step
-from lettuce.core import Scenario
-from lettuce.core import Feature
-from lettuce.exceptions import LettuceSyntaxError
+INLINE_COMMENTS = '''
+Scenario: Making a sword
+ Given I am using an anvil
+ And I am using a hammer # informational "comment"
+'''
+
+INLINE_COMMENTS_IGNORED_WITHIN_DOUBLE_QUOTES = '''
+Scenario: Tweeting
+ Given I am logged in on twitter
+ When I search for the hashtag "#hammer"
+'''
+
+INLINE_COMMENTS_IGNORED_WITHIN_SINGLE_QUOTES = """
+Scenario: Tweeting
+ Given I am logged in on twitter
+ When I search for the hashtag '#hammer'
+"""
-from nose.tools import assert_equals
-from nose.tools import assert_raises
def test_scenario_has_name():
"It should extract the name of the scenario"
@@ -427,6 +446,7 @@ def test_scenario_aggregate_all_examples_blocks():
]
)
+
def test_commented_scenarios():
"A scenario string that contains lines starting with '#' will be commented"
scenario = Scenario.from_string(COMMENTED_SCENARIO)
@@ -435,26 +455,26 @@ def test_commented_scenarios():
def test_scenario_has_tag():
- "A scenario object should be able to find at least one tag " \
- "on the first line"
+ ("A scenario object should be able to find at least one tag "
+ "on the first line")
scenario = Scenario.from_string(
SCENARIO1,
original_string=('@onetag\n' + SCENARIO1.strip()))
- assert that(scenario.tags).deep_equals(['onetag'])
+ expect(scenario.tags).to.equal(['onetag'])
def test_scenario_has_tags_singleline():
- "A scenario object should be able to find many tags " \
- "on the first line"
+ ("A scenario object should be able to find many tags "
+ "on the first line")
scenario = Scenario.from_string(
SCENARIO1,
original_string=(
'@onetag @another @$%^&even-weird_chars \n' + SCENARIO1.strip()))
- assert that(scenario.tags).deep_equals([
+ expect(scenario.tags).to.equal([
'onetag',
'another',
'$%^&even-weird_chars',
@@ -469,7 +489,7 @@ def test_scenario_matches_tags():
SCENARIO1,
original_string=('@onetag\n@another-one\n' + SCENARIO1.strip()))
- assert that(scenario.tags).deep_equals(['onetag','another-one'])
+ expect(scenario.tags).to.equal(['onetag', 'another-one'])
assert scenario.matches_tags(['onetag'])
assert scenario.matches_tags(['another-one'])
@@ -526,6 +546,43 @@ def test_scenario_show_tags_in_its_representation():
SCENARIO1,
original_string=('@slow\n@firefox\n@chrome\n' + SCENARIO1.strip()))
- assert that(scenario.represented()).equals(
+ expect(scenario.represented()).to.equal(
u' @slow @firefox @chrome\n '
'Scenario: Adding some students to my university database')
+
+
+def test_scenario_with_inline_comments():
+ ("Scenarios can have steps with inline comments")
+
+ scenario = Scenario.from_string(INLINE_COMMENTS)
+
+ step1, step2 = scenario.steps
+
+ expect(step1.sentence).to.equal(u'Given I am using an anvil')
+ expect(step2.sentence).to.equal(u'And I am using a hammer')
+
+
+def test_scenario_with_hash_within_double_quotes():
+ ("Scenarios have hashes within double quotes and yet don't "
+ "consider them as comments")
+
+ scenario = Scenario.from_string(
+ INLINE_COMMENTS_IGNORED_WITHIN_DOUBLE_QUOTES)
+
+ step1, step2 = scenario.steps
+
+ expect(step1.sentence).to.equal(u'Given I am logged in on twitter')
+ expect(step2.sentence).to.equal(u'When I search for the hashtag "#hammer"')
+
+
+def test_scenario_with_hash_within_single_quotes():
+ ("Scenarios have hashes within single quotes and yet don't "
+ "consider them as comments")
+
+ scenario = Scenario.from_string(
+ INLINE_COMMENTS_IGNORED_WITHIN_SINGLE_QUOTES)
+
+ step1, step2 = scenario.steps
+
+ expect(step1.sentence).to.equal(u'Given I am logged in on twitter')
+ expect(step2.sentence).to.equal(u"When I search for the hashtag '#hammer'")

0 comments on commit eafddd9

Please sign in to comment.