easycoder 250522.1__py2.py3-none-any.whl → 250602.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 +1 -1
- easycoder/ec_core.py +9 -0
- easycoder/ec_program.py +7 -7
- easycoder/ec_pyside.py +56 -29
- {easycoder-250522.1.dist-info → easycoder-250602.1.dist-info}/METADATA +2 -3
- easycoder-250602.1.dist-info/RECORD +16 -0
- {easycoder-250522.1.dist-info → easycoder-250602.1.dist-info}/WHEEL +1 -1
- easycoder/ec_graphics.py +0 -429
- easycoder/ec_gutils.py +0 -175
- easycoder-250522.1.dist-info/RECORD +0 -18
- {easycoder-250522.1.dist-info/licenses → easycoder-250602.1.dist-info}/LICENSE +0 -0
- {easycoder-250522.1.dist-info → easycoder-250602.1.dist-info}/entry_points.txt +0 -0
easycoder/__init__.py
CHANGED
easycoder/ec_core.py
CHANGED
|
@@ -1995,6 +1995,9 @@ class Core(Handler):
|
|
|
1995
1995
|
value['command'] = self.nextValue()
|
|
1996
1996
|
return value
|
|
1997
1997
|
|
|
1998
|
+
if token == 'ticker':
|
|
1999
|
+
return value
|
|
2000
|
+
|
|
1998
2001
|
return None
|
|
1999
2002
|
|
|
2000
2003
|
#############################################################################
|
|
@@ -2387,6 +2390,12 @@ class Core(Handler):
|
|
|
2387
2390
|
value['content'] = round(math.tan(angle * 0.01745329) * radius)
|
|
2388
2391
|
return value
|
|
2389
2392
|
|
|
2393
|
+
def v_ticker(self, v):
|
|
2394
|
+
value = {}
|
|
2395
|
+
value['type'] = 'int'
|
|
2396
|
+
value['content'] = self.program.ticker
|
|
2397
|
+
return value
|
|
2398
|
+
|
|
2390
2399
|
def v_timestamp(self, v):
|
|
2391
2400
|
value = {}
|
|
2392
2401
|
value['type'] = 'int'
|
easycoder/ec_program.py
CHANGED
|
@@ -24,9 +24,6 @@ class Program:
|
|
|
24
24
|
exit()
|
|
25
25
|
self.classes=[Core]
|
|
26
26
|
scriptName = argv
|
|
27
|
-
if scriptName.endswith('.ecg'):
|
|
28
|
-
from .ec_graphics import Graphics
|
|
29
|
-
self.classes.append(Graphics)
|
|
30
27
|
|
|
31
28
|
f = open(scriptName, 'r')
|
|
32
29
|
source = f.read()
|
|
@@ -49,8 +46,14 @@ class Program:
|
|
|
49
46
|
self.graphics = None
|
|
50
47
|
self.processClasses()
|
|
51
48
|
self.externalControl = False
|
|
49
|
+
self.ticker = 0
|
|
52
50
|
self.running = True
|
|
53
51
|
|
|
52
|
+
# This is called at 10msec intervals by the GUI code
|
|
53
|
+
def flushCB(self):
|
|
54
|
+
self.ticker += 1
|
|
55
|
+
flush()
|
|
56
|
+
|
|
54
57
|
def start(self, parent=None, module = None, exports=[]):
|
|
55
58
|
self.parent = parent
|
|
56
59
|
self.exports = exports
|
|
@@ -288,9 +291,6 @@ class Program:
|
|
|
288
291
|
self.parent.waiting = False
|
|
289
292
|
self.parent.program.run(self.parent.pc)
|
|
290
293
|
|
|
291
|
-
def flushCB(self):
|
|
292
|
-
flush()
|
|
293
|
-
|
|
294
294
|
# Flush the queue
|
|
295
295
|
def flush(self, pc):
|
|
296
296
|
global queue
|
|
@@ -323,7 +323,7 @@ class Program:
|
|
|
323
323
|
elif self.pc == None or self.pc == 0 or self.pc >= len(self.code):
|
|
324
324
|
break
|
|
325
325
|
|
|
326
|
-
# Run the script
|
|
326
|
+
# Run the script at a given PC value
|
|
327
327
|
def run(self, pc):
|
|
328
328
|
global queue
|
|
329
329
|
item = Object()
|
easycoder/ec_pyside.py
CHANGED
|
@@ -40,12 +40,16 @@ class Graphics(Handler):
|
|
|
40
40
|
def __init__(self, compiler):
|
|
41
41
|
Handler.__init__(self, compiler)
|
|
42
42
|
self.blocked = False
|
|
43
|
+
self.runOnTick = 0
|
|
43
44
|
|
|
44
45
|
def getName(self):
|
|
45
46
|
return 'graphics'
|
|
46
47
|
|
|
47
48
|
def closeEvent(self):
|
|
48
49
|
print('window closed')
|
|
50
|
+
|
|
51
|
+
def isWidget(self, keyword):
|
|
52
|
+
return keyword in ['layout', 'groupbox', 'label', 'pushbutton', 'checkbox', 'lineinput', 'listbox', 'combobox']
|
|
49
53
|
|
|
50
54
|
#############################################################################
|
|
51
55
|
# Keyword handlers
|
|
@@ -84,7 +88,7 @@ class Graphics(Handler):
|
|
|
84
88
|
elif self.isSymbol():
|
|
85
89
|
record = self.getSymbolRecord()
|
|
86
90
|
if record['extra'] == 'gui':
|
|
87
|
-
if record['keyword']
|
|
91
|
+
if self.isWidget(record['keyword']):
|
|
88
92
|
if self.peek() == 'to':
|
|
89
93
|
# (2)
|
|
90
94
|
record = self.getSymbolRecord()
|
|
@@ -170,9 +174,11 @@ class Graphics(Handler):
|
|
|
170
174
|
# clear {widget}
|
|
171
175
|
def k_clear(self, command):
|
|
172
176
|
if self.nextIsSymbol():
|
|
173
|
-
|
|
174
|
-
self.
|
|
175
|
-
|
|
177
|
+
record = self.getSymbolRecord()
|
|
178
|
+
if self.isWidget(record['keyword']):
|
|
179
|
+
command['name'] = record['name']
|
|
180
|
+
self.add(command)
|
|
181
|
+
return True
|
|
176
182
|
return False
|
|
177
183
|
|
|
178
184
|
def r_clear(self, command):
|
|
@@ -583,9 +589,9 @@ class Graphics(Handler):
|
|
|
583
589
|
|
|
584
590
|
# on click {pushbutton}
|
|
585
591
|
# on select {combobox}/{listbox}
|
|
592
|
+
# on tick
|
|
586
593
|
def k_on(self, command):
|
|
587
594
|
def setupOn():
|
|
588
|
-
command['name'] = record['name']
|
|
589
595
|
command['goto'] = self.getPC() + 2
|
|
590
596
|
self.add(command)
|
|
591
597
|
self.nextToken()
|
|
@@ -606,34 +612,65 @@ class Graphics(Handler):
|
|
|
606
612
|
cmd['keyword'] = 'stop'
|
|
607
613
|
cmd['debug'] = False
|
|
608
614
|
self.addCommand(cmd)
|
|
609
|
-
# Fixup the
|
|
615
|
+
# Fixup the goto
|
|
610
616
|
self.getCommandAt(pcNext)['goto'] = self.getPC()
|
|
611
617
|
|
|
612
618
|
token = self.nextToken()
|
|
619
|
+
command['type'] = token
|
|
613
620
|
if token == 'click':
|
|
614
621
|
if self.nextIsSymbol():
|
|
615
622
|
record = self.getSymbolRecord()
|
|
616
623
|
if record['keyword'] == 'pushbutton':
|
|
624
|
+
command['name'] = record['name']
|
|
617
625
|
setupOn()
|
|
618
626
|
return True
|
|
619
627
|
elif token == 'select':
|
|
620
628
|
if self.nextIsSymbol():
|
|
621
629
|
record = self.getSymbolRecord()
|
|
622
630
|
if record['keyword'] in ['combobox', 'listbox']:
|
|
631
|
+
command['name'] = record['name']
|
|
623
632
|
setupOn()
|
|
624
633
|
return True
|
|
634
|
+
elif token == 'tick':
|
|
635
|
+
command['tick'] = True
|
|
636
|
+
command['runOnTick'] = self.getPC() + 2
|
|
637
|
+
self.addCommand(command)
|
|
638
|
+
self.nextToken()
|
|
639
|
+
# Step over the on tick action
|
|
640
|
+
pcNext = self.getPC()
|
|
641
|
+
cmd = {}
|
|
642
|
+
cmd['domain'] = 'core'
|
|
643
|
+
cmd['lino'] = command['lino']
|
|
644
|
+
cmd['keyword'] = 'gotoPC'
|
|
645
|
+
cmd['goto'] = 0
|
|
646
|
+
cmd['debug'] = False
|
|
647
|
+
self.addCommand(cmd)
|
|
648
|
+
# This is the on tick handler
|
|
649
|
+
self.compileOne()
|
|
650
|
+
cmd = {}
|
|
651
|
+
cmd['domain'] = 'core'
|
|
652
|
+
cmd['lino'] = command['lino']
|
|
653
|
+
cmd['keyword'] = 'stop'
|
|
654
|
+
cmd['debug'] = False
|
|
655
|
+
self.addCommand(cmd)
|
|
656
|
+
# Fixup the goto
|
|
657
|
+
self.getCommandAt(pcNext)['goto'] = self.getPC()
|
|
658
|
+
return True
|
|
625
659
|
return False
|
|
626
660
|
|
|
627
661
|
def r_on(self, command):
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
widget
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
662
|
+
if command['type'] == 'tick':
|
|
663
|
+
self.runOnTick = command['runOnTick']
|
|
664
|
+
else:
|
|
665
|
+
record = self.getVariable(command['name'])
|
|
666
|
+
widget = record['widget']
|
|
667
|
+
keyword = record['keyword']
|
|
668
|
+
if keyword == 'pushbutton':
|
|
669
|
+
widget.clicked.connect(lambda: self.run(command['goto']))
|
|
670
|
+
elif keyword == 'combobox':
|
|
671
|
+
widget.currentIndexChanged.connect(lambda: self.run(command['goto']))
|
|
672
|
+
elif keyword == 'listbox':
|
|
673
|
+
widget.itemClicked.connect(lambda: self.run(command['goto']))
|
|
637
674
|
return self.nextPC()
|
|
638
675
|
|
|
639
676
|
# Declare a pushbutton variable
|
|
@@ -915,7 +952,10 @@ class Graphics(Handler):
|
|
|
915
952
|
def init():
|
|
916
953
|
self.program.flush(self.nextPC())
|
|
917
954
|
def flush():
|
|
918
|
-
if not self.blocked:
|
|
955
|
+
if not self.blocked:
|
|
956
|
+
if self.runOnTick != 0:
|
|
957
|
+
self.program.run(self.runOnTick)
|
|
958
|
+
self.program.flushCB()
|
|
919
959
|
timer = QTimer()
|
|
920
960
|
timer.timeout.connect(flush)
|
|
921
961
|
timer.start(10)
|
|
@@ -1049,16 +1089,3 @@ class Graphics(Handler):
|
|
|
1049
1089
|
def force_exit(self):
|
|
1050
1090
|
QApplication.quit() # Gracefully close the application
|
|
1051
1091
|
sys.exit(0) # Force a complete system exit
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
def addIconToLayout(layout, icon_path):
|
|
1055
|
-
"""
|
|
1056
|
-
Adds an icon to the specified layout.
|
|
1057
|
-
|
|
1058
|
-
:param layout: The layout to which the icon will be added.
|
|
1059
|
-
:param icon_path: The file path of the icon image.
|
|
1060
|
-
"""
|
|
1061
|
-
icon_label = QLabel()
|
|
1062
|
-
pixmap = QPixmap(icon_path)
|
|
1063
|
-
icon_label.setPixmap(pixmap)
|
|
1064
|
-
layout.addWidget(icon_label)
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: easycoder
|
|
3
|
-
Version:
|
|
3
|
+
Version: 250602.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>
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
-
License-File: LICENSE
|
|
10
9
|
Requires-Dist: pytz
|
|
11
10
|
Requires-Dist: requests
|
|
12
11
|
Requires-Dist: pyside6
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
easycoder/README.md,sha256=BVXmYphcTJ6q6RN_9L6HtQukgCnOjSLVIsTM3lk-9aM,587
|
|
2
|
+
easycoder/__init__.py,sha256=WIPSkiauVT1ZKy6fLL77h-ZIjtnym27E2fraxAZaxnU,262
|
|
3
|
+
easycoder/ec_classes.py,sha256=L6-6yWHDHw8yF9TGL4WWc4p1aUyXzYz6Gom7jJ43h8o,1823
|
|
4
|
+
easycoder/ec_compiler.py,sha256=zKZXXUrQyHbwZ1gJARnwfdAPHWTARa5SN9Y31iuty8o,5086
|
|
5
|
+
easycoder/ec_condition.py,sha256=YXvSBQKEzKGCcgUGo3Qp8iHolXmm2BpEm0NimSDszIM,785
|
|
6
|
+
easycoder/ec_core.py,sha256=IH7lvxr1ZSFcZvd00RV8wzG_fvWX8bSW4YHKLOL3m04,92443
|
|
7
|
+
easycoder/ec_handler.py,sha256=zPDZ_hqdgNnkCd8B5HmSLkqsGgf4aDmqcUBOPHgo47U,2305
|
|
8
|
+
easycoder/ec_program.py,sha256=HnJJhd0umQyw8CwUv3wxwG73DFLxciGTry8b3tYG-6w,10094
|
|
9
|
+
easycoder/ec_pyside.py,sha256=Ofg9H_FCNeMcv2rgEXhjIiiUHgTIPdJgUnU0IHRMBmc,39811
|
|
10
|
+
easycoder/ec_timestamp.py,sha256=myQnnF-mT31_1dpQKv2VEAu4BCcbypvMdzq7_DUi1xc,277
|
|
11
|
+
easycoder/ec_value.py,sha256=zgDJTJhIg3yOvmnnKIfccIizmIhGbtvL_ghLTL1T5fg,2516
|
|
12
|
+
easycoder-250602.1.dist-info/entry_points.txt,sha256=JXAZbenl0TnsIft2FcGJbJ-4qoztVu2FuT8PFmWFexM,44
|
|
13
|
+
easycoder-250602.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
14
|
+
easycoder-250602.1.dist-info/WHEEL,sha256=ssQ84EZ5gH1pCOujd3iW7HClo_O_aDaClUbX4B8bjKY,100
|
|
15
|
+
easycoder-250602.1.dist-info/METADATA,sha256=Qn_VomKaxetOTnGExaBEMEsxePM5EXNE0n9tQSi62V4,6829
|
|
16
|
+
easycoder-250602.1.dist-info/RECORD,,
|
easycoder/ec_graphics.py
DELETED
|
@@ -1,429 +0,0 @@
|
|
|
1
|
-
from .ec_classes import FatalError, RuntimeError
|
|
2
|
-
from .ec_handler import Handler
|
|
3
|
-
from .ec_gutils import GUtils
|
|
4
|
-
import PySimpleGUI as psg
|
|
5
|
-
import json
|
|
6
|
-
from copy import deepcopy
|
|
7
|
-
|
|
8
|
-
class Graphics(Handler):
|
|
9
|
-
|
|
10
|
-
def __init__(self, compiler):
|
|
11
|
-
Handler.__init__(self, compiler)
|
|
12
|
-
self.utils = GUtils()
|
|
13
|
-
|
|
14
|
-
def getName(self):
|
|
15
|
-
return 'graphics'
|
|
16
|
-
|
|
17
|
-
#############################################################################
|
|
18
|
-
# Keyword handlers
|
|
19
|
-
|
|
20
|
-
def k_add(self, command):
|
|
21
|
-
token = self.nextToken()
|
|
22
|
-
if self.isSymbol():
|
|
23
|
-
symbolRecord = self.getSymbolRecord()
|
|
24
|
-
name = symbolRecord['name']
|
|
25
|
-
keyword = symbolRecord['keyword']
|
|
26
|
-
if keyword == 'layout':
|
|
27
|
-
command['args'] = name
|
|
28
|
-
elif keyword in ['column', 'frame', 'tab']:
|
|
29
|
-
command['name'] = name
|
|
30
|
-
command['type'] = token
|
|
31
|
-
if self.peek() == 'to':
|
|
32
|
-
command['args'] = name
|
|
33
|
-
else:
|
|
34
|
-
command['args'] = self.utils.getArgs(self)
|
|
35
|
-
else:
|
|
36
|
-
command['type'] = token
|
|
37
|
-
command['args'] = self.utils.getArgs(self)
|
|
38
|
-
if self.nextIs('to'):
|
|
39
|
-
if self.nextIsSymbol():
|
|
40
|
-
symbolRecord = self.getSymbolRecord()
|
|
41
|
-
if symbolRecord['keyword'] in ['column', 'frame', 'layout', 'tab']:
|
|
42
|
-
command['target'] = symbolRecord['name']
|
|
43
|
-
self.addCommand(command)
|
|
44
|
-
return True
|
|
45
|
-
return False
|
|
46
|
-
|
|
47
|
-
def r_add(self, command):
|
|
48
|
-
def create(type, layout, args2, target):
|
|
49
|
-
args = self.utils.getDefaultArgs(type)
|
|
50
|
-
for n in range(0, len(args2)):
|
|
51
|
-
try:
|
|
52
|
-
self.utils.decode(self, args, args2[n])
|
|
53
|
-
except Exception as e:
|
|
54
|
-
RuntimeError(self.program, e)
|
|
55
|
-
item = self.utils.createWidget(type, layout, args)
|
|
56
|
-
target['layout'].append(item)
|
|
57
|
-
|
|
58
|
-
target = self.getVariable(command['target'])
|
|
59
|
-
type = command['type']
|
|
60
|
-
args = command['args']
|
|
61
|
-
if not 'layout' in target:
|
|
62
|
-
target['layout'] = []
|
|
63
|
-
if len(args) > 0 and args[0] == '{':
|
|
64
|
-
args = json.loads(self.getRuntimeValue(json.loads(args)))
|
|
65
|
-
if type in ['Column', 'Frame', 'Tab']:
|
|
66
|
-
record = self.getVariable(command['name'])
|
|
67
|
-
layout = record['layout']
|
|
68
|
-
create(type, layout, args, target)
|
|
69
|
-
else:
|
|
70
|
-
create(type, None, args, target)
|
|
71
|
-
else:
|
|
72
|
-
if type in ['Column', 'Frame', 'Tab']:
|
|
73
|
-
record = self.getVariable(command['name'])
|
|
74
|
-
layout = record['layout']
|
|
75
|
-
create(type, layout, args, target)
|
|
76
|
-
else:
|
|
77
|
-
v = self.getVariable(args)
|
|
78
|
-
target['layout'].append(v['layout'])
|
|
79
|
-
return self.nextPC()
|
|
80
|
-
|
|
81
|
-
def k_close(self, command):
|
|
82
|
-
if self.nextIsSymbol():
|
|
83
|
-
symbolRecord = self.getSymbolRecord()
|
|
84
|
-
if symbolRecord['keyword'] == 'window':
|
|
85
|
-
command['target'] = symbolRecord['name']
|
|
86
|
-
self.add(command)
|
|
87
|
-
return True
|
|
88
|
-
return False
|
|
89
|
-
|
|
90
|
-
def r_close(self, command):
|
|
91
|
-
target = self.getVariable(command['target'])
|
|
92
|
-
target['window'].close()
|
|
93
|
-
return self.nextPC()
|
|
94
|
-
|
|
95
|
-
def k_column(self, command):
|
|
96
|
-
return self.compileVariable(command)
|
|
97
|
-
|
|
98
|
-
def r_column(self, command):
|
|
99
|
-
return self.nextPC()
|
|
100
|
-
|
|
101
|
-
# create layout {name} from {spec}
|
|
102
|
-
# create {window} layout {layout}
|
|
103
|
-
def k_create(self, command):
|
|
104
|
-
token = self.nextToken()
|
|
105
|
-
if token == 'layout':
|
|
106
|
-
if self.nextIsSymbol():
|
|
107
|
-
record = self.getSymbolRecord()
|
|
108
|
-
if record['keyword'] == 'layout':
|
|
109
|
-
command['layout'] = record['name']
|
|
110
|
-
if self.nextIs('from'):
|
|
111
|
-
command['spec'] = self.nextValue()
|
|
112
|
-
self.addCommand(command)
|
|
113
|
-
return True
|
|
114
|
-
elif self.isSymbol():
|
|
115
|
-
symbolRecord = self.getSymbolRecord()
|
|
116
|
-
command['name'] = symbolRecord['name']
|
|
117
|
-
command['title'] = self.nextValue()
|
|
118
|
-
if self.nextIs('layout'):
|
|
119
|
-
if self.nextIsSymbol():
|
|
120
|
-
symbolRecord = self.getSymbolRecord()
|
|
121
|
-
if symbolRecord['keyword'] == 'layout':
|
|
122
|
-
command['layout'] = symbolRecord['name']
|
|
123
|
-
self.addCommand(command)
|
|
124
|
-
return True
|
|
125
|
-
return False
|
|
126
|
-
|
|
127
|
-
def r_create(self, command):
|
|
128
|
-
def processItem(name, item):
|
|
129
|
-
print(name, item['type'])
|
|
130
|
-
children = item['#']
|
|
131
|
-
if isinstance(children, list):
|
|
132
|
-
print("List")
|
|
133
|
-
for child in children:
|
|
134
|
-
print(child)
|
|
135
|
-
else:
|
|
136
|
-
print("Single:", children)
|
|
137
|
-
|
|
138
|
-
if 'spec' in command:
|
|
139
|
-
spec = self.getRuntimeValue(command['spec'])
|
|
140
|
-
layout = self.getVariable(command['layout'])
|
|
141
|
-
for key in spec.keys():
|
|
142
|
-
item = spec[key]
|
|
143
|
-
print(key, item['type'])
|
|
144
|
-
if item['type'] == 'column':
|
|
145
|
-
for child in item['#']: processItem(child, item[child])
|
|
146
|
-
return self.nextPC()
|
|
147
|
-
else:
|
|
148
|
-
record = self.getVariable(command['name'])
|
|
149
|
-
title = self.getRuntimeValue(command['title'])
|
|
150
|
-
layout = self.getVariable(command['layout'])['layout']
|
|
151
|
-
window = psg.Window(title, layout, finalize=True)
|
|
152
|
-
record['window'] = window
|
|
153
|
-
record['eventHandlers'] = {}
|
|
154
|
-
self.program.run(self.nextPC())
|
|
155
|
-
self.mainLoop(record)
|
|
156
|
-
return 0
|
|
157
|
-
|
|
158
|
-
def k_frame(self, command):
|
|
159
|
-
return self.compileVariable(command)
|
|
160
|
-
|
|
161
|
-
def r_frame(self, command):
|
|
162
|
-
return self.nextPC()
|
|
163
|
-
|
|
164
|
-
# get {variable} from popup {type} {message} {title}
|
|
165
|
-
def k_get(self, command):
|
|
166
|
-
if self.nextIsSymbol():
|
|
167
|
-
symbolRecord = self.getSymbolRecord()
|
|
168
|
-
if symbolRecord['hasValue']:
|
|
169
|
-
command['target'] = self.getToken()
|
|
170
|
-
else:
|
|
171
|
-
FatalError(self.compiler, f'Variable "{symbolRecord["name"]}" does not hold a value')
|
|
172
|
-
if symbolRecord['hasValue']:
|
|
173
|
-
if self.nextIs('from'):
|
|
174
|
-
if self.nextIs('popup'):
|
|
175
|
-
command['ptype'] = self.nextToken()
|
|
176
|
-
command['message'] = self.nextValue()
|
|
177
|
-
command['title'] = self.nextValue()
|
|
178
|
-
self.addCommand(command)
|
|
179
|
-
return True
|
|
180
|
-
return False
|
|
181
|
-
|
|
182
|
-
def r_get(self, command):
|
|
183
|
-
target = self.getVariable(command['target'])
|
|
184
|
-
ptype = command['ptype']
|
|
185
|
-
if ptype == 'text':
|
|
186
|
-
text = psg.popup_get_text(self.getRuntimeValue(command['message']), title=self.getRuntimeValue(command['title']))
|
|
187
|
-
elif ptype == 'ok-cancel':
|
|
188
|
-
text = psg.popup_ok_cancel(self.getRuntimeValue(command['message']), title=self.getRuntimeValue(command['title']))
|
|
189
|
-
elif ptype == 'yes-no':
|
|
190
|
-
text = psg.popup_yes_no(self.getRuntimeValue(command['message']), title=self.getRuntimeValue(command['title']))
|
|
191
|
-
else:
|
|
192
|
-
return None
|
|
193
|
-
v = {}
|
|
194
|
-
v['type'] = 'text'
|
|
195
|
-
v['content'] = text
|
|
196
|
-
self.program.putSymbolValue(target, v)
|
|
197
|
-
return self.nextPC()
|
|
198
|
-
|
|
199
|
-
def k_init(self, command):
|
|
200
|
-
if self.nextIsSymbol():
|
|
201
|
-
symbolRecord = self.getSymbolRecord()
|
|
202
|
-
if symbolRecord['keyword'] in ['column', 'frame', 'layout', 'tab']:
|
|
203
|
-
command['target'] = symbolRecord['name']
|
|
204
|
-
self.add(command)
|
|
205
|
-
return True
|
|
206
|
-
return False
|
|
207
|
-
|
|
208
|
-
def r_init(self, command):
|
|
209
|
-
target = self.getVariable(command['target'])
|
|
210
|
-
target['layout'] = []
|
|
211
|
-
return self.nextPC()
|
|
212
|
-
|
|
213
|
-
def k_layout(self, command):
|
|
214
|
-
return self.compileVariable(command)
|
|
215
|
-
|
|
216
|
-
def r_layout(self, command):
|
|
217
|
-
return self.nextPC()
|
|
218
|
-
|
|
219
|
-
def k_on(self, command):
|
|
220
|
-
token = self.nextToken()
|
|
221
|
-
if token == 'event':
|
|
222
|
-
command['key'] = self.nextValue()
|
|
223
|
-
if self.nextIs('in'):
|
|
224
|
-
if self.nextIsSymbol():
|
|
225
|
-
record = self.getSymbolRecord()
|
|
226
|
-
if record['keyword'] == 'window':
|
|
227
|
-
command['window'] = record['name']
|
|
228
|
-
command['goto'] = self.getPC() + 2
|
|
229
|
-
self.add(command)
|
|
230
|
-
self.nextToken()
|
|
231
|
-
pcNext = self.getPC()
|
|
232
|
-
cmd = {}
|
|
233
|
-
cmd['domain'] = 'core'
|
|
234
|
-
cmd['lino'] = command['lino']
|
|
235
|
-
cmd['keyword'] = 'gotoPC'
|
|
236
|
-
cmd['goto'] = 0
|
|
237
|
-
cmd['debug'] = False
|
|
238
|
-
self.addCommand(cmd)
|
|
239
|
-
self.compileOne()
|
|
240
|
-
cmd = {}
|
|
241
|
-
cmd['domain'] = 'core'
|
|
242
|
-
cmd['lino'] = command['lino']
|
|
243
|
-
cmd['keyword'] = 'stop'
|
|
244
|
-
cmd['debug'] = False
|
|
245
|
-
self.addCommand(cmd)
|
|
246
|
-
# Fixup the link
|
|
247
|
-
self.getCommandAt(pcNext)['goto'] = self.getPC()
|
|
248
|
-
return True
|
|
249
|
-
return False
|
|
250
|
-
|
|
251
|
-
def r_on(self, command):
|
|
252
|
-
key = self.getRuntimeValue(command['key'])
|
|
253
|
-
window = self.getVariable(command['window'])
|
|
254
|
-
window['eventHandlers'][key] = lambda: self.run(command['goto'])
|
|
255
|
-
return self.nextPC()
|
|
256
|
-
|
|
257
|
-
# popup {message} {title}
|
|
258
|
-
def k_popup(self, command):
|
|
259
|
-
command['message'] = self.nextValue()
|
|
260
|
-
command['title'] = self.nextValue()
|
|
261
|
-
self.addCommand(command)
|
|
262
|
-
return True
|
|
263
|
-
|
|
264
|
-
def r_popup(self, command):
|
|
265
|
-
psg.popup(self.getRuntimeValue(command['message']), title=self.getRuntimeValue(command['title']))
|
|
266
|
-
return self.nextPC()
|
|
267
|
-
|
|
268
|
-
def k_refresh(self, command):
|
|
269
|
-
if self.nextIsSymbol():
|
|
270
|
-
symbolRecord = self.getSymbolRecord()
|
|
271
|
-
if symbolRecord['keyword'] == 'window':
|
|
272
|
-
command['target'] = symbolRecord['name']
|
|
273
|
-
self.add(command)
|
|
274
|
-
return True
|
|
275
|
-
return False
|
|
276
|
-
|
|
277
|
-
def r_refresh(self, command):
|
|
278
|
-
target = self.getVariable(command['target'])
|
|
279
|
-
target['window'].refresh()
|
|
280
|
-
return self.nextPC()
|
|
281
|
-
|
|
282
|
-
# set property {property} of {key} in {window} to {value}
|
|
283
|
-
def k_set(self, command):
|
|
284
|
-
if self.nextIs('property'):
|
|
285
|
-
command['property'] = self.nextValue()
|
|
286
|
-
if self.nextIs('of'):
|
|
287
|
-
command['key'] = self.nextValue()
|
|
288
|
-
if self.nextIs('in'):
|
|
289
|
-
if self.nextIsSymbol():
|
|
290
|
-
record = self.getSymbolRecord()
|
|
291
|
-
if record['keyword'] == 'window':
|
|
292
|
-
name = record['name']
|
|
293
|
-
command['window'] = name
|
|
294
|
-
if self.nextIs('to'):
|
|
295
|
-
command['value'] = self.nextValue()
|
|
296
|
-
self.add(command)
|
|
297
|
-
return True
|
|
298
|
-
else: RuntimeError(self.program, f'\'{name}\' is not a window variable')
|
|
299
|
-
else: RuntimeError(self.program, 'No window variable given')
|
|
300
|
-
return False
|
|
301
|
-
|
|
302
|
-
def r_set(self, command):
|
|
303
|
-
property = self.getRuntimeValue(command['property'])
|
|
304
|
-
key = self.getRuntimeValue(command['key'])
|
|
305
|
-
windowRecord = self.getVariable(command['window'])
|
|
306
|
-
window = windowRecord['window']
|
|
307
|
-
value = self.getRuntimeValue(command['value'])
|
|
308
|
-
self.utils.updateProperty(window[key], property, value)
|
|
309
|
-
return self.nextPC()
|
|
310
|
-
|
|
311
|
-
def k_window(self, command):
|
|
312
|
-
return self.compileVariable(command)
|
|
313
|
-
|
|
314
|
-
def r_window(self, command):
|
|
315
|
-
return self.nextPC()
|
|
316
|
-
|
|
317
|
-
#############################################################################
|
|
318
|
-
# Compile a value in this domain
|
|
319
|
-
def compileValue(self):
|
|
320
|
-
value = {}
|
|
321
|
-
value['domain'] = self.getName()
|
|
322
|
-
token = self.getToken()
|
|
323
|
-
if self.isSymbol():
|
|
324
|
-
value['name'] = token
|
|
325
|
-
symbolRecord = self.getSymbolRecord()
|
|
326
|
-
keyword = symbolRecord['keyword']
|
|
327
|
-
if keyword == 'event':
|
|
328
|
-
value['type'] = 'symbol'
|
|
329
|
-
return value
|
|
330
|
-
return None
|
|
331
|
-
|
|
332
|
-
if self.getToken() == 'the':
|
|
333
|
-
self.nextToken()
|
|
334
|
-
|
|
335
|
-
token = self.getToken()
|
|
336
|
-
value['type'] = token
|
|
337
|
-
|
|
338
|
-
if token == 'event':
|
|
339
|
-
return value
|
|
340
|
-
|
|
341
|
-
if token == 'property':
|
|
342
|
-
value['property'] = self.nextValue()
|
|
343
|
-
if self.nextIs('of'):
|
|
344
|
-
if self.nextToken() == 'the':
|
|
345
|
-
if self.nextIs('event'):
|
|
346
|
-
return value
|
|
347
|
-
return None
|
|
348
|
-
|
|
349
|
-
if token == 'value':
|
|
350
|
-
if self.nextIs('of'):
|
|
351
|
-
if self.nextIs('key'):
|
|
352
|
-
value['key'] = self.nextValue()
|
|
353
|
-
if self.nextIs('in'):
|
|
354
|
-
if self.nextIsSymbol():
|
|
355
|
-
record = self.getSymbolRecord()
|
|
356
|
-
if record['keyword'] == 'window':
|
|
357
|
-
value['window'] = record['name']
|
|
358
|
-
return value
|
|
359
|
-
return None
|
|
360
|
-
|
|
361
|
-
#############################################################################
|
|
362
|
-
# Modify a value or leave it unchanged.
|
|
363
|
-
def modifyValue(self, value):
|
|
364
|
-
return value
|
|
365
|
-
|
|
366
|
-
#############################################################################
|
|
367
|
-
# Value handlers
|
|
368
|
-
|
|
369
|
-
# This is used by the expression evaluator to get the value of a symbol
|
|
370
|
-
def v_symbol(self, symbolRecord):
|
|
371
|
-
if symbolRecord['keyword'] == 'event':
|
|
372
|
-
return self.getSymbolValue(symbolRecord)
|
|
373
|
-
else:
|
|
374
|
-
return None
|
|
375
|
-
|
|
376
|
-
def v_event(self, v):
|
|
377
|
-
window = self.eventValues['window']
|
|
378
|
-
values = self.eventValues['values']
|
|
379
|
-
self.utils.getEventProperties(window, values)
|
|
380
|
-
v['type'] = 'text'
|
|
381
|
-
v['content'] = values
|
|
382
|
-
return v
|
|
383
|
-
|
|
384
|
-
def v_property(self, v):
|
|
385
|
-
property = self.getRuntimeValue(v['property'])
|
|
386
|
-
window = self.eventValues['window']
|
|
387
|
-
values = self.eventValues['values']
|
|
388
|
-
self.utils.getEventProperties(window, values)
|
|
389
|
-
v['type'] = 'text'
|
|
390
|
-
v['content'] = values[property]
|
|
391
|
-
return v
|
|
392
|
-
|
|
393
|
-
def v_value(self, v):
|
|
394
|
-
key = self.getRuntimeValue(v['key'])
|
|
395
|
-
window = self.getVariable(v['window'])
|
|
396
|
-
value = self.utils.getWidgetValue(window, key)
|
|
397
|
-
if value == None: RuntimeError(self.program, 'getWidgetValue: unimplemented widget type')
|
|
398
|
-
v = deepcopy(v)
|
|
399
|
-
v['type'] = 'text'
|
|
400
|
-
v['content'] = value
|
|
401
|
-
return v
|
|
402
|
-
|
|
403
|
-
#############################################################################
|
|
404
|
-
# Compile a condition
|
|
405
|
-
def compileCondition(self):
|
|
406
|
-
condition = {}
|
|
407
|
-
return condition
|
|
408
|
-
|
|
409
|
-
#############################################################################
|
|
410
|
-
# Condition handlers
|
|
411
|
-
|
|
412
|
-
#############################################################################
|
|
413
|
-
# The main loop
|
|
414
|
-
def mainLoop(self, windowRecord):
|
|
415
|
-
window = windowRecord['window']
|
|
416
|
-
eventHandlers = windowRecord['eventHandlers']
|
|
417
|
-
while True:
|
|
418
|
-
event, values = window.Read(timeout=100)
|
|
419
|
-
if event == psg.WIN_CLOSED or event == "EXIT":
|
|
420
|
-
del window
|
|
421
|
-
break
|
|
422
|
-
if event == '__TIMEOUT__': self.program.flushCB()
|
|
423
|
-
else:
|
|
424
|
-
if event in eventHandlers:
|
|
425
|
-
self.eventValues = {}
|
|
426
|
-
self.eventValues['values'] = values
|
|
427
|
-
self.eventValues['window'] = window
|
|
428
|
-
eventHandlers[event]()
|
|
429
|
-
pass
|
easycoder/ec_gutils.py
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import PySimpleGUI as psg
|
|
2
|
-
import json
|
|
3
|
-
|
|
4
|
-
class GUtils:
|
|
5
|
-
|
|
6
|
-
# Parse a set of compile-time arguments
|
|
7
|
-
def getArgs(self, handler):
|
|
8
|
-
args = []
|
|
9
|
-
while True:
|
|
10
|
-
key = handler.nextToken()
|
|
11
|
-
value = handler.nextValue()
|
|
12
|
-
value = json.dumps(value)
|
|
13
|
-
args.append(f'{key}={value}')
|
|
14
|
-
if handler.peek() == 'and':
|
|
15
|
-
handler.nextToken()
|
|
16
|
-
else: break
|
|
17
|
-
v = {}
|
|
18
|
-
v['type'] = 'text'
|
|
19
|
-
v['content'] = json.dumps(args)
|
|
20
|
-
return json.dumps(v)
|
|
21
|
-
|
|
22
|
-
# Get the default args for a graphic element
|
|
23
|
-
def getDefaultArgs(self, type):
|
|
24
|
-
args = {}
|
|
25
|
-
if type == 'Button': self.getDefaultButton(args)
|
|
26
|
-
elif type == 'Checkbox': self.getDefaultCheckbox(args)
|
|
27
|
-
elif type == 'Column': self.getDefaultColumn(args)
|
|
28
|
-
elif type == 'Frame': self.getDefaultFrame(args)
|
|
29
|
-
elif type == 'Input': self.getDefaultInput(args)
|
|
30
|
-
elif type == 'Listbox': self.getDefaultListbox(args)
|
|
31
|
-
elif type == 'Multiline': self.getDefaultMultiline(args)
|
|
32
|
-
elif type == 'Text': self.getDefaultText(args)
|
|
33
|
-
return args
|
|
34
|
-
|
|
35
|
-
# Decode an argument at runtime
|
|
36
|
-
def decode(self, handler, args, text):
|
|
37
|
-
p = text.find('=')
|
|
38
|
-
if p > 0:
|
|
39
|
-
key = text[0:p]
|
|
40
|
-
value = text[p+1:]
|
|
41
|
-
value = json.loads(value)
|
|
42
|
-
if value['type'] == 'symbol':
|
|
43
|
-
record = handler.program.getSymbolRecord(value['name'])
|
|
44
|
-
value = handler.getSymbolValue(record)
|
|
45
|
-
if value != None: value = value['content']
|
|
46
|
-
else: raise Exception('Variable has no value')
|
|
47
|
-
args[key] = value
|
|
48
|
-
|
|
49
|
-
# Reduce the event properties to a list of strings
|
|
50
|
-
def getEventProperties(self, window, values):
|
|
51
|
-
keys = values.keys()
|
|
52
|
-
for key in keys:
|
|
53
|
-
v = values[key]
|
|
54
|
-
widget = window.key_dict[key]
|
|
55
|
-
if type(widget) is psg.Listbox:
|
|
56
|
-
# Only pick one from those selected
|
|
57
|
-
v = v[0]
|
|
58
|
-
values[key] = v
|
|
59
|
-
|
|
60
|
-
# Create a widget
|
|
61
|
-
def createWidget(self, type, layout, args):
|
|
62
|
-
if type == 'Button': return self.createButton(layout, args)
|
|
63
|
-
elif type == 'Checkbox': return self.createCheckbox(layout, args)
|
|
64
|
-
elif type == 'Column': return self.createColumn(layout, args)
|
|
65
|
-
elif type == 'Frame': return self.createFrame(layout, args)
|
|
66
|
-
elif type == 'Input': return self.createInput(layout, args)
|
|
67
|
-
elif type == 'Listbox': return self.createListbox(layout, args)
|
|
68
|
-
elif type == 'Multiline': return self.createMultiline(layout, args)
|
|
69
|
-
elif type == 'Text': return self.createText(layout, args)
|
|
70
|
-
else: return None
|
|
71
|
-
|
|
72
|
-
# Get the current value of a widget
|
|
73
|
-
def getWidgetValue(self, window, key):
|
|
74
|
-
key_dict = window['window'].key_dict
|
|
75
|
-
widget = key_dict[key]
|
|
76
|
-
if type(widget) is psg.Button: return widget.get()
|
|
77
|
-
elif type(widget) is psg.Checkbox: return widget.get()
|
|
78
|
-
elif type(widget) is psg.Column: return widget.get()
|
|
79
|
-
elif type(widget) is psg.Frame: return widget.get()
|
|
80
|
-
elif type(widget) is psg.Input: return widget.get()
|
|
81
|
-
elif type(widget) is psg.Listbox:
|
|
82
|
-
items = widget.get()
|
|
83
|
-
if len(items) > 0:
|
|
84
|
-
return items[0]
|
|
85
|
-
return ''
|
|
86
|
-
elif type(widget) is psg.Multiline: return widget.get()
|
|
87
|
-
elif type(widget) is psg.Text: return widget.get()
|
|
88
|
-
return None
|
|
89
|
-
|
|
90
|
-
# Update a property
|
|
91
|
-
def updateProperty(self, element, property, value):
|
|
92
|
-
if property == 'disabled':
|
|
93
|
-
element.update(disabled=value)
|
|
94
|
-
elif property == 'text':
|
|
95
|
-
element.update(text=value)
|
|
96
|
-
elif property == 'value':
|
|
97
|
-
element.update(value=value)
|
|
98
|
-
elif property == 'values':
|
|
99
|
-
element.update(values=value)
|
|
100
|
-
|
|
101
|
-
def getSize(self, args):
|
|
102
|
-
size = args['size']
|
|
103
|
-
if size == (None, None):
|
|
104
|
-
return size
|
|
105
|
-
size = size.split()
|
|
106
|
-
return (size[0], size[1])
|
|
107
|
-
|
|
108
|
-
def getDefaultButton(self, args):
|
|
109
|
-
args['button_text'] = ''
|
|
110
|
-
args['disabled'] = False
|
|
111
|
-
args['size'] = (None, None)
|
|
112
|
-
|
|
113
|
-
def createButton(self, layout, args):
|
|
114
|
-
return psg.Button(button_text=args['button_text'], disabled=args['disabled'], size=self.getSize(args))
|
|
115
|
-
|
|
116
|
-
def getDefaultCheckbox(self, args):
|
|
117
|
-
args['text'] = ''
|
|
118
|
-
args['key'] = None
|
|
119
|
-
args['size'] = (None, None)
|
|
120
|
-
args['expand_x'] = False
|
|
121
|
-
|
|
122
|
-
def createCheckbox(self, layout, args):
|
|
123
|
-
return psg.Checkbox(args['text'], key=args['key'], expand_x=args['expand_x'], size=self.getSize(args))
|
|
124
|
-
|
|
125
|
-
def getDefaultColumn(self, args):
|
|
126
|
-
args['expand_x'] = False
|
|
127
|
-
args['pad'] = (0, 0)
|
|
128
|
-
|
|
129
|
-
def createColumn(self, layout, args):
|
|
130
|
-
return psg.Column(layout, expand_x=args['expand_x'], pad=args['pad'])
|
|
131
|
-
|
|
132
|
-
def getDefaultFrame(self, args):
|
|
133
|
-
args['title'] = ''
|
|
134
|
-
args['border_width'] = 1
|
|
135
|
-
args['expand_x'] = False
|
|
136
|
-
args['pad'] = (0, 0)
|
|
137
|
-
|
|
138
|
-
def createFrame(self, layout, args):
|
|
139
|
-
return psg.Frame(args['title'], layout, border_width=args['border_width'], expand_x=args['expand_x'], pad=args['pad'])
|
|
140
|
-
|
|
141
|
-
def getDefaultInput(self, args):
|
|
142
|
-
args['default_text'] = ''
|
|
143
|
-
args['key'] = None
|
|
144
|
-
args['size'] = (None, None)
|
|
145
|
-
|
|
146
|
-
def createInput(self, layout, args):
|
|
147
|
-
return psg.Input(default_text=args['default_text'], key=args['key'], size=self.getSize(args))
|
|
148
|
-
|
|
149
|
-
def getDefaultListbox(self, args):
|
|
150
|
-
args['list'] = []
|
|
151
|
-
args['key'] = [None]
|
|
152
|
-
args['size'] = '10 2'
|
|
153
|
-
args['pad'] = 1
|
|
154
|
-
args['select_mode'] = None
|
|
155
|
-
|
|
156
|
-
def createListbox(self, layout, args):
|
|
157
|
-
return psg.Listbox([], key=args['key'], pad=args['pad'], size=self.getSize(args))
|
|
158
|
-
|
|
159
|
-
def getDefaultMultiline(self, args):
|
|
160
|
-
args['default_text'] = ''
|
|
161
|
-
args['key'] = None
|
|
162
|
-
args['size'] = (None, None)
|
|
163
|
-
|
|
164
|
-
def createMultiline(self, layout, args):
|
|
165
|
-
return psg.Multiline(default_text=args['default_text'], key=args['key'], size=self.getSize(args))
|
|
166
|
-
|
|
167
|
-
def getDefaultText(self, args):
|
|
168
|
-
args['text'] = ''
|
|
169
|
-
args['key'] = None
|
|
170
|
-
args['size'] = (None, None)
|
|
171
|
-
args['expand_x'] = False
|
|
172
|
-
|
|
173
|
-
def createText(self, layouts, args):
|
|
174
|
-
return psg.Text(text=args['text'], expand_x=args['expand_x'], key=args['key'], size=self.getSize(args))
|
|
175
|
-
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
easycoder/README.md,sha256=BVXmYphcTJ6q6RN_9L6HtQukgCnOjSLVIsTM3lk-9aM,587
|
|
2
|
-
easycoder/__init__.py,sha256=fBeU_blUdyJ9_2Boq25g8iJDpMC7OVgv8R5jWWzYs5Q,262
|
|
3
|
-
easycoder/ec_classes.py,sha256=L6-6yWHDHw8yF9TGL4WWc4p1aUyXzYz6Gom7jJ43h8o,1823
|
|
4
|
-
easycoder/ec_compiler.py,sha256=zKZXXUrQyHbwZ1gJARnwfdAPHWTARa5SN9Y31iuty8o,5086
|
|
5
|
-
easycoder/ec_condition.py,sha256=YXvSBQKEzKGCcgUGo3Qp8iHolXmm2BpEm0NimSDszIM,785
|
|
6
|
-
easycoder/ec_core.py,sha256=ATuBnJP4RZZCzB7How8XUouF7PoFM7JwuVrjh4oQGH4,92242
|
|
7
|
-
easycoder/ec_graphics.py,sha256=WXxKMB4GJSmxvk-FVbOTyufiUx4TYIzyDoB1PCAO3JY,16067
|
|
8
|
-
easycoder/ec_gutils.py,sha256=yqu4RRQ6VdRkC5B2ADBYsXzgNu76dLnekd9aUjdEgPw,6399
|
|
9
|
-
easycoder/ec_handler.py,sha256=zPDZ_hqdgNnkCd8B5HmSLkqsGgf4aDmqcUBOPHgo47U,2305
|
|
10
|
-
easycoder/ec_program.py,sha256=d_CchiglkCdAgX2CSIQ_WTWcDEvFWCQmRKdoqLCaooU,10087
|
|
11
|
-
easycoder/ec_pyside.py,sha256=gyQJLrLiYQ6IATWKpiksfEBk7pqFw6Eviy7saOeCfZc,38731
|
|
12
|
-
easycoder/ec_timestamp.py,sha256=myQnnF-mT31_1dpQKv2VEAu4BCcbypvMdzq7_DUi1xc,277
|
|
13
|
-
easycoder/ec_value.py,sha256=zgDJTJhIg3yOvmnnKIfccIizmIhGbtvL_ghLTL1T5fg,2516
|
|
14
|
-
easycoder-250522.1.dist-info/entry_points.txt,sha256=JXAZbenl0TnsIft2FcGJbJ-4qoztVu2FuT8PFmWFexM,44
|
|
15
|
-
easycoder-250522.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
16
|
-
easycoder-250522.1.dist-info/WHEEL,sha256=Dyt6SBfaasWElUrURkknVFAZDHSTwxg3PaTza7RSbkY,100
|
|
17
|
-
easycoder-250522.1.dist-info/METADATA,sha256=FWjDsxXZKOWuBGBBtN6Ukfd567dxzMoiEAULWNlAkDY,6851
|
|
18
|
-
easycoder-250522.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|