shell-lite 0.3.3__py3-none-any.whl → 0.3.5__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.
shell_lite/__init__.py CHANGED
@@ -0,0 +1 @@
1
+
shell_lite/ast_nodes.py CHANGED
@@ -1,369 +1,274 @@
1
-
2
1
  from dataclasses import dataclass, field
3
2
  from typing import Any, List, Optional
4
-
5
3
  @dataclass
6
4
  class Node:
7
5
  line: int = field(default=0, init=False)
8
-
9
6
  @dataclass
10
7
  class Number(Node):
11
8
  value: int
12
-
13
9
  @dataclass
14
10
  class String(Node):
15
11
  value: str
16
-
17
12
  @dataclass
18
13
  class Regex(Node):
19
14
  pattern: str
20
-
21
15
  @dataclass
22
16
  class VarAccess(Node):
23
17
  name: str
24
-
25
18
  @dataclass
26
19
  class Assign(Node):
27
- name: str # variable name
20
+ name: str
28
21
  value: Node
29
-
30
22
  @dataclass
31
23
  class PropertyAssign(Node):
32
24
  instance_name: str
33
25
  property_name: str
34
26
  value: Node
35
-
36
27
  @dataclass
37
28
  class UnaryOp(Node):
38
29
  op: str
39
30
  right: Node
40
-
41
31
  @dataclass
42
32
  class BinOp(Node):
43
33
  left: Node
44
34
  op: str
45
35
  right: Node
46
-
47
36
  @dataclass
48
37
  class Print(Node):
49
38
  expression: Node
50
39
  style: Optional[str] = None
51
40
  color: Optional[str] = None
52
-
53
41
  @dataclass
54
42
  class If(Node):
55
43
  condition: Node
56
44
  body: List[Node]
57
45
  else_body: Optional[List[Node]] = None
58
-
59
46
  @dataclass
60
47
  class While(Node):
61
48
  condition: Node
62
49
  body: List[Node]
63
-
64
50
  @dataclass
65
51
  class For(Node):
66
52
  count: Node
67
53
  body: List[Node]
68
-
69
54
  @dataclass
70
55
  class ListVal(Node):
71
56
  elements: List[Node]
72
-
73
57
  @dataclass
74
58
  class Dictionary(Node):
75
59
  pairs: List[tuple[Node, Node]]
76
-
77
60
  @dataclass
78
61
  class SetVal(Node):
79
62
  elements: List[Node]
80
-
81
63
  @dataclass
82
64
  class Boolean(Node):
83
65
  value: bool
84
-
85
66
  @dataclass
86
67
  class Input(Node):
87
68
  prompt: Optional[str] = None
88
-
89
69
  @dataclass
90
70
  class FunctionDef(Node):
91
71
  name: str
92
- args: List[tuple[str, Optional[Node], Optional[str]]] # [(name, default_node, type_hint), ...]
72
+ args: List[tuple[str, Optional[Node], Optional[str]]]
93
73
  body: List[Node]
94
74
  return_type: Optional[str] = None
95
-
96
75
  @dataclass
97
76
  class Call(Node):
98
77
  name: str
99
78
  args: List[Node]
100
- body: Optional[List[Node]] = None # For WebDSL (e.g. div ... \n ...block)
101
-
79
+ body: Optional[List[Node]] = None
102
80
  @dataclass
103
81
  class Return(Node):
104
82
  value: Node
105
-
106
83
  @dataclass
107
84
  class ClassDef(Node):
108
85
  name: str
109
86
  properties: List[str]
110
87
  methods: List[FunctionDef]
111
88
  parent: Optional[str] = None
112
-
113
89
  @dataclass
114
90
  class Instantiation(Node):
115
91
  var_name: str
116
92
  class_name: str
117
93
  args: List[Node]
118
-
119
94
  @dataclass
120
95
  class MethodCall(Node):
121
96
  instance_name: str
122
97
  method_name: str
123
98
  args: List[Node]
124
-
125
99
  @dataclass
126
100
  class PropertyAccess(Node):
127
101
  instance_name: str
128
102
  property_name: str
129
-
130
103
  @dataclass
131
104
  class Import(Node):
132
105
  path: str
133
-
134
106
  @dataclass
135
107
  class Try(Node):
136
108
  try_body: List[Node]
137
109
  catch_var: str
138
110
  catch_body: List[Node]
139
-
140
111
  @dataclass
141
112
  class Lambda(Node):
142
113
  params: List[str]
143
- body: Node # Single expression
144
-
114
+ body: Node
145
115
  @dataclass
146
116
  class Ternary(Node):
147
117
  condition: Node
148
118
  true_expr: Node
149
119
  false_expr: Node
150
-
151
120
  @dataclass
152
121
  class ListComprehension(Node):
153
122
  expr: Node
154
123
  var_name: str
155
124
  iterable: Node
156
125
  condition: Optional[Node] = None
157
-
158
126
  @dataclass
159
127
  class Spread(Node):
160
128
  value: Node
161
-
162
129
  @dataclass
163
130
  class ConstAssign(Node):
164
131
  name: str
165
132
  value: Node
166
-
167
133
  @dataclass
168
134
  class ForIn(Node):
169
135
  var_name: str
170
136
  iterable: Node
171
137
  body: List[Node]
172
-
173
138
  @dataclass
174
139
  class IndexAccess(Node):
175
140
  obj: Node
176
141
  index: Node
177
-
178
142
  @dataclass
179
143
  class Stop(Node):
180
- """Break out of loop"""
181
144
  pass
182
-
183
145
  @dataclass
184
146
  class Skip(Node):
185
- """Continue to next iteration"""
186
147
  pass
187
-
188
148
  @dataclass
189
149
  class When(Node):
190
- """Pattern matching - when x is value1 => ... otherwise => ..."""
191
150
  value: Node
192
- cases: List[tuple[Node, List[Node]]] # [(match_value, body), ...]
151
+ cases: List[tuple[Node, List[Node]]]
193
152
  otherwise: Optional[List[Node]] = None
194
-
195
153
  @dataclass
196
154
  class Throw(Node):
197
- """Throw an error - error 'message'"""
198
155
  message: Node
199
-
200
156
  @dataclass
201
157
  class TryAlways(Node):
202
- """Try with always block - try ... catch ... always ..."""
203
158
  try_body: List[Node]
204
159
  catch_var: str
205
160
  catch_body: List[Node]
206
161
  always_body: List[Node]
207
-
208
162
  @dataclass
209
163
  class Unless(Node):
210
- """Negative if - unless condition"""
211
164
  condition: Node
212
165
  body: List[Node]
213
166
  else_body: Optional[List[Node]] = None
214
-
215
167
  @dataclass
216
168
  class Execute(Node):
217
- """Execute code from string - execute 'say hello'"""
218
169
  code: Node
219
-
220
170
  @dataclass
221
171
  class Repeat(Node):
222
- """Simple repeat loop - repeat 5 times"""
223
172
  count: Node
224
173
  body: List[Node]
225
-
226
174
  @dataclass
227
175
  class ImportAs(Node):
228
- """Import with alias - use 'math' as m"""
229
176
  path: str
230
177
  alias: str
231
-
232
178
  @dataclass
233
179
  class Until(Node):
234
- """Loop until condition - until done"""
235
180
  condition: Node
236
181
  body: List[Node]
237
-
238
182
  @dataclass
239
183
  class Forever(Node):
240
- """Infinite loop - forever"""
241
184
  body: List[Node]
242
-
243
185
  @dataclass
244
186
  class Exit(Node):
245
- """Exit program - exit or exit 1"""
246
187
  code: Optional[Node] = None
247
-
248
188
  @dataclass
249
189
  class Make(Node):
250
- """Create object - make Robot or new Robot"""
251
190
  class_name: str
252
191
  args: List[Node]
253
-
254
192
  @dataclass
255
193
  class FileWatcher(Node):
256
- """File watcher - on file_change 'path' ..."""
257
194
  path: Node
258
195
  body: List[Node]
259
-
260
- # --- New GUI Nodes ---
261
196
  @dataclass
262
197
  class Alert(Node):
263
198
  message: Node
264
-
265
199
  @dataclass
266
200
  class Prompt(Node):
267
201
  prompt: Node
268
-
269
202
  @dataclass
270
203
  class Confirm(Node):
271
204
  prompt: Node
272
-
273
- # --- Async Nodes ---
274
205
  @dataclass
275
206
  class Spawn(Node):
276
207
  call: Node
277
-
278
208
  @dataclass
279
209
  class Await(Node):
280
210
  task: Node
281
-
282
211
  @dataclass
283
212
  class ProgressLoop(Node):
284
- """show progress for i in ..."""
285
- loop_node: Node # The underlying loop (For or ForIn or Repeat)
286
-
213
+ loop_node: Node
287
214
  @dataclass
288
215
  class Convert(Node):
289
- """convert x to json"""
290
216
  expression: Node
291
217
  target_format: str
292
-
293
218
  @dataclass
294
219
  class Listen(Node):
295
- """listen on port 8000"""
296
220
  port: Node
297
-
298
221
  @dataclass
299
222
  class OnRequest(Node):
300
- """on request to "/path" ..."""
301
- path: Node # or pattern
223
+ path: Node
302
224
  body: List[Node]
303
-
304
225
  @dataclass
305
226
  class Every(Node):
306
- """every 5 minutes ..."""
307
227
  interval: Node
308
- unit: str # 'seconds', 'minutes'
228
+ unit: str
309
229
  body: List[Node]
310
-
311
230
  @dataclass
312
231
  class After(Node):
313
- """in 5 minutes ..."""
314
232
  delay: Node
315
233
  unit: str
316
234
  body: List[Node]
317
-
318
235
  @dataclass
319
236
  class ServeStatic(Node):
320
237
  folder: Node
321
238
  url: Node
322
-
323
239
  @dataclass
324
240
  class Download(Node):
325
241
  url: Node
326
-
327
242
  @dataclass
328
243
  class ArchiveOp(Node):
329
- op: str # 'compress' or 'extract'
244
+ op: str
330
245
  source: Node
331
246
  target: Node
332
-
333
247
  @dataclass
334
248
  class CsvOp(Node):
335
- op: str # 'load' or 'save'
249
+ op: str
336
250
  data: Optional[Node]
337
251
  path: Node
338
-
339
252
  @dataclass
340
253
  class ClipboardOp(Node):
341
- op: str # 'copy' or 'paste'
342
- content: Optional[Node] # for copy
343
-
254
+ op: str
255
+ content: Optional[Node]
344
256
  @dataclass
345
257
  class AutomationOp(Node):
346
- action: str # 'press', 'type', 'click', 'notify'
258
+ action: str
347
259
  args: List[Node]
348
-
349
260
  @dataclass
350
261
  class DateOp(Node):
351
- expr: str # "next friday"
352
-
262
+ expr: str
353
263
  @dataclass
354
264
  class FileWrite(Node):
355
- """write 'text' to file 'path' (mode='w') or append (mode='a')"""
356
265
  path: Node
357
266
  content: Node
358
- mode: str # 'w' or 'a'
359
-
267
+ mode: str
360
268
  @dataclass
361
269
  class FileRead(Node):
362
- """read file 'path'"""
363
270
  path: Node
364
-
365
271
  @dataclass
366
272
  class DatabaseOp(Node):
367
- """db open 'path', db query 'sql', etc."""
368
273
  op: str
369
274
  args: List[Node]
shell_lite/cli.py ADDED
@@ -0,0 +1,10 @@
1
+ import sys
2
+ import os
3
+ if getattr(sys, 'frozen', False):
4
+ base_dir = sys._MEIPASS
5
+ else:
6
+ base_dir = os.path.dirname(os.path.abspath(__file__))
7
+ sys.path.insert(0, base_dir)
8
+ from src.main import main
9
+ if __name__ == "__main__":
10
+ main()