Commit dcbf1aed by Gabriel Falcao

starting to work on tags

parent 4bbe6aef
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
import re import re
import codecs import codecs
import unicodedata import unicodedata
from itertools import chain
from copy import deepcopy from copy import deepcopy
from lettuce import strings from lettuce import strings
from lettuce import languages from lettuce import languages
...@@ -499,6 +500,7 @@ class Scenario(object): ...@@ -499,6 +500,7 @@ class Scenario(object):
self.name = name self.name = name
self.language = language self.language = language
self.remaining_lines = remaining_lines
self.steps = self._parse_remaining_lines(remaining_lines, self.steps = self._parse_remaining_lines(remaining_lines,
with_file, with_file,
original_string) original_string)
...@@ -517,6 +519,11 @@ class Scenario(object): ...@@ -517,6 +519,11 @@ class Scenario(object):
self.steps, self.outlines, with_file, original_string)) self.steps, self.outlines, with_file, original_string))
self._add_myself_to_steps() self._add_myself_to_steps()
if original_string and '@' in self.original_string:
self.tags = self._find_tags()
else:
self.tags = []
@property @property
def max_length(self): def max_length(self):
if self.outlines: if self.outlines:
...@@ -627,6 +634,21 @@ class Scenario(object): ...@@ -627,6 +634,21 @@ class Scenario(object):
for step in self.solved_steps: for step in self.solved_steps:
step.scenario = self step.scenario = self
def _find_tags(self):
first_line = self.remaining_lines[0]
trim = lambda x: x.strip()
old_lines = map(trim, self.original_string.splitlines())
tag_lines = []
if first_line in old_lines:
tag_lines = old_lines[:old_lines.index(first_line)-1]
if tag_lines:
return list(chain(*map(self._extract_tag, tag_lines)))
def _extract_tag(self, item):
regex = re.compile(r'[@](\S+)')
return regex.findall(item)
def _resolve_steps(self, steps, outlines, with_file, original_string): def _resolve_steps(self, steps, outlines, with_file, original_string):
for outline in outlines: for outline in outlines:
for step in steps: for step in steps:
......
...@@ -4,4 +4,5 @@ django>=1.1.1 ...@@ -4,4 +4,5 @@ django>=1.1.1
sphinx sphinx
lxml lxml
tornado tornado
coverage coverage
\ No newline at end of file sure>=0.10.0
\ No newline at end of file
...@@ -30,7 +30,7 @@ def get_packages(): ...@@ -30,7 +30,7 @@ def get_packages():
return packages return packages
required_modules = [] required_modules = ['sure']
if sys.version_info[:2] < (2, 6): if sys.version_info[:2] < (2, 6):
required_modules.append('multiprocessing') required_modules.append('multiprocessing')
...@@ -40,10 +40,10 @@ setup(name='lettuce', ...@@ -40,10 +40,10 @@ setup(name='lettuce',
description='Behaviour Driven Development for python', description='Behaviour Driven Development for python',
author=u'Gabriel Falcao', author=u'Gabriel Falcao',
author_email='gabriel@nacaolivre.org', author_email='gabriel@nacaolivre.org',
url='http://github.com/gabrielfalcao/lettuce', url='http://lettuce.it',
packages=get_packages(), packages=get_packages(),
install_requires=required_modules, install_requires=required_modules,
entry_points={ entry_points={
'console_scripts': ['lettuce = lettuce.lettuce_cli:main'], 'console_scripts': ['lettuce = lettuce.bin:main'],
}, },
) )
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from sure import that
from lettuce.core import Scenario from lettuce.core import Scenario
from lettuce.core import Feature from lettuce.core import Feature
from nose.tools import assert_equals from nose.tools import assert_equals
...@@ -148,6 +148,16 @@ Feature: Big sentence ...@@ -148,6 +148,16 @@ Feature: Big sentence
# And another one, very tiny # And another one, very tiny
""" """
FEATURE11 = """
Feature: Yay tags
@many @other
@basic
@tags @here @:)
Scenario: Holy tag, Batman
Given this scenario has tags
Then it can be inspected from within the object
"""
def test_feature_has_repr(): def test_feature_has_repr():
"Feature implements __repr__ nicely" "Feature implements __repr__ nicely"
...@@ -282,15 +292,17 @@ def test_feature_max_length_on_scenario_outline_keys(): ...@@ -282,15 +292,17 @@ def test_feature_max_length_on_scenario_outline_keys():
assert_equals(feature1.max_length, 68) assert_equals(feature1.max_length, 68)
assert_equals(feature2.max_length, 68) assert_equals(feature2.max_length, 68)
def test_description_on_long_named_feature(): def test_description_on_long_named_feature():
"Can parse the description on long named features" "Can parse the description on long named features"
feature = Feature.from_string(FEATURE3) feature = Feature.from_string(FEATURE3)
assert_equals( assert_equals(
feature.description, feature.description,
"In order to describe my features\n" "In order to describe my features\n"
"I want to add description on them" "I want to add description on them",
) )
def test_description_on_big_sentenced_steps(): def test_description_on_big_sentenced_steps():
"Can parse the description on long sentenced steps" "Can parse the description on long sentenced steps"
feature = Feature.from_string(FEATURE4) feature = Feature.from_string(FEATURE4)
...@@ -298,11 +310,22 @@ def test_description_on_big_sentenced_steps(): ...@@ -298,11 +310,22 @@ def test_description_on_big_sentenced_steps():
feature.description, feature.description,
"As a clever guy\n" "As a clever guy\n"
"I want to describe this Feature\n" "I want to describe this Feature\n"
"So that I can take care of my Scenario" "So that I can take care of my Scenario",
) )
def test_comments(): def test_comments():
"It should ignore lines that start with #, despite white spaces" "It should ignore lines that start with #, despite white spaces"
feature = Feature.from_string(FEATURE10) feature = Feature.from_string(FEATURE10)
assert_equals(feature.max_length, 55) assert_equals(feature.max_length, 55)
def test_single_scenario_single_tag():
"Features should have their scenarios parsed with tags"
feature = Feature.from_string(FEATURE11)
first_scenario = feature.scenarios[0]
assert that(first_scenario.tags).deep_equals([
'many', 'other', 'basic', 'tags', 'here', ':)'])
...@@ -175,6 +175,7 @@ Scenario: Adding some students to my university database ...@@ -175,6 +175,7 @@ Scenario: Adding some students to my university database
""" """
from sure import that
from lettuce.core import Step from lettuce.core import Step
from lettuce.core import Scenario from lettuce.core import Scenario
from lettuce.core import Feature from lettuce.core import Feature
...@@ -300,7 +301,7 @@ def test_scenario_tables_are_solved_against_outlines(): ...@@ -300,7 +301,7 @@ def test_scenario_tables_are_solved_against_outlines():
[], [],
[] []
] ]
scenario = Scenario.from_string(OUTLINED_SCENARIO_WITH_SUBSTITUTIONS_IN_TABLE) scenario = Scenario.from_string(OUTLINED_SCENARIO_WITH_SUBSTITUTIONS_IN_TABLE)
for step, expected_hashes in zip(scenario.solved_steps, expected_hashes_per_step): for step, expected_hashes in zip(scenario.solved_steps, expected_hashes_per_step):
assert_equals(type(step), Step) assert_equals(type(step), Step)
...@@ -431,3 +432,30 @@ def test_commented_scenarios(): ...@@ -431,3 +432,30 @@ def test_commented_scenarios():
scenario = Scenario.from_string(COMMENTED_SCENARIO) scenario = Scenario.from_string(COMMENTED_SCENARIO)
assert_equals(scenario.name, u'Adding some students to my university database') assert_equals(scenario.name, u'Adding some students to my university database')
assert_equals(len(scenario.steps), 4) assert_equals(len(scenario.steps), 4)
def test_scenario_has_tag():
"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'])
def test_scenario_has_tags_singleline():
"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([
'onetag',
'another',
'$%^&even-weird_chars',
])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment