tutorials.py (4056B)
1 """Beginner/reference catalogue settings and independent native expectations.""" 2 def literal(value): 3 if isinstance(value, dict): return value 4 if isinstance(value, bool): return dict(type='bool', value=value) 5 if isinstance(value, int): return dict(type='number', value=str(value)) 6 if isinstance(value, str): return dict(type='string', value=value) 7 return dict(type='list', value=[literal(x) for x in value]) 8 9 10 def tree(value): return dict(type='tree', value=value) 11 12 13 def examples(): 14 # First case is the initial expression. Other cases double as definition 15 # presets; repeated cases exercise fallback paths without changing a preset. 16 return { 17 'names-values': ('Names and values', 'Basic Examples', [ 18 ('greeting', [], 'Hello, world!', 'string'), ('answer', [], 42, 'number')]), 19 'arithmetic': ('Doing arithmetic', 'Basic Examples', [ 20 ('total', [], 12, 'number'), ('product', [], 35, 'number'), ('grouped', [], 24, 'number')]), 21 'functions': ('Your first function', 'Basic Examples', [ 22 ('double', [6], 12, 'number'), ('double', [9], 18, 'number'), ('add', [4, 7], 11, 'number')]), 23 'lists': ('Working with lists', 'Basic Examples', [ 24 ('count', [], 3, 'number'), ('total', [], 12, 'number')]), 25 'transform-list': ('Transforming a list', 'Basic Examples', [ 26 ('total', [], 24, 'number'), ('double', [5], 10, 'number')]), 27 'choices': ('Making a choice', 'Basic Examples', [ 28 ('message', [0], 'Your basket is empty.', 'string'), 29 ('message', [1], 'You have one item.', 'string'), 30 ('message', [4], 'You have several items.', 'string')]), 31 'language-reference': ('Language reference', 'Language & Runtime Explorations', [ 32 ('answer', [], 42, 'number'), ('identity', [7], 7, 'number'), ('identity', ['hello'], 'hello', 'string'), 33 ('first', [7, 9], 7, 'number'), ('leaf', [], tree('0'), 'tricu'), 34 ('shapes', [], [tree('0'), tree('10'), tree('200')], 'tricu'), 35 ('literals', [], ['hello', 42, [1, 2, 3]], 'tricu'), 36 ('addTwo', [5], 7, 'number'), 37 ('describe', [7], 'seven', 'string'), ('describe', ['hi'], 'greeting', 'string'), 38 ('describe', [True], 'true', 'string'), ('describe', [[4, 5]], 'two items', 'string'), 39 ('describe', [[1, 2, 3]], 'nonempty list', 'string'), ('describe', [[]], 'empty list', 'string'), 40 ('describe', [tree('110')], 'other', 'string'), 41 ('keep', [tree('200')], tree('200'), 'tricu'), ('keep', [tree('10')], tree('0'), 'tricu'), 42 ('local', [6], 12, 'number'), ('viaWhere', [6], 7, 'number'), 43 ('copy', [[1, 2, 3]], [1, 2, 3], 'bytes'), ('copy', [[]], [], 'bytes'), ('copy', [tree('10')], [], 'bytes'), 44 ('firstOr', [99, [5]], 5, 'number'), ('firstOr', [99, []], 99, 'number'), 45 ('localCopy', [[4, 5]], [4, 5], 'bytes'), ('localCopy', [[]], [], 'bytes'), ('localCopy', [tree('10')], [], 'bytes'), 46 ('checked', [42], 42, 'number'), ('sequenced', [9], 9, 'number'), 47 ]), 48 } 49 50 51 def encoded(value): return value if isinstance(value, dict) else literal(value) 52 53 54 def settings(): 55 result = {} 56 for name, (title, category, cases) in examples().items(): 57 presets = {} 58 for export, arguments, _, output in cases: 59 presets.setdefault(export, dict(arguments=[encoded(a) for a in arguments], output=output, mode='pure')) 60 first = cases[0] 61 result[name] = dict(title=title, category=category, exports=list(presets), export=first[0], 62 args=presets[first[0]]['arguments'], output=first[3], mode='pure', presets=presets) 63 # Private list values keep the beginner definition picker on scalar results. 64 return result 65 66 67 def cases(): 68 return {name: [(export, [encoded(a) for a in arguments], encoded(expected)) 69 for export, arguments, expected, _ in rows] 70 for name, (_, _, rows) in examples().items()}