easycoder 250118.1__py2.py3-none-any.whl → 250123.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of easycoder might be problematic. Click here for more details.

easycoder/__init__.py CHANGED
@@ -9,4 +9,4 @@ from .ec_program import *
9
9
  from .ec_timestamp import *
10
10
  from .ec_value import *
11
11
 
12
- __version__ = "250118.1"
12
+ __version__ = "250123.1"
easycoder/ec_core.py CHANGED
@@ -2,7 +2,7 @@ import json, math, hashlib, threading, os, subprocess, sys, requests, time, numb
2
2
  from psutil import Process
3
3
  from datetime import datetime, timezone
4
4
  from random import randrange
5
- from .ec_classes import FatalError, RuntimeWarning, RuntimeError, AssertionError, Condition
5
+ from .ec_classes import FatalError, RuntimeWarning, RuntimeError, AssertionError, Condition, Object
6
6
  from .ec_handler import Handler
7
7
  from .ec_timestamp import getTimestamp
8
8
 
@@ -729,6 +729,12 @@ class Core(Handler):
729
729
  target['locked'] = True
730
730
  return self.nextPC()
731
731
 
732
+ # Log a message
733
+ def k_log(self, command):
734
+ command['log'] = True
735
+ command['keyword'] = 'print'
736
+ return self.k_print(command)
737
+
732
738
  # Declare a module variable
733
739
  def k_module(self, command):
734
740
  return self.compileVariable(command)
@@ -996,10 +1002,9 @@ class Core(Handler):
996
1002
  program = command['program']
997
1003
  code = program.code[program.pc]
998
1004
  lino = code['lino'] + 1
999
- if value == None:
1000
- print(f'{lino}-> <empty>')
1001
- else:
1002
- print(f'{lino}-> {value}')
1005
+ if value == None: value = '<empty>'
1006
+ if 'log' in command: print(f'{datetime.now().time()}: {lino}-> {value}')
1007
+ else: print(value)
1003
1008
  return self.nextPC()
1004
1009
 
1005
1010
  # Push a value onto a stack
@@ -1147,6 +1152,7 @@ class Core(Handler):
1147
1152
  return self.stack.pop()
1148
1153
 
1149
1154
  # Compile and run a script
1155
+ # run {path} [as {module}] [with {variable} [and {variable}...]]
1150
1156
  def k_run(self, command):
1151
1157
  try:
1152
1158
  command['path'] = self.nextValue()
@@ -1157,20 +1163,24 @@ class Core(Handler):
1157
1163
  if self.nextIsSymbol():
1158
1164
  record = self.getSymbolRecord()
1159
1165
  if record['keyword'] == 'module':
1160
- command['module'] = record['name']
1161
- exports = []
1162
- if self.nextIs('with'):
1163
- while True:
1164
- name = self.nextToken()
1165
- record = self.getSymbolRecord()
1166
- exports.append(name)
1167
- if self.peek() != 'and':
1168
- break
1169
- self.nextToken()
1170
- command['exports'] = json.dumps(exports)
1171
- self.add(command)
1172
- return True
1173
- return False
1166
+ name = record['name']
1167
+ command['module'] = name
1168
+ else: RuntimeError(self.program, f'Symbol \'name\' is not a module')
1169
+ else: RuntimeError(self.program, 'Module name expected after \'as\'')
1170
+ else: RuntimeError(self.program, '\'as {module name}\' expected')
1171
+ exports = []
1172
+ if self.peek() == 'with':
1173
+ self.nextToken()
1174
+ while True:
1175
+ name = self.nextToken()
1176
+ record = self.getSymbolRecord()
1177
+ exports.append(name)
1178
+ if self.peek() != 'and':
1179
+ break
1180
+ self.nextToken()
1181
+ command['exports'] = json.dumps(exports)
1182
+ self.add(command)
1183
+ return True
1174
1184
 
1175
1185
  def r_run(self, command):
1176
1186
  module = self.getVariable(command['module'])
@@ -1734,10 +1744,7 @@ class Core(Handler):
1734
1744
  if symbolRecord['valueHolder']:
1735
1745
  value['target'] = symbolRecord['name']
1736
1746
  return value
1737
- else:
1738
- value['value'] = self.getValue()
1739
- return value
1740
- self.warning(f'Core.compileValue: Token \'{self.getToken()}\' does not hold a value')
1747
+ FatalError(self.program.compiler, 'Variable does not hold a value')
1741
1748
  return None
1742
1749
 
1743
1750
  if token == 'arg':
@@ -2503,7 +2510,7 @@ class Core(Handler):
2503
2510
  return not comparison if condition.negate else comparison
2504
2511
 
2505
2512
  def c_not(self, condition):
2506
- return not self.getRuntimeValue(condition.value1)
2513
+ return not self.getRuntimeValue(condition.value)
2507
2514
 
2508
2515
  def c_object(self, condition):
2509
2516
  comparison = type(self.getRuntimeValue(condition.value1)) is dict
easycoder/ec_graphics.py CHANGED
@@ -57,7 +57,10 @@ class Graphics(Handler):
57
57
  layout = json.loads(self.getRuntimeValue(json.loads(args)))
58
58
  default = self.utils.getDefaultArgs(type)
59
59
  for n in range(0, len(layout)):
60
- args = self.utils.decode(default, layout[n])
60
+ try:
61
+ args = self.utils.decode(self, default, layout[n])
62
+ except Exception as e:
63
+ RuntimeError(self.program, e)
61
64
  item = self.utils.createElement(type, param, args)
62
65
  target['layout'].append(item)
63
66
  else:
@@ -125,7 +128,8 @@ class Graphics(Handler):
125
128
  if type == 'window':
126
129
  layout = self.getVariable(command['layout'])
127
130
  title = self.getRuntimeValue(command['title'])
128
- record['window'] = psg.Window(title, layout['layout'], finalize=True)
131
+ window = psg.Window(title, layout['layout'], finalize=True)
132
+ record['window'] = window
129
133
  record['eventHandlers'] = {}
130
134
  self.program.windowRecord = record
131
135
  self.program.run(self.nextPC())
@@ -202,38 +206,327 @@ class Graphics(Handler):
202
206
  psg.popup(self.getRuntimeValue(command['message']))
203
207
  return self.nextPC()
204
208
 
209
+ # set property {property} of {key} in {window} to {value}
205
210
  def k_set(self, command):
206
- if self.nextIsSymbol():
207
- record = self.getSymbolRecord()
208
- keyword = record['keyword']
211
+ if self.nextIs('property'):
212
+ command['property'] = self.nextValue()
213
+ if self.nextIs('of'):
214
+ command['key'] = self.nextValue()
215
+ if self.nextIs('in'):
216
+ if self.nextIsSymbol():
217
+ record = self.getSymbolRecord()
218
+ if record['keyword'] == 'window':
219
+ name = record['name']
220
+ command['window'] = name
221
+ if self.nextIs('to'):
222
+ command['value'] = self.nextValue()
223
+ self.add(command)
224
+ return True
225
+ else: RuntimeError(self.program, f'\'{name}\' is not a window variable')
226
+ else: RuntimeError(self.program, 'No window variable given')
227
+ return False
228
+
229
+ def r_set(self, command):
230
+ property = self.getRuntimeValue(command['property'])
231
+ key = self.getRuntimeValue(command['key'])
232
+ window = self.program.windowRecord['window']
233
+ value = self.getRuntimeValue(command['value'])
234
+ self.utils.updateProperty(window[key], property, value)
235
+ return self.nextPC()
236
+
237
+ def k_window(self, command):
238
+ return self.compileVariable(command)
239
+
240
+ def r_window(self, command):
241
+ return self.nextPC()
242
+
243
+ #############################################################################
244
+ # Compile a value in this domain
245
+ def compileValue(self):
246
+ value = {}
247
+ value['domain'] = self.getName()
248
+ token = self.getToken()
249
+ if self.isSymbol():
250
+ value['name'] = token
251
+ symbolRecord = self.getSymbolRecord()
252
+ keyword = symbolRecord['keyword']
253
+ if keyword == 'event':
254
+ value['type'] = 'symbol'
255
+ return value
256
+ return None
257
+
258
+ if self.getToken() == 'the':
259
+ self.nextToken()
260
+
261
+ token = self.getToken()
262
+ value['type'] = token
263
+
264
+ if token == 'event':
265
+ return value
266
+
267
+ return None
268
+
269
+ #############################################################################
270
+ # Modify a value or leave it unchanged.
271
+ def modifyValue(self, value):
272
+ return value
273
+
274
+ #############################################################################
275
+ # Value handlers
276
+
277
+ # This is used by the expression evaluator to get the value of a symbol
278
+ def v_symbol(self, symbolRecord):
279
+ if symbolRecord['keyword'] == 'event':
280
+ return self.getSymbolValue(symbolRecord)
281
+ else:
282
+ return None
283
+
284
+ def v_event(self, v):
285
+ v['type'] = 'text'
286
+ v['content'] = self.eventValues
287
+ return v
288
+
289
+ #############################################################################
290
+ # Compile a condition
291
+ def compileCondition(self):
292
+ condition = {}
293
+ return condition
294
+
295
+ #############################################################################
296
+ # Condition handlers
297
+
298
+ #############################################################################
299
+ # The main loop
300
+ def mainLoop(self):
301
+ windowRecord = self.program.windowRecord
302
+ window = windowRecord['window']
303
+ eventHandlers = windowRecord['eventHandlers']
304
+ while True:
305
+ event, values = window.Read(timeout=100)
306
+ if event == psg.WIN_CLOSED or event == "EXIT":
307
+ del window
308
+ break
309
+ if event == '__TIMEOUT__': self.program.flushCB()
310
+ else:
311
+ if event in eventHandlers:
312
+ self.eventValues = values
313
+ eventHandlers[event]()
314
+ class Graphics(Handler):
315
+
316
+ def __init__(self, compiler):
317
+ Handler.__init__(self, compiler)
318
+ self.utils = GUtils()
319
+
320
+ def getName(self):
321
+ return 'graphics'
322
+
323
+ #############################################################################
324
+ # Keyword handlers
325
+
326
+ def k_add(self, command):
327
+ token = self.nextToken()
328
+ if self.isSymbol():
329
+ symbolRecord = self.getSymbolRecord()
330
+ name = symbolRecord['name']
331
+ keyword = symbolRecord['keyword']
209
332
  if keyword == 'layout':
210
- command['target'] = record['name']
333
+ command['args'] = name
334
+ elif keyword in ['column', 'frame', 'tab']:
335
+ command['name'] = name
336
+ command['type'] = token
211
337
  if self.peek() == 'to':
212
- self.nextToken()
213
- command['type'] = self.nextToken()
338
+ command['args'] = []
339
+ else:
214
340
  command['args'] = self.utils.getArgs(self)
215
- else: command['args'] = None
216
- self.addCommand(command)
217
- return True
218
- elif keyword == 'event':
219
- pass
220
- return False
341
+ else:
342
+ command['type'] = token
343
+ command['args'] = self.utils.getArgs(self)
344
+ if self.nextIs('to'):
345
+ if self.nextIsSymbol():
346
+ symbolRecord = self.getSymbolRecord()
347
+ if symbolRecord['keyword'] in ['column', 'frame', 'layout', 'tab']:
348
+ command['target'] = symbolRecord['name']
349
+ self.addCommand(command)
350
+ return True
351
+ return False
221
352
 
222
- def r_set(self, command):
353
+ def r_add(self, command):
223
354
  target = self.getVariable(command['target'])
224
- target['layout'] = []
225
355
  type = command['type']
226
356
  args = command['args']
227
- if args != None:
228
- if args[0] == '{':
229
- layout = json.loads(self.getRuntimeValue(json.loads(args)))
230
- default = self.utils.getDefaultArgs(type)
231
- for n in range(0, len(layout)):
232
- args = self.utils.decode(default, layout[n])
233
- target['layout'].append(self.utils.createElement(type, args))
234
- else:
235
- v = self.getVariable(args)
236
- target['layout'].append(v['layout'])
357
+ param= None
358
+ if not 'layout' in target:
359
+ target['layout'] = []
360
+ if args[0] == '{':
361
+ if type in ['Column', 'Frame', 'Tab']:
362
+ record = self.getVariable(command['name'])
363
+ param = record['layout']
364
+ layout = json.loads(self.getRuntimeValue(json.loads(args)))
365
+ default = self.utils.getDefaultArgs(type)
366
+ for n in range(0, len(layout)):
367
+ try:
368
+ args = self.utils.decode(self, default, layout[n])
369
+ except Exception as e:
370
+ RuntimeError(self.program, e)
371
+ item = self.utils.createElement(type, param, args)
372
+ target['layout'].append(item)
373
+ else:
374
+ v = self.getVariable(args)
375
+ target['layout'].append(v['layout'])
376
+ return self.nextPC()
377
+
378
+ def k_close(self, command):
379
+ if self.nextIsSymbol():
380
+ symbolRecord = self.getSymbolRecord()
381
+ if symbolRecord['keyword'] == 'window':
382
+ command['target'] = symbolRecord['name']
383
+ self.add(command)
384
+ return True
385
+ return False
386
+
387
+ def r_close(self, command):
388
+ target = self.getVariable(command['target'])
389
+ target['window'].close()
390
+ return self.nextPC()
391
+
392
+ def k_column(self, command):
393
+ return self.compileVariable(command)
394
+
395
+ def r_column(self, command):
396
+ return self.nextPC()
397
+
398
+ # create {window} layout {layout}
399
+ # create {element} {args...}
400
+ def k_create(self, command):
401
+ if self.nextIsSymbol():
402
+ symbolRecord = self.getSymbolRecord()
403
+ type = symbolRecord['keyword']
404
+ command['type'] = type
405
+ command['name'] = symbolRecord['name']
406
+ if type == 'window':
407
+ command['title'] = self.nextValue()
408
+ if self.nextIs('layout'):
409
+ if self.nextIsSymbol():
410
+ symbolRecord = self.getSymbolRecord()
411
+ if symbolRecord['keyword'] == 'layout':
412
+ command['layout'] = symbolRecord['name']
413
+ self.addCommand(command)
414
+ return True
415
+ return False
416
+
417
+ def r_create(self, command):
418
+ type = command['type']
419
+ record = self.getVariable(command['name'])
420
+ if type == 'window':
421
+ title = self.getRuntimeValue(command['title'])
422
+ layout = self.getVariable(command['layout'])['layout']
423
+ # keys = {}
424
+ # self.utils.tagKeys(keys, layout)
425
+ window = psg.Window(title, layout, finalize=True)
426
+ # window.keys = keys
427
+ record['window'] = window
428
+ record['eventHandlers'] = {}
429
+ self.program.windowRecord = record
430
+ self.program.run(self.nextPC())
431
+ self.mainLoop()
432
+ # self.program.kill()
433
+ return 0
434
+ else:
435
+ RuntimeError(self.program, 'Variable is not a window or an element')
436
+
437
+ def k_init(self, command):
438
+ if self.nextIsSymbol():
439
+ symbolRecord = self.getSymbolRecord()
440
+ if symbolRecord['keyword'] in ['column', 'frame', 'layout', 'tab']:
441
+ command['target'] = symbolRecord['name']
442
+ self.add(command)
443
+ return True
444
+ return False
445
+
446
+ def r_init(self, command):
447
+ target = self.getVariable(command['target'])
448
+ target['layout'] = []
449
+ return self.nextPC()
450
+
451
+ def k_layout(self, command):
452
+ return self.compileVariable(command)
453
+
454
+ def r_layout(self, command):
455
+ return self.nextPC()
456
+
457
+ def k_on(self, command):
458
+ token = self.nextToken()
459
+ if token == 'event':
460
+ command['key'] = self.nextValue()
461
+ if self.nextIs('in'):
462
+ if self.nextIsSymbol():
463
+ record = self.getSymbolRecord()
464
+ if record['keyword'] == 'window':
465
+ command['window'] = record['name']
466
+ command['goto'] = self.getPC() + 2
467
+ self.add(command)
468
+ self.nextToken()
469
+ pcNext = self.getPC()
470
+ cmd = {}
471
+ cmd['domain'] = 'core'
472
+ cmd['lino'] = command['lino']
473
+ cmd['keyword'] = 'gotoPC'
474
+ cmd['goto'] = 0
475
+ cmd['debug'] = False
476
+ self.addCommand(cmd)
477
+ self.compileOne()
478
+ cmd = {}
479
+ cmd['domain'] = 'core'
480
+ cmd['lino'] = command['lino']
481
+ cmd['keyword'] = 'stop'
482
+ cmd['debug'] = False
483
+ self.addCommand(cmd)
484
+ # Fixup the link
485
+ self.getCommandAt(pcNext)['goto'] = self.getPC()
486
+ return True
487
+ return False
488
+
489
+ def r_on(self, command):
490
+ key = self.getRuntimeValue(command['key'])
491
+ window = self.getVariable(command['window'])
492
+ window['eventHandlers'][key] = lambda: self.run(command['goto'])
493
+ return self.nextPC()
494
+
495
+ def k_popup(self, command):
496
+ command['message'] = self.nextValue()
497
+ self.addCommand(command)
498
+ return True
499
+
500
+ def r_popup(self, command):
501
+ psg.popup(self.getRuntimeValue(command['message']))
502
+ return self.nextPC()
503
+
504
+ # set property {property} of {key} in {window} to {value}
505
+ def k_set(self, command):
506
+ if self.nextIs('property'):
507
+ command['property'] = self.nextValue()
508
+ if self.nextIs('of'):
509
+ command['key'] = self.nextValue()
510
+ if self.nextIs('in'):
511
+ if self.nextIsSymbol():
512
+ record = self.getSymbolRecord()
513
+ if record['keyword'] == 'window':
514
+ name = record['name']
515
+ command['window'] = name
516
+ if self.nextIs('to'):
517
+ command['value'] = self.nextValue()
518
+ self.add(command)
519
+ return True
520
+ else: RuntimeError(self.program, f'\'{name}\' is not a window variable')
521
+ else: RuntimeError(self.program, 'No window variable given')
522
+ return False
523
+
524
+ def r_set(self, command):
525
+ property = self.getRuntimeValue(command['property'])
526
+ key = self.getRuntimeValue(command['key'])
527
+ window = self.program.windowRecord['window']
528
+ value = self.getRuntimeValue(command['value'])
529
+ self.utils.updateProperty(window[key], property, value)
237
530
  return self.nextPC()
238
531
 
239
532
  def k_window(self, command):
@@ -266,6 +559,21 @@ class Graphics(Handler):
266
559
  if token == 'event':
267
560
  return value
268
561
 
562
+ if token == 'property':
563
+ value['key'] = self.nextValue()
564
+ if self.nextIs('of'):
565
+ if self.nextToken() == 'the':
566
+ if self.nextIs('event'):
567
+ value['source'] = '_event_'
568
+ return value
569
+ else:
570
+ value['key'] = self.getValue()
571
+ if self.nextIs('in'):
572
+ if self.nextIsSymbol():
573
+ record = self.getSymbolRecord()
574
+ if record['keyword'] == 'window':
575
+ value['source'] = record['name']
576
+ return value
269
577
  return None
270
578
 
271
579
  #############################################################################
@@ -284,10 +592,30 @@ class Graphics(Handler):
284
592
  return None
285
593
 
286
594
  def v_event(self, v):
595
+ window = self.eventValues['window']
596
+ values = self.eventValues['values']
597
+ self.utils.getEventProperties(window, values)
287
598
  v['type'] = 'text'
288
- v['content'] = self.eventValues
599
+ v['content'] = values
289
600
  return v
290
601
 
602
+ def v_property(self, v):
603
+ key = self.getRuntimeValue(v['key'])
604
+ source = v['source']
605
+ if source == '_event_':
606
+ window = self.eventValues['window']
607
+ values = self.eventValues['values']
608
+ self.utils.getEventProperties(window, values)
609
+ v['type'] = 'text'
610
+ v['content'] = values[key]
611
+ return v
612
+ else:
613
+ window = self.getVariable(source)
614
+ widget = window['window'].key_dict[key]
615
+ v['type'] = 'text'
616
+ v['content'] = widget.get()
617
+ return v
618
+
291
619
  #############################################################################
292
620
  # Compile a condition
293
621
  def compileCondition(self):
@@ -305,10 +633,13 @@ class Graphics(Handler):
305
633
  eventHandlers = windowRecord['eventHandlers']
306
634
  while True:
307
635
  event, values = window.Read(timeout=100)
308
- if event == psg.WINDOW_CLOSED or event == "EXIT":
636
+ if event == psg.WIN_CLOSED or event == "EXIT":
637
+ del window
309
638
  break
310
639
  if event == '__TIMEOUT__': self.program.flushCB()
311
640
  else:
312
641
  if event in eventHandlers:
313
- self.eventValues = values
642
+ self.eventValues = {}
643
+ self.eventValues['values'] = values
644
+ self.eventValues['window'] = window
314
645
  eventHandlers[event]()
easycoder/ec_gutils.py CHANGED
@@ -8,7 +8,8 @@ class GUtils:
8
8
  args = []
9
9
  while True:
10
10
  key = handler.nextToken()
11
- value = json.dumps(handler.nextValue())
11
+ value = handler.nextValue()
12
+ value = json.dumps(value)
12
13
  args.append(f'{key}={value}')
13
14
  if handler.peek() == 'and':
14
15
  handler.nextToken()
@@ -21,64 +22,123 @@ class GUtils:
21
22
  # Get the default args for a graphic element
22
23
  def getDefaultArgs(self, type):
23
24
  args = {}
24
- if type == 'Button':
25
- args['button_text'] = '(empty)'
26
- args['size'] = (None, None)
27
- if type == 'Checkbox':
28
- args['text'] = ''
29
- args['key'] = None
30
- args['size'] = (None, None)
31
- args['expand_x'] = False
32
- elif type == 'Column':
33
- args['expand_x'] = False
34
- args['pad'] = (0, 0)
35
- elif type == 'Input':
36
- args['key'] = None
37
- args['size'] = (None, None)
38
- elif type == 'Multiline':
39
- args['default_text'] = ''
40
- args['key'] = None
41
- args['size'] = (None, None)
42
- elif type == 'Text':
43
- args['text'] = '(empty)'
44
- args['size'] = (None, None)
45
- args['expand_x'] = False
25
+ if type == 'Button': self.getDefaultButton(args)
26
+ elif type == 'Checkbox': self.getDefaultCheckbox(args)
27
+ elif type == 'Column': self.getDefaultColumn(args)
28
+ elif type == 'Input': self.getDefaultInput(args)
29
+ elif type == 'Listbox': self.getDefaultListbox(args)
30
+ elif type == 'Multiline': self.getDefaultMultiline(args)
31
+ elif type == 'Text': self.getDefaultText(args)
46
32
  return args
47
33
 
48
34
  # Decode an argument at runtime
49
- def decode(self, args, text):
35
+ def decode(self, handler, args, text):
50
36
  p = text.find('=')
51
37
  if p > 0:
52
38
  key = text[0:p]
53
- value = json.loads(text[p+1:])['content']
39
+ value = text[p+1:]
40
+ value = json.loads(value)
41
+ if value['type'] == 'symbol':
42
+ record = handler.program.getSymbolRecord(value['name'])
43
+ value = handler.getSymbolValue(record)
44
+ if value != None: value = value['content']
45
+ else: raise Exception('Variable has no value')
54
46
  args[key] = value
55
47
  return args
56
48
  return None
57
49
 
50
+ # Reduce the event properties to a list of strings
51
+ def getEventProperties(self, window, values):
52
+ keys = values.keys()
53
+ for key in keys:
54
+ v = values[key]
55
+ element = window.key_dict[key]
56
+ if type(element) is psg.Listbox:
57
+ # Only pick one from those selected
58
+ v = v[0]
59
+ values[key] = v
60
+
58
61
  # Create an element
59
62
  def createElement(self, type, param, args):
60
- if type == 'Button':
61
- size = self.getSize(args)
62
- return psg.Button(button_text=args['button_text'], size=size)
63
- if type == 'Checkbox':
64
- size = self.getSize(args)
65
- return psg.Checkbox(args['text'], key=args['key'], expand_x=args['expand_x'], size=size)
66
- if type == 'Column':
67
- return psg.Column(param, expand_x=args['expand_x'], pad=args['pad'])
68
- elif type == 'Input':
69
- size = self.getSize(args)
70
- return psg.Input(key=args['key'], size=size)
71
- elif type == 'Multiline':
72
- size = self.getSize(args)
73
- return psg.Multiline(default_text=args['default_text'], key=args['key'], size=size)
74
- elif type == 'Text':
75
- size = self.getSize(args)
76
- return psg.Text(text=args['text'], size=size, expand_x=args['expand_x'])
63
+ if type == 'Button': return self.createButton(param, args)
64
+ elif type == 'Checkbox': return self.createCheckbox(param, args)
65
+ elif type == 'Column': return self.createColumn(param, args)
66
+ elif type == 'Input': return self.createInput(param, args)
67
+ elif type == 'Listbox': return self.createListbox(param, args)
68
+ elif type == 'Multiline': return self.createMultiline(param, args)
69
+ elif type == 'Text': return self.createText(param, args)
77
70
  else: return None
78
71
 
72
+ # Update a property
73
+ def updateProperty(self, element, property, value):
74
+ if property == 'disabled':
75
+ element.update(disabled=value)
76
+ elif property == 'value':
77
+ element.update(value=value)
78
+ elif property == 'values':
79
+ element.update(values=value)
80
+
79
81
  def getSize(self, args):
80
82
  size = args['size']
81
83
  if size == (None, None):
82
84
  return size
83
85
  size = size.split()
84
86
  return (size[0], size[1])
87
+
88
+ def getDefaultButton(self, args):
89
+ args['button_text'] = '(empty)'
90
+ args['disabled'] = False
91
+ args['size'] = (None, None)
92
+
93
+ def createButton(self, param, args):
94
+ return psg.Button(button_text=args['button_text'], disabled=args['disabled'], size=self.getSize(args))
95
+
96
+ def getDefaultCheckbox(self, args):
97
+ args['text'] = ''
98
+ args['key'] = None
99
+ args['size'] = (None, None)
100
+ args['expand_x'] = False
101
+
102
+ def createCheckbox(self, param, args):
103
+ return psg.Checkbox(args['text'], key=args['key'], expand_x=args['expand_x'], size=self.getSize(args))
104
+
105
+ def getDefaultColumn(self, args):
106
+ args['expand_x'] = False
107
+ args['pad'] = (0, 0)
108
+
109
+ def createColumn(self, param, args):
110
+ return psg.Column(param, expand_x=args['expand_x'], pad=args['pad'])
111
+
112
+ def getDefaultInput(self, args):
113
+ args['default_text'] = ''
114
+ args['key'] = None
115
+ args['size'] = (None, None)
116
+
117
+ def createInput(self, param, args):
118
+ return psg.Input(default_text=args['default_text'], key=args['key'], size=self.getSize(args))
119
+
120
+ def getDefaultListbox(self, args):
121
+ args['list'] = []
122
+ args['key'] = [None]
123
+ args['size'] = '10 2'
124
+ args['select_mode'] = None
125
+
126
+ def createListbox(self, param, args):
127
+ return psg.Listbox([], key=args['key'], size=self.getSize(args))
128
+
129
+ def getDefaultMultiline(self, args):
130
+ args['default_text'] = ''
131
+ args['key'] = None
132
+ args['size'] = (None, None)
133
+
134
+ def createMultiline(self, param, args):
135
+ return psg.Multiline(default_text=args['default_text'], key=args['key'], size=self.getSize(args))
136
+
137
+ def getDefaultText(self, args):
138
+ args['text'] = '(empty)'
139
+ args['size'] = (None, None)
140
+ args['expand_x'] = False
141
+
142
+ def createText(self, param, args):
143
+ return psg.Text(text=args['text'], expand_x=args['expand_x'], size=self.getSize(args))
144
+
easycoder/ec_program.py CHANGED
@@ -127,7 +127,7 @@ class Program:
127
127
 
128
128
  def doValue(self, value):
129
129
  if value == None:
130
- FatalError(self.compiler, f'Undefined value (variable not initialized?)')
130
+ RuntimeError(self, f'Undefined value (variable not initialized?)')
131
131
 
132
132
  result = {}
133
133
  valType = value['type']
@@ -150,7 +150,7 @@ class Program:
150
150
  name = value['name']
151
151
  symbolRecord = self.getSymbolRecord(name)
152
152
  if symbolRecord['value'] == [None]:
153
- RuntimeWarning(self.program, f'Variable "{name}" has no value')
153
+ RuntimeWarning(self, f'Variable "{name}" has no value')
154
154
  return None
155
155
  handler = self.domainIndex[symbolRecord['domain']].valueHandler('symbol')
156
156
  result = handler(symbolRecord)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: easycoder
3
- Version: 250118.1
3
+ Version: 250123.1
4
4
  Summary: Rapid scripting in English
5
5
  Keywords: compiler,scripting,prototyping,programming,coding,python,low code,hypertalk,computer language,learn to code
6
6
  Author-email: Graham Trott <gtanyware@gmail.com>
@@ -0,0 +1,17 @@
1
+ easycoder/README.md,sha256=PYqOc_SkIGiFbyCNs90y7JqoqWe4aO1xYIW-6bOnFKU,573
2
+ easycoder/__init__.py,sha256=8iQkCI7OEj-ml08eL1YZLHLnUmVob3PV61dfs6kyP-E,262
3
+ easycoder/ec_classes.py,sha256=xnWBNak8oKydkFoxHLlq9wo3lIsB3aMnTDrqbtCfoWo,1512
4
+ easycoder/ec_compiler.py,sha256=dFJEA_uOhD-HeSiAdBzmmA6q3LHThUVoJpSETanmSHs,4800
5
+ easycoder/ec_condition.py,sha256=WSbONo4zs2sX1icOVpscZDFSCAEFmTsquoc2RGcLx_k,763
6
+ easycoder/ec_core.py,sha256=9SRuYjM3UIhjQFP5PLSEDolXOVuzH7Z5rhaDw6ymYJI,87009
7
+ easycoder/ec_graphics.py,sha256=KbLbhNDr-DjKKy8RbkzpBogvz30FXFOsmQUJxFcBg4E,23718
8
+ easycoder/ec_gutils.py,sha256=cREktnAoHd_1t_fDgrnQ1F60n_TzFTGvoXJeWc_LJo4,5068
9
+ easycoder/ec_handler.py,sha256=IJvxcrJJSR53d6DS_8H5qPHKhp9y5-GV4WXAjhZxu_o,2250
10
+ easycoder/ec_program.py,sha256=R8zMukA-pfRsOpcy9WqTw7fE_190dQfrMt2la23Yrs4,9904
11
+ easycoder/ec_timestamp.py,sha256=_3QFJPzIWZ9Rzk3SQOQJ-gwmvB07pg78k23SPntoZtY,288
12
+ easycoder/ec_value.py,sha256=zgDJTJhIg3yOvmnnKIfccIizmIhGbtvL_ghLTL1T5fg,2516
13
+ easycoder-250123.1.dist-info/entry_points.txt,sha256=JXAZbenl0TnsIft2FcGJbJ-4qoztVu2FuT8PFmWFexM,44
14
+ easycoder-250123.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
15
+ easycoder-250123.1.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
16
+ easycoder-250123.1.dist-info/METADATA,sha256=OvDnVgGjc1r6lZsL2UZ2xYlHk45DeK4Zfni9pONDfYo,6162
17
+ easycoder-250123.1.dist-info/RECORD,,
@@ -1,17 +0,0 @@
1
- easycoder/README.md,sha256=PYqOc_SkIGiFbyCNs90y7JqoqWe4aO1xYIW-6bOnFKU,573
2
- easycoder/__init__.py,sha256=eHRjGvRE1Q4gkU7LU7u5U422z1Krs_a2AdY1PHd2sQw,262
3
- easycoder/ec_classes.py,sha256=xnWBNak8oKydkFoxHLlq9wo3lIsB3aMnTDrqbtCfoWo,1512
4
- easycoder/ec_compiler.py,sha256=dFJEA_uOhD-HeSiAdBzmmA6q3LHThUVoJpSETanmSHs,4800
5
- easycoder/ec_condition.py,sha256=WSbONo4zs2sX1icOVpscZDFSCAEFmTsquoc2RGcLx_k,763
6
- easycoder/ec_core.py,sha256=t4snx4DPIPvj1sLE7uPCrikGZaLajc5Rsq8M_RJiOIw,86727
7
- easycoder/ec_graphics.py,sha256=W2IE6vCg5h8HPjxuaJQ4ftqCNnhwAnX5CSaeHi0nEG0,11239
8
- easycoder/ec_gutils.py,sha256=6vO0yJbWc4sYMp2wR8LAwF4CZc5yqYERFfXUnHnFZxU,2819
9
- easycoder/ec_handler.py,sha256=IJvxcrJJSR53d6DS_8H5qPHKhp9y5-GV4WXAjhZxu_o,2250
10
- easycoder/ec_program.py,sha256=wU-vWRWAYK2Ie4EFnp8HeSPUL0bxz-j9HLQSNplObcc,9919
11
- easycoder/ec_timestamp.py,sha256=_3QFJPzIWZ9Rzk3SQOQJ-gwmvB07pg78k23SPntoZtY,288
12
- easycoder/ec_value.py,sha256=zgDJTJhIg3yOvmnnKIfccIizmIhGbtvL_ghLTL1T5fg,2516
13
- easycoder-250118.1.dist-info/entry_points.txt,sha256=JXAZbenl0TnsIft2FcGJbJ-4qoztVu2FuT8PFmWFexM,44
14
- easycoder-250118.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
15
- easycoder-250118.1.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
16
- easycoder-250118.1.dist-info/METADATA,sha256=UvUpqmF2I9xQP44f6RKcYtsNPI9Y7eTbd128KE9QMZs,6162
17
- easycoder-250118.1.dist-info/RECORD,,