jetstream-api 0.5.2__tar.gz → 0.5.3__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. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/PKG-INFO +1 -1
  2. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/__init__.py +1 -1
  3. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/properties.py +263 -3
  4. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/jetstream_api.egg-info/PKG-INFO +1 -1
  5. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/pyproject.toml +1 -1
  6. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/LICENSE.txt +0 -0
  7. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/README.md +0 -0
  8. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/admin.py +0 -0
  9. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/admintopic.py +0 -0
  10. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/common.py +0 -0
  11. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/connectivity.py +0 -0
  12. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/exception.py +0 -0
  13. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/msg.py +0 -0
  14. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/pattern.py +0 -0
  15. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/producer.py +0 -0
  16. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/py.typed +0 -0
  17. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/qmgr.py +0 -0
  18. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/topic.py +0 -0
  19. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/ilink/util.py +0 -0
  20. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/jetstream_api.egg-info/SOURCES.txt +0 -0
  21. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/jetstream_api.egg-info/dependency_links.txt +0 -0
  22. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/jetstream_api.egg-info/requires.txt +0 -0
  23. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/jetstream_api.egg-info/top_level.txt +0 -0
  24. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/setup.cfg +0 -0
  25. {jetstream_api-0.5.2 → jetstream_api-0.5.3}/tests/test_example.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
5
5
  Author: snowjeans
6
6
  License: Boost Software License - Version 1.0 - August 17th, 2003
@@ -1,6 +1,6 @@
1
1
  """iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
2
2
 
3
- __version__ = "0.5.2"
3
+ __version__ = "0.5.3"
4
4
 
5
5
  # --- Admin / Service ---
6
6
  from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
@@ -41,6 +41,55 @@ def _validate_log_level(value: int) -> None:
41
41
  )
42
42
 
43
43
 
44
+ def _spec_range(lo, hi, extra=""):
45
+ """``lo <= v <= hi`` 규칙. ``extra`` 는 오류 문구에 덧붙일 단서."""
46
+ text = "%s~%s%s" % (lo, hi, extra)
47
+
48
+ def check(v):
49
+ return isinstance(v, int) and not isinstance(v, bool) and lo <= v <= hi
50
+
51
+ return check, text
52
+
53
+
54
+ def _spec_min(lo, extra=""):
55
+ """``lo`` 이상 규칙."""
56
+ text = "%s or greater%s" % (lo, extra)
57
+
58
+ def check(v):
59
+ return isinstance(v, int) and not isinstance(v, bool) and v >= lo
60
+
61
+ return check, text
62
+
63
+
64
+ def _spec_special_or_min(special, lo, label):
65
+ """``special`` 하나를 따로 허용하고, 그 밖에는 ``lo`` 이상만 받는다.
66
+
67
+ 엔진이 ``-1``(무제한/비활성) 같은 특수값을 따로 두는 항목에 쓴다. ``0`` 처럼
68
+ 특수값도 아니고 범위에도 없는 값을 걸러 내는 것이 목적이다.
69
+ """
70
+ text = "%s for %s, or %s or greater" % (special, label, lo)
71
+
72
+ def check(v):
73
+ if not isinstance(v, int) or isinstance(v, bool):
74
+ return False
75
+ return v == special or v >= lo
76
+
77
+ return check, text
78
+
79
+
80
+ def _spec_maxlen(n):
81
+ """``n`` 바이트 이하 문자열 규칙."""
82
+ text = "%d bytes or less" % n
83
+
84
+ def check(v):
85
+ try:
86
+ return len(str(v).encode("utf-8")) <= n
87
+ except Exception:
88
+ return False
89
+
90
+ return check, text
91
+
92
+
44
93
  class _AutoAccessor:
45
94
  """필드에서 ``getX`` / ``setX`` / ``isX`` 접근자를 **자동으로** 만들어 주는 믹스인.
46
95
 
@@ -53,8 +102,18 @@ class _AutoAccessor:
53
102
  - ``obj.isFoo()`` -> ``bool(obj.foo)``
54
103
 
55
104
  즉 **필드 이름을 알면 접근자 이름도 안다.** 각 클래스 docstring 의 Attributes
56
- 절에 필드 목록이 있다. 필드를 직접 읽고 쓰는 것도 그대로 허용된다
57
- (``obj.foo = 3`` 과 ``obj.setFoo(3)`` 은 같다).
105
+ 절에 필드 목록이 있다.
106
+
107
+ Note:
108
+ **세터는 값 범위를 검사한다.** 클래스마다 ``_SPEC`` 규칙표가 있고, 엔진
109
+ ``Validate()`` 와 같은 규칙이다. 범위를 벗어나면
110
+ :class:`UnsupportedOperationException` 을 올린다 - 서버에 갔다 오기 전에
111
+ 걸러진다. 규칙이 없는 필드는 그냥 대입된다.
112
+
113
+ **필드 직접 대입은 검사하지 않는다** (``obj.foo = 3``). 서버가 보낸
114
+ 바이트를 푸는 경로가 같은 방식으로 필드에 넣기 때문이다 - 구엔진이 지금
115
+ 규격을 벗어난 값을 보내도 파싱이 깨지면 안 된다. 미리 걸러 내고 싶으면
116
+ **세터를 쓴다.**
58
117
  """
59
118
 
60
119
  def __getattr__(self, name: str):
@@ -77,13 +136,44 @@ class _AutoAccessor:
77
136
  if name.startswith("set") and len(name) > 3:
78
137
  field = name[3].lower() + name[4:]
79
138
  if hasattr(self, field):
80
- return lambda value: setattr(self, field, value)
139
+ return lambda value: self._set_checked(field, value)
81
140
  if name.startswith("is") and len(name) > 2:
82
141
  field = name[2].lower() + name[3:]
83
142
  if hasattr(self, field):
84
143
  return lambda: bool(getattr(self, field))
85
144
  raise AttributeError(f"{self.__class__.__name__} has no attribute {name}")
86
145
 
146
+ _SPEC: dict = {}
147
+
148
+ def _set_checked(self, field: str, value):
149
+ """규칙표에 있으면 검사한 뒤 필드에 넣는다.
150
+
151
+ Args:
152
+ field (str): 대상 필드 이름.
153
+ value: 넣을 값.
154
+
155
+ Raises:
156
+ UnsupportedOperationException: 값이 규격을 벗어났을 때.
157
+
158
+ Note:
159
+ **역직렬화 경로는 이 검사를 타지 않는다.** ``__init__`` 이 서버 바이트를
160
+ 풀 때는 ``self.<필드> = ...`` 로 직접 넣으므로, 구엔진이 지금 규격을
161
+ 벗어난 값을 보내도 파싱이 깨지지 않는다. 검사는 **앱이 값을 지정하는
162
+ 경로**에만 걸린다.
163
+
164
+ 같은 이유로 ``obj.<필드> = 값`` 직접 대입도 검사하지 않는다. 규격을
165
+ 미리 확인하려면 세터를 쓰거나 각 클래스 docstring 의 ``스펙:`` 줄을 본다.
166
+ """
167
+ rule = type(self)._SPEC.get(field)
168
+ if rule is not None:
169
+ check, text = rule
170
+ if not check(value):
171
+ raise UnsupportedOperationException(
172
+ f"[{value}] is an unacceptable value."
173
+ f" (acceptable value range: {text})"
174
+ )
175
+ object.__setattr__(self, field, value)
176
+
87
177
 
88
178
  class DestItem(_AutoAccessor):
89
179
  """분산(밸런스) 채널의 **전송 대상** 하나. 고정폭 바이트 블롭으로 오간다.
@@ -560,6 +650,24 @@ class ILQueueProperty(_AutoAccessor):
560
650
  스펙: 서버 응답 길이로 라이브러리가 판단하는 내부 표시 · 앱이 건드리지 않는다.
561
651
  """
562
652
 
653
+ # 엔진 QueueProperty::Validate() 와 같은 규칙.
654
+ _SPEC = {
655
+ "name": _spec_maxlen(47),
656
+ "triggerProcess": _spec_maxlen(999),
657
+ "remoteQmgrName": _spec_maxlen(47),
658
+ "remoteQueueName": _spec_maxlen(47),
659
+ "xmitQueueName": _spec_maxlen(47),
660
+ "expiredQueue": _spec_maxlen(47),
661
+ "maxDepth": _spec_range(1, 99999999),
662
+ "maxMsgLength": _spec_special_or_min(-1, 1, "unlimited"),
663
+ "incomingDelayDepth": _spec_special_or_min(-1, 1, "disabled"),
664
+ "incomingDelay": _spec_special_or_min(-1, 1, "disabled"),
665
+ "expiry": _spec_min(-1, " (-1 = by message)"),
666
+ "maxMemorySize": _spec_min(0, " (byte)"),
667
+ "sharedMemorySize": _spec_min(0, " (byte)"),
668
+ "numberOfPartition": _spec_range(2, 99),
669
+ }
670
+
563
671
  def __init__(
564
672
  self,
565
673
  name: str | bytes | bytearray | None = None,
@@ -1212,6 +1320,18 @@ class ILChannelProperty(_AutoAccessor):
1212
1320
  읽지 않는 옛 필드**라 이 클래스에 없다. 찾지 마라.
1213
1321
  """
1214
1322
 
1323
+ # 엔진 ChannelProperty::Validate() 와 같은 규칙.
1324
+ _SPEC = {
1325
+ "name": _spec_maxlen(47),
1326
+ "destManagerName": _spec_maxlen(47),
1327
+ "destManagerIp": _spec_maxlen(127),
1328
+ "xmitQueueName": _spec_maxlen(47),
1329
+ "keyFileName": _spec_maxlen(511),
1330
+ "certFileName": _spec_maxlen(511),
1331
+ "destManagerPort": _spec_range(1025, 65535),
1332
+ "timeout": _spec_special_or_min(-1, 1, "infinite"),
1333
+ }
1334
+
1215
1335
  def __init__(
1216
1336
  self,
1217
1337
  name: str | bytes | bytearray | None = None,
@@ -2368,6 +2488,37 @@ class ILQmgrProperty(_AutoAccessor):
2368
2488
  서버가 채우는 읽기 전용 값이다.
2369
2489
  """
2370
2490
 
2491
+ # 엔진 ManagerProperty::Validate() / Fix() 와 같은 규칙.
2492
+ _SPEC = {
2493
+ "name": _spec_maxlen(47),
2494
+ "port": _spec_range(1025, 65535),
2495
+ "deadLetterQueueName": _spec_maxlen(31),
2496
+ "channelRetryTimeInterval": _spec_range(1, 86400, " (sec)"),
2497
+ "sendTimeout": _spec_range(1, 864000, " (sec)"),
2498
+ "recvWaitTimeout": _spec_range(1, 864000, " (sec)"),
2499
+ "volumeMonitorInterval": _spec_range(1, 864000, " (sec)"),
2500
+ "volumeMonitorSizeLimit": _spec_range(1, 1073741824000, " (byte)"),
2501
+ "subExpiryMinutes": _spec_min(0, " (min)"),
2502
+ "memberExpiryMinutes": _spec_range(0, 9999, " (min)"),
2503
+ "deadSessionMaxCount": _spec_min(0),
2504
+ "deadSessionKeepDuration": _spec_min(0, " (sec)"),
2505
+ "logLevelSystem": _spec_range(0, 7),
2506
+ "logLevelClient": _spec_range(0, 7),
2507
+ "logLevelQueue": _spec_range(0, 7),
2508
+ "logLevelChannel": _spec_range(0, 7),
2509
+ "logLevelTopic": _spec_range(0, 7),
2510
+ "logFileSizeSystem": _spec_range(1048576, 104857600, " (byte)"),
2511
+ "logFileSizeClient": _spec_range(1048576, 104857600, " (byte)"),
2512
+ "logFileSizeQueue": _spec_range(1048576, 104857600, " (byte)"),
2513
+ "logFileSizeChannel": _spec_range(1048576, 104857600, " (byte)"),
2514
+ "logFileSizeTopic": _spec_range(1048576, 104857600, " (byte)"),
2515
+ "logFileCountSystem": _spec_range(1, 999),
2516
+ "logFileCountClient": _spec_range(1, 999),
2517
+ "logFileCountQueue": _spec_range(1, 999),
2518
+ "logFileCountChannel": _spec_range(1, 999),
2519
+ "logFileCountTopic": _spec_range(1, 999),
2520
+ }
2521
+
2371
2522
  def __init__(
2372
2523
  self,
2373
2524
  name: str | bytes | bytearray | None = None,
@@ -2819,6 +2970,33 @@ class ILQmgrProperty(_AutoAccessor):
2819
2970
  )
2820
2971
  setattr(self, "logFileCount" + self._log_suffix(logger_type), value)
2821
2972
 
2973
+
2974
+ # --- camelCase 별칭 -------------------------------------------------
2975
+ # 2인자 로거 접근자는 _AutoAccessor 가 합성하지 못한다(필드 이름이 아니라
2976
+ # 종류를 인자로 받으므로). 자바에는 있는 형태라 명시적으로 붙여 둔다.
2977
+ def getLogLevel(self, logger_type: int) -> int:
2978
+ """:meth:`get_log_level` 의 camelCase 별칭."""
2979
+ return self.get_log_level(logger_type)
2980
+
2981
+ def setLogLevel(self, logger_type: int, value: int) -> None:
2982
+ """:meth:`set_log_level` 의 camelCase 별칭."""
2983
+ self.set_log_level(logger_type, value)
2984
+
2985
+ def getLogFileSize(self, logger_type: int) -> int:
2986
+ """:meth:`get_log_file_size` 의 camelCase 별칭."""
2987
+ return self.get_log_file_size(logger_type)
2988
+
2989
+ def setLogFileSize(self, logger_type: int, value: int) -> None:
2990
+ """:meth:`set_log_file_size` 의 camelCase 별칭."""
2991
+ self.set_log_file_size(logger_type, value)
2992
+
2993
+ def getLogFileCount(self, logger_type: int) -> int:
2994
+ """:meth:`get_log_file_count` 의 camelCase 별칭."""
2995
+ return self.get_log_file_count(logger_type)
2996
+
2997
+ def setLogFileCount(self, logger_type: int, value: int) -> None:
2998
+ """:meth:`set_log_file_count` 의 camelCase 별칭."""
2999
+ self.set_log_file_count(logger_type, value)
2822
3000
  def get_log_level_system_string(self) -> str:
2823
3001
  """시스템 로그 레벨을 문자열로 돌려준다.
2824
3002
 
@@ -3420,6 +3598,22 @@ class ILServiceProperty(_AutoAccessor):
3420
3598
  스펙: 기본 5 · 범위 1~999 · 단위 개 · 변경 가능/재기동 불필요.
3421
3599
  """
3422
3600
 
3601
+ # 엔진 ServiceProperty::Validate() 와 같은 규칙.
3602
+ _SPEC = {
3603
+ "name": _spec_maxlen(47),
3604
+ "port": _spec_range(1025, 65535),
3605
+ "hubIp": _spec_maxlen(127),
3606
+ "hubPort": _spec_range(1025, 65535),
3607
+ "timeoutSocketSend": _spec_range(1, 864000, " (sec)"),
3608
+ "timeoutSocketRecv": _spec_range(1, 864000, " (sec)"),
3609
+ "logLevelSystem": _spec_range(0, 7),
3610
+ "logLevelClient": _spec_range(0, 7),
3611
+ "logFileSizeSystem": _spec_range(1048576, 104857600, " (byte)"),
3612
+ "logFileSizeClient": _spec_range(1048576, 104857600, " (byte)"),
3613
+ "logFileCountSystem": _spec_range(1, 999),
3614
+ "logFileCountClient": _spec_range(1, 999),
3615
+ }
3616
+
3423
3617
  def __init__(self, ba: bytes | bytearray | None = None) -> None:
3424
3618
  """서비스 속성 객체를 만든다.
3425
3619
 
@@ -3758,6 +3952,33 @@ class ILServiceProperty(_AutoAccessor):
3758
3952
  )
3759
3953
  setattr(self, "logFileCount" + self._log_suffix(logger_type), value)
3760
3954
 
3955
+
3956
+ # --- camelCase 별칭 -------------------------------------------------
3957
+ # 2인자 로거 접근자는 _AutoAccessor 가 합성하지 못한다(필드 이름이 아니라
3958
+ # 종류를 인자로 받으므로). 자바에는 있는 형태라 명시적으로 붙여 둔다.
3959
+ def getLogLevel(self, logger_type: int) -> int:
3960
+ """:meth:`get_log_level` 의 camelCase 별칭."""
3961
+ return self.get_log_level(logger_type)
3962
+
3963
+ def setLogLevel(self, logger_type: int, value: int) -> None:
3964
+ """:meth:`set_log_level` 의 camelCase 별칭."""
3965
+ self.set_log_level(logger_type, value)
3966
+
3967
+ def getLogFileSize(self, logger_type: int) -> int:
3968
+ """:meth:`get_log_file_size` 의 camelCase 별칭."""
3969
+ return self.get_log_file_size(logger_type)
3970
+
3971
+ def setLogFileSize(self, logger_type: int, value: int) -> None:
3972
+ """:meth:`set_log_file_size` 의 camelCase 별칭."""
3973
+ self.set_log_file_size(logger_type, value)
3974
+
3975
+ def getLogFileCount(self, logger_type: int) -> int:
3976
+ """:meth:`get_log_file_count` 의 camelCase 별칭."""
3977
+ return self.get_log_file_count(logger_type)
3978
+
3979
+ def setLogFileCount(self, logger_type: int, value: int) -> None:
3980
+ """:meth:`set_log_file_count` 의 camelCase 별칭."""
3981
+ self.set_log_file_count(logger_type, value)
3761
3982
  def get_log_level_system_string(self) -> str:
3762
3983
  """시스템 로그 레벨을 문자열로 돌려준다.
3763
3984
 
@@ -3868,6 +4089,15 @@ class ILProxyProperty(_AutoAccessor):
3868
4089
  스펙: 기본 F · 범위 T | F · 변경 불가.
3869
4090
  """
3870
4091
 
4092
+ # 엔진 ProxyProperty::Validate() 와 같은 규칙.
4093
+ _SPEC = {
4094
+ "name": _spec_maxlen(47),
4095
+ "port": _spec_range(1025, 65535),
4096
+ "destIp": _spec_maxlen(127),
4097
+ "destPort": _spec_range(1025, 65535),
4098
+ "timeout": _spec_min(1, " (sec)"),
4099
+ }
4100
+
3871
4101
  def __init__(self, ba: bytes | bytearray | None = None) -> None:
3872
4102
  """프록시 속성 객체를 만든다.
3873
4103
 
@@ -4034,6 +4264,16 @@ class ILDiskGuardProperty(_AutoAccessor):
4034
4264
  스펙: 기본 10 · 범위 1~3600 · 단위 초 · 변경 가능/재기동 불필요.
4035
4265
  """
4036
4266
 
4267
+ # 엔진 DiskGuardProperty::Validate() 와 같은 규칙(상호 제약은 validate() 가 본다).
4268
+ _SPEC = {
4269
+ "warnPercent": _spec_range(1, 100, " (%)"),
4270
+ "suspendPercent": _spec_range(1, 100, " (%)"),
4271
+ "resumePercent": _spec_range(1, 100, " (%)"),
4272
+ "minFreeMB": _spec_min(0, " (MB)"),
4273
+ "resumeMinFreeMB": _spec_min(0, " (MB)"),
4274
+ "intervalSec": _spec_range(1, 3600, " (sec)"),
4275
+ }
4276
+
4037
4277
  def __init__(self, csv: str | None = None) -> None:
4038
4278
  """디스크 가드 설정 객체를 만든다.
4039
4279
 
@@ -4265,6 +4505,14 @@ class ILClusterNode(_AutoAccessor):
4265
4505
  스펙: 기본 "" · 범위 47바이트 이하 문자열 (빈 값 금지, rev 3319+) · 변경 가능/클러스터 정지 필요.
4266
4506
  """
4267
4507
 
4508
+ # 엔진 ClusterProperty::Validate() 의 노드 검사와 같은 규칙.
4509
+ _SPEC = {
4510
+ "nodeId": _spec_min(1),
4511
+ "host": _spec_maxlen(127),
4512
+ "port": _spec_range(1025, 65535),
4513
+ "qmgrName": _spec_maxlen(47),
4514
+ }
4515
+
4268
4516
  def __init__(self, ba: bytes | bytearray | None = None,
4269
4517
  qmgr_name: str = "", host: str = "", port: int = 0) -> None:
4270
4518
  """클러스터 노드 객체를 만든다.
@@ -4479,6 +4727,18 @@ class ILClusterProperty(_AutoAccessor):
4479
4727
  항목마다 자기 길이만큼 커서를 전진시켜 파싱한다.
4480
4728
  """
4481
4729
 
4730
+ # 엔진 ClusterProperty::Validate() 와 같은 규칙.
4731
+ _SPEC = {
4732
+ "name": _spec_maxlen(47),
4733
+ "ilccPort": _spec_range(1025, 65535),
4734
+ "priPort": _spec_range(1025, 65535),
4735
+ "secPort": _spec_range(1025, 65535),
4736
+ "witPort": _spec_range(1025, 65535),
4737
+ "heartbeatIntervalMs": _spec_min(100, " (ms)"),
4738
+ "heartbeatMissCount": _spec_range(1, 99),
4739
+ "electionDelayMs": _spec_min(0, " (ms)"),
4740
+ }
4741
+
4482
4742
  def __init__(self, ba: bytes | bytearray | None = None,
4483
4743
  name: str = "", ilcc_port: int = 0,
4484
4744
  is_auto_start: bool = True,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
5
5
  Author: snowjeans
6
6
  License: Boost Software License - Version 1.0 - August 17th, 2003
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jetstream-api"
7
- version = "0.5.2"
7
+ version = "0.5.3"
8
8
  description = "Python client API for iLink M.O.M. (Message Oriented Middleware)"
9
9
  authors = [{name = "snowjeans"}]
10
10
  readme = "README.md"
File without changes
File without changes
File without changes