psr-factory 4.1.0b12__py3-none-win_amd64.whl → 5.0.0b2__py3-none-win_amd64.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.
psr/cloud/aws.py ADDED
@@ -0,0 +1,256 @@
1
+ import os
2
+ import tempfile
3
+ import zipfile
4
+ from typing import Dict, List, Optional
5
+
6
+ import boto3
7
+ from botocore.exceptions import ClientError
8
+
9
+
10
+ def _get_region(url):
11
+ """Extract the region from the S3 URL."""
12
+ if url:
13
+ parts = url.split(".")
14
+ return parts[0]
15
+ return None
16
+
17
+
18
+ def upload_file_to_s3(
19
+ s3_client, bucket_name, file_path, object_name=None, extra_args=None
20
+ ):
21
+ """Upload a file to an S3 bucket using a provided S3 client.
22
+
23
+ :param s3_client: Initialized S3 client.
24
+ :param bucket_name: Name of the S3 bucket.
25
+ :param file_path: Path to the file to upload.
26
+ :param object_name: S3 object name. If not specified, file_path's basename is used.
27
+ :param extra_args: A dictionary of extra arguments to pass to S3's upload_file.
28
+ :return: True if file was uploaded, else False.
29
+ """
30
+ if object_name is None:
31
+ object_name = os.path.basename(file_path)
32
+
33
+ try:
34
+ s3_client.upload_file(file_path, bucket_name, object_name, ExtraArgs=extra_args)
35
+ return True
36
+ except ClientError as e:
37
+ print(f"Error uploading file: {e}")
38
+ return False
39
+
40
+
41
+ def upload_case_to_s3(
42
+ files: List[str],
43
+ repository_id: str,
44
+ cluster_name: str,
45
+ checksums: Optional[Dict[str, str]] = None,
46
+ access: Optional[str] = None,
47
+ secret: Optional[str] = None,
48
+ session_token: Optional[str] = None,
49
+ bucket_name: Optional[str] = None,
50
+ url: Optional[str] = None,
51
+ zip_compress: bool = False,
52
+ compress_zip_name: str = None,
53
+ ):
54
+ """Upload files to an S3 bucket."""
55
+
56
+ region = _get_region(url)
57
+
58
+ if not region or not access or not secret or not session_token or not bucket_name:
59
+ raise ValueError("Unable to set up AWS connection.")
60
+
61
+ s3_client = boto3.client(
62
+ "s3",
63
+ aws_access_key_id=access,
64
+ aws_secret_access_key=secret,
65
+ aws_session_token=session_token,
66
+ region_name=region,
67
+ )
68
+
69
+ # Base metadata, common for both zip and individual files
70
+ base_metadata: Dict[str, str] = {
71
+ "upload": str(True).lower(),
72
+ "user-agent": "aws-fsx-lustre",
73
+ "file-owner": "537",
74
+ "file-group": "500",
75
+ "file-permissions": "100777",
76
+ }
77
+
78
+ if zip_compress and not compress_zip_name:
79
+ compress_zip_name = str(repository_id)
80
+
81
+ if zip_compress:
82
+ # Create a temporary zip file
83
+ with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as tmp_zip_file:
84
+ zip_path = tmp_zip_file.name
85
+ tmp_zip_file.close() # Close the file handle so zipfile can open it
86
+
87
+ try:
88
+ with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zipf:
89
+ for file_path in files:
90
+ # Add file to zip, using only the basename inside the zip
91
+ zipf.write(file_path, arcname=os.path.basename(file_path))
92
+
93
+ # Construct object name for the zip file
94
+ object_name = f"{repository_id}/uploaded/{compress_zip_name}.zip"
95
+
96
+ # For zip files, we use the base metadata without a specific checksum
97
+ # (as checksums are per-file in the original design)
98
+ extra_args = {
99
+ "Metadata": base_metadata.copy()
100
+ } # Use a copy to avoid modifying base_metadata
101
+
102
+ if not upload_file_to_s3(
103
+ s3_client, bucket_name, zip_path, object_name, extra_args=extra_args
104
+ ):
105
+ raise ValueError(
106
+ f"Failed to upload zip file {zip_path} to S3 bucket {bucket_name}."
107
+ )
108
+
109
+ finally:
110
+ # Clean up the temporary zip file
111
+ if os.path.exists(zip_path):
112
+ os.unlink(zip_path)
113
+
114
+ else:
115
+ # Original logic: upload files individually
116
+ for file_path in files:
117
+ file_basename = os.path.basename(file_path)
118
+ object_name = f"{repository_id}/uploaded/{file_basename}"
119
+
120
+ current_file_metadata = base_metadata.copy()
121
+ if checksums:
122
+ current_file_metadata["checksum"] = checksums.get(file_basename, "")
123
+
124
+ extra_args = {"Metadata": current_file_metadata}
125
+
126
+ if not upload_file_to_s3(
127
+ s3_client, bucket_name, file_path, object_name, extra_args=extra_args
128
+ ):
129
+ raise ValueError(
130
+ f"Failed to upload file {file_path} to S3 bucket {bucket_name}."
131
+ )
132
+
133
+ # Always upload .metadata files if the source 'files' list is provided
134
+ if files:
135
+ # Assuming all files in the 'files' list share the same parent directory,
136
+ # which is the case data directory.
137
+ data_directory = os.path.dirname(files[0])
138
+ metadata_dir_local_path = os.path.join(data_directory, ".metadata")
139
+
140
+ if os.path.isdir(metadata_dir_local_path):
141
+ # Iterate through the original list of files to find corresponding metadata files
142
+ for original_file_path in files:
143
+ original_file_basename = os.path.basename(original_file_path)
144
+ local_metadata_file_path = os.path.join(
145
+ metadata_dir_local_path, original_file_basename
146
+ )
147
+
148
+ if os.path.isfile(local_metadata_file_path):
149
+ # S3 object name for the metadata file (e.g., repository_id/.metadata/original_file_basename)
150
+ s3_metadata_object_name = (
151
+ f"{repository_id}/.metadata/{original_file_basename}"
152
+ )
153
+ extra_args = {"Metadata": base_metadata.copy()}
154
+ if not upload_file_to_s3(
155
+ s3_client,
156
+ bucket_name,
157
+ local_metadata_file_path,
158
+ s3_metadata_object_name,
159
+ extra_args=extra_args,
160
+ ):
161
+ raise ValueError(
162
+ f"Failed to upload metadata file {local_metadata_file_path} to S3 bucket {bucket_name}."
163
+ )
164
+
165
+
166
+ def _download_s3_object(
167
+ s3_client, bucket_name: str, s3_object_key: str, local_file_path: str
168
+ ) -> bool:
169
+ """
170
+ Downloads a single object from S3 to a local file path.
171
+
172
+ :param s3_client: Initialized S3 client.
173
+ :param bucket_name: Name of the S3 bucket.
174
+ :param s3_object_key: The key of the object in S3.
175
+ :param local_file_path: The local path where the file should be saved.
176
+ :return: True if download was successful, False otherwise.
177
+ """
178
+
179
+ try:
180
+ s3_client.download_file(bucket_name, s3_object_key, local_file_path)
181
+ return True
182
+ except ClientError as e:
183
+ print(f"ERROR: Failed to download {s3_object_key} from S3: {e}")
184
+ return False
185
+
186
+
187
+ def download_case_from_s3(
188
+ repository_id: str,
189
+ cluster_name: str, # Kept for consistency with caller, though not used directly in S3 ops
190
+ access: str,
191
+ secret: str,
192
+ session_token: str,
193
+ bucket_name: str,
194
+ url: str, # S3 endpoint URL, used by _get_region
195
+ output_path: str,
196
+ file_list: List[str],
197
+ ) -> List[str]:
198
+ """
199
+ Downloads files from an S3 bucket for a given case repository.
200
+
201
+ It iterates through the provided `file_list`, downloads each specified file
202
+ from the S3 path `{repository_id}/{file_in_list}`, preserving its relative path
203
+ under `output_path`. It then checks if each downloaded file is gzipped,
204
+ decompresses it if necessary, and returns a list of basenames of the
205
+ final downloaded (and potentially decompressed) files.
206
+
207
+ :param repository_id: The ID of the repository in S3.
208
+ :param cluster_name: Name of the cluster (for context, not used in S3 calls).
209
+ :param access: AWS access key ID.
210
+ :param secret: AWS secret access key.
211
+ :param session_token: AWS session token.
212
+ :param bucket_name: Name of the S3 bucket.
213
+ :param url: S3 service URL (used to determine region via _get_region).
214
+ :param output_path: Local directory where files will be downloaded.
215
+ :param file_list: A list of file names (basenames) to be downloaded.
216
+ :return: A list of basenames of the downloaded (and decompressed) files.
217
+ :raises ValueError: If S3 connection parameters are missing or filter is invalid.
218
+ :raises RuntimeError: If S3 operations fail.
219
+ """
220
+ region = _get_region(url)
221
+ if not all([region, access, secret, session_token, bucket_name]):
222
+ # TODO: Replace print with proper logging
223
+ print(
224
+ "ERROR: Missing S3 connection parameters (region, access, secret, token, or bucket name)."
225
+ )
226
+ raise ValueError("Missing S3 connection parameters.")
227
+
228
+ s3_client = boto3.client(
229
+ "s3",
230
+ aws_access_key_id=access,
231
+ aws_secret_access_key=secret,
232
+ aws_session_token=session_token,
233
+ region_name=region,
234
+ )
235
+
236
+ downloaded_files: List[str] = []
237
+
238
+ try:
239
+ for file_name in file_list:
240
+ # Construct the full S3 object key
241
+ s3_object_key = f"{repository_id}/{file_name}"
242
+
243
+ local_file_path = os.path.join(output_path, file_name)
244
+ if _download_s3_object(
245
+ s3_client, bucket_name, s3_object_key, local_file_path
246
+ ):
247
+ downloaded_files.append(os.path.basename(local_file_path))
248
+
249
+ except ClientError as e:
250
+ print(f"ERROR: S3 ClientError during download: {e}")
251
+ raise RuntimeError(f"Failed to download files from S3: {e}")
252
+ except Exception as e:
253
+ print(f"ERROR: An unexpected error occurred during download: {e}")
254
+ raise RuntimeError(f"An unexpected error occurred during S3 download: {e}")
255
+
256
+ return downloaded_files
psr/cloud/cloud.py CHANGED
@@ -100,7 +100,7 @@ _CONSOLE_REL_PARENT_PATH = r"Oper\Console"
100
100
 
101
101
  _CONSOLE_APP = r"FakeConsole.exe"
102
102
 
103
- _ALLOWED_PROGRAMS = ["SDDP", "OPTGEN", "PSRIO", "GRAF", "MyModel"]
103
+ _ALLOWED_PROGRAMS = ["SDDP", "OPTGEN", "PSRIO", "GRAF", "MyModel", "GNoMo"]
104
104
 
105
105
  if os.name == "nt":
106
106
  _PSRCLOUD_CREDENTIALS_PATH = os.path.expandvars(
@@ -462,6 +462,7 @@ class Client:
462
462
  return selection
463
463
 
464
464
  program_versions = self.get_program_versions(case.program)
465
+ case.program_version_name = case.program_version
465
466
  case.program_version = validate_selection(
466
467
  case.program_version, program_versions, "Version", case.program
467
468
  )
@@ -618,6 +619,7 @@ class Client:
618
619
  "validacaoModelo": "True",
619
620
  "validacaoUsuario": "False",
620
621
  "idVersao": case.program_version,
622
+ "modeloVersao": case.program_version_name,
621
623
  "pathModelo": "C:\\PSR",
622
624
  "idTipoExecucao": case.execution_type,
623
625
  "nomeCaso": case.name,
@@ -911,22 +913,46 @@ class Client:
911
913
  budgets.sort()
912
914
  return budgets
913
915
 
916
+ def get_number_of_processes(self, programa_nome):
917
+ xml = self._get_cloud_versions_xml()
918
+
919
+ programa = xml.find(f".//Programa[@nome='{programa_nome}']")
920
+ if programa is None:
921
+ raise CloudError(f"Programa '{programa_nome}' não encontrado.")
922
+
923
+ cluster = programa.find(f".//Cluster[@nome='{self.cluster['name']}']")
924
+ if cluster is None:
925
+ raise CloudError(
926
+ f"Cluster '{self.cluster['name']}' não encontrado no programa '{programa_nome}'."
927
+ )
928
+
929
+ maximo_processos = cluster.get("maximoProcessos")
930
+ processos_por_maquina = cluster.get("processosPorMaquina")
931
+
932
+ if maximo_processos and processos_por_maquina:
933
+ maximo_processos = int(maximo_processos)
934
+ processos_por_maquina = int(processos_por_maquina)
935
+
936
+ lista_processos = list(
937
+ range(
938
+ processos_por_maquina, maximo_processos + 1, processos_por_maquina
939
+ )
940
+ )
941
+
942
+ return lista_processos
943
+
944
+ raise CloudError(f"Invalid values for cluster '{self.cluster['name']}'.")
945
+
914
946
  def _make_soap_request(self, service: str, name: str = "", **kwargs) -> ET.Element:
915
947
  portal_ws = zeep.Client(self.cluster["url"] + "?WSDL")
916
948
  section = str(id(self))
917
- password_md5 = _md5sum(self.username + self.__password + section).upper()
918
- password_md5 = (
919
- password_md5
920
- if self.cluster["name"] == "PSR-US"
921
- else self.__password.upper()
922
- )
949
+ password_md5 = self.__password.upper()
923
950
  additional_arguments = kwargs.get("additional_arguments", None)
924
951
  parameters = {
925
952
  "sessao_id": section,
926
- "tipo_autenticacao": "portal"
927
- if self.cluster["name"] == "PSR-US"
928
- else "bcrypt",
953
+ "tipo_autenticacao": "bcrypt",
929
954
  "idioma": "3",
955
+ "versao_cliente": self._get_console_version().split("-")[0],
930
956
  }
931
957
  if additional_arguments:
932
958
  parameters.update(additional_arguments)
psr/cloud/version.py CHANGED
@@ -2,4 +2,4 @@
2
2
  # Unauthorized copying of this file, via any medium is strictly prohibited
3
3
  # Proprietary and confidential
4
4
 
5
- __version__ = "0.3.3"
5
+ __version__ = "0.3.7"
psr/factory/__init__.py CHANGED
@@ -2,6 +2,6 @@
2
2
  # Unauthorized copying of this file, via any medium is strictly prohibited
3
3
  # Proprietary and confidential
4
4
 
5
- __version__ = "4.1.0b12"
5
+ __version__ = "5.0.0b2"
6
6
 
7
7
  from .api import *
psr/factory/factory.dll CHANGED
Binary file
psr/factory/factory.pmd CHANGED
@@ -926,8 +926,10 @@ DEFINE_MODEL MODL:Coral_Configuration
926
926
  PARM INTEGER FlagContingencyCircuits
927
927
  PARM INTEGER FlagCommitment
928
928
  PARM INTEGER PseudoSequential
929
+ PARM INTEGER Sequential
929
930
  PARM INTEGER MaxInterval
930
931
  PARM INTEGER PrintStates
932
+ PARM INTEGER MaxContingencyCircuits
931
933
  VECTOR INTEGER SelectedBlocks
932
934
  PARM REAL CVAR_Alpha
933
935
  PARM REAL CVAR_Lambda
@@ -5645,6 +5647,8 @@ DEFINE_MODEL MODL:SDDP_Execution_Options
5645
5647
  PARM INTEGER FCFO
5646
5648
  PARM INTEGER HYRM
5647
5649
  PARM INTEGER BLVP
5650
+ PARM INTEGER GAME
5651
+ PARM INTEGER TRUP
5648
5652
 
5649
5653
  PARM REAL NCPL_MIPR
5650
5654
  PARM REAL NCPL_LTOL
@@ -6985,6 +6989,33 @@ DEFINE_MODEL MODL:ePSR_Shunt
6985
6989
  VETOR INTEGER Num INDEX DtV
6986
6990
  END_MODEL
6987
6991
  //--------------------------------------------------------------------------------------------------
6992
+ // Modelo de Bateria
6993
+ //--------------------------------------------------------------------------------------------------
6994
+ DEFINE_MODEL MODL:ePSR_Bateria
6995
+ MERGE_MODEL MODL:ePSR_Element
6996
+
6997
+ VETOR DATE DtV
6998
+ VETOR REAL AMn INDEX DtV
6999
+ VETOR REAL AMx INDEX DtV
7000
+ VETOR REAL AIn INDEX DtV
7001
+ VETOR REAL Pot INDEX DtV
7002
+ VETOR REAL TMxR INDEX DtV
7003
+ VETOR REAL ECar INDEX DtV
7004
+ VETOR REAL EDes INDEX DtV
7005
+ VETOR REAL RCar INDEX DtV
7006
+ VETOR REAL RDes INDEX DtV
7007
+ VETOR STRING OM INDEX DtV
7008
+ VETOR INTEGER Dsc INDEX DtV
7009
+ VETOR INTEGER FlgExc INDEX DtV
7010
+ VETOR INTEGER CancInc INDEX DtV
7011
+ VETOR INTEGER CancAlt INDEX DtV
7012
+
7013
+ PARM STRING TpSht
7014
+ PARM STRING TpCtl
7015
+ VETOR REAL Pot INDEX DtV
7016
+ VETOR INTEGER Num INDEX DtV
7017
+ END_MODEL
7018
+ //--------------------------------------------------------------------------------------------------
6988
7019
  // Modelo de Compensador Sincrono
6989
7020
  //--------------------------------------------------------------------------------------------------
6990
7021
  DEFINE_MODEL MODL:ePSR_CompensadorSincrono
Binary file
psr/runner/runner.py CHANGED
@@ -278,12 +278,7 @@ def run_optgen_cleanup(case_path: Union[str, pathlib.Path], optgen_path: Union[s
278
278
  kwargs["_mode"] = "clean"
279
279
  run_optgen(case_path, optgen_path, sddp_path, **kwargs)
280
280
 
281
-
282
- def run_psrio(case_path: Union[str, pathlib.Path], sddp_path: Union[str, pathlib.Path], **kwargs):
283
- if os.name != 'nt':
284
- raise NotImplementedError("Running PSRIO is only available on Windows")
285
- case_path = str(case_path)
286
- sddp_path = str(sddp_path)
281
+ def run_psrio(case_path, sddp_path: str, **kwargs):
287
282
  recipe_script = kwargs.get('r', kwargs.get('recipes', False))
288
283
  output_path = kwargs.get('o', kwargs.get('output', False))
289
284
 
@@ -313,9 +308,14 @@ def run_psrio(case_path: Union[str, pathlib.Path], sddp_path: Union[str, pathlib
313
308
  if recipe_script:
314
309
  cmd += f' -r "{recipe_script}"'
315
310
 
316
- cmd += f' "{case_path}"'
317
- exec_cmd(cmd, **kwargs)
318
-
311
+ if isinstance(case_path, str):
312
+ cmd += f' "{case_path}"'
313
+ else:
314
+ case_paths = list(case_path)
315
+ for path in case_paths:
316
+ cmd += f' "{path}"'
317
+
318
+ _exec_cmd(cmd, **kwargs)
319
319
 
320
320
  def run_nwsddp(input_case_path: Union[str, pathlib.Path], output_case_path: Union[str, pathlib.Path], nwsddp_app_path: Union[str, pathlib.Path], mdc_file_path: Optional[Union[str, pathlib.Path]] = None, **kwargs):
321
321
  if os.name != 'nt':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: psr-factory
3
- Version: 4.1.0b12
3
+ Version: 5.0.0b2
4
4
  Summary: PSR database management module.
5
5
  Author-email: "PSR Inc." <psrfactory@psr-inc.com>
6
6
  License-Expression: MIT
@@ -22,9 +22,14 @@ Classifier: Operating System :: POSIX :: Linux
22
22
  Requires-Python: >=3.9
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE.txt
25
+ Requires-Dist: zeep
26
+ Requires-Dist: filelock
27
+ Requires-Dist: pefile
28
+ Requires-Dist: boto3
29
+ Requires-Dist: botocore
25
30
  Dynamic: license-file
26
31
 
27
- PSR Factory (version 4.1.0b12)
32
+ PSR Factory (version 5.0.0b2)
28
33
  ============================
29
34
 
30
35
  Factory is a library that helps to manage SDDP cases.
@@ -45,7 +50,7 @@ pip install psr-factory
45
50
  Or, if the package directly from the wheel (whl) file:
46
51
 
47
52
  ```bash
48
- pip install psr_factory-4.1.0b12-py3-none-win_amd64.whl
53
+ pip install psr_factory-5.0.0b2-py3-none-win_amd64.whl
49
54
  ```
50
55
 
51
56
  Factory will be available to all Python scripts in your system after importing it:
@@ -2,21 +2,22 @@ psr/apps/__init__.py,sha256=frSq1WIy5vIdU21xJIGX7U3XoAZRj0pcQmFb-R00b7I,228
2
2
  psr/apps/apps.py,sha256=8jVxTFZ73KFk_PbY-8rZDD8HBONdCjt-jzsDJyu2P50,6921
3
3
  psr/apps/version.py,sha256=vs459L6JsatAkUxna7BNG-vMCaXpO1Ye8c1bmkEx4U4,194
4
4
  psr/cloud/__init__.py,sha256=inZMwG7O9Fca9hg1BhqYObOYtTTJOkpuTIuXnkHJZkI,246
5
- psr/cloud/cloud.py,sha256=XOtTr6AoxZSNrWXzvM3Ia2BfMjThLn3FVF_7LM4BtME,57585
5
+ psr/cloud/aws.py,sha256=ro8kBNVxpGDXgZ5haceqX-MAD-0F5KFDJJ4M6rRvwS8,9915
6
+ psr/cloud/cloud.py,sha256=9Z342IJ-PVkiETyO5ksCDTgpT7CXj6Ec6g2S8fGhgTk,58670
6
7
  psr/cloud/data.py,sha256=nQVpCZhHlHI0HOpqsNhBpotLO37ha5Fl9txWABDnFwQ,4008
7
8
  psr/cloud/desktop.py,sha256=JFroCMEFV1Nz3has74n7OVrGCg2lS7Ev5bcjdw2hRxY,2980
8
9
  psr/cloud/log.py,sha256=Dvhz1enIWlFWeaRK7JAAuZVPfODgoEIRNcHEmbEliyQ,1366
9
10
  psr/cloud/status.py,sha256=vcI4B9S6wCt9maT5NNrVwYaEgGIvy6kkC1UVpJjYbtw,3607
10
11
  psr/cloud/tempfile.py,sha256=1IOeye0eKWnmBynK5K5FMWiTaEVhn4GbQ8_y0THEva0,3893
11
- psr/cloud/version.py,sha256=RG2RB_TfKD_2sF3BR3PpbFPEmlXkWUJOgqpsnMmcVsc,192
12
+ psr/cloud/version.py,sha256=Wxm5oXHAe8U9QoQpN5WIlzAhFR9bGfvIITFeq8QPBLw,192
12
13
  psr/cloud/xml.py,sha256=ac2lyflOQm8khPvJn0zmI26I4sfUDY6A_OTsxzbMQEs,1896
13
- psr/factory/__init__.py,sha256=HNNVl6Rl2MZnfodAZFBM6ZH7qOVD9vrpQNpom_cXALM,219
14
+ psr/factory/__init__.py,sha256=LOAdIPKWDzsDv5hMFpBFRS3mDya2Lof2c8WzWJj5jMg,218
14
15
  psr/factory/api.py,sha256=N5153ZJmZjzLQ0AvRZnSlTu6UmHBQqbYw0UQ69sZHkE,98705
15
- psr/factory/factory.dll,sha256=Xi0W6KyNvWhLfbaZziLOjnLxG7wgGg7LFZZ0PEcWEUA,12969744
16
- psr/factory/factory.pmd,sha256=BntBOXSJ1Uf2rZ9HIM-yaHT1F9erAm8zOxHYssUCZCo,242440
16
+ psr/factory/factory.dll,sha256=hdQZdi-XPBsig31tXaddifWA135jfr9lzqnchHxAPiI,18108240
17
+ psr/factory/factory.pmd,sha256=gZnS1mnb1iA1XtNA1JfALM9rKdFLFBbwAJHF2_PxKAk,243405
17
18
  psr/factory/factory.pmk,sha256=3xDhU0fpUz6dSn29E8GkXEmCOSadnq7cJPcNPbEyFfI,579203
18
19
  psr/factory/factorylib.py,sha256=xnhCFTo4DpU0e5oHtIWMmc-kk6ThtNAUI3cxpDXrBKE,27497
19
- psr/factory/libcurl-x64.dll,sha256=smw29I-r8m5zrvILQqP_T3HY2m67YBW8k6duQvbV0mA,5317904
20
+ psr/factory/libcurl-x64.dll,sha256=-IyLfl9t-QM0zOlXf-BfHeLwN7Y7RaS6mMUkwduD_T8,5317968
20
21
  psr/factory/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
22
  psr/factory/samples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
23
  psr/factory/samples/sddp_case01.py,sha256=jo71p9NN7dtRqMT76TEbD4S4Lut7p4ejbpu6SoSwg0Y,5034
@@ -27,10 +28,10 @@ psr/psrfcommon/__init__.py,sha256=WXR560XQllIjtFpWd0jiJEbUAQIyh5-6lwj-42_J95c,20
27
28
  psr/psrfcommon/psrfcommon.py,sha256=NABM5ahvyfSizDC9c0Vu9dVK1pD_vOzIGFHL1oz2E1o,1464
28
29
  psr/psrfcommon/tempfile.py,sha256=5S13wa2DCLYTUdwbLm_KMBRnDRJ0WDlu8GO2BmZoNdg,3939
29
30
  psr/runner/__init__.py,sha256=kI9HDX-B_LMQJUHHylFHas2rNpWfNNa0pZXoIvX_Alw,230
30
- psr/runner/runner.py,sha256=xmo8YtrVvR4wzTHmnEeWxZzBQb9oRgg3bK_sPAGBcko,26599
31
+ psr/runner/runner.py,sha256=EYSmdbAzPs1_cAneAR7b3m5RjyFU5YH8_MyYqVzijoc,26572
31
32
  psr/runner/version.py,sha256=mch2Y8anSXGMn9w72Z78PhSRhOyn55EwaoLAYhY4McE,194
32
- psr_factory-4.1.0b12.dist-info/licenses/LICENSE.txt,sha256=N6mqZK2Ft3iXGHj-by_MHC_dJo9qwn0URjakEPys3H4,1089
33
- psr_factory-4.1.0b12.dist-info/METADATA,sha256=T9n8MRvmsZH5CUY9htEmNEL4iEupy9QoRkuyQmBwS4g,2429
34
- psr_factory-4.1.0b12.dist-info/WHEEL,sha256=ZjXRCNaQ9YSypEK2TE0LRB0sy2OVXSszb4Sx1XjM99k,97
35
- psr_factory-4.1.0b12.dist-info/top_level.txt,sha256=Jb393O96WQk3b5D1gMcrZBLKJJgZpzNjTPoldUi00ck,4
36
- psr_factory-4.1.0b12.dist-info/RECORD,,
33
+ psr_factory-5.0.0b2.dist-info/licenses/LICENSE.txt,sha256=N6mqZK2Ft3iXGHj-by_MHC_dJo9qwn0URjakEPys3H4,1089
34
+ psr_factory-5.0.0b2.dist-info/METADATA,sha256=BhUPjURqDFo5K_rLjSABpx0L2Zr4uPQv8rNS7MDMldU,2542
35
+ psr_factory-5.0.0b2.dist-info/WHEEL,sha256=ZjXRCNaQ9YSypEK2TE0LRB0sy2OVXSszb4Sx1XjM99k,97
36
+ psr_factory-5.0.0b2.dist-info/top_level.txt,sha256=Jb393O96WQk3b5D1gMcrZBLKJJgZpzNjTPoldUi00ck,4
37
+ psr_factory-5.0.0b2.dist-info/RECORD,,