From d8fd583dfcc1f4abf44d84f320e1ad69a9032fc4 Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Thu, 4 Feb 2010 21:21:06 -0500 Subject: First pass at a naive parser. Committing for posterity. --- kronos/parser.py | 51 ++++++++++++++++++++++++++++++++++++++++----- kronos/tests/test_parser.py | 40 ++++++++++++++++++++++++++--------- 2 files changed, 76 insertions(+), 15 deletions(-) diff --git a/kronos/parser.py b/kronos/parser.py index 5f79144..0c39b95 100644 --- a/kronos/parser.py +++ b/kronos/parser.py @@ -9,12 +9,53 @@ Activity Parser class Activity(object): - activity = "my activity" - description = "Some cool stuff!" - category = "Home" + def __init__(self, activity, description=None, category=None): + self.activity = activity + self.description = description + self.category = category + + def __repr__(self): + return "Activity({0!r}, description={1!r}, category={2!r})".format( + self.activity, self.description, self.category) class ActivityParser(object): - def parse(self, text): - return Activity() + def __init__(self, text): + self.text = text + self.tokens = text.split(' ') + + def parse(self): + activity = Activity(self._parse_activity()) + activity.description = self._parse_description() + activity.category = self._parse_category() + + return activity + + def _parse_activity(self): + return self.text.split(',')[0].split('@')[0] + + def _parse_description(self): + text = self.text + + if ',' in self.text: + text = text.split(',', 1)[1] + + if '@' in text: + text = text.split('@', 1)[0] + + if text == self.text: + return None + + return text.strip() + + def _parse_category(self): + text = self.text + + if '@' in text: + text = text.split('@', 1)[1] + + if text == self.text: + return None + + return text diff --git a/kronos/tests/test_parser.py b/kronos/tests/test_parser.py index 676a471..e7d64a3 100644 --- a/kronos/tests/test_parser.py +++ b/kronos/tests/test_parser.py @@ -12,27 +12,47 @@ from nose.tools import assert_equals from kronos.parser import ActivityParser -class TestWhenParsingBasicFormat(object): +def parse_text(text): + return ActivityParser(text).parse() - def setup(self): - test_input = "my activity, Some cool stuff!@Home" - self.results = ActivityParser().parse(test_input) +class TestWhenParsingBasicFormat(object): def test_should_get_activity(self): - assert_equals(self.results.activity, "my activity") + results = parse_text("my activity, Some cool stuff!@Home") + assert_equals(results.activity, "my activity") + + results = parse_text("my activity") + assert_equals(results.activity, "my activity") + + results = parse_text("my activity@Home") + assert_equals(results.activity, "my activity") def test_should_get_description(self): - assert_equals(self.results.description, "Some cool stuff!") + results = parse_text("my activity, Some cool stuff!@Home") + assert_equals(results.description, "Some cool stuff!") + + results = parse_text("my activity, Some cool stuff!") + assert_equals(results.description, "Some cool stuff!") + + results = parse_text("my activity") + assert_equals(results.description, None) def test_should_get_category(self): - assert_equals(self.results.category, "Home") + results = parse_text("my activity, Some cool stuff!@Home") + assert_equals(results.category, "Home") + + results = parse_text("my activity, Some cool stuff!") + assert_equals(results.category, None) + + results = parse_text("my activity@Home") + assert_equals(results.category, "Home") class TestWhenParsingWithTags(object): def setup(self): test_input = "my activity, Some cool stuff!@Home #tag1 #tag2" - self.results = ActivityParser().parse(test_input) + self.results = ActivityParser(test_input).parse() def test_should_get_tags(self): pass @@ -41,7 +61,7 @@ class TestWhenParsingWithTags(object): class TestWhenParsingWithTimeOffset(object): def _parse_text(self, text): - return ActivityParser().parse(text) + return ActivityParser(text).parse() def test_should_understand_minutes(self): test_input = "my activity, Some cool stuff!@Home 10m" @@ -59,7 +79,7 @@ class TestWhenParsingWithTimeOffset(object): class TestWhenParsingWithAbsoluteTime(object): def _parse_text(self, text): - return ActivityParser().parse(text) + return ActivityParser(text).parse() def test_should_understand_military_time(self): test_input = "my activity, Some cool stuff!@Home 11:30-14:40" -- cgit v1.2.3