From 14c1b1074023ca7176c702b4715c8230d1df64c8 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Tue, 25 Sep 2012 15:08:38 +0000 Subject: new sample projects --- (limited to 'pysamples/ta-stats.py') diff --git a/pysamples/ta-stats.py b/pysamples/ta-stats.py new file mode 100755 index 0000000..f8002a7 --- /dev/null +++ b/pysamples/ta-stats.py @@ -0,0 +1,167 @@ +# Copyright (c) 2012, Walter Bender + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +def myblock(tw, x): # ignore second argument + ''' Load journal stats to heap (Sugar only) ''' + + import os + import glob + MAX = 19 + DIROFINTEREST = 'datastore' + + + class ParseJournal(): + ''' Simple parser of datastore for turtle art entries ''' + + def __init__(self): + self._score = [] + + homepath = os.environ['HOME'] + for path in glob.glob(os.path.join(homepath, '.sugar', '*')): + if isdsdir(path): + dsobjdirs = glob.glob( + os.path.join(path, DIROFINTEREST, '??')) + for dsobjdir in dsobjdirs: + dsobjs = glob.glob(os.path.join(dsobjdir, '*')) + for dsobj in dsobjs: + if not isactivity(dsobj) == 'TurtleArtActivity': + continue + score = hasturtleblocks(dsobj) + if score: + self._score.append(score) + + + def hascomponent(path, component): + ''' Return metadata attribute, if any ''' + if not os.path.exists(os.path.join(path, 'metadata')): + return False + if not os.path.exists(os.path.join(path, 'metadata', component)): + return False + fd = open(os.path.join(path, 'metadata', component)) + data = fd.readline() + fd.close() + if len(data) == 0: + return False + return data + + + def isactivity(path): + ''' Return activity name ''' + activity = hascomponent(path, 'activity') + if not activity: + return False + else: + return activity.split('.')[-1] + + + def isdsdir(path): + ''' Only interested if it is a datastore directory ''' + if not os.path.isdir(path): + return False + if not os.path.exists(os.path.join(path, DIROFINTEREST)): + return False + return True + + + TACAT = {'clean':'forward', 'forward':'forward', 'back':'forward', + 'left':'forward', 'right':'forward', 'arc': 'arc', + 'xcor': 'coord', 'ycor': 'coord', 'heading': 'coord', + 'setxy': 'setxy', 'seth': 'setxy', 'penup': 'pen', 'pendown': 'pen', + 'setpensize': 'pen', 'setcolor': 'pen', 'pensize': 'pen', + 'color': 'pen', 'setshade': 'pen', 'setgray': 'pen', 'shade': 'pen', + 'gray': 'pen', 'fillscreen': 'pen', 'startfill': 'fill', + 'stopfill': 'fill', 'plus2': 'number', 'minus2': 'number', + 'product2': 'number', 'division2': 'number', 'remainder2': 'number', + 'sqrt': 'number', 'identity2': 'number', 'and2': 'boolean', + 'or2': 'boolean', 'not': 'boolean', 'greater2': 'boolean', + 'less2': 'boolean', 'equal2': 'boolean', 'random': 'random', + 'repeat': 'repeat', 'forever': 'repeat', 'if': 'ifthen', + 'ifelse': 'ifthen', 'while': 'ifthen', 'until': 'ifthen', + 'hat': 'action', 'stack': 'action', 'storein': 'box', 'box': 'box', + 'luminance': 'sensor', 'mousex': 'sensor', 'mousey': 'sensor', + 'moousebutton2': 'sensor', 'keyboard': 'sensor', 'kbinput': 'sensor', + 'readpixel': 'sensor', 'see': 'sensor', 'time': 'sensor', + 'sound': 'sensor', 'volume': 'sensor', 'pitch': 'sensor', + 'resistance': 'sensor', 'voltage': 'sensor', 'video': 'media', + 'wait': 'media', 'camera': 'media', 'journal': 'media', + 'audio': 'media', 'show': 'media', 'setscale': 'media', + 'savepix': 'media', 'savesvg': 'media', 'mediawait': 'media', + 'mediapause': 'media', 'mediastop': 'media', 'mediaplay': 'media', + 'speak': 'media', 'sinewave': 'media', 'description': 'media', + 'push':'extras', 'pop':'extras', 'printheap':'extras', + 'clearheap':'extras', 'isheapempty2':'extras', 'chr':'extras', + 'int':'extras', 'myfunction': 'python', 'userdefined': 'python', + 'loadblock': 'python', 'loadpalette': 'python'} + + TAPAL = {'forward': 'turtlep', 'arc': 'turtlep', 'coord': 'turtlep', + 'setxy': 'turtlep', 'pen': 'penp', 'fill': 'penp', 'number': 'numberp', + 'boolean': 'numberp', 'repeat': 'flowp', 'ifthen': 'flowp', + 'action': 'boxp', 'box': 'boxp', 'sensor': 'sensorp', + 'media': 'mediap', 'extras': 'extrasp', 'python': 'extrasp'} + + TASCORE = {'forward': 3, 'arc': 3, 'setxy': 2.5, 'coord': 4, 'turtlep': 5, + 'pen': 2.5, 'fill': 2.5, 'penp': 5, + 'number': 2.5, 'boolean': 2.5, 'random': 2.5, 'numberp': 0, + 'repeat': 2.5, 'ifthen': 7.5, 'flowp': 10, + 'box': 7.5, 'action': 7.5, 'boxp': 0, + 'media': 5, 'mediap': 0, + 'python': 5, 'extras': 5, 'extrasp': 0, + 'sensor': 5, 'sensorp': 0} + + + def hasturtleblocks(path): + ''' Parse turtle block data and generate score based on rubric ''' + + if not os.path.exists(os.path.join(path, 'data')): + return None + fd = open(os.path.join(path, 'data')) + blocks = [] + # block name is second token in each line + for line in fd: + tokens = line.split(',') + if len(tokens) > 1: + token = tokens[1].strip('" [') + blocks.append(token) + + score = 0 + cats = [] + pals = [] + + for b in blocks: + if b in TACAT: + if not TACAT[b] in cats: + cats.append(TACAT[b]) + for c in cats: + if c in TAPAL: + if not TAPAL[c] in pals: + pals.append(TAPAL[c]) + + for c in cats: + if c in TASCORE: + score += TASCORE[c] + + for p in pals: + if p in TASCORE: + score += TASCORE[p] + + return str(score) + + data = ParseJournal() + for a in data._score: + tw.lc.heap.append(float(a)) + + tw.lc.heap.append(len(data._score)) + return -- cgit v0.9.1