iris-devtester 1.9.1__py3-none-any.whl → 1.9.3__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.
@@ -26,7 +26,7 @@ LangChain Integration:
26
26
  ... # Build your RAG app...
27
27
  """
28
28
 
29
- __version__ = "1.9.1"
29
+ __version__ = "1.9.3"
30
30
  __author__ = "InterSystems Community"
31
31
  __license__ = "MIT"
32
32
 
@@ -31,6 +31,12 @@ def container_group(ctx):
31
31
  @click.option(
32
32
  "--config", type=click.Path(exists=True), help="Path to iris-config.yml configuration file"
33
33
  )
34
+ @click.option(
35
+ "--name",
36
+ type=str,
37
+ default=None,
38
+ help="Container name (default: iris_db)",
39
+ )
34
40
  @click.option(
35
41
  "--detach/--no-detach",
36
42
  default=True,
@@ -41,7 +47,7 @@ def container_group(ctx):
41
47
  )
42
48
  @click.option("--cpf", help="Path to CPF merge file or raw CPF content")
43
49
  @click.pass_context
44
- def up(ctx, config, detach, timeout, cpf):
50
+ def up(ctx, config, name, detach, timeout, cpf):
45
51
  """
46
52
  Create and start IRIS container from configuration.
47
53
 
@@ -58,6 +64,9 @@ def up(ctx, config, detach, timeout, cpf):
58
64
  # Zero-config (uses Community edition defaults)
59
65
  iris-devtester container up
60
66
 
67
+ # With custom container name
68
+ iris-devtester container up --name my-test-db
69
+
61
70
  # With custom configuration including volumes
62
71
  iris-devtester container up --config iris-config.yml
63
72
 
@@ -85,6 +94,11 @@ def up(ctx, config, detach, timeout, cpf):
85
94
  container_config = ContainerConfig.default()
86
95
  click.echo("⚡ Creating container from zero-config defaults")
87
96
 
97
+ # Override container name if provided via --name
98
+ if name:
99
+ container_config.container_name = name
100
+ click.echo(f" → Container name: {name}")
101
+
88
102
  if cpf:
89
103
  container_config.cpf_merge = cpf
90
104
  click.echo(f" → CPF Merge: {cpf[:50]}...")
@@ -95,6 +109,36 @@ def up(ctx, config, detach, timeout, cpf):
95
109
  if existing_container:
96
110
  # Container exists - check if running
97
111
  existing_container.reload()
112
+
113
+ # Warn if using default name and container already exists
114
+ # (user might be connecting to wrong container from different project)
115
+ if container_config.container_name == "iris_db" and not name:
116
+ existing_image = (
117
+ existing_container.image.tags[0] if existing_container.image.tags else "unknown"
118
+ )
119
+ click.echo("")
120
+ click.echo(
121
+ click.style(
122
+ "⚠️ WARNING: Using default container name 'iris_db'", fg="yellow", bold=True
123
+ )
124
+ )
125
+ click.echo(
126
+ click.style(
127
+ f" A container with this name already exists (image: {existing_image})",
128
+ fg="yellow",
129
+ )
130
+ )
131
+ click.echo(
132
+ click.style(
133
+ " If this is from a different project, use --name to avoid conflicts:",
134
+ fg="yellow",
135
+ )
136
+ )
137
+ click.echo(
138
+ click.style(" iris-devtester container up --name my-project-db", fg="cyan")
139
+ )
140
+ click.echo("")
141
+
98
142
  if existing_container.status == "running":
99
143
  click.echo(f"✓ Container '{container_config.container_name}' is already running")
100
144
 
@@ -808,9 +852,6 @@ def enable_callin(ctx, container_name, timeout):
808
852
  except (ImportError, ModuleNotFoundError) as e:
809
853
  progress.print_error(f"enable_callin utility not available: {e}")
810
854
  ctx.exit(1)
811
- except (click.exceptions.Exit, SystemExit, KeyboardInterrupt):
812
- # Let Click handle these - don't catch them
813
- raise
814
855
  except Exception as e:
815
856
  progress.print_error(f"Failed to enable CallIn: {e}")
816
857
  ctx.exit(1)
@@ -3,9 +3,9 @@
3
3
  import os
4
4
  import re
5
5
  from pathlib import Path
6
- from typing import List, Literal, Optional
6
+ from typing import List, Literal, Optional, Union
7
7
 
8
- from pydantic import BaseModel, Field, field_validator, model_validator
8
+ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
9
9
 
10
10
  from iris_devtester.config.yaml_loader import load_yaml
11
11
 
@@ -122,7 +122,7 @@ class ContainerConfig(BaseModel):
122
122
  return self
123
123
 
124
124
  @classmethod
125
- def from_yaml(cls, file_path: str | Path) -> "ContainerConfig":
125
+ def from_yaml(cls, file_path: Union[str, Path]) -> "ContainerConfig":
126
126
  """
127
127
  Load configuration from YAML file.
128
128
 
@@ -290,10 +290,8 @@ class ContainerConfig(BaseModel):
290
290
 
291
291
  return errors
292
292
 
293
- class Config:
294
- """Pydantic model configuration."""
295
-
296
- json_schema_extra = {
293
+ model_config = ConfigDict(
294
+ json_schema_extra={
297
295
  "example": {
298
296
  "edition": "community",
299
297
  "container_name": "iris_db",
@@ -306,3 +304,4 @@ class ContainerConfig(BaseModel):
306
304
  "image_tag": "latest",
307
305
  }
308
306
  }
307
+ )
@@ -3,9 +3,9 @@
3
3
  from datetime import datetime
4
4
  from enum import Enum
5
5
  from pathlib import Path
6
- from typing import Dict, Literal, Optional
6
+ from typing import Dict, Optional
7
7
 
8
- from pydantic import BaseModel, Field, field_validator
8
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
9
9
 
10
10
 
11
11
  class ContainerStatus(str, Enum):
@@ -304,10 +304,8 @@ class ContainerState(BaseModel):
304
304
  "config_source": str(self.config_source) if self.config_source else None,
305
305
  }
306
306
 
307
- class Config:
308
- """Pydantic model configuration."""
309
-
310
- json_schema_extra = {
307
+ model_config = ConfigDict(
308
+ json_schema_extra={
311
309
  "example": {
312
310
  "container_id": "a1b2c3d4e5f6" + "0" * 52, # 64 chars
313
311
  "container_name": "iris_db",
@@ -316,8 +314,9 @@ class ContainerState(BaseModel):
316
314
  "created_at": "2025-01-10T14:30:00Z",
317
315
  "started_at": "2025-01-10T14:30:15Z",
318
316
  "finished_at": None,
319
- "ports": {1972: 1972, 52773: 52773},
317
+ "ports": {"1972": 1972, "52773": 52773},
320
318
  "image": "intersystems/iris-community:latest",
321
319
  "config_source": None,
322
320
  }
323
321
  }
322
+ )
@@ -28,7 +28,7 @@ def load_yaml(file_path: Path) -> Dict[str, Any]:
28
28
  config = yaml.safe_load(f)
29
29
  if config is None:
30
30
  return {}
31
- return config
31
+ return dict(config)
32
32
  except yaml.YAMLError as e:
33
33
  raise yaml.YAMLError(f"Invalid YAML syntax in {file_path}: {e}")
34
34
 
@@ -52,8 +52,8 @@ def reset_password_if_needed(config_or_error, **kwargs):
52
52
  If first arg is a config, attempts remediation and returns result object.
53
53
  """
54
54
  from iris_devtester.testing.models import PasswordResetResult as ContractResult
55
- from iris_devtester.utils.password import reset_password_if_needed as modern_reset
56
55
  from iris_devtester.utils.password import PasswordResetResult as ModernResult
56
+ from iris_devtester.utils.password import reset_password_if_needed as modern_reset
57
57
 
58
58
  if isinstance(config_or_error, Exception):
59
59
  return modern_reset(config_or_error, **kwargs)
@@ -1,10 +1,9 @@
1
1
  import logging
2
- import os
3
2
  import subprocess
4
3
  import time
5
- from typing import Any, Dict, List, Literal, Optional, Tuple, Type, Union
4
+ from typing import Any, Optional
6
5
 
7
- from iris_devtester.config import IRISConfig, discover_config
6
+ from iris_devtester.config import IRISConfig
8
7
  from iris_devtester.connections import get_connection
9
8
 
10
9
  logger = logging.getLogger(__name__)
@@ -185,7 +184,7 @@ class IRISContainer(IRISBase):
185
184
  if is_enabled:
186
185
  self._callin_enabled = True
187
186
  return is_enabled
188
- except:
187
+ except Exception:
189
188
  return False
190
189
 
191
190
  def get_test_namespace(self, prefix: str = "TEST") -> str:
@@ -238,9 +237,7 @@ class IRISContainer(IRISBase):
238
237
  self.host = self.get_container_host_ip()
239
238
  self._mapped_port = int(self.get_exposed_port(1972)) # Use internal port to get mapping
240
239
  config.host = self.host
241
- config.port = (
242
- self._mapped_port
243
- ) # Config uses the host-mapped port for connections
240
+ config.port = self._mapped_port # Config uses the host-mapped port for connections
244
241
  except Exception:
245
242
  pass
246
243
  return config
@@ -7,7 +7,7 @@ Provides atomic file-based persistence with file locking for concurrent safety.
7
7
  import json
8
8
  from datetime import datetime
9
9
  from pathlib import Path
10
- from typing import List, Optional
10
+ from typing import List, Literal, Optional
11
11
 
12
12
  from filelock import FileLock, Timeout
13
13
 
@@ -89,7 +89,7 @@ class PortRegistry:
89
89
  # Manual port assignment
90
90
  self._validate_port_available(assignments, preferred_port, project_path)
91
91
  port = preferred_port
92
- assignment_type = "manual"
92
+ assignment_type: Literal["auto", "manual"] = "manual"
93
93
  else:
94
94
  # Auto-assignment
95
95
  port = self._find_available_port(assignments)
@@ -379,7 +379,7 @@ def enable_callin_service(container: Container) -> None:
379
379
  """
380
380
  # Execute ObjectScript to enable CallIn
381
381
  objectscript_cmd = (
382
- "iris session iris -U%SYS "
382
+ "iris session IRIS -U%SYS "
383
383
  '"Do ##class(Security.Services).Get("%Service_CallIn", .service) '
384
384
  "Set service.Enabled = 1 "
385
385
  'Do ##class(Security.Services).Modify("%Service_CallIn", .service)"'
@@ -572,7 +572,7 @@ Halt
572
572
  container_name,
573
573
  "sh",
574
574
  "-c",
575
- f'iris session iris -U %SYS << "EOF"\n{objectscript_commands}\nEOF',
575
+ f'iris session IRIS -U %SYS << "EOF"\n{objectscript_commands}\nEOF',
576
576
  ]
577
577
 
578
578
  logger.info(f"Unexpiring passwords in container: {container_name}")
@@ -626,7 +626,7 @@ Halt
626
626
  "\n"
627
627
  "Manual fix:\n"
628
628
  f" docker exec {container_name} bash -c 'echo \"do ##class(Security.Users)"
629
- f'.UnExpireUserPasswords(\\"*\\")" | iris session iris -U %SYS\'\n',
629
+ f'.UnExpireUserPasswords(\\"*\\")" | iris session IRIS -U %SYS\'\n',
630
630
  )
631
631
 
632
632
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris-devtester
3
- Version: 1.9.1
3
+ Version: 1.9.3
4
4
  Summary: Battle-tested InterSystems IRIS infrastructure utilities for Python development
5
5
  Author-email: InterSystems Community <community@intersystems.com>
6
6
  Maintainer-email: Thomas Dyar <thomas.dyar@intersystems.com>
@@ -107,6 +107,50 @@ def test_connection():
107
107
  assert cursor.fetchone()[0] == 1
108
108
  ```
109
109
 
110
+ ## Container API
111
+
112
+ ### Basic Usage
113
+ ```python
114
+ from iris_devtester.containers import IRISContainer
115
+
116
+ # Community Edition (auto-detects ARM64 vs x86)
117
+ with IRISContainer.community() as iris:
118
+ conn = iris.get_connection()
119
+
120
+ # Enterprise Edition (requires license)
121
+ with IRISContainer.enterprise(license_key="/path/to/iris.key") as iris:
122
+ conn = iris.get_connection()
123
+ ```
124
+
125
+ ### Builder Methods
126
+ ```python
127
+ # Set a custom container name (for debugging, logs, multiple containers)
128
+ iris = IRISContainer.community().with_name("my-test-db")
129
+
130
+ # Set credentials
131
+ iris = IRISContainer.community().with_credentials("_SYSTEM", "MyPassword")
132
+
133
+ # Pre-configure password (set via IRIS_PASSWORD env var at startup)
134
+ iris = IRISContainer.community().with_preconfigured_password("MyPassword")
135
+
136
+ # Chain multiple options
137
+ with IRISContainer.community() \
138
+ .with_name("integration-test-db") \
139
+ .with_credentials("_SYSTEM", "TestPass123") as iris:
140
+ conn = iris.get_connection()
141
+ ```
142
+
143
+ ### Constructor Parameters
144
+ ```python
145
+ IRISContainer(
146
+ image="intersystemsdc/iris-community:latest", # Docker image
147
+ username="SuperUser", # Default username
148
+ password="SYS", # Default password
149
+ namespace="USER", # Default namespace
150
+ name="my-container", # Container name (alternative to with_name)
151
+ )
152
+ ```
153
+
110
154
  ## Key Features
111
155
 
112
156
  - **🔐 Automatic Password Management**: Remediates security flags using official system APIs.
@@ -1,20 +1,20 @@
1
- iris_devtester/__init__.py,sha256=mpmoTVyFUXHzQWTZjATBla4cgWNl-s_34FIGo1ljoxY,1848
1
+ iris_devtester/__init__.py,sha256=HzbADwcjJamdWENJTE4FaervonOKGTfKdxU8VkG_kcM,1848
2
2
  iris_devtester/cli/__init__.py,sha256=yakDJH-EsnTBmKl_K7r2n47EDiWvfpwLVcY11KriQQQ,691
3
3
  iris_devtester/cli/__main__.py,sha256=YgFAn0Q02AXgXRwAg70MR3U0IIjFHUSz38h5tPFJnGg,125
4
4
  iris_devtester/cli/connection_commands.py,sha256=cabAufSsrrhwpxlPZFlsE-5Zi54176eGdJOApPLdZXA,11467
5
- iris_devtester/cli/container.py,sha256=TROSWehO02J8FNdUaoMooasCZUhox_jzi05z5RasS-8,29211
5
+ iris_devtester/cli/container.py,sha256=FcDb6EiSa8SYvzsntxu5j5q6PCh1jba7wosd_KUqe0U,30736
6
6
  iris_devtester/cli/container_commands.py,sha256=lOxa2TXnBK1ATCIzbbXexk-p0lItStUwU_gKVnv_p1w,4451
7
7
  iris_devtester/cli/fixture_commands.py,sha256=w1n6MIujQsY46ZKG_L0aRF4lhohWh5dOrF0lgH_K3r0,17493
8
8
  iris_devtester/config/__init__.py,sha256=acRVXpdKAp7lkZzrpKGnOYLgSfkxN3kpL1RU0b0hhlM,486
9
9
  iris_devtester/config/auto_discovery.py,sha256=y1BD26rfEut1vjw77IXh0yel95BaUvMfMxzskIPPQec,10638
10
- iris_devtester/config/container_config.py,sha256=oO44vKUImSXbSj9X1ka4g2gRJLyRqLv6mv7HVYzCU8w,10928
11
- iris_devtester/config/container_state.py,sha256=qIgSNQlpM6z417drSICbPfCWEvtb-L3YoB6JvkPl4T4,11239
10
+ iris_devtester/config/container_config.py,sha256=UNtgjfWlO517KzH0upwpx1xBWpyvhXIZQmxRQ-OKLNI,10925
11
+ iris_devtester/config/container_state.py,sha256=O2i69oVj_B1NQRZqmPKPdjmYwonhPD0QLe1UZmGupI4,11218
12
12
  iris_devtester/config/defaults.py,sha256=RgQal0IeDr215KIy6ZToDrsOdV4DwVJvMJE2SgAzVA4,1846
13
13
  iris_devtester/config/discovery.py,sha256=7R64ykibns6N2W9hNZlg_8CQqpNwiWSITl6G72VnNws,5879
14
14
  iris_devtester/config/models.py,sha256=aa2kd8t_UNawiA2BbU8GHlhVhVjqvEwLEmE75tewOo4,2706
15
15
  iris_devtester/config/presets.py,sha256=yXRiSfOUtUUUDQTW1wx-BHrUDzXhjYTCF8iiJ4kwyrU,453
16
- iris_devtester/config/yaml_loader.py,sha256=WF48AYDiuAMrI2XJpNkqfURvr3figvNcCrNInmvw0lI,1314
17
- iris_devtester/connections/__init__.py,sha256=sc2YFupRKBLUdiK3NFj3yhAsn5UfOABOvWRLvIJ2Xms,6018
16
+ iris_devtester/config/yaml_loader.py,sha256=3OahoOeLtRtBAxo3pH0-a1RUdXwFB5wc2_jtF2WielQ,1320
17
+ iris_devtester/connections/__init__.py,sha256=0ci2QuyQPJxdtoJzeyd8CSw_0I4C9MB6UnsVzztdh5U,6018
18
18
  iris_devtester/connections/auto_discovery.py,sha256=LCLdP90w7hfJrNj2oe6ueiSdmMDR5IdjztJ1wn9pvQc,5197
19
19
  iris_devtester/connections/connection.py,sha256=4QPV_D4kNCw61qg7XT9rgJOYxu5ZmOcw2km8LiuQ2Nc,5536
20
20
  iris_devtester/connections/dbapi.py,sha256=NmXwrgvfnN6K3051XenNFaqcbAipBNBvh7y3O2C4XUM,4767
@@ -24,7 +24,7 @@ iris_devtester/connections/models.py,sha256=rfKCFtm86wQZAv_cLOVS6N7P5vGlfkInSHbs
24
24
  iris_devtester/connections/retry.py,sha256=FxNhlTA2RHI2ayvEF5w7P_EjO7k6xKgeA3mplJd3-co,2893
25
25
  iris_devtester/containers/__init__.py,sha256=quWN4CtxRUMje8QkpZWMY79XlVOSM79HF5ewHLNz5YA,729
26
26
  iris_devtester/containers/cpf_manager.py,sha256=GBkuM5mPw85lo7djINlTNkrQ8bGgRe2QEWv7YQQL6KU,1969
27
- iris_devtester/containers/iris_container.py,sha256=2SEdxJ2-Sx0QqbZGCLnUvzjWtPfRh84uk-fvtsrQjaA,11173
27
+ iris_devtester/containers/iris_container.py,sha256=GA9fgcjU0nLJnSP-PnZDWVMZcwOR7s45ZHK5pNxgYok,11083
28
28
  iris_devtester/containers/models.py,sha256=f66fwQjlmw1Sl4M33QlglCv4ewNtk4TJLXXcmhNsbDA,13693
29
29
  iris_devtester/containers/monitor_utils.py,sha256=cCsLp1cZYAbMmj7o6tUYhVurMEE7GOOe9Y5FLAxl6hM,4917
30
30
  iris_devtester/containers/monitoring.py,sha256=E4v-5VW-_W7CVSRm_ryzpOfLQgP9NZ6WN7GYglsAFro,41172
@@ -42,7 +42,7 @@ iris_devtester/integrations/langchain.py,sha256=cIV8bq_wDKMOXLFQ1P-wdSFsJdxIV7o0
42
42
  iris_devtester/ports/__init__.py,sha256=uLdbV7J7UJxJsoDqoyySTabIle72WltYDFKlN2-f7bI,506
43
43
  iris_devtester/ports/assignment.py,sha256=7ayWfeqLfHDICLAmr3LaJAGs8Uz-Ehm3dHX-V44Frj0,1954
44
44
  iris_devtester/ports/exceptions.py,sha256=mJLJAeZUmiBAfv0ubr6nh0K1iK-uk4bAX1gupyw5lzg,4967
45
- iris_devtester/ports/registry.py,sha256=f-UT2NyN2dNan9-5DfIlL-xRpBE_6w8KQKMCeHPXQeU,12880
45
+ iris_devtester/ports/registry.py,sha256=vf-vlPKNJCPGCCijz_ioioO5qjjMII2WndUlfDkgyxc,12916
46
46
  iris_devtester/testing/__init__.py,sha256=VD02sIjDQ1HUFIRFrd1vQUwoExE2yRkeFJ1Goz4cCDs,1559
47
47
  iris_devtester/testing/fixtures.py,sha256=Rh7NFlhKrGWy0YOHP1Bwyj1-E_99OJz5-TcG-3BhI6w,1139
48
48
  iris_devtester/testing/helpers.py,sha256=fLJbs7A5Ay_TQ7sMimdtOpKONN4AdnFEzEhOsR28iBs,5021
@@ -53,14 +53,14 @@ iris_devtester/utils/container_port.py,sha256=BWz1f9DXJRavcH_FC1jY2mo3isb8lg_zB4
53
53
  iris_devtester/utils/container_status.py,sha256=WTpKp1aq4R72lGcn8qvoB_h6GxB-zRdBWwqwO57C5Gg,6309
54
54
  iris_devtester/utils/dbapi_compat.py,sha256=pYy8w8XA4syAI-dNeENCKv496BETyn_IsvpJpedMPDE,11782
55
55
  iris_devtester/utils/enable_callin.py,sha256=DtDd3fJUz41Z73IUWycchrd6DdO6O0gvxthuuGIUfRo,7874
56
- iris_devtester/utils/health_checks.py,sha256=fpvyomBSYfVGb2kzG_BUJ407G0HgfA_v-gyI_eOX9ag,17844
56
+ iris_devtester/utils/health_checks.py,sha256=FF5NK1DiwI7Ymkb6bWJTaXEam2EZzFHg4FwWZnBqQb8,17844
57
57
  iris_devtester/utils/iris_container_adapter.py,sha256=0Vc55gDsVAxHZzk4wvZySGUJKRhFoDh5wM7RUMSLiCI,23239
58
- iris_devtester/utils/password.py,sha256=CAa3QHFS_85g_F7GCv-UGYlWaymmidhD82YSf-vqqf0,21968
58
+ iris_devtester/utils/password.py,sha256=OqS6LNXMDopSoYGiodM2V9clghD4qcbIzftH4TdrMSU,21968
59
59
  iris_devtester/utils/progress.py,sha256=5OmuntItqCgUFXSmaQjHwILrTnVLYECZ5glpSbvOTOU,7795
60
60
  iris_devtester/utils/test_connection.py,sha256=cyEzxSbvxBxz44xLb7Jbz8OhHT8UgCZLO0lT-qShPEo,6950
61
- iris_devtester-1.9.1.dist-info/licenses/LICENSE,sha256=dISbikDYS2uP710ZFzSzaSmKzIBRyi_6YwuwO97bT94,1083
62
- iris_devtester-1.9.1.dist-info/METADATA,sha256=7MFPQyrdcoz0vMcx69Sow8Br7v1fwVx6x6bfehqJPYw,6286
63
- iris_devtester-1.9.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
64
- iris_devtester-1.9.1.dist-info/entry_points.txt,sha256=svOltni3vX3ul_qxbWl8fOA6ZrJeFASuN29pON6ftqw,59
65
- iris_devtester-1.9.1.dist-info/top_level.txt,sha256=DnrLJ3laB5x_gTkmATDEg1v1lTOQxgmHgNd66bdXaoU,15
66
- iris_devtester-1.9.1.dist-info/RECORD,,
61
+ iris_devtester-1.9.3.dist-info/licenses/LICENSE,sha256=dISbikDYS2uP710ZFzSzaSmKzIBRyi_6YwuwO97bT94,1083
62
+ iris_devtester-1.9.3.dist-info/METADATA,sha256=It5jOKAoyNkbBiyaYQw3kO5TFRog3I9lKeQl2f0eTIo,7682
63
+ iris_devtester-1.9.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
64
+ iris_devtester-1.9.3.dist-info/entry_points.txt,sha256=svOltni3vX3ul_qxbWl8fOA6ZrJeFASuN29pON6ftqw,59
65
+ iris_devtester-1.9.3.dist-info/top_level.txt,sha256=DnrLJ3laB5x_gTkmATDEg1v1lTOQxgmHgNd66bdXaoU,15
66
+ iris_devtester-1.9.3.dist-info/RECORD,,