def test_filter_by_since(): """ Get the tiddlers modified since <timespec>. """ tiddler_old = Tiddler('old') tiddler_old.modified = '19691009000000' tiddler_new = Tiddler('new') tiddler_new.modified = '20090401030303' found_tiddlers = filter('select=modified:>20010101010100', [tiddler_old, tiddler_new]) assert len(found_tiddlers) == 1 assert found_tiddlers[0].title == 'new' found_tiddlers = filter('select=modified:>200101010101', [tiddler_old, tiddler_new]) assert len(found_tiddlers) == 1 assert found_tiddlers[0].title == 'new'
def test_tiddler_collection(): tiddlers = Tiddlers() n = 4 for title in [u'how', u'now', u'cow']: n = n - 1 tiddler = Tiddler(title, 'bag') tiddler.modified = n tiddlers.add(tiddler) modified = tiddlers.modified assert [u'how', u'now', u'cow'] == list( tiddler.title for tiddler in tiddlers) assert modified == '30000000000000'
def test_tiddler_collection(): tiddlers = Tiddlers() n = 4 for title in ['how', 'now', 'cow']: n = n - 1 tiddler = Tiddler(title, 'bag') tiddler.modified = n tiddlers.add(tiddler) digest = tiddlers.hexdigest() modified = tiddlers.modified assert ['how', 'now', 'cow'] == list(tiddler.title for tiddler in tiddlers) assert modified == '30000000000000'
def test_filter_by_since(): """ Get the tiddlers modified since <timespec>. """ tiddler_old = Tiddler('old') tiddler_old.modified = '19691009000000' tiddler_new = Tiddler('new') tiddler_new.modified = '20090401030303' found_tiddlers = list( filter('select=modified:>20010101010100', [tiddler_old, tiddler_new])) assert len(found_tiddlers) == 1 assert found_tiddlers[0].title == 'new' found_tiddlers = list( filter('select=modified:>200101010101', [tiddler_old, tiddler_new])) assert len(found_tiddlers) == 1 assert found_tiddlers[0].title == 'new' found_tiddlers = list( filter('select=modified:<200101010101', [tiddler_old, tiddler_new])) assert len(found_tiddlers) == 1 assert found_tiddlers[0].title == 'old'
def test_tiddler_creation_info(): bag = Bag('alpha') STORE.put(bag) tiddler = Tiddler('Foo', bag.name) tiddler.text = 'lorem ipsum' tiddler.modifier = 'john' tiddler.modified = '20130119150632' STORE.put(tiddler) tiddler = Tiddler('Foo', bag.name) tiddler.text = 'lorem ipsum\ndolor sit amet' tiddler.modifier = 'jane' tiddler.modified = '20130119151021' STORE.put(tiddler) tiddler = Tiddler('Foo', bag.name) tiddler = STORE.get(tiddler) assert tiddler.creator == 'john' assert tiddler.modifier == 'jane' assert tiddler.created != tiddler.modified assert len(tiddler.created) == 14 assert len(tiddler.fields) == 0
def test_simple_get(): """ get a tiddler that had been stored """ stored_tiddler = Tiddler('TiddlerOne') stored_tiddler.bag = u'bagone' stored_tiddler.modified = '200803030303' stored_tiddler = store.get(stored_tiddler) assert stored_tiddler.title == 'TiddlerOne' assert stored_tiddler.bag == 'bagone' assert stored_tiddler.text == 'c tiddler one content' assert sorted(stored_tiddler.tags) == ['tag five', 'tagone', 'tagtwo']
def create_tiddler(store, bag, numeral): tiddler = Tiddler('tiddler%s' % numeral) tiddler.bag = bag.name tiddler.text = u'i am tiddler %s' % numeral tags = [u'basic tag'] if not numeral % 2: tags.append(u'tagtwo') if not numeral % 3: tags.append(u'tagthree') if not numeral % 4: tags.append(u'tagfour') tiddler.tags = tags if tiddler.title == 'tiddler8': tiddler.modified = '200805230303' store.put(tiddler)
def test_select(): # cook some known modified strings in the past nowstring = current_timestring() now = int(nowstring) yearago = str(now - 10000000101) dayago = str(now - 1000101) tiddlers = [] tiddler = Tiddler('now') tiddler.modified = nowstring tiddlers.append(tiddler) tiddler = Tiddler('year') tiddler.modified = yearago tiddlers.append(tiddler) tiddler = Tiddler('day') tiddler.modified = dayago tiddlers.append(tiddler) results = list(filter_tiddlers(tiddlers, 'select=modified:<1y')) assert len(results) == 1 assert results[0].title == 'year' results = list(filter_tiddlers(tiddlers, 'select=modified:>1y')) assert len(results) == 2 assert sorted(tiddler.title for tiddler in results) == ['day', 'now'] results = list(filter_tiddlers(tiddlers, 'select=modified:<1d')) assert len(results) == 2 assert sorted(tiddler.title for tiddler in results) == ['day', 'year'] results = list(filter_tiddlers(tiddlers, 'select=modified:>1m')) assert len(results) == 1 assert results[0].title == 'now'
def test_simple_get(): """ get a tiddler that had been stored in bagfour """ stored_tiddler = Tiddler(title='TiddlerOne') stored_tiddler.bag = u'bagone' stored_tiddler.modified = '200803030303' stored_tiddler = store.get(stored_tiddler) assert stored_tiddler.title == 'TiddlerOne', 'retrieved tiddler has correct title' assert stored_tiddler.bag == 'bagone', 'retrieve tiddler has correct bag' assert stored_tiddler.text == 'c tiddler one content', 'text is %s should b %s' % (stored_tiddler.text, 'c tiddler one content\n') assert sorted(stored_tiddler.tags) == ['tag five', 'tagone', 'tagtwo']
def test_simple_get(): """ get a tiddler that had been stored in bagfour """ stored_tiddler = Tiddler(title='TiddlerOne') stored_tiddler.bag = u'bagone' stored_tiddler.modified = '200803030303' stored_tiddler = store.get(stored_tiddler) assert stored_tiddler.title == 'TiddlerOne', 'retrieved tiddler has correct title' assert stored_tiddler.bag == 'bagone', 'retrieve tiddler has correct bag' assert stored_tiddler.text == 'c tiddler one content', 'text is %s should b %s' % ( stored_tiddler.text, 'c tiddler one content\n') assert sorted(stored_tiddler.tags) == ['tag five', 'tagone', 'tagtwo']
def test_lt_gt(): tiddlers = [] dummy = "20050322134706" dates = ["20091203","20081203","20080403","20090903","20090331","20071103",dummy,dummy,dummy,dummy,dummy,dummy] for i in [1,2,4,6,10,12,55,90,100,201,323,2223]:#12 tid = Tiddler("foo%s"%i) tid.fields['foo'] = "%s"%i try: tid.modified = dates.pop() except IndexError: pass tiddlers.append(tid) restiddlers = ltgt.lt("foo:10",tiddlers) result = [] for tid in restiddlers: result.append(tid) assert 4 is len(result) restiddlers = ltgt.lt("foo:1",tiddlers) result = [] for tid in restiddlers: result.append(tid) assert 0 is len(result) restiddlers = ltgt.gt("foo:300",tiddlers) result = [] for tid in restiddlers: result.append(tid) assert 2 is len(result) restiddlers = ltgt.gt("modified:20081101",tiddlers) result = [] for tid in restiddlers: print tid.modified result.append(tid) assert 4 is len(result) restiddlers = ltgt.lt("modified:20050323",tiddlers) result = [] for tid in restiddlers: print tid.modified result.append(tid) assert 6 is len(result)
def _get_tiddler_from_div(node): """ Create a Tiddler from an HTML div element. """ tiddler = Tiddler(node.getAttribute('title')) tiddler.text = _html_decode(_get_text(node.getElementsByTagName('pre'))) for attr, value in node.attributes.items(): data = value if data and attr != 'tags': if attr in (['modifier', 'created', 'modified']): tiddler.__setattr__(attr, data) elif (attr not in ['title', 'changecount'] and not attr.startswith('server.')): tiddler.fields[attr] = data if not node.attributes.get('modified', None) and tiddler.created: tiddler.modified = tiddler.created tiddler.tags = string_to_tags_list(str(node.getAttribute('tags'))) return tiddler
def _get_tiddler_from_div(node): """ Create a Tiddler from an HTML div element. """ tiddler = Tiddler(node.getAttribute('title')) tiddler.text = _html_decode(_get_text(node.getElementsByTagName('pre'))) for attr, value in node.attributes.items(): data = value if data and attr != 'tags': if attr in (['creator', 'modifier', 'created', 'modified']): tiddler.__setattr__(attr, data) elif (attr not in ['title', 'changecount'] and not attr.startswith('server.')): tiddler.fields[attr] = data if not node.attributes.get('modified', None) and tiddler.created: tiddler.modified = tiddler.created tiddler.tags = string_to_tags_list(node.getAttribute('tags')) return tiddler
def test_store_tiddler(): tiddler = Tiddler('monkey', 'testone') tiddler.text = 'cow' tiddler.tags = ['tagone', 'tagtwo', 'tagthree'] tiddler.fields['field key one'] = 'fieldvalueone' tiddler.fields['field key two'] = 'fieldvaluetwo' tiddler.modifier = 'cdent' tiddler.modified = '20080202111111' store.put(tiddler) tiddler2 = Tiddler('monkey', 'testone') tiddler2 = store.get(tiddler2) assert tiddler.text == tiddler2.text assert sorted(tiddler.tags) == sorted(tiddler2.tags) assert tiddler.fields['field key two'] == tiddler2.fields['field key two'] assert tiddler.modifier == tiddler2.modifier assert tiddler.modified == tiddler2.modified tiddler2.text = 'pig' store.put(tiddler2) revisions = store.list_tiddler_revisions(tiddler2) assert len(revisions) == 2 store.delete(tiddler2) py.test.raises(NoTiddlerError, 'store.get(tiddler2)') store.put(tiddler2) revisions = store.list_tiddler_revisions(tiddler2) assert len(revisions) == 1 store.delete(Bag('testone')) py.test.raises(NoTiddlerError, 'store.get(tiddler2)')
def test_store_tiddler(): tiddler = Tiddler(name, name) tiddler.text = name tiddler.tags = [name] tiddler.fields['field key ' + name + ' one'] = name tiddler.fields['field key ' + name + ' two'] = name tiddler.modifier = name tiddler.modified = '20080202111111' store.put(tiddler) tiddler2 = Tiddler(name, name) tiddler2 = store.get(tiddler2) assert tiddler.text == tiddler2.text assert sorted(tiddler.tags) == sorted(tiddler2.tags) assert tiddler.fields['field key ' + name + ' two'] == tiddler2.fields['field key ' + name + ' two'] assert tiddler.modifier == tiddler2.modifier assert tiddler.modified == tiddler2.modified tiddler2.text = 'pig' store.put(tiddler2) revisions = store.list_tiddler_revisions(tiddler2) assert len(revisions) == 2 store.delete(tiddler2) py.test.raises(NoTiddlerError, 'store.get(tiddler2)') store.put(tiddler2) revisions = store.list_tiddler_revisions(tiddler2) assert len(revisions) == 1 store.delete(Bag(name)) py.test.raises(NoTiddlerError, 'store.get(tiddler2)')
def tiddlers_from_rss(rss_url): """Import an rss feed into a bag using a given rule number <url> <bag>""" DEFAULT_TIDDLER_TEXT = u"<html><p><a href=\"%s\">%s</a><br/>%s</p></html>" h = httplib2.Http() try: resp, content = h.request(rss_url, method='GET') except httplib2.RelativeURIError: try: content = open(rss_url, "r") content = "".join(content.readlines()) except IOError: content = "" resp = {"status": 200} content = content.replace( "media:thumbnail", "media_thumbnail" ) #this is a workaround to allow media thumbnails to work. content = content.replace( "media:content", "media_thumbnail" ) #this is a workaround to allow media thumbnails to work. feed = feedparser.parse(content) print "url returned status code %s" % resp["status"] tiddlers = [] for entry in feed.entries: try: unique_title = entry.id except AttributeError: try: unique_title = entry.link except AttributeError: unique_title = "%s_%s" % (entry.title, rss_url) unique_title = unique_title.replace("/", "_").replace(".", "_").replace( ":", "_") imtiddler = Tiddler(unique_title) imtiddler.fields[ "heading"] = entry.title #save the original title for display purposes tags = [] try: for tag in entry.tags: tags.append("[" + tag.term + "]") except AttributeError: pass imtiddler.tags = tags description = None try: description = entry.summary except AttributeError: try: description = entry.content[0]["value"] except AttributeError: description = u"No description." try: imtiddler.modifier = entry.author except AttributeError: imtiddler.modifier = "Unknown" try: posted_date = entry["updated_parsed"] yr = posted_date[0] mo = posted_date[1] dy = posted_date[2] hr = posted_date[3] mi = posted_date[4] sec = posted_date[5] imtiddler.modified = "%02d%02d%02d%02d%02d%02d" % (yr, mo, dy, hr, mi, sec) except KeyError: pass #use default if "pos" in entry: longlat = entry["pos"].split(" ") imtiddler.fields["geo.lat"] = longlat[0] imtiddler.fields["geo.long"] = longlat[1] elif "point" in entry: longlat = entry["point"].split(" ") imtiddler.fields["geo.lat"] = longlat[0] imtiddler.fields["geo.long"] = longlat[1] try: link = entry.link except AttributeError: link = "" imtiddler.text = DEFAULT_TIDDLER_TEXT % (link, entry.title, description) imtiddler.fields.update({"rssurl": rss_url}) try: name = config['imrss']['module'] f = __import__(name, fromlist=True) imtiddler = f.handler(rss_url, imtiddler, entry, feed=feed) except KeyError: pass if imtiddler: tiddlers.append(imtiddler) print "tiddlers ready for store (%s)" % (len(tiddlers)) return tiddlers
def tiddlers_from_rss(rss_url): """Import an rss feed into a bag using a given rule number <url> <bag>""" DEFAULT_TIDDLER_TEXT = u"<html><p><a href=\"%s\">%s</a><br/>%s</p></html>" h = httplib2.Http() try: resp,content = h.request(rss_url,method='GET') except httplib2.RelativeURIError: try: content = open(rss_url,"r") content = "".join(content.readlines()) except IOError: content = "" resp = {"status":200} content = content.replace("media:thumbnail","media_thumbnail") #this is a workaround to allow media thumbnails to work. content = content.replace("media:content","media_thumbnail") #this is a workaround to allow media thumbnails to work. feed = feedparser.parse(content) print "url returned status code %s"%resp["status"] tiddlers = [] for entry in feed.entries: try: unique_title = entry.id except AttributeError: try: unique_title= entry.link except AttributeError: unique_title= "%s_%s"%(entry.title,rss_url) unique_title = unique_title.replace("/","_").replace(".","_").replace(":","_") imtiddler = Tiddler(unique_title) imtiddler.fields["heading"] = entry.title #save the original title for display purposes tags = [] try: for tag in entry.tags: tags.append("["+tag.term+"]") except AttributeError: pass imtiddler.tags = tags description = None try: description = entry.summary except AttributeError: try: description = entry.content[0]["value"] except AttributeError: description = u"No description." try: imtiddler.modifier = entry.author except AttributeError: imtiddler.modifier = "Unknown" try: posted_date = entry["updated_parsed"] yr = posted_date[0] mo = posted_date[1] dy = posted_date[2] hr = posted_date[3] mi = posted_date[4] sec = posted_date[5] imtiddler.modified = "%02d%02d%02d%02d%02d%02d"%(yr,mo,dy,hr,mi,sec) except KeyError: pass #use default if "pos" in entry: longlat = entry["pos"].split(" ") imtiddler.fields["geo.lat"] = longlat[0] imtiddler.fields["geo.long"] = longlat[1] elif "point" in entry: longlat = entry["point"].split(" ") imtiddler.fields["geo.lat"] = longlat[0] imtiddler.fields["geo.long"] = longlat[1] try: link = entry.link except AttributeError: link = "" imtiddler.text = DEFAULT_TIDDLER_TEXT%(link,entry.title,description) imtiddler.fields.update({"rssurl":rss_url}) try: name = config['imrss']['module'] f = __import__(name,fromlist=True) imtiddler = f.handler(rss_url,imtiddler,entry,feed=feed) except KeyError: pass if imtiddler: tiddlers.append(imtiddler) print "tiddlers ready for store (%s)"%(len(tiddlers)) return tiddlers
def edit(environ, start_response): """ XXX: Lots of duplication from editor. """ store = environ['tiddlyweb.store'] usersign = environ['tiddlyweb.usersign'] query = environ['tiddlyweb.query'] try: bag_name = query['bag'][0] title = query['title'][0] text = query['text'][0] tiddler_type = query['type'][0] tags = query['tags'][0] etag = query['etag'][0] except KeyError as exc: raise HTTP400('bad query: incomplete form, %s' % exc) tags = [tag.strip() for tag in tags.split(',')] if not (bag_name and title): raise HTTP400('bad query: bag and title required') bag = Bag(bag_name) try: bag = store.get(bag) except NoBagError: raise HTTP404('that tank does not exist') tiddler = Tiddler(title, bag_name) tiddler_new = False conflict = False try: tiddler = store.get(tiddler) existing_etag = tiddler_etag(environ, tiddler).replace('"', '').split(':', 1)[0] if etag != existing_etag: conflict = True except NoTiddlerError: tiddler.type = tiddler_type tiddler_new = True if tiddler_new: bag.policy.allows(usersign, 'create') else: bag.policy.allows(usersign, 'write') tiddler.text = text tiddler.tags = tags tiddler.modifier = usersign['name'] tiddler.modified = current_timestring() if conflict: return editor(environ, start_response, tiddler, message='conflict') try: validate_tiddler(tiddler, environ) except InvalidTiddlerError as exc: return editor(environ, start_response, tiddler, message='Tiddler content is invalid: %s' % exc) store.put(tiddler) redirect_uri = tank_page_uri(environ, tiddler.bag, tiddler.title) start_response('303 See Other', [ ('Location', str(redirect_uri))]) return []
bad_string = """modifiXr: [email protected] created: modiFied: 200803030303 type: None tags:foobar [[foo bar]] Hello, I'm the content. """ expected_json_string = '{"created": "", "text": "Hello, I\'m the content.", "modifier": "*****@*****.**", "modified": "200803030303", "tags": ["foobar", "foo bar"]}' tiddler = Tiddler("test tiddler") tiddler.modifier = "*****@*****.**" tiddler.tags = ["foobar", "foo bar"] tiddler.text = "Hello, I'm the content." tiddler.modified = "200803030303" def setup_module(module): pass def test_generated_txt_string(): serializer = Serializer("text") serializer.object = tiddler string = serializer.to_string() assert string == expected_string, "serialized recipe looks like we expect. should be %s, got %s" % ( expected_string, string, )
bad_string = """modifiXr: [email protected] created: modiFied: 200803030303 type: None tags:foobar [[foo bar]] Hello, I'm the content. """ expected_json_string = '{"created": "", "text": "Hello, I\'m the content.", "modifier": "*****@*****.**", "modified": "200803030303", "tags": ["foobar", "foo bar"]}' tiddler = Tiddler('test tiddler') tiddler.modifier = '*****@*****.**' tiddler.tags = ['foobar', 'foo bar'] tiddler.text = "Hello, I'm the content." tiddler.modified = '200803030303' def setup_module(module): pass def test_generated_txt_string(): serializer = Serializer('text') serializer.object = tiddler string = serializer.to_string() assert string == expected_string, \ 'serialized recipe looks like we expect. should be %s, got %s' \ % (expected_string, string)
# cosmic rays have injected noise into this tiddler string bad_string = """modifiXr: [email protected] modiFied: 200803030303 tags:foobar [[foo bar]] Hello, I'm the content. """ expected_json_string = '{"created": "", "text": "Hello, I\'m the content.", "modifier": "*****@*****.**", "modified": "200803030303", "tags": ["foobar", "foo bar"]}' tiddler = Tiddler('test tiddler') tiddler.bag = 'snoop' tiddler.modifier = '*****@*****.**' tiddler.tags = ['foobar', 'foo bar'] tiddler.text = "Hello, I'm the content." tiddler.modified = '200803030303' def setup_module(module): pass def test_generated_txt_string(): serializer = Serializer('text') serializer.object = tiddler string = serializer.to_string() assert string == expected_string assert '%s' % serializer == expected_string, \ 'serializer goes to string as expected_string' def test_bad_string_raises(): serializer = Serializer('text')
from tiddlywebplugins.wikklytextplugins.plugins import macros from tiddlyweb.model.tiddler import Tiddler from tiddlywebplugins import wikklytextplugins from tiddlywebplugins import wikklytextrender from tiddlyweb.config import config from test_common import WikiArgument,WikiContext test_tiddler= Tiddler("Test Tiddler","bag") test_tiddler.modified = "20071003201000" test_tiddler.revision = 2 def test_view_date(): out = macros.view(WikiContext(test_tiddler,{}), WikiArgument("modified"),WikiArgument("date")) assert '03 October 2007' in out def test_view_text(): text ="My name is the test tiddler!" test_tiddler.text = text test_tiddler.tags = ["jon","ben","jeremy ruston"] out = macros.view(WikiContext(test_tiddler,{}), WikiArgument("text")) assert text in out out = macros.view(WikiContext(test_tiddler,{}), WikiArgument("text"),WikiArgument("text")) assert text in out out = macros.view(WikiContext(test_tiddler,{}), WikiArgument("title"),WikiArgument("text")) assert 'Test Tiddler' in out out = macros.view(WikiContext(test_tiddler,{}), WikiArgument("server.bag"),WikiArgument("text")) assert 'bag' in out out = macros.view(WikiContext(test_tiddler,{}), WikiArgument("server.page.revision"),WikiArgument("text")) assert '2' in out