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 +256 -0
- psr/cloud/cloud.py +36 -10
- psr/cloud/version.py +1 -1
- psr/factory/__init__.py +1 -1
- psr/factory/factory.dll +0 -0
- psr/factory/factory.pmd +31 -0
- psr/factory/libcurl-x64.dll +0 -0
- psr/runner/runner.py +9 -9
- {psr_factory-4.1.0b12.dist-info → psr_factory-5.0.0b2.dist-info}/METADATA +8 -3
- {psr_factory-4.1.0b12.dist-info → psr_factory-5.0.0b2.dist-info}/RECORD +13 -12
- {psr_factory-4.1.0b12.dist-info → psr_factory-5.0.0b2.dist-info}/WHEEL +0 -0
- {psr_factory-4.1.0b12.dist-info → psr_factory-5.0.0b2.dist-info}/licenses/LICENSE.txt +0 -0
- {psr_factory-4.1.0b12.dist-info → psr_factory-5.0.0b2.dist-info}/top_level.txt +0 -0
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 =
|
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": "
|
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
psr/factory/__init__.py
CHANGED
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
|
psr/factory/libcurl-x64.dll
CHANGED
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
|
-
|
317
|
-
|
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:
|
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
|
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-
|
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/
|
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=
|
12
|
+
psr/cloud/version.py,sha256=Wxm5oXHAe8U9QoQpN5WIlzAhFR9bGfvIITFeq8QPBLw,192
|
12
13
|
psr/cloud/xml.py,sha256=ac2lyflOQm8khPvJn0zmI26I4sfUDY6A_OTsxzbMQEs,1896
|
13
|
-
psr/factory/__init__.py,sha256=
|
14
|
+
psr/factory/__init__.py,sha256=LOAdIPKWDzsDv5hMFpBFRS3mDya2Lof2c8WzWJj5jMg,218
|
14
15
|
psr/factory/api.py,sha256=N5153ZJmZjzLQ0AvRZnSlTu6UmHBQqbYw0UQ69sZHkE,98705
|
15
|
-
psr/factory/factory.dll,sha256=
|
16
|
-
psr/factory/factory.pmd,sha256=
|
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
|
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=
|
31
|
+
psr/runner/runner.py,sha256=EYSmdbAzPs1_cAneAR7b3m5RjyFU5YH8_MyYqVzijoc,26572
|
31
32
|
psr/runner/version.py,sha256=mch2Y8anSXGMn9w72Z78PhSRhOyn55EwaoLAYhY4McE,194
|
32
|
-
psr_factory-
|
33
|
-
psr_factory-
|
34
|
-
psr_factory-
|
35
|
-
psr_factory-
|
36
|
-
psr_factory-
|
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,,
|
File without changes
|
File without changes
|
File without changes
|