rainbow-rb-utils 0.1.2.dev3__tar.gz → 0.1.2.dev4__tar.gz

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.
Files changed (25) hide show
  1. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/PKG-INFO +2 -2
  2. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/pyproject.toml +2 -2
  3. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/flow_manager.py +44 -10
  4. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/manipulate.py +5 -0
  5. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow_rb_utils.egg-info/PKG-INFO +2 -2
  6. rainbow_rb_utils-0.1.2.dev4/src/rainbow_rb_utils.egg-info/requires.txt +2 -0
  7. rainbow_rb_utils-0.1.2.dev3/src/rainbow_rb_utils.egg-info/requires.txt +0 -2
  8. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/README.md +0 -0
  9. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/setup.cfg +0 -0
  10. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/__init__.py +0 -0
  11. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/asyncio_helper.py +0 -0
  12. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/date.py +0 -0
  13. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/env.py +0 -0
  14. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/file.py +0 -0
  15. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/flatbuffer.py +0 -0
  16. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/helper.py +0 -0
  17. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/pagination.py +0 -0
  18. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/parser.py +0 -0
  19. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/path_utils.py +0 -0
  20. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/program.py +0 -0
  21. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/py.typed +0 -0
  22. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow/rb_utils/service_exception.py +0 -0
  23. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow_rb_utils.egg-info/SOURCES.txt +0 -0
  24. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow_rb_utils.egg-info/dependency_links.txt +0 -0
  25. {rainbow_rb_utils-0.1.2.dev3 → rainbow_rb_utils-0.1.2.dev4}/src/rainbow_rb_utils.egg-info/top_level.txt +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rainbow-rb-utils
3
- Version: 0.1.2.dev3
3
+ Version: 0.1.2.dev4
4
4
  Summary: Rainbow Python Utilities
5
5
  Author-email: Derek <dfd1123@rainbow-robotics.com>
6
6
  Requires-Python: <3.14,>=3.11
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: psutil<8.0.0,>=7.0.0
9
- Requires-Dist: rainbow-rb-log==0.1.2.dev3
9
+ Requires-Dist: rainbow-rb-log==0.1.2.dev4
10
10
 
11
11
  # rb_utils
12
12
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "rainbow-rb-utils"
7
- version = "0.1.2.dev3"
7
+ version = "0.1.2.dev4"
8
8
  requires-python = ">=3.11,<3.14"
9
9
  description = "Rainbow Python Utilities"
10
10
  authors = [
@@ -14,7 +14,7 @@ readme = "README.md"
14
14
 
15
15
  dependencies = [
16
16
  "psutil>=7.0.0,<8.0.0",
17
- "rainbow-rb-log==0.1.2.dev3",
17
+ "rainbow-rb-log==0.1.2.dev4",
18
18
  ]
19
19
 
20
20
  [tool.setuptools]
@@ -66,7 +66,28 @@ ALLOWED_CONSTS = {
66
66
 
67
67
  EXPLICIT_EXPR_PATTERN = re.compile(r"\$[A-Za-z_]\w*")
68
68
  RB_GLOBAL_PATTERN = re.compile(r"\bRB_[A-Za-z_0-9]*\b")
69
- GET_VAR_PATTERN = re.compile(r"\bget_var\s*\(")
69
+ # get/update 는 get_var/update_var 별칭. `.get(`/`.update(` (dict 메서드) 은 제외
70
+ GET_VAR_PATTERN = re.compile(r"(?<![\w.])(?:get|update)(?:_var)?\s*\(")
71
+
72
+
73
+ def collect_rb_globals(value: Any) -> list[str]:
74
+ """value(문자열/리스트/딕트 중첩) 안의 RB_ 이름을 순서대로, 중복 없이 모은다."""
75
+ found: dict[str, None] = {}
76
+
77
+ def _walk(v: Any) -> None:
78
+ if isinstance(v, str):
79
+ for name in RB_GLOBAL_PATTERN.findall(v):
80
+ found[name] = None
81
+ elif isinstance(v, list | tuple | set):
82
+ for item in v:
83
+ _walk(item)
84
+ elif isinstance(v, dict):
85
+ # eval_value 와 동일하게 값만 본다
86
+ for item in v.values():
87
+ _walk(item)
88
+
89
+ _walk(value)
90
+ return list(found)
70
91
 
71
92
 
72
93
  def safe_eval_expr(
@@ -75,6 +96,7 @@ def safe_eval_expr(
75
96
  get_global_variable: Callable[[str], Any] | None = None,
76
97
  get_var: Callable[..., Any] | None = None,
77
98
  on_write: Callable[[str, str], None] | None = None,
99
+ update_var: Callable[..., Any] | None = None,
78
100
  ) -> Any:
79
101
  """on_write: 대입/증감 시 (변수명, "local"|"global") 통보. 쓰기 없으면 호출 안 됨."""
80
102
  if not isinstance(expr, str):
@@ -202,18 +224,25 @@ def safe_eval_expr(
202
224
  return any(_eval(v) for v in node.values)
203
225
 
204
226
  if isinstance(node, ast.Call):
205
- if isinstance(node.func, ast.Name) and node.func.id == "get_var":
227
+ if isinstance(node.func, ast.Name) and node.func.id in ("get", "get_var"):
228
+ # get(name) = 자기 프로세스, get(target, name[, default]) = 다른 프로그램
229
+ fname = node.func.id
206
230
  if get_var is None:
207
- raise ValueError("get_var is not available in this context")
208
- if len(node.args) not in (2, 3):
231
+ raise ValueError(f"{fname} is not available in this context")
232
+ if not 1 <= len(node.args) <= 3 or node.keywords:
209
233
  raise ValueError(
210
- "get_var requires 2 or 3 arguments: get_var(pid_or_model, var_name[, default])"
234
+ f"{fname} requires {fname}(var_name) or "
235
+ f"{fname}(pid_or_model, var_name[, default])"
211
236
  )
212
- pid_or_model = _eval(node.args[0])
213
- var_name = _eval(node.args[1])
214
- if len(node.args) == 3:
215
- return get_var(pid_or_model, var_name, _eval(node.args[2]))
216
- return get_var(pid_or_model, var_name)
237
+ return get_var(*[_eval(a) for a in node.args])
238
+ if isinstance(node.func, ast.Name) and node.func.id in ("update", "update_var"):
239
+ # update({...}) = 자기 프로세스, update(target, {...}) = 다른 프로그램
240
+ fname = node.func.id
241
+ if update_var is None:
242
+ raise ValueError(f"{fname} is not available in this context")
243
+ if len(node.args) not in (1, 2) or node.keywords:
244
+ raise ValueError(f"{fname} requires {fname}({{...}}) or {fname}(target, {{...}})")
245
+ return update_var(*[_eval(a) for a in node.args])
217
246
  fn = _eval(node.func)
218
247
  if fn not in ALLOWED_CALLABLES:
219
248
  raise ValueError(f"function not allowed: {fn}")
@@ -515,6 +544,7 @@ def eval_value(
515
544
  get_global_variable: Callable[[str], Any] | None = None,
516
545
  get_var: Callable[..., Any] | None = None,
517
546
  on_write: Callable[[str, str], None] | None = None,
547
+ update_var: Callable[..., Any] | None = None,
518
548
  ) -> Any:
519
549
  # 1) 문자열이면 → 기존 safe_eval_expr 호출
520
550
  if isinstance(value, str):
@@ -524,6 +554,7 @@ def eval_value(
524
554
  get_global_variable=get_global_variable,
525
555
  get_var=get_var,
526
556
  on_write=on_write,
557
+ update_var=update_var,
527
558
  )
528
559
 
529
560
  # 2) 리스트면 → 각 요소를 재귀적으로 평가
@@ -535,6 +566,7 @@ def eval_value(
535
566
  get_global_variable=get_global_variable,
536
567
  get_var=get_var,
537
568
  on_write=on_write,
569
+ update_var=update_var,
538
570
  )
539
571
  for v in value
540
572
  ]
@@ -548,6 +580,7 @@ def eval_value(
548
580
  get_global_variable=get_global_variable,
549
581
  get_var=get_var,
550
582
  on_write=on_write,
583
+ update_var=update_var,
551
584
  )
552
585
  for v in value
553
586
  )
@@ -561,6 +594,7 @@ def eval_value(
561
594
  get_global_variable=get_global_variable,
562
595
  get_var=get_var,
563
596
  on_write=on_write,
597
+ update_var=update_var,
564
598
  )
565
599
  for k, v in value.items()
566
600
  }
@@ -228,4 +228,9 @@ def parse_state_core_mv_to_dict(mv: memoryview) -> dict[str, object]:
228
228
  "weldInfoRxCurrent": obj.WeldInfoRxCurrent(),
229
229
  "weldInfoRxVoltage": obj.WeldInfoRxVoltage(),
230
230
  "weldInfoRxFeedrate": obj.WeldInfoRxFeedrate(),
231
+ "safetyRawDataA0": obj.SafetyRawDataA0(),
232
+ "safetyRawDataA1": obj.SafetyRawDataA1(),
233
+ "safetyRawDataB0": obj.SafetyRawDataB0(),
234
+ "safetyRawDataB1": obj.SafetyRawDataB1(),
235
+ "realtimeFeedback": obj.RealtimeFeedback(),
231
236
  }
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rainbow-rb-utils
3
- Version: 0.1.2.dev3
3
+ Version: 0.1.2.dev4
4
4
  Summary: Rainbow Python Utilities
5
5
  Author-email: Derek <dfd1123@rainbow-robotics.com>
6
6
  Requires-Python: <3.14,>=3.11
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: psutil<8.0.0,>=7.0.0
9
- Requires-Dist: rainbow-rb-log==0.1.2.dev3
9
+ Requires-Dist: rainbow-rb-log==0.1.2.dev4
10
10
 
11
11
  # rb_utils
12
12
 
@@ -0,0 +1,2 @@
1
+ psutil<8.0.0,>=7.0.0
2
+ rainbow-rb-log==0.1.2.dev4
@@ -1,2 +0,0 @@
1
- psutil<8.0.0,>=7.0.0
2
- rainbow-rb-log==0.1.2.dev3