jetstream-api 0.5.1__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.1 → jetstream_api-0.5.3}/PKG-INFO +1 -1
  2. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/__init__.py +1 -1
  3. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/admin.py +14 -6
  4. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/properties.py +299 -31
  5. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/jetstream_api.egg-info/PKG-INFO +1 -1
  6. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/pyproject.toml +1 -1
  7. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/LICENSE.txt +0 -0
  8. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/README.md +0 -0
  9. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/admintopic.py +0 -0
  10. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/common.py +0 -0
  11. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/connectivity.py +0 -0
  12. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/exception.py +0 -0
  13. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/msg.py +0 -0
  14. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/pattern.py +0 -0
  15. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/producer.py +0 -0
  16. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/py.typed +0 -0
  17. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/qmgr.py +0 -0
  18. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/topic.py +0 -0
  19. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/ilink/util.py +0 -0
  20. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/jetstream_api.egg-info/SOURCES.txt +0 -0
  21. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/jetstream_api.egg-info/dependency_links.txt +0 -0
  22. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/jetstream_api.egg-info/requires.txt +0 -0
  23. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/jetstream_api.egg-info/top_level.txt +0 -0
  24. {jetstream_api-0.5.1 → jetstream_api-0.5.3}/setup.cfg +0 -0
  25. {jetstream_api-0.5.1 → 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.1
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.1"
3
+ __version__ = "0.5.3"
4
4
 
5
5
  # --- Admin / Service ---
6
6
  from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
@@ -6278,7 +6278,10 @@ class ILLogBrowser:
6278
6278
  self.service = service
6279
6279
 
6280
6280
  def __del__(self) -> None:
6281
- if self.browserId:
6281
+ # 생성자가 중간에 실패하면 속성이 없을 수 있다. __del__ 에서 난 예외는
6282
+ # 파이썬이 삼키고 stderr 로만 찍으므로, 동작에는 문제가 없어도 로그가
6283
+ # 지저분해진다 - getattr 로 방어한다.
6284
+ if getattr(self, "browserId", None) and getattr(self, "service", None):
6282
6285
  self.close()
6283
6286
 
6284
6287
  def close(self) -> None:
@@ -6289,10 +6292,11 @@ class ILLogBrowser:
6289
6292
  Note:
6290
6293
  닫지 않으면 서버에 커서가 남는다. ``try/finally`` 로 반드시 닫아라.
6291
6294
  """
6292
- if not self.service.isOnline():
6295
+ service = getattr(self, "service", None)
6296
+ if service is None or not service.isOnline():
6293
6297
  return
6294
6298
  try:
6295
- self.service.request(
6299
+ service.request(
6296
6300
  ILC.MIMQ_BROWSER_DELETION,
6297
6301
  ILC.MIMQ_SUCCESSFUL_BROWSER_DELETION,
6298
6302
  self.browserId,
@@ -6388,7 +6392,10 @@ class ILQueueBrowser:
6388
6392
  self.closed = False
6389
6393
 
6390
6394
  def __del__(self) -> None:
6391
- if self.browserId:
6395
+ # 생성자가 중간에 실패하면 속성이 없을 수 있다. __del__ 에서 난 예외는
6396
+ # 파이썬이 삼키고 stderr 로만 찍으므로, 동작에는 문제가 없어도 로그가
6397
+ # 지저분해진다 - getattr 로 방어한다.
6398
+ if getattr(self, "browserId", None) and getattr(self, "service", None):
6392
6399
  self.close()
6393
6400
 
6394
6401
  def close(self) -> None:
@@ -6399,10 +6406,11 @@ class ILQueueBrowser:
6399
6406
  Note:
6400
6407
  닫지 않으면 서버에 커서가 남는다. ``try/finally`` 로 반드시 닫아라.
6401
6408
  """
6402
- if not self.service.isOnline() or self.closed:
6409
+ service = getattr(self, "service", None)
6410
+ if service is None or not service.isOnline() or getattr(self, "closed", True):
6403
6411
  return
6404
6412
  try:
6405
- self.service.request(
6413
+ service.request(
6406
6414
  self.qmgrName,
6407
6415
  ILC.MIMQ_BROWSER_DELETION,
6408
6416
  ILC.MIMQ_SUCCESSFUL_BROWSER_DELETION,
@@ -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,
@@ -1435,14 +1555,16 @@ class ILChannelProperty(_AutoAccessor):
1435
1555
  """연결 타임아웃을 설정한다.
1436
1556
 
1437
1557
  Args:
1438
- sec (int): 타임아웃(**초**). ``-1`` 이면 무제한.
1558
+ sec (int): 타임아웃(**초**). ``-1`` 이면 무제한, 그 밖에는 **1 이상**.
1559
+ ``0`` 은 거부된다.
1439
1560
 
1440
1561
  Raises:
1441
- UnsupportedOperationException: ``-1`` 미만일 때.
1562
+ UnsupportedOperationException: ``-1`` 도 아니고 1 미만일 때.
1442
1563
  """
1443
- if sec < -1:
1564
+ if sec != -1 and sec < 1:
1444
1565
  raise UnsupportedOperationException(
1445
- f"[{sec}] is an unacceptable value. (acceptable value range: -1~)"
1566
+ f"[{sec}] is an unacceptable value."
1567
+ " (acceptable value range: -1 for infinite, or 1 or greater)"
1446
1568
  )
1447
1569
  self.timeout = sec
1448
1570
 
@@ -2366,6 +2488,37 @@ class ILQmgrProperty(_AutoAccessor):
2366
2488
  서버가 채우는 읽기 전용 값이다.
2367
2489
  """
2368
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
+
2369
2522
  def __init__(
2370
2523
  self,
2371
2524
  name: str | bytes | bytearray | None = None,
@@ -2770,14 +2923,16 @@ class ILQmgrProperty(_AutoAccessor):
2770
2923
  :data:`ILC.MIMQ_LOGGER_TYPE_CLIENT`(1) /
2771
2924
  :data:`ILC.MIMQ_LOGGER_TYPE_QUEUE`(2) /
2772
2925
  :data:`ILC.MIMQ_LOGGER_TYPE_CHANNEL`(3).
2773
- value (int): 회전 크기(바이트). **1048576(1MB) 이상**이어야 한다.
2926
+ value (int): 회전 크기(바이트). **1048576(1MB) ~ 104857600(100MB)**
2927
+ 이어야 한다.
2774
2928
 
2775
2929
  Raises:
2776
- UnsupportedOperationException: 1048576 미만이거나 종류가 잘못됐을 때.
2930
+ UnsupportedOperationException: 범위를 벗어나거나 종류가 잘못됐을 때.
2777
2931
  """
2778
- if value < 1048576:
2932
+ if value < 1048576 or value > 104857600:
2779
2933
  raise UnsupportedOperationException(
2780
- f"[{value}] is an unacceptable value. (acceptable value range: 1048576~)"
2934
+ f"[{value}] is an unacceptable value."
2935
+ " (acceptable value range: 1048576~104857600)"
2781
2936
  )
2782
2937
  setattr(self, "logFileSize" + self._log_suffix(logger_type), value)
2783
2938
 
@@ -2804,17 +2959,44 @@ class ILQmgrProperty(_AutoAccessor):
2804
2959
  :data:`ILC.MIMQ_LOGGER_TYPE_CLIENT`(1) /
2805
2960
  :data:`ILC.MIMQ_LOGGER_TYPE_QUEUE`(2) /
2806
2961
  :data:`ILC.MIMQ_LOGGER_TYPE_CHANNEL`(3).
2807
- value (int): 보관 개수. **1 이상**이어야 한다.
2962
+ value (int): 보관 개수. **1~999** 여야 한다.
2808
2963
 
2809
2964
  Raises:
2810
- UnsupportedOperationException: 1 미만이거나 종류가 잘못됐을 때.
2965
+ UnsupportedOperationException: 범위를 벗어나거나 종류가 잘못됐을 때.
2811
2966
  """
2812
- if value < 1:
2967
+ if value < 1 or value > 999:
2813
2968
  raise UnsupportedOperationException(
2814
- f"[{value}] is an unacceptable value. (acceptable value range: 1~)"
2969
+ f"[{value}] is an unacceptable value. (acceptable value range: 1~999)"
2815
2970
  )
2816
2971
  setattr(self, "logFileCount" + self._log_suffix(logger_type), value)
2817
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)
2818
3000
  def get_log_level_system_string(self) -> str:
2819
3001
  """시스템 로그 레벨을 문자열로 돌려준다.
2820
3002
 
@@ -3416,6 +3598,22 @@ class ILServiceProperty(_AutoAccessor):
3416
3598
  스펙: 기본 5 · 범위 1~999 · 단위 개 · 변경 가능/재기동 불필요.
3417
3599
  """
3418
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
+
3419
3617
  def __init__(self, ba: bytes | bytearray | None = None) -> None:
3420
3618
  """서비스 속성 객체를 만든다.
3421
3619
 
@@ -3622,14 +3820,15 @@ class ILServiceProperty(_AutoAccessor):
3622
3820
  """소켓 송신 타임아웃을 설정한다.
3623
3821
 
3624
3822
  Args:
3625
- sec (int): 타임아웃(**초**). ``-1`` 이면 무제한.
3823
+ sec (int): 타임아웃(**초**). **1~864000**.
3824
+ 엔진 rev 3283(TMOGUARD-1) 부터 ``-1``(무제한)과 ``0`` 은 거부된다.
3626
3825
 
3627
3826
  Raises:
3628
- UnsupportedOperationException: ``-1`` 미만일 때.
3827
+ UnsupportedOperationException: 1~864000 을 벗어날 때.
3629
3828
  """
3630
- if sec < -1:
3829
+ if sec < 1 or sec > 864000:
3631
3830
  raise UnsupportedOperationException(
3632
- f"[{sec}] is an unacceptable value. (acceptable value range: -1~)"
3831
+ f"[{sec}] is an unacceptable value. (acceptable value range: 1~864000)"
3633
3832
  )
3634
3833
  self.timeoutSocketSend = sec
3635
3834
 
@@ -3637,14 +3836,15 @@ class ILServiceProperty(_AutoAccessor):
3637
3836
  """소켓 수신 타임아웃을 설정한다.
3638
3837
 
3639
3838
  Args:
3640
- sec (int): 타임아웃(**초**). ``-1`` 이면 무제한.
3839
+ sec (int): 타임아웃(**초**). **1~864000**.
3840
+ 엔진 rev 3283(TMOGUARD-1) 부터 ``-1``(무제한)과 ``0`` 은 거부된다.
3641
3841
 
3642
3842
  Raises:
3643
- UnsupportedOperationException: ``-1`` 미만일 때.
3843
+ UnsupportedOperationException: 1~864000 을 벗어날 때.
3644
3844
  """
3645
- if sec < -1:
3845
+ if sec < 1 or sec > 864000:
3646
3846
  raise UnsupportedOperationException(
3647
- f"[{sec}] is an unacceptable value. (acceptable value range: -1~)"
3847
+ f"[{sec}] is an unacceptable value. (acceptable value range: 1~864000)"
3648
3848
  )
3649
3849
  self.timeoutSocketRecv = sec
3650
3850
 
@@ -3709,14 +3909,16 @@ class ILServiceProperty(_AutoAccessor):
3709
3909
  Args:
3710
3910
  logger_type (int): 로거 종류. :data:`ILC.MIMQ_LOGGER_TYPE_SYSTEM`(0) 또는
3711
3911
  :data:`ILC.MIMQ_LOGGER_TYPE_CLIENT`(1). 서비스는 이 둘뿐이다.
3712
- value (int): 회전 크기(바이트). **1048576(1MB) 이상**이어야 한다.
3912
+ value (int): 회전 크기(바이트). **1048576(1MB) ~ 104857600(100MB)**
3913
+ 이어야 한다.
3713
3914
 
3714
3915
  Raises:
3715
- UnsupportedOperationException: 1048576 미만이거나 종류가 잘못됐을 때.
3916
+ UnsupportedOperationException: 범위를 벗어나거나 종류가 잘못됐을 때.
3716
3917
  """
3717
- if value < 1048576:
3918
+ if value < 1048576 or value > 104857600:
3718
3919
  raise UnsupportedOperationException(
3719
- f"[{value}] is an unacceptable value. (acceptable value range: 1048576~)"
3920
+ f"[{value}] is an unacceptable value."
3921
+ " (acceptable value range: 1048576~104857600)"
3720
3922
  )
3721
3923
  setattr(self, "logFileSize" + self._log_suffix(logger_type), value)
3722
3924
 
@@ -3739,17 +3941,44 @@ class ILServiceProperty(_AutoAccessor):
3739
3941
  Args:
3740
3942
  logger_type (int): 로거 종류. :data:`ILC.MIMQ_LOGGER_TYPE_SYSTEM`(0) 또는
3741
3943
  :data:`ILC.MIMQ_LOGGER_TYPE_CLIENT`(1). 서비스는 이 둘뿐이다.
3742
- value (int): 보관 개수. **1 이상**이어야 한다.
3944
+ value (int): 보관 개수. **1~999** 여야 한다.
3743
3945
 
3744
3946
  Raises:
3745
- UnsupportedOperationException: 1 미만이거나 종류가 잘못됐을 때.
3947
+ UnsupportedOperationException: 범위를 벗어나거나 종류가 잘못됐을 때.
3746
3948
  """
3747
- if value < 1:
3949
+ if value < 1 or value > 999:
3748
3950
  raise UnsupportedOperationException(
3749
- f"[{value}] is an unacceptable value. (acceptable value range: 1~)"
3951
+ f"[{value}] is an unacceptable value. (acceptable value range: 1~999)"
3750
3952
  )
3751
3953
  setattr(self, "logFileCount" + self._log_suffix(logger_type), value)
3752
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)
3753
3982
  def get_log_level_system_string(self) -> str:
3754
3983
  """시스템 로그 레벨을 문자열로 돌려준다.
3755
3984
 
@@ -3860,6 +4089,15 @@ class ILProxyProperty(_AutoAccessor):
3860
4089
  스펙: 기본 F · 범위 T | F · 변경 불가.
3861
4090
  """
3862
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
+
3863
4101
  def __init__(self, ba: bytes | bytearray | None = None) -> None:
3864
4102
  """프록시 속성 객체를 만든다.
3865
4103
 
@@ -4026,6 +4264,16 @@ class ILDiskGuardProperty(_AutoAccessor):
4026
4264
  스펙: 기본 10 · 범위 1~3600 · 단위 초 · 변경 가능/재기동 불필요.
4027
4265
  """
4028
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
+
4029
4277
  def __init__(self, csv: str | None = None) -> None:
4030
4278
  """디스크 가드 설정 객체를 만든다.
4031
4279
 
@@ -4257,6 +4505,14 @@ class ILClusterNode(_AutoAccessor):
4257
4505
  스펙: 기본 "" · 범위 47바이트 이하 문자열 (빈 값 금지, rev 3319+) · 변경 가능/클러스터 정지 필요.
4258
4506
  """
4259
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
+
4260
4516
  def __init__(self, ba: bytes | bytearray | None = None,
4261
4517
  qmgr_name: str = "", host: str = "", port: int = 0) -> None:
4262
4518
  """클러스터 노드 객체를 만든다.
@@ -4471,6 +4727,18 @@ class ILClusterProperty(_AutoAccessor):
4471
4727
  항목마다 자기 길이만큼 커서를 전진시켜 파싱한다.
4472
4728
  """
4473
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
+
4474
4742
  def __init__(self, ba: bytes | bytearray | None = None,
4475
4743
  name: str = "", ilcc_port: int = 0,
4476
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.1
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.1"
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