Skip to content

Latest commit

 

History

History

1.0.1-1.1.0

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Comparing tmp/cegalprizm_pycoderunner-1.0.1-py2.py3-none-any.whl.zip & tmp/cegalprizm_pycoderunner-1.1.0-py2.py3-none-any.whl.zip

zipinfo {}

@@ -1,31 +1,31 @@
-Zip file size: 45435 bytes, number of entries: 29
--rw-r--r--  2.0 unx      524 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/__init__.py
--rw-r--r--  2.0 unx     5485 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/__main__.py
--rw-r--r--  2.0 unx     8431 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/file_services.py
--rw-r--r--  2.0 unx     1150 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/hub_helper.py
--rw-r--r--  2.0 unx     7067 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/notebook.py
--rw-r--r--  2.0 unx    11612 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/prizmworkflowrunner_pb2.py
--rw-r--r--  2.0 unx    74051 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/pycoderunner_pb2.py
--rw-r--r--  2.0 unx     5168 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/python_code_parser.py
--rw-r--r--  2.0 unx     1313 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/redirects.py
--rw-r--r--  2.0 unx    10576 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/script.py
--rw-r--r--  2.0 unx     3233 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/script_library.py
--rw-r--r--  2.0 unx     2893 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/task_registry.py
--rw-r--r--  2.0 unx     4610 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/value_parameters.py
--rw-r--r--  2.0 unx    29612 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/workflow_description.py
--rw-r--r--  2.0 unx     7408 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/workflow_inputs.py
--rw-r--r--  2.0 unx    10174 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/workflow_library.py
--rw-r--r--  2.0 unx     2300 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/enums/domain_objects.py
--rw-r--r--  2.0 unx     4114 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/enums/measurement_names.py
--rw-r--r--  2.0 unx    15698 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/enums/template_names.py
--rw-r--r--  2.0 unx     1215 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/tasks/create_function.py
--rw-r--r--  2.0 unx     3672 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/tasks/execute_function.py
--rw-r--r--  2.0 unx     1866 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/tasks/list_workflows.py
--rw-r--r--  2.0 unx     1267 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/tasks/run_script.py
--rw-r--r--  2.0 unx     3801 b- defN 24-Apr-19 13:01 cegalprizm/pycoderunner/tasks/run_workflow.py
--rw-r--r--  2.0 unx     1212 b- defN 24-Apr-19 13:01 cegalprizm_pycoderunner-1.0.1.dist-info/LICENSE
--rw-r--r--  2.0 unx     2185 b- defN 24-Apr-19 13:01 cegalprizm_pycoderunner-1.0.1.dist-info/METADATA
--rw-r--r--  2.0 unx      110 b- defN 24-Apr-19 13:01 cegalprizm_pycoderunner-1.0.1.dist-info/WHEEL
--rw-r--r--  2.0 unx       16 b- defN 24-Apr-19 13:01 cegalprizm_pycoderunner-1.0.1.dist-info/top_level.txt
--rw-rw-r--  2.0 unx     2861 b- defN 24-Apr-19 13:01 cegalprizm_pycoderunner-1.0.1.dist-info/RECORD
-29 files, 223624 bytes uncompressed, 40689 bytes compressed:  81.8%
+Zip file size: 48325 bytes, number of entries: 29
+-rw-r--r--  2.0 unx      686 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/__init__.py
+-rw-r--r--  2.0 unx     5412 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/__main__.py
+-rw-r--r--  2.0 unx     8431 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/file_services.py
+-rw-r--r--  2.0 unx     1150 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/hub_helper.py
+-rw-r--r--  2.0 unx     7067 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/notebook.py
+-rw-r--r--  2.0 unx    11612 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/prizmworkflowrunner_pb2.py
+-rw-r--r--  2.0 unx    79221 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/pycoderunner_pb2.py
+-rw-r--r--  2.0 unx     5168 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/python_code_parser.py
+-rw-r--r--  2.0 unx     1313 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/redirects.py
+-rw-r--r--  2.0 unx    10576 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/script.py
+-rw-r--r--  2.0 unx     3233 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/script_library.py
+-rw-r--r--  2.0 unx     2893 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/task_registry.py
+-rw-r--r--  2.0 unx     4610 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/value_parameters.py
+-rw-r--r--  2.0 unx    51203 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/workflow_description.py
+-rw-r--r--  2.0 unx     8830 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/workflow_inputs.py
+-rw-r--r--  2.0 unx    10596 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/workflow_library.py
+-rw-r--r--  2.0 unx     2486 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/enums/domain_objects.py
+-rw-r--r--  2.0 unx     4114 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/enums/measurement_names.py
+-rw-r--r--  2.0 unx    15698 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/enums/template_names.py
+-rw-r--r--  2.0 unx     1215 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/tasks/create_function.py
+-rw-r--r--  2.0 unx     3672 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/tasks/execute_function.py
+-rw-r--r--  2.0 unx     1866 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/tasks/list_workflows.py
+-rw-r--r--  2.0 unx     1267 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/tasks/run_script.py
+-rw-r--r--  2.0 unx     3801 b- defN 24-May-29 13:06 cegalprizm/pycoderunner/tasks/run_workflow.py
+-rw-r--r--  2.0 unx     1212 b- defN 24-May-29 13:06 cegalprizm_pycoderunner-1.1.0.dist-info/LICENSE
+-rw-r--r--  2.0 unx     2185 b- defN 24-May-29 13:06 cegalprizm_pycoderunner-1.1.0.dist-info/METADATA
+-rw-r--r--  2.0 unx      110 b- defN 24-May-29 13:06 cegalprizm_pycoderunner-1.1.0.dist-info/WHEEL
+-rw-r--r--  2.0 unx       16 b- defN 24-May-29 13:06 cegalprizm_pycoderunner-1.1.0.dist-info/top_level.txt
+-rw-rw-r--  2.0 unx     2861 b- defN 24-May-29 13:06 cegalprizm_pycoderunner-1.1.0.dist-info/RECORD
+29 files, 252504 bytes uncompressed, 43579 bytes compressed:  82.7%

zipnote {}

@@ -66,23 +66,23 @@
 
 Filename: cegalprizm/pycoderunner/tasks/run_script.py
 Comment: 
 
 Filename: cegalprizm/pycoderunner/tasks/run_workflow.py
 Comment: 
 
-Filename: cegalprizm_pycoderunner-1.0.1.dist-info/LICENSE
+Filename: cegalprizm_pycoderunner-1.1.0.dist-info/LICENSE
 Comment: 
 
-Filename: cegalprizm_pycoderunner-1.0.1.dist-info/METADATA
+Filename: cegalprizm_pycoderunner-1.1.0.dist-info/METADATA
 Comment: 
 
-Filename: cegalprizm_pycoderunner-1.0.1.dist-info/WHEEL
+Filename: cegalprizm_pycoderunner-1.1.0.dist-info/WHEEL
 Comment: 
 
-Filename: cegalprizm_pycoderunner-1.0.1.dist-info/top_level.txt
+Filename: cegalprizm_pycoderunner-1.1.0.dist-info/top_level.txt
 Comment: 
 
-Filename: cegalprizm_pycoderunner-1.0.1.dist-info/RECORD
+Filename: cegalprizm_pycoderunner-1.1.0.dist-info/RECORD
 Comment: 
 
 Zip file comment:

cegalprizm/pycoderunner/init.py

@@ -1,16 +1,16 @@
 # Copyright 2024 Cegal AS
 # All rights reserved.
 # Unauthorized copying of this file, via any medium is strictly prohibited.
 
-__version__ = '1.0.1'
-__git_hash__ = '6c914f61'
+__version__ = '1.1.0'
+__git_hash__ = '3b1d12a7'
 
 import logging
 logger = logging.getLogger(__name__)
 
 # pylint: disable=wrong-import-position
-from .enums.domain_objects import DomainObjectsEnum
-from .enums.measurement_names import MeasurementNamesEnum
-from .enums.template_names import TemplateNamesEnum
-from .workflow_description import WorkflowDescription
-from .file_services import FileServices
+from .enums.domain_objects import DomainObjectsEnum  # noqa: E402, F401
+from .enums.measurement_names import MeasurementNamesEnum  # noqa: E402, F401
+from .enums.template_names import TemplateNamesEnum  # noqa: E402, F401
+from .workflow_description import WorkflowDescription, VisualEnum, ParameterRef, ParameterState, ObjectRefStateEnum  # noqa: E402, F401
+from .file_services import FileServices  # noqa: E402, F401

cegalprizm/pycoderunner/main.py

@@ -115,15 +115,14 @@
 logger.info(f"Hub connector public : {str(supports_public_requests)}")
 logger.info(f"Num concurrent tasks : {num_of_concurrent_tasks}")
 
 if args.libdir is not None:
     if args.workdir is None:
         logger.info(f"A working_path must be specified when specifying workflow_library_path")
     else:
-        os.environ['pwr_working_path'] = args.workdir.replace("\\", "/")
         initialise_workflow_library(args.name, args.libdir.replace("\\", "/"), args.workdir.replace("\\", "/"))
 
 labels = {
     "pycoderunner-environment": args.name,
     "pycoderunner-uuid": str(pycoderunner_uuid)
 }

cegalprizm/pycoderunner/pycoderunner_pb2.py

@@ -16,15 +16,15 @@
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='cegalprizm/pycoderunner/pycoderunner.proto',
   package='',
   syntax='proto3',
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n*cegalprizm/pycoderunner/pycoderunner.proto\x1a\x19google/protobuf/any.proto\"T\n\x15\x43reateFunctionRequest\x12\x10\n\x06script\x18\x01 \x01(\tH\x00\x12\x18\n\x0epickled_object\x18\x02 \x01(\tH\x00\x42\x0f\n\rfunction_type\"-\n\x16\x43reateFunctionResponse\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\"M\n\x10RunScriptRequest\x12\x0e\n\x06script\x18\x01 \x01(\t\x12)\n\rinjected_vars\x18\x02 \x01(\x0b\x32\x12.PayloadDictionary\"\xde\x01\n\x10\x45xecutionRequest\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\x12)\n\rinjected_vars\x18\x02 \x01(\x0b\x32\x12.PayloadDictionary\x12 \n\x18\x66unction_names_to_ignore\x18\x03 \x03(\t\x12\x1d\n\tparameter\x18\x04 \x01(\x0b\x32\x08.PayloadH\x00\x12\"\n\x04\x64ict\x18\x05 \x01(\x0b\x32\x12.PayloadDictionaryH\x00\x12\x1b\n\x13output_payload_type\x18\x06 \x01(\tB\x08\n\x06inputs\"W\n\x11\x45xecutionResponse\x12 \n\x0eoutput_payload\x18\x01 \x01(\x0b\x32\x08.Payload\x12\x0f\n\x07std_out\x18\x02 \x01(\t\x12\x0f\n\x07std_err\x18\x03 \x01(\t\"\x1f\n\x1dListWellKnownWorkflowsRequest\"G\n\x1eListWellKnownWorkflowsResponse\x12%\n\tworkflows\x18\x01 \x03(\x0b\x32\x12.WellKnownWorkflow\"\xfd\x01\n\x11WellKnownWorkflow\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x0f\n\x07\x61uthors\x18\x05 \x01(\t\x12\x0f\n\x07version\x18\x06 \x01(\t\x12\'\n\x06inputs\x18\x07 \x03(\x0b\x32\x17.WellKnownWorkflowInput\x12\x18\n\x10\x65nvironment_name\x18\x08 \x01(\t\x12\x10\n\x08\x66ilepath\x18\t \x01(\t\x12\x10\n\x08is_valid\x18\n \x01(\x08\x12\x15\n\rerror_message\x18\x0b \x01(\t\"-\n\x14\x42ooleanWorkflowInput\x12\x15\n\rdefault_value\x18\x01 \x01(\x08\"y\n\x14IntegerWorkflowInput\x12\x0f\n\x07minimum\x18\x01 \x01(\x05\x12\x0f\n\x07maximum\x18\x02 \x01(\x05\x12\x15\n\rdefault_value\x18\x03 \x01(\x05\x12\x13\n\x0bhas_minimum\x18\x04 \x01(\x08\x12\x13\n\x0bhas_maximum\x18\x05 \x01(\x08\"\xaa\x01\n\x13\x44oubleWorkflowInput\x12\x0f\n\x07minimum\x18\x01 \x01(\x01\x12\x0f\n\x07maximum\x18\x02 \x01(\x01\x12\x15\n\rdefault_value\x18\x03 \x01(\x01\x12\x18\n\x10measurement_name\x18\x04 \x01(\t\x12\x16\n\x0e\x64isplay_symbol\x18\x05 \x01(\t\x12\x13\n\x0bhas_minimum\x18\x06 \x01(\x08\x12\x13\n\x0bhas_maximum\x18\x07 \x01(\x08\",\n\x13StringWorkflowInput\x12\x15\n\rdefault_value\x18\x01 \x01(\t\"E\n\x11\x46ileWorkflowInput\x12\x17\n\x0f\x66ile_extensions\x18\x01 \x01(\t\x12\x17\n\x0fselect_multiple\x18\x02 \x01(\x08\"\x15\n\x13\x46olderWorkflowInput\"\x92\x01\n\x16ObjectRefWorkflowInput\x12\x13\n\x0bobject_name\x18\x01 \x01(\t\x12\x15\n\rproperty_name\x18\x02 \x01(\t\x12\x18\n\x10measurement_name\x18\x03 \x01(\t\x12\x19\n\x11linked_input_name\x18\x04 \x01(\t\x12\x17\n\x0fselect_multiple\x18\x05 \x01(\x08\"\x8c\x01\n\x11\x45numWorkflowInput\x12\x15\n\rdefault_value\x18\x01 \x01(\x05\x12\x30\n\x07options\x18\x02 \x03(\x0b\x32\x1f.EnumWorkflowInput.OptionsEntry\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd5\x03\n\x16WellKnownWorkflowInput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12.\n\rboolean_input\x18\x07 \x01(\x0b\x32\x15.BooleanWorkflowInputH\x00\x12*\n\tint_input\x18\x04 \x01(\x0b\x32\x15.IntegerWorkflowInputH\x00\x12,\n\x0c\x64ouble_input\x18\x05 \x01(\x0b\x32\x14.DoubleWorkflowInputH\x00\x12,\n\x0cstring_input\x18\x06 \x01(\x0b\x32\x14.StringWorkflowInputH\x00\x12(\n\nenum_input\x18\x08 \x01(\x0b\x32\x12.EnumWorkflowInputH\x00\x12\x33\n\x10object_ref_input\x18\t \x01(\x0b\x32\x17.ObjectRefWorkflowInputH\x00\x12(\n\nfile_input\x18\x0b \x01(\x0b\x32\x12.FileWorkflowInputH\x00\x12,\n\x0c\x66older_input\x18\x0c \x01(\x0b\x32\x14.FolderWorkflowInputH\x00\x42\x0c\n\ninput_type\"Z\n\x1bRunWellKnownWorkflowRequest\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12&\n\nparameters\x18\x02 \x01(\x0b\x32\x12.PayloadDictionary\"@\n\x1cRunWellKnownWorkflowResponse\x12\x0f\n\x07std_out\x18\x01 \x01(\t\x12\x0f\n\x07std_err\x18\x02 \x01(\t\"v\n\x11PayloadDictionary\x12*\n\x04\x64ict\x18\x01 \x03(\x0b\x32\x1c.PayloadDictionary.DictEntry\x1a\x35\n\tDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x17\n\x05value\x18\x02 \x01(\x0b\x32\x08.Payload:\x02\x38\x01\"F\n\x07Payload\x12\x14\n\x0c\x63ontent_type\x18\x01 \x01(\t\x12%\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\"#\n\x12\x44oubleValuePayload\x12\r\n\x05value\x18\x01 \x01(\x01\"!\n\x0f\x44ouble1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\x01\"3\n\x0f\x44ouble2DPayload\x12 \n\x06values\x18\x01 \x03(\x0b\x32\x10.Double1DPayload\" \n\x0fIntValuePayload\x12\r\n\x05value\x18\x01 \x01(\x05\"\x1e\n\x0cInt1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\x05\"-\n\x0cInt2DPayload\x12\x1d\n\x06values\x18\x01 \x03(\x0b\x32\r.Int1DPayload\"!\n\x10\x42oolValuePayload\x12\r\n\x05value\x18\x01 \x01(\x08\"\x1f\n\rBool1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\x08\"#\n\x12StringValuePayload\x12\r\n\x05value\x18\x01 \x01(\t\"!\n\x0fString1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\tb\x06proto3'
+  serialized_pb=b'\n*cegalprizm/pycoderunner/pycoderunner.proto\x1a\x19google/protobuf/any.proto\"T\n\x15\x43reateFunctionRequest\x12\x10\n\x06script\x18\x01 \x01(\tH\x00\x12\x18\n\x0epickled_object\x18\x02 \x01(\tH\x00\x42\x0f\n\rfunction_type\"-\n\x16\x43reateFunctionResponse\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\"M\n\x10RunScriptRequest\x12\x0e\n\x06script\x18\x01 \x01(\t\x12)\n\rinjected_vars\x18\x02 \x01(\x0b\x32\x12.PayloadDictionary\"\xde\x01\n\x10\x45xecutionRequest\x12\x13\n\x0b\x66unction_id\x18\x01 \x01(\t\x12)\n\rinjected_vars\x18\x02 \x01(\x0b\x32\x12.PayloadDictionary\x12 \n\x18\x66unction_names_to_ignore\x18\x03 \x03(\t\x12\x1d\n\tparameter\x18\x04 \x01(\x0b\x32\x08.PayloadH\x00\x12\"\n\x04\x64ict\x18\x05 \x01(\x0b\x32\x12.PayloadDictionaryH\x00\x12\x1b\n\x13output_payload_type\x18\x06 \x01(\tB\x08\n\x06inputs\"W\n\x11\x45xecutionResponse\x12 \n\x0eoutput_payload\x18\x01 \x01(\x0b\x32\x08.Payload\x12\x0f\n\x07std_out\x18\x02 \x01(\t\x12\x0f\n\x07std_err\x18\x03 \x01(\t\"\x1f\n\x1dListWellKnownWorkflowsRequest\"G\n\x1eListWellKnownWorkflowsResponse\x12%\n\tworkflows\x18\x01 \x03(\x0b\x32\x12.WellKnownWorkflow\"\xfd\x01\n\x11WellKnownWorkflow\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x0f\n\x07\x61uthors\x18\x05 \x01(\t\x12\x0f\n\x07version\x18\x06 \x01(\t\x12\'\n\x06inputs\x18\x07 \x03(\x0b\x32\x17.WellKnownWorkflowInput\x12\x18\n\x10\x65nvironment_name\x18\x08 \x01(\t\x12\x10\n\x08\x66ilepath\x18\t \x01(\t\x12\x10\n\x08is_valid\x18\n \x01(\x08\x12\x15\n\rerror_message\x18\x0b \x01(\t\"-\n\x14\x42ooleanWorkflowInput\x12\x15\n\rdefault_value\x18\x01 \x01(\x08\"y\n\x14IntegerWorkflowInput\x12\x0f\n\x07minimum\x18\x01 \x01(\x05\x12\x0f\n\x07maximum\x18\x02 \x01(\x05\x12\x15\n\rdefault_value\x18\x03 \x01(\x05\x12\x13\n\x0bhas_minimum\x18\x04 \x01(\x08\x12\x13\n\x0bhas_maximum\x18\x05 \x01(\x08\"\xaa\x01\n\x13\x44oubleWorkflowInput\x12\x0f\n\x07minimum\x18\x01 \x01(\x01\x12\x0f\n\x07maximum\x18\x02 \x01(\x01\x12\x15\n\rdefault_value\x18\x03 \x01(\x01\x12\x18\n\x10measurement_name\x18\x04 \x01(\t\x12\x16\n\x0e\x64isplay_symbol\x18\x05 \x01(\t\x12\x13\n\x0bhas_minimum\x18\x06 \x01(\x08\x12\x13\n\x0bhas_maximum\x18\x07 \x01(\x08\",\n\x13StringWorkflowInput\x12\x15\n\rdefault_value\x18\x01 \x01(\t\"E\n\x11\x46ileWorkflowInput\x12\x17\n\x0f\x66ile_extensions\x18\x01 \x01(\t\x12\x17\n\x0fselect_multiple\x18\x02 \x01(\x08\"\x15\n\x13\x46olderWorkflowInput\"\x92\x01\n\x16ObjectRefWorkflowInput\x12\x13\n\x0bobject_name\x18\x01 \x01(\t\x12\x15\n\rproperty_name\x18\x02 \x01(\t\x12\x18\n\x10measurement_name\x18\x03 \x01(\t\x12\x19\n\x11linked_input_name\x18\x04 \x01(\t\x12\x17\n\x0fselect_multiple\x18\x05 \x01(\x08\"\xb3\x01\n\x11\x45numWorkflowInput\x12\x15\n\rdefault_value\x18\x01 \x01(\x05\x12\x34\n\x07options\x18\x02 \x03(\x0b\x32\x1f.EnumWorkflowInput.OptionsEntryB\x02\x18\x01\x12!\n\x0c\x65num_options\x18\x03 \x03(\x0b\x32\x0b.EnumOption\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"(\n\nEnumOption\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t\"\xeb\x04\n\x16WellKnownWorkflowInput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12.\n\rboolean_input\x18\x07 \x01(\x0b\x32\x15.BooleanWorkflowInputH\x00\x12*\n\tint_input\x18\x04 \x01(\x0b\x32\x15.IntegerWorkflowInputH\x00\x12,\n\x0c\x64ouble_input\x18\x05 \x01(\x0b\x32\x14.DoubleWorkflowInputH\x00\x12,\n\x0cstring_input\x18\x06 \x01(\x0b\x32\x14.StringWorkflowInputH\x00\x12(\n\nenum_input\x18\x08 \x01(\x0b\x32\x12.EnumWorkflowInputH\x00\x12\x33\n\x10object_ref_input\x18\t \x01(\x0b\x32\x17.ObjectRefWorkflowInputH\x00\x12(\n\nfile_input\x18\x0b \x01(\x0b\x32\x12.FileWorkflowInputH\x00\x12,\n\x0c\x66older_input\x18\x0c \x01(\x0b\x32\x14.FolderWorkflowInputH\x00\x12U\n\x18linked_visual_parameters\x18\r \x03(\x0b\x32\x33.WellKnownWorkflowInput.LinkedVisualParametersEntry\x1a=\n\x1bLinkedVisualParametersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x0c\n\ninput_type\"Z\n\x1bRunWellKnownWorkflowRequest\x12\x13\n\x0bworkflow_id\x18\x01 \x01(\t\x12&\n\nparameters\x18\x02 \x01(\x0b\x32\x12.PayloadDictionary\"@\n\x1cRunWellKnownWorkflowResponse\x12\x0f\n\x07std_out\x18\x01 \x01(\t\x12\x0f\n\x07std_err\x18\x02 \x01(\t\"v\n\x11PayloadDictionary\x12*\n\x04\x64ict\x18\x01 \x03(\x0b\x32\x1c.PayloadDictionary.DictEntry\x1a\x35\n\tDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x17\n\x05value\x18\x02 \x01(\x0b\x32\x08.Payload:\x02\x38\x01\"F\n\x07Payload\x12\x14\n\x0c\x63ontent_type\x18\x01 \x01(\t\x12%\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x14.google.protobuf.Any\"#\n\x12\x44oubleValuePayload\x12\r\n\x05value\x18\x01 \x01(\x01\"!\n\x0f\x44ouble1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\x01\"3\n\x0f\x44ouble2DPayload\x12 \n\x06values\x18\x01 \x03(\x0b\x32\x10.Double1DPayload\" \n\x0fIntValuePayload\x12\r\n\x05value\x18\x01 \x01(\x05\"\x1e\n\x0cInt1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\x05\"-\n\x0cInt2DPayload\x12\x1d\n\x06values\x18\x01 \x03(\x0b\x32\r.Int1DPayload\"!\n\x10\x42oolValuePayload\x12\r\n\x05value\x18\x01 \x01(\x08\"\x1f\n\rBool1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\x08\"#\n\x12StringValuePayload\x12\r\n\x05value\x18\x01 \x01(\t\"!\n\x0fString1DPayload\x12\x0e\n\x06values\x18\x01 \x03(\tb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,])
 
 
 
 
 _CREATEFUNCTIONREQUEST = _descriptor.Descriptor(
@@ -771,16 +771,16 @@
   ],
   serialized_options=b'8\001',
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1688,
-  serialized_end=1734,
+  serialized_start=1727,
+  serialized_end=1773,
 )
 
 _ENUMWORKFLOWINPUT = _descriptor.Descriptor(
   name='EnumWorkflowInput',
   full_name='EnumWorkflowInput',
   filename=None,
   file=DESCRIPTOR,
@@ -796,32 +796,116 @@
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='options', full_name='EnumWorkflowInput.options', index=1,
       number=2, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
+      serialized_options=b'\030\001', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='enum_options', full_name='EnumWorkflowInput.enum_options', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[_ENUMWORKFLOWINPUT_OPTIONSENTRY, ],
   enum_types=[
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
   serialized_start=1594,
-  serialized_end=1734,
+  serialized_end=1773,
 )
 
 
+_ENUMOPTION = _descriptor.Descriptor(
+  name='EnumOption',
+  full_name='EnumOption',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='EnumOption.key', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='EnumOption.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1775,
+  serialized_end=1815,
+)
+
+
+_WELLKNOWNWORKFLOWINPUT_LINKEDVISUALPARAMETERSENTRY = _descriptor.Descriptor(
+  name='LinkedVisualParametersEntry',
+  full_name='WellKnownWorkflowInput.LinkedVisualParametersEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='WellKnownWorkflowInput.LinkedVisualParametersEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='WellKnownWorkflowInput.LinkedVisualParametersEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2362,
+  serialized_end=2423,
+)
+
 _WELLKNOWNWORKFLOWINPUT = _descriptor.Descriptor(
   name='WellKnownWorkflowInput',
   full_name='WellKnownWorkflowInput',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
@@ -906,33 +990,40 @@
     _descriptor.FieldDescriptor(
       name='folder_input', full_name='WellKnownWorkflowInput.folder_input', index=11,
       number=12, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='linked_visual_parameters', full_name='WellKnownWorkflowInput.linked_visual_parameters', index=12,
+      number=13, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
-  nested_types=[],
+  nested_types=[_WELLKNOWNWORKFLOWINPUT_LINKEDVISUALPARAMETERSENTRY, ],
   enum_types=[
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
     _descriptor.OneofDescriptor(
       name='input_type', full_name='WellKnownWorkflowInput.input_type',
       index=0, containing_type=None,
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=1737,
-  serialized_end=2206,
+  serialized_start=1818,
+  serialized_end=2437,
 )
 
 
 _RUNWELLKNOWNWORKFLOWREQUEST = _descriptor.Descriptor(
   name='RunWellKnownWorkflowRequest',
   full_name='RunWellKnownWorkflowRequest',
   filename=None,
@@ -962,16 +1053,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2208,
-  serialized_end=2298,
+  serialized_start=2439,
+  serialized_end=2529,
 )
 
 
 _RUNWELLKNOWNWORKFLOWRESPONSE = _descriptor.Descriptor(
   name='RunWellKnownWorkflowResponse',
   full_name='RunWellKnownWorkflowResponse',
   filename=None,
@@ -1001,16 +1092,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2300,
-  serialized_end=2364,
+  serialized_start=2531,
+  serialized_end=2595,
 )
 
 
 _PAYLOADDICTIONARY_DICTENTRY = _descriptor.Descriptor(
   name='DictEntry',
   full_name='PayloadDictionary.DictEntry',
   filename=None,
@@ -1040,16 +1131,16 @@
   ],
   serialized_options=b'8\001',
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2431,
-  serialized_end=2484,
+  serialized_start=2662,
+  serialized_end=2715,
 )
 
 _PAYLOADDICTIONARY = _descriptor.Descriptor(
   name='PayloadDictionary',
   full_name='PayloadDictionary',
   filename=None,
   file=DESCRIPTOR,
@@ -1071,16 +1162,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2366,
-  serialized_end=2484,
+  serialized_start=2597,
+  serialized_end=2715,
 )
 
 
 _PAYLOAD = _descriptor.Descriptor(
   name='Payload',
   full_name='Payload',
   filename=None,
@@ -1110,16 +1201,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2486,
-  serialized_end=2556,
+  serialized_start=2717,
+  serialized_end=2787,
 )
 
 
 _DOUBLEVALUEPAYLOAD = _descriptor.Descriptor(
   name='DoubleValuePayload',
   full_name='DoubleValuePayload',
   filename=None,
@@ -1142,16 +1233,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2558,
-  serialized_end=2593,
+  serialized_start=2789,
+  serialized_end=2824,
 )
 
 
 _DOUBLE1DPAYLOAD = _descriptor.Descriptor(
   name='Double1DPayload',
   full_name='Double1DPayload',
   filename=None,
@@ -1174,16 +1265,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2595,
-  serialized_end=2628,
+  serialized_start=2826,
+  serialized_end=2859,
 )
 
 
 _DOUBLE2DPAYLOAD = _descriptor.Descriptor(
   name='Double2DPayload',
   full_name='Double2DPayload',
   filename=None,
@@ -1206,16 +1297,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2630,
-  serialized_end=2681,
+  serialized_start=2861,
+  serialized_end=2912,
 )
 
 
 _INTVALUEPAYLOAD = _descriptor.Descriptor(
   name='IntValuePayload',
   full_name='IntValuePayload',
   filename=None,
@@ -1238,16 +1329,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2683,
-  serialized_end=2715,
+  serialized_start=2914,
+  serialized_end=2946,
 )
 
 
 _INT1DPAYLOAD = _descriptor.Descriptor(
   name='Int1DPayload',
   full_name='Int1DPayload',
   filename=None,
@@ -1270,16 +1361,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2717,
-  serialized_end=2747,
+  serialized_start=2948,
+  serialized_end=2978,
 )
 
 
 _INT2DPAYLOAD = _descriptor.Descriptor(
   name='Int2DPayload',
   full_name='Int2DPayload',
   filename=None,
@@ -1302,16 +1393,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2749,
-  serialized_end=2794,
+  serialized_start=2980,
+  serialized_end=3025,
 )
 
 
 _BOOLVALUEPAYLOAD = _descriptor.Descriptor(
   name='BoolValuePayload',
   full_name='BoolValuePayload',
   filename=None,
@@ -1334,16 +1425,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2796,
-  serialized_end=2829,
+  serialized_start=3027,
+  serialized_end=3060,
 )
 
 
 _BOOL1DPAYLOAD = _descriptor.Descriptor(
   name='Bool1DPayload',
   full_name='Bool1DPayload',
   filename=None,
@@ -1366,16 +1457,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2831,
-  serialized_end=2862,
+  serialized_start=3062,
+  serialized_end=3093,
 )
 
 
 _STRINGVALUEPAYLOAD = _descriptor.Descriptor(
   name='StringValuePayload',
   full_name='StringValuePayload',
   filename=None,
@@ -1398,16 +1489,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2864,
-  serialized_end=2899,
+  serialized_start=3095,
+  serialized_end=3130,
 )
 
 
 _STRING1DPAYLOAD = _descriptor.Descriptor(
   name='String1DPayload',
   full_name='String1DPayload',
   filename=None,
@@ -1430,16 +1521,16 @@
   ],
   serialized_options=None,
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2901,
-  serialized_end=2934,
+  serialized_start=3132,
+  serialized_end=3165,
 )
 
 _CREATEFUNCTIONREQUEST.oneofs_by_name['function_type'].fields.append(
   _CREATEFUNCTIONREQUEST.fields_by_name['script'])
 _CREATEFUNCTIONREQUEST.fields_by_name['script'].containing_oneof = _CREATEFUNCTIONREQUEST.oneofs_by_name['function_type']
 _CREATEFUNCTIONREQUEST.oneofs_by_name['function_type'].fields.append(
   _CREATEFUNCTIONREQUEST.fields_by_name['pickled_object'])
@@ -1455,22 +1546,25 @@
   _EXECUTIONREQUEST.fields_by_name['dict'])
 _EXECUTIONREQUEST.fields_by_name['dict'].containing_oneof = _EXECUTIONREQUEST.oneofs_by_name['inputs']
 _EXECUTIONRESPONSE.fields_by_name['output_payload'].message_type = _PAYLOAD
 _LISTWELLKNOWNWORKFLOWSRESPONSE.fields_by_name['workflows'].message_type = _WELLKNOWNWORKFLOW
 _WELLKNOWNWORKFLOW.fields_by_name['inputs'].message_type = _WELLKNOWNWORKFLOWINPUT
 _ENUMWORKFLOWINPUT_OPTIONSENTRY.containing_type = _ENUMWORKFLOWINPUT
 _ENUMWORKFLOWINPUT.fields_by_name['options'].message_type = _ENUMWORKFLOWINPUT_OPTIONSENTRY
+_ENUMWORKFLOWINPUT.fields_by_name['enum_options'].message_type = _ENUMOPTION
+_WELLKNOWNWORKFLOWINPUT_LINKEDVISUALPARAMETERSENTRY.containing_type = _WELLKNOWNWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['boolean_input'].message_type = _BOOLEANWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['int_input'].message_type = _INTEGERWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['double_input'].message_type = _DOUBLEWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['string_input'].message_type = _STRINGWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['enum_input'].message_type = _ENUMWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['object_ref_input'].message_type = _OBJECTREFWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['file_input'].message_type = _FILEWORKFLOWINPUT
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['folder_input'].message_type = _FOLDERWORKFLOWINPUT
+_WELLKNOWNWORKFLOWINPUT.fields_by_name['linked_visual_parameters'].message_type = _WELLKNOWNWORKFLOWINPUT_LINKEDVISUALPARAMETERSENTRY
 _WELLKNOWNWORKFLOWINPUT.oneofs_by_name['input_type'].fields.append(
   _WELLKNOWNWORKFLOWINPUT.fields_by_name['boolean_input'])
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['boolean_input'].containing_oneof = _WELLKNOWNWORKFLOWINPUT.oneofs_by_name['input_type']
 _WELLKNOWNWORKFLOWINPUT.oneofs_by_name['input_type'].fields.append(
   _WELLKNOWNWORKFLOWINPUT.fields_by_name['int_input'])
 _WELLKNOWNWORKFLOWINPUT.fields_by_name['int_input'].containing_oneof = _WELLKNOWNWORKFLOWINPUT.oneofs_by_name['input_type']
 _WELLKNOWNWORKFLOWINPUT.oneofs_by_name['input_type'].fields.append(
@@ -1510,14 +1604,15 @@
 DESCRIPTOR.message_types_by_name['IntegerWorkflowInput'] = _INTEGERWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['DoubleWorkflowInput'] = _DOUBLEWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['StringWorkflowInput'] = _STRINGWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['FileWorkflowInput'] = _FILEWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['FolderWorkflowInput'] = _FOLDERWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['ObjectRefWorkflowInput'] = _OBJECTREFWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['EnumWorkflowInput'] = _ENUMWORKFLOWINPUT
+DESCRIPTOR.message_types_by_name['EnumOption'] = _ENUMOPTION
 DESCRIPTOR.message_types_by_name['WellKnownWorkflowInput'] = _WELLKNOWNWORKFLOWINPUT
 DESCRIPTOR.message_types_by_name['RunWellKnownWorkflowRequest'] = _RUNWELLKNOWNWORKFLOWREQUEST
 DESCRIPTOR.message_types_by_name['RunWellKnownWorkflowResponse'] = _RUNWELLKNOWNWORKFLOWRESPONSE
 DESCRIPTOR.message_types_by_name['PayloadDictionary'] = _PAYLOADDICTIONARY
 DESCRIPTOR.message_types_by_name['Payload'] = _PAYLOAD
 DESCRIPTOR.message_types_by_name['DoubleValuePayload'] = _DOUBLEVALUEPAYLOAD
 DESCRIPTOR.message_types_by_name['Double1DPayload'] = _DOUBLE1DPAYLOAD
@@ -1647,20 +1742,35 @@
   'DESCRIPTOR' : _ENUMWORKFLOWINPUT,
   '__module__' : 'cegalprizm.pycoderunner.pycoderunner_pb2'
   # @@protoc_insertion_point(class_scope:EnumWorkflowInput)
   })
 _sym_db.RegisterMessage(EnumWorkflowInput)
 _sym_db.RegisterMessage(EnumWorkflowInput.OptionsEntry)
 
+EnumOption = _reflection.GeneratedProtocolMessageType('EnumOption', (_message.Message,), {
+  'DESCRIPTOR' : _ENUMOPTION,
+  '__module__' : 'cegalprizm.pycoderunner.pycoderunner_pb2'
+  # @@protoc_insertion_point(class_scope:EnumOption)
+  })
+_sym_db.RegisterMessage(EnumOption)
+
 WellKnownWorkflowInput = _reflection.GeneratedProtocolMessageType('WellKnownWorkflowInput', (_message.Message,), {
+
+  'LinkedVisualParametersEntry' : _reflection.GeneratedProtocolMessageType('LinkedVisualParametersEntry', (_message.Message,), {
+    'DESCRIPTOR' : _WELLKNOWNWORKFLOWINPUT_LINKEDVISUALPARAMETERSENTRY,
+    '__module__' : 'cegalprizm.pycoderunner.pycoderunner_pb2'
+    # @@protoc_insertion_point(class_scope:WellKnownWorkflowInput.LinkedVisualParametersEntry)
+    })
+  ,
   'DESCRIPTOR' : _WELLKNOWNWORKFLOWINPUT,
   '__module__' : 'cegalprizm.pycoderunner.pycoderunner_pb2'
   # @@protoc_insertion_point(class_scope:WellKnownWorkflowInput)
   })
 _sym_db.RegisterMessage(WellKnownWorkflowInput)
+_sym_db.RegisterMessage(WellKnownWorkflowInput.LinkedVisualParametersEntry)
 
 RunWellKnownWorkflowRequest = _reflection.GeneratedProtocolMessageType('RunWellKnownWorkflowRequest', (_message.Message,), {
   'DESCRIPTOR' : _RUNWELLKNOWNWORKFLOWREQUEST,
   '__module__' : 'cegalprizm.pycoderunner.pycoderunner_pb2'
   # @@protoc_insertion_point(class_scope:RunWellKnownWorkflowRequest)
   })
 _sym_db.RegisterMessage(RunWellKnownWorkflowRequest)
@@ -1762,9 +1872,11 @@
   '__module__' : 'cegalprizm.pycoderunner.pycoderunner_pb2'
   # @@protoc_insertion_point(class_scope:String1DPayload)
   })
 _sym_db.RegisterMessage(String1DPayload)
 
 
 _ENUMWORKFLOWINPUT_OPTIONSENTRY._options = None
+_ENUMWORKFLOWINPUT.fields_by_name['options']._options = None
+_WELLKNOWNWORKFLOWINPUT_LINKEDVISUALPARAMETERSENTRY._options = None
 _PAYLOADDICTIONARY_DICTENTRY._options = None
 # @@protoc_insertion_point(module_scope)

cegalprizm/pycoderunner/workflow_description.py

@@ -17,14 +17,95 @@
 from .workflow_inputs import EnumWorkflowInput, ObjectRefWorkflowInput
 
 
 class ScriptTypeEnum(Enum):
     PyScript = 1
     Notebook = 2
 
+class VisualEnum(Enum):
+    Enabled = 1
+    Visible = 2
+
+class ObjectRefStateEnum(Enum):
+    Selected = 1
+    NotSelected = 2
+
+class ParameterRef():
+    """A reference to a parameter in a workflow description.
+    """
+    def __init__(self, name: str, workflow_input: BaseWorkflowInput):
+        self.name = name
+        self.workflow_input = workflow_input
+
+    def is_valid_state(self, state):
+        if self.workflow_input.get_type() == "bool":
+            if not isinstance(state, bool):
+                return (False, "state must be a bool")
+        elif self.workflow_input.get_type() == "enum":
+            if not isinstance(state, int):
+                return (False, "state must be an int")
+            if state not in self.workflow_input._options.keys():
+                return (False, "state must be a valid option")
+        elif self.workflow_input.get_type() == "object_ref":
+            if not isinstance(state, ObjectRefStateEnum):
+                return (False, "state must be an ObjectRefStateEnum")
+        return (True, "")
+    
+    def state_as_string(self, state):
+        if self.workflow_input.get_type() == "bool":
+            return str(state)
+        elif self.workflow_input.get_type() == "enum":
+            return str(state)
+        elif self.workflow_input.get_type() == "object_ref":
+            return str(state.name)
+
+class ParameterState():
+    """A class to define a desired parameter state.
+    Used as the key in the linked_visual_parameters dictionary when add_*_parameter is called on the WorkflowDescription object. The ParameterState links the visual state of a parameter to the state of another parameter.
+
+    **Example**: 
+
+    Add an integer parameter that is only enabled in the UI when the linked boolean reference is True (Integer value can only be set when checkbox is checked):
+
+    .. code-block:: python
+        linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+        linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Enabled}
+        pwr_description.add_integer_parameter(name="int", label="int", description="int", default_value=0, linked_visual_parameters=linked_visual_parameters)
+
+    **Example**:
+
+    Add an object reference parameter that is only visible in the UI when the linked enum reference is set to a specific value (Well selector only shows when the enum drop-down is set to Value3):
+
+    .. code-block:: python
+        linked_enum_ref = pwr_description.add_enum_parameter(name="enum1", label="enum1", description="enum1", options={1:"Value1", 2:"Value2", 3:"Value3"}, default_value=1)
+        linked_visual_parameters = {ParameterState(linked_enum_ref, 3): VisualEnum.Visible}
+        pwr_description.add_object_ref_parameter(name='well', label='well_selector', description='well_selector', object_type=DomainObjectsEnum.Well, select_multiple=False, linked_visual_parameters=linked_visual_parameters)
+
+    **Example**:
+
+    Add a float parameter that is only enabled in the UI when the linked object reference parameter has a selection (Float value can only be set when a well is selected):
+
+    .. code-block:: python
+        linked_object_ref = pwr_description.add_object_ref_parameter(name='well', label='well_selector', description='well_selector', object_type=DomainObjectsEnum.Well, select_multiple=False)
+        linked_visual_parameters = {ParameterState(linked_object_ref, ObjectRefStateEnum.Selected): VisualEnum.Enabled}
+        pwr_description.add_float_parameter(name="float", label="float", description="float", default_value=0.0, linked_visual_parameters=linked_visual_parameters)
+
+    """
+    def __init__(self, parameter_ref: ParameterRef, state):
+        self.parameter_ref = parameter_ref
+        self.state = state
+
+    def is_valid(self):
+        if self.parameter_ref is None:
+            return (False, "parameter_ref must be defined")
+        return self.parameter_ref.is_valid_state(self.state)
+    
+    def as_string(self):
+        state_as_string = self.parameter_ref.state_as_string(self.state)
+        return f"{self.parameter_ref.name}:{state_as_string}"
 
 class WorkflowDescription():
 
     def __init__(self, name: str, category: str, description: str, authors: str, version: str):
         """
         Describes a PWR workflow
 
@@ -96,64 +177,113 @@
     def _get_error_message(self) -> str:
         return self._error_message
 
     def _set_error_message(self, error_message: str):
         self._error_message = error_message
         self._is_valid = False
 
-    def add_boolean_parameter(self, name: str, label: str, description: str, default_value: bool):
+    def add_boolean_parameter(self, name: str, label: str, description: str, default_value: bool,
+                              linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a boolean parameter to the workflow description.
 
         This will generate a checkbox in the workflow UI.
 
+        **Example**:
+
+        Add a boolean parameter:
+        
+        .. code-block:: python
+            pwr_description.add_boolean_parameter(name='bool', label='bool_input', description='bool_input', default_value=False)
+
+        **Example**:
+
+        Add a boolean parameter that is only visible in the UI when the linked enum reference is set to a specific value (Checkbox only shows when the enum drop-down is set to Value3):
+
+        .. code-block:: python
+            linked_enum_ref = pwr_description.add_enum_parameter(name="enum1", label="enum1", description="enum1", options={1:"Value1", 2:"Value2", 3:"Value3"}, default_value=1)
+            linked_visual_parameters = {ParameterState(linked_enum_ref, 3): VisualEnum.Visible}
+            pwr_description.add_boolean_parameter(name='bool', label='bool_input', description='bool_input', default_value=False, linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the checkbox in the workflow UI.
             description (str): A description of what the parameter represents. This description will be shown in the tooltip next to the checkbox in the workflow UI.
             default_value (bool): The default value to be assigned to the parameter.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
 
+        Returns:
+            ParameterRef: a reference to the parameter that was added
+                                                                        
         Raises:
             ValueError: If the name is already used in the workflow.
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         if not isinstance(default_value, bool):
             self._is_valid = False
             self._error_message = f"Parameter {name}: default_value must be a bool"
             raise ValueError(self._error_message)
-
-        self._parameters.append(BooleanWorkflowInput(name, label, description, default_value))
-        return self
+        
+        workflow_input = BooleanWorkflowInput(name, label, description, default_value, linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
     def add_integer_parameter(self, name: str, label: str, description: str, default_value: int = 0,
-                              minimum_value: int = None, maximum_value: int = None):
+                              minimum_value: int = None, maximum_value: int = None,
+                              linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a integer parameter to the workflow description.
 
         This will generate an integer number field in the workflow UI.
 
+        **Example**:
+
+        Add an integer parameter:
+
+        .. code-block:: python
+            pwr_description.add_integer_parameter(name='int', label='int_input', description='int_input', default_value=0)
+
+        **Example**:
+
+        Add an integer parameter that is only visible in the UI when the linked boolean reference is set to True:
+
+        .. code-block:: python
+            linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+            linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Visible}
+            pwr_description.add_integer_parameter(name='int', label='int_input', description='int_input', default_value=0, linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the field in the workflow UI.
             description (str): A description of what the parameter represents. This description will be shown in the tooltip next to the field in the workflow UI.
             default_value (int, optional): If defined this specifies the default value to be assigned to the parameter. Defaults to 0.
             minimum_value (int, optional): If defined this specifies the lowest value the field can accept. Defaults to None.
             maximum_value (int, optional): If defined this specifies the highest value the field can accept. Defaults to None.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
+
+        Returns:
+            ParameterRef: a reference to the parameter that was added                                                                        
 
         Raises:
             ValueError: If the name is already used in the workflow.
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         if not isinstance(default_value, int):
             self._is_valid = False
@@ -164,44 +294,68 @@
             self._error_message = f"Parameter {name}: default_value must be a int or None"
             raise ValueError(self._error_message)
         if maximum_value and not isinstance(maximum_value, int):
             self._is_valid = False
             self._error_message = f"Parameter {name}: maximum_value must be a int or None"
             raise ValueError(self._error_message)
 
-        self._parameters.append(IntegerWorkflowInput(name, label, description, default_value,
-                                                     minimum_value, maximum_value))
-        return self
+        workflow_input = IntegerWorkflowInput(name, label, description, default_value, minimum_value, maximum_value, linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
     def add_float_parameter(self, name: str, label: str, description: str, default_value: float = 0.0,
                             minimum_value: float = None, maximum_value: float = None,
                             measurement_type: Union[MeasurementNamesEnum, str] = None,
-                            display_symbol: str = None):
+                            display_symbol: str = None,
+                            linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """Adds a float parameter to the workflow description.
 
         This will generate an float number field in the workflow UI.
 
+        **Example**:
+
+        Add a float parameter:
+
+        .. code-block:: python
+            pwr_description.add_float_parameter(name='float', label='float_input', description='float_input', default_value=0.0)
+
+        **Example**:
+
+        Add a float parameter that is only visible in the UI when the linked boolean reference is set to True:
+
+        .. code-block:: python
+            linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+            linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Visible}
+            pwr_description.add_float_parameter(name='float', label='float_input', description='float_input', default_value=0.0, linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the field in the workflow UI.
             description (str): A description of what the parameter represents. This text will be shown in the tooltip next to the field in the workflow UI.
             default_value (float, optional): If defined this specifies the default value to be assigned to the parameter. Defaults to 0.
             minimum_value (float, optional): If defined this specifies the lowest value the field can accept. Defaults to None.
             maximum_value (float, optional): If defined this specifies the highest value the field can accept. Defaults to None.
             measurement_type (Union[MeasurementNamesEnum, str], optional): If defined this specifies the measurement type of the parameter. Defaults to None.
             display_symbol (str, optional): If defined this specifies the units of the supplied parameter.
                                             This allows the workflow to ensure that the parameter will be in the given units irrespective of the display units in the Petrel project.
                                             Defaults to None.
-
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
+                                                                    
+        Returns:
+            ParameterRef: a reference to the parameter that was added
+                                                                        
         Raises:
             ValueError: If the name is already used in the workflow.
             ValueError: If the measurement_type is not MeasurementNamesEnum or a str
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         if not isinstance(default_value, float) and not isinstance(default_value, int):
             self._is_valid = False
@@ -251,68 +405,117 @@
         if minimum_value is not None:
             _minimum_value = float(minimum_value)
 
         _maximum_value = None
         if maximum_value is not None:
             _maximum_value = float(maximum_value)
 
-        self._parameters.append(DoubleWorkflowInput(name, label, description, _default_value,
-                                                    _minimum_value, _maximum_value,
-                                                    measurement_name,
-                                                    display_symbol))
-        return self
+        workflow_input = DoubleWorkflowInput(name, label, description, _default_value,
+                                             _minimum_value, _maximum_value,
+                                             measurement_name,
+                                             display_symbol,
+                                             linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
-    def add_string_parameter(self, name: str, label: str, description: str, default_value: str = ""):
+    def add_string_parameter(self, name: str, label: str, description: str, default_value: str = "", linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a string parameter to the workflow description.
 
         This will generate a text field in the workflow UI.
 
+        **Example**:
+
+        Add a string parameter to input a string:
+
+        .. code-block:: python
+            pwr_description.add_string_parameter(name='string', label='string_input', description='string_input', default_value='Please type someting here')
+
+        **Example**:
+
+        Add a string parameter that is only enabled in the UI when the linked boolean reference is set to True:
+
+        .. code-block:: python
+            linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+            linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Enabled}
+            pwr_description.add_string_parameter(name='string', label='string_input', description='string_input', default_value='You can only type here after checking the checkbox', linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the text field in the workflow UI.
             description (str): A description of what the parameter is used for. This description will be shown in the tooltip next to the text field in the workflow UI.
             default_value (str, optional): The default value to be assigned to the parameter.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
+
+        Returns:
+            ParameterRef: a reference to the parameter that was added
 
         Raises:
             ValueError: If the name is already used in the workflow.
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         if not isinstance(default_value, str):
             self._is_valid = False
             self._error_message = f"Parameter {name}: default_value must be a str"
             raise ValueError(self._error_message)
 
-        self._parameters.append(StringWorkflowInput(name, label, description, default_value))
-        return self
+        workflow_input = StringWorkflowInput(name, label, description, default_value, linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
-    def add_enum_parameter(self, name: str, label: str, description: str, options: Dict[int, str], default_value: int = None):
+    def add_enum_parameter(self, name: str, label: str, description: str, options: Dict[int, str], default_value: int = None, linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a enum parameter to the workflow description.
 
         This will generate a combobox in the workflow UI.
 
+        **Example**:
+
+        Add an enum parameter to select between three options:
+
+        .. code-block:: python
+            pwr_description.add_enum_parameter(name='enum', label='enum_selector', description='enum_selector', options={1:"Option1", 2:"Option2", 3:"Option3"})
+
+        **Example**:
+
+        Add an enum parameter to select between three options that is only enabled in the UI when the linked boolean reference is set to True:
+
+        .. code-block:: python
+            linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+            linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Enabled}
+            pwr_description.add_enum_parameter(name='enum', label='enum_selector', description='enum_selector', options={1:"Option1", 2:"Option2", 3:"Option3"}, linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the text field in the workflow UI.
             description (str): A description of what the parameter is used for. This description will be shown in the tooltip next to the combobox in the workflow UI.
             options (Dict[int, str]): A dictionary of options where each option is described by a value and the text to be shown for it.
             default_value (int, optional): The default value to be assigned to the parameter.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
 
+        Returns:
+            ParameterRef: a reference to the parameter that was added
+                                                                        
         Raises:
             ValueError: If the name is already used in the workflow.
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         if not isinstance(options, dict):
             self._is_valid = False
@@ -348,35 +551,59 @@
             self._error_message = f"Parameter {name}: default_value must be a int"
             raise ValueError(self._error_message)
         if default_value not in valid_options.keys():
             self._is_valid = False
             self._error_message = f"Parameter {name}: default_value must be a defined option"
             raise ValueError(self._error_message)
 
-        self._parameters.append(EnumWorkflowInput(name, label, description, options, default_value))
-        return self
+        workflow_input = EnumWorkflowInput(name, label, description, valid_options, default_value, linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
-    def add_file_parameter(self, name: str, label: str, description: str, file_extensions: str, select_multiple: bool = False):
+    def add_file_parameter(self, name: str, label: str, description: str, file_extensions: str, select_multiple: bool = False, linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a file parameter to the workflow description.
 
         This will generate a file selection in the workflow UI.
 
+        **Example**:
+
+        Add a file parameter to select a file:
+
+        .. code-block:: python
+            pwr_description.add_file_parameter(name='file', label='file_selector', description='file_selector', file_extensions='*.txt')
+
+        **Example**:
+
+        Add a file parameter to select multiple files that is only enabled in the UI when the linked boolean reference is set to True:
+
+        .. code-block:: python
+            linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+            linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Enabled}
+            pwr_description.add_file_parameter(name='file', label='file_selector', description='file_selector', file_extensions='*.txt', select_multiple=True, linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the text field in the workflow UI.
             description (str): A description of what the parameter is used for. This description will be shown in the tooltip next to the text field in the workflow UI.
             file_extensions (str): The file extensions supported.
             select_multiple (bool, optional): Specifies if the parameter can contain multiple values. Defaults to False.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
 
+        Returns:
+            ParameterRef: a reference to the parameter that was added
+                                                                                                                                                
         Raises:
             ValueError: If the name is already used in the workflow.
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         if not isinstance(file_extensions, str):
             self._is_valid = False
@@ -384,75 +611,126 @@
             raise ValueError(self._error_message)
 
         if not isinstance(select_multiple, bool):
             self._is_valid = False
             self._error_message = f"Parameter {name}: select_multiple must be a bool"
             raise ValueError(self._error_message)
 
-        self._parameters.append(FileWorkflowInput(name, label, description, file_extensions, select_multiple))
-        return self
+        workflow_input = FileWorkflowInput(name, label, description, file_extensions, linked_visual_parameters, select_multiple)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
-    def add_folder_parameter(self, name: str, label: str, description: str):
+    def add_folder_parameter(self, name: str, label: str, description: str, linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a folder parameter to the workflow description.
 
         This will generate a folder selection in the workflow UI.
 
+        **Example**:
+
+        Add a folder parameter to select a folder:
+
+        .. code-block:: python
+            pwr_description.add_folder_parameter(name='folder', label='folder_selector', description='folder_selector')
+
+        **Example**:
+
+        Add a folder parameter to select a folder that is only enabled in the UI when the linked enum reference is set to "Value3":
+
+        .. code-block:: python
+            linked_enum_ref = pwr_description.add_enum_parameter(name="enum1", label="enum1", description="enum1", options={1:"Value1", 2:"Value2", 3:"Value3"}, default_value=1)
+            linked_visual_parameters = {ParameterState(linked_enum_ref, 3): VisualEnum.Enabled}
+            pwr_description.add_folder_parameter(name='folder', label='folder_selector', description='folder_selector', linked_visual_parameters=linked_visual_parameters)
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the text field in the workflow UI.
             description (str): A description of what the parameter is used for. This description will be shown in the tooltip next to the text field in the workflow UI.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
+
+        Returns:
+            ParameterRef: a reference to the parameter that was added
 
         Raises:
             ValueError: If the name is already used in the workflow.
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
-        self._parameters.append(FolderWorkflowInput(name, label, description))
-        return self
+
+        workflow_input = FolderWorkflowInput(name, label, description, linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
     def add_object_ref_parameter(self, name: str, label: str, description: str,
                                  object_type: Union[DomainObjectsEnum, str],
                                  template_type: Union[Iterable[Union[TemplateNamesEnum, str]], TemplateNamesEnum, str] = None,
                                  measurement_type: Union[MeasurementNamesEnum, str] = None,
                                  select_multiple: bool = False,
-                                 linked_input_name: str = None):
+                                 linked_input_name: str = None,
+                                 linked_visual_parameters: Dict[ParameterState, VisualEnum] = None):
         """
         Adds a string parameter to the workflow description.
 
         This will generate a domain object selector (blue arrow control) in the workflow UI.
 
         Note: If select_multiple is False then the parameter value will be set to the DROID of the selected domain object.
               If select_multiple is True then the parameter value will be a list of DROIDs for the selected domain objects.
 
+        **Example**:
+
+        Add a single object reference parameter to select a well object:
+
+        .. code-block:: python
+            pwr_description.add_object_ref_parameter(name='well', label='well_selector', description='well_selector', object_type=DomainObjectsEnum.Well)
+
+        **Example**:
+
+        Add two object reference parameters to select a well object and then select multiple well continuous log objects for the selected well. Both drop-downs are only set to be visible when the linked boolean parameter is set to True:
+
+        .. code-block:: python
+            linked_bool_ref = pwr_description.add_boolean_parameter(name="linked_bool", label="linked_bool", description="linked_bool", default_value=False)
+            linked_visual_parameters = {ParameterState(linked_bool_ref, True): VisualEnum.Visible}
+            well_ref = pwr_description.add_object_ref_parameter(name='well', label='well_selector', description='well_selector', object_type=DomainObjectsEnum.Well, select_multiple=False, linked_visual_parameters=linked_visual_parameters)
+            well_log_ref = pwr_description.add_object_ref_parameter(name='well_log', label='well_log_selector', description='well_log_selector', object_type=DomainObjectsEnum.WellContinuousLog, select_multiple=True, linked_input_name='well')
+
         Args:
             name (str): The name of the object created the parameters dictionary. This name must be unique within the workflow.
             label (str): The label text that will be displayed next to the dropbox in the workflow UI.
             description (str): A description of what the parameter is used for. This description will be shown in the tooltip next to the text field in the workflow UI.
             object_type (Union[DomainObjectsEnum, str]): The domain object type that must be supplied for this parameter.
                                                          The workflow UI will limit the user to selecting only domain objects for this type.
             template_type (Union[Iterable[Union[TemplateNamesEnum, str]], TemplateNamesEnum, str], optional): If defined this specifies the template types accepted for the parameter. Defaults to None.
             measurement_type (Union[MeasurementNamesEnum, str], optional): If defined this specifies the measurement type accepted for the parameter. Defaults to None.
             select_multiple (bool, optional): Specifies if the parameter can contain multiple values. Defaults to False.
             linked_input_name (str, optional): If defined this specifies the name of another parameter defined in the workflow which must be specified to enable this parameter in the workflow UI.
                                                Defaults to None.
+            linked_visual_parameters (Dict[ParameterState, VisualEnum], optional): Use this to specify a link between another boolean, enum or object_ref parameter state and this parameter's visual state.
+                                                                                If the linked visual parameter have correct state the parameter will be enabled/visible accordingly.
+                                                                                If adding multiple linked visual parameters, all must be true for the parameter to be enabled/visible.
+                                                                                Defaults to None.
+
+        Returns:
+            ParameterRef: a reference to the parameter that was added
 
         Raises:
             ValueError: If the name is already used in the workflow.
             ValueError: If the object_type is not DomainObjectsEnum or a str
             ValueError: If the template_type is not Iterable[TemplateNamesEnum] or a Iterable[str] or TemplateNamesEnum or a str
             ValueError: If the measurement_type is not MeasurementNamesEnum or a str
         """
 
-        valid = self._is_common_parameters_valid(name, label, description)
+        valid = self._is_common_parameters_valid(name, label, description, linked_visual_parameters)
         if not valid[0]:
             self._is_valid = False
             self._error_message = valid[1]
             raise ValueError(self._error_message)
 
         object_name = None
         if isinstance(object_type, DomainObjectsEnum):
@@ -514,42 +792,42 @@
 
         if linked_input_name:
             if not isinstance(linked_input_name, str):
                 self._is_valid = False
                 self._error_message = f"Parameter {name}: linked_input_name must be a str"
                 raise ValueError(self._error_message)
 
-        self._parameters.append(ObjectRefWorkflowInput(name, label, description,
-                                                       object_name,
-                                                       template_names,
-                                                       measurement_name,
-                                                       select_multiple,
-                                                       linked_input_name))
-        return self
+        workflow_input = ObjectRefWorkflowInput(name, label, description, object_name, template_names, measurement_name, select_multiple, linked_input_name, linked_visual_parameters)
+        self._parameters.append(workflow_input)
+        return ParameterRef(name, workflow_input)
 
     def is_valid(self) -> bool:
         """Returns a bool indicating if the workflow is valid
 
         Returns:
             bool: Indicates the if the workflow is valid
         """
         if not self._is_valid:
             return False
 
         linked_names_valid = self._linked_names_valid()
         if not linked_names_valid[0]:
             raise ValueError(linked_names_valid[1])
+        
+        linked_visual_parameters_valid = self._linked_visual_parameters_valid()
+        if not linked_visual_parameters_valid[0]:
+            raise ValueError(linked_visual_parameters_valid[1])
 
         return True
 
     def get_default_parameters(self) -> Dict[str, object]:
         """
         Returns a dictionary of the default values for parameters required by the workflow.
 
-        THis is useful when testing the workflow outside of PWR.
+        This is useful when testing the workflow outside of PWR.
 
         Returns:
             Dict[str, object]: _description_
         """
         try:
             if not self.is_valid():
                 return None
@@ -565,15 +843,16 @@
         if not isinstance(name, str):
             raise ValueError(f"Parameter {name}: name must be a str")
         item = next((x for x in self._parameters if x.get_name() == name), None)
         if item is None:
             raise ValueError(f"Parameter {name}: No parameter defined with '{name}'")
         return item.get_label()
     
-    def _is_common_parameters_valid(self, name: str, label: str, description: str) -> Tuple[bool, str]:
+
+    def _is_common_parameters_valid(self, name: str, label: str, description: str, linked_visual_parameters) -> Tuple[bool, str]:
         if not isinstance(name, str):
             return (False, f"Parameter {name}: name must be a str")
         item = next((x for x in self._parameters if x.get_name() == name), None)
         if item is not None:
             return (False, f"Parameter {name}: Parameter already defined with '{name}'")
         elif name.lower() != name:
             return (False, f"Parameter {name}: name must be lowercase")
@@ -586,30 +865,57 @@
             raise ValueError(self._error_message)
 
         if not isinstance(description, str):
             self._is_valid = False
             self._error_message = f"Parameter {name}: description must be a str"
             raise ValueError(self._error_message)
 
+        if linked_visual_parameters:
+            if not isinstance(linked_visual_parameters, dict):
+                self._is_valid = False
+                self._error_message = f"Parameter {name}: linked_visual_parameters must be a dict"
+                raise ValueError(self._error_message)
+            for key,value in linked_visual_parameters.items():
+                if not isinstance(key, ParameterState):
+                    self._is_valid = False
+                    self._error_message = f"Parameter {name}: linked_visual_parameters dict key must be a ParameterState object"
+                    raise ValueError(self._error_message)
+                if not isinstance(value, VisualEnum):
+                    self._is_valid = False
+                    self._error_message = f"Parameter {name}: linked_visual_parameters dict value must be a valid VisualEnum"
+                    raise ValueError(self._error_message)
         return (True, "")
 
     def _linked_names_valid(self) -> Tuple[bool, str]:
         for parameter in self._parameters:
             if isinstance(parameter, ObjectRefWorkflowInput):
                 linked_input_name = parameter.get_linked_input_name()
                 if linked_input_name:
                     if linked_input_name == parameter.get_name():
-                        return (False, f"Parameter '{parameter.get_name()}': cannot be is linked to itself in workflow {self._get_filepath()}")
+                        return (False, f"Parameter '{parameter.get_name()}': cannot be is linked to itself")
 
                     linked_parameter = next((x for x in self._parameters if x.get_name() == linked_input_name), None)
                     if linked_parameter is None:
-                        return (False, f"Parameter '{parameter.get_name()}': linked parameter '{linked_input_name}' is not defined in the workflow {self._get_filepath()}")
+                        return (False, f"Parameter '{parameter.get_name()}': linked parameter '{linked_input_name}' is not defined in the workflow")
+        return (True, "")
+    
+    def _linked_visual_parameters_valid(self) -> Tuple[bool, str]:
+        for parameter in self._parameters:
+            linked_visual_parameters_dict = parameter.get_linked_visual_parameters()
+            if not linked_visual_parameters_dict:
+                continue
+            for param_state in linked_visual_parameters_dict.keys():
+                linked_param_name = param_state.parameter_ref.name
+                if not linked_param_name in [x.get_name() for x in self._parameters]:
+                    return (False, f"Parameter '{parameter.get_name()}': linked visual parameter '{linked_param_name}' is not defined in the workflow")
+                is_valid = param_state.is_valid()
+                if not is_valid[0]:
+                    return (False, f"Parameter '{parameter.get_name()}': linked visual parameter key '{param_state}' is not valid in the workflow {self._get_filepath()}. {is_valid[1]}")
         return (True, "")
-
 
 class WorkflowInfo():
     def __init__(self, description: WorkflowDescription):
         self.is_valid = description.is_valid()
         self.script_type = description._get_script_type()
         self.filepath = description._get_filepath()
         self.name = description._get_name()
-        self.working_path = os.environ['pwr_working_path']
+        self.working_path = os.environ['CEGAL_PWR_TASK_WORKING_PATH']

cegalprizm/pycoderunner/workflow_inputs.py

@@ -1,24 +1,25 @@
 # Copyright 2024 Cegal AS
 # All rights reserved.
 # Unauthorized copying of this file, via any medium is strictly prohibited.
 
 from typing import Dict, List
 
-from .pycoderunner_pb2 import WellKnownWorkflowInput
+from .pycoderunner_pb2 import WellKnownWorkflowInput, EnumOption
 
 
 class BaseWorkflowInput():
 
-    def __init__(self, type: str, name: str, label: str, description: str, default_value):
+    def __init__(self, type: str, name: str, label: str, description: str, default_value, linked_visual_parameters):
         self._type = type
         self._name = name
         self._label = label
         self._description = description
         self._default_value = default_value
+        self._linked_visual_parameters = linked_visual_parameters
 
     def get_type(self):
         return self._type
 
     def get_name(self):
         return self._name
 
@@ -26,39 +27,54 @@
         return self._label
 
     def get_description(self):
         return self._description
 
     def get_default_value(self):
         return self._default_value
-
+    
+    def get_linked_visual_parameters(self):
+        return self._linked_visual_parameters
+    
+    def get_parsed_linked_visual_parameters(self) -> Dict[str, str]:
+        linked_visual_parameters = {}
+        if self._linked_visual_parameters:
+            for key,value in self._linked_visual_parameters.items():
+                new_key = key.as_string()
+                linked_visual_parameters[new_key] = str(value.name).lower()
+        return linked_visual_parameters
+    
     def get_wellknown_workflow_input(self):
         input = WellKnownWorkflowInput()
         input.name = self.get_name()
         input.type = self.get_type()
         input.label = self.get_label()
         input.description = self.get_description()
+        linked_vis_params = self.get_parsed_linked_visual_parameters()
+        if linked_vis_params is not None:
+            for key in linked_vis_params.keys():
+                input.linked_visual_parameters[key] = linked_vis_params[key]
         return input
 
 
 class BooleanWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, default_value: bool):
-        super().__init__("bool", name, label, description, default_value)
+    def __init__(self, name: str, label: str, description: str, default_value: bool, linked_visual_parameters):
+        super().__init__("bool", name, label, description, default_value, linked_visual_parameters)
 
     def get_wellknown_workflow_input(self):
         input = super().get_wellknown_workflow_input()
         input.boolean_input.default_value = self.get_default_value()
         return input
 
 
 class IntegerWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, default_value: int, minimum_value: int, maximum_value: int):
-        super().__init__("int", name, label, description, default_value)
+    def __init__(self, name: str, label: str, description: str, default_value: int, minimum_value: int, maximum_value: int, linked_visual_parameters):
+        super().__init__("int", name, label, description, default_value, linked_visual_parameters)
         self._minimum_value = minimum_value
         self._maximum_value = maximum_value
 
     def get_minimum_value(self):
         return self._minimum_value
 
     def get_maximum_value(self):
@@ -72,16 +88,16 @@
         input.int_input.has_minimum = self.get_minimum_value() is not None
         input.int_input.has_maximum = self.get_maximum_value() is not None
         return input
 
 
 class DoubleWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, default_value: float, minimum_value: float, maximum_value: float, measurement_name: str, display_symbol: str):
-        super().__init__("double", name, label, description, default_value)
+    def __init__(self, name: str, label: str, description: str, default_value: float, minimum_value: float, maximum_value: float, measurement_name: str, display_symbol: str, linked_visual_parameters):
+        super().__init__("double", name, label, description, default_value, linked_visual_parameters)
         self._minimum_value = minimum_value
         self._maximum_value = maximum_value
         self._measurement_name = measurement_name
         self._display_symbol = display_symbol
 
     def get_minimum_value(self):
         return self._minimum_value
@@ -105,41 +121,44 @@
         input.double_input.measurement_name = self.get_measurement_name() or ""
         input.double_input.display_symbol = self.get_display_symbol() or ""
         return input
 
 
 class StringWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, default_value: str):
-        super().__init__("string", name, label, description, default_value)
+    def __init__(self, name: str, label: str, description: str, default_value: str, linked_visual_parameters):
+        super().__init__("string", name, label, description, default_value, linked_visual_parameters)
 
     def get_wellknown_workflow_input(self):
         input = super().get_wellknown_workflow_input()
         input.string_input.default_value = self.get_default_value()
         return input
 
 
 class EnumWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, options: Dict[int, str], default_value: int):
-        super().__init__("enum", name, label, description, default_value)
+    def __init__(self, name: str, label: str, description: str, options: Dict[int, str], default_value: int, linked_visual_parameters: Dict[str, str]):
+        super().__init__("enum", name, label, description, default_value, linked_visual_parameters)
         self._options = options
 
     def get_wellknown_workflow_input(self):
         input = super().get_wellknown_workflow_input()
         input.enum_input.default_value = self.get_default_value()
-        for key in self._options.keys():
-            input.enum_input.options[key] = self._options[key]
+        for key, value in self._options.items():
+            enum_option = EnumOption()
+            enum_option.key = key
+            enum_option.value = value
+            input.enum_input.enum_options.append(enum_option)
         return input
 
 
 class FileWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, file_extensions: str, select_multiple: bool = False):
-        super().__init__("file", name, label, description, None)
+    def __init__(self, name: str, label: str, description: str, file_extensions: str, linked_visual_parameters: Dict[str, str], select_multiple: bool = False):
+        super().__init__("file", name, label, description, None, linked_visual_parameters)
         self._file_extensions = file_extensions
         self._select_multiple = select_multiple
 
     def get_file_extensions(self) -> bool:
         return self._file_extensions
 
     def get_select_multiple(self) -> bool:
@@ -150,26 +169,26 @@
         input.file_input.file_extensions = self.get_file_extensions()
         input.file_input.select_multiple = self.get_select_multiple()
         return input
 
 
 class FolderWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str):
-        super().__init__("folder", name, label, description, None)
+    def __init__(self, name: str, label: str, description: str, linked_visual_parameters: Dict[str, str]):
+        super().__init__("folder", name, label, description, None, linked_visual_parameters)
 
     def get_wellknown_workflow_input(self):
         input = super().get_wellknown_workflow_input()
         return input
 
 
 class ObjectRefWorkflowInput(BaseWorkflowInput):
 
-    def __init__(self, name: str, label: str, description: str, object_name: str, template_names: List[str], measurement_name: str, select_multiple: bool, linked_input_name: str):
-        super().__init__("object_ref", name, label, description, None)
+    def __init__(self, name: str, label: str, description: str, object_name: str, template_names: List[str], measurement_name: str, select_multiple: bool, linked_input_name: str, linked_visual_parameters: Dict[str, str]):
+        super().__init__("object_ref", name, label, description, None, linked_visual_parameters)
         self._object_name = object_name
         self._template_names = template_names
         self._measurement_name = measurement_name
         self._select_multiple = select_multiple
         self._linked_input_name = linked_input_name
 
     def get_object_name(self) -> str:

cegalprizm/pycoderunner/workflow_library.py

@@ -59,15 +59,16 @@
     if invalid_library_path or invalid_working_path:
         return
 
     this.environment_name = environment_name
     this.working_path = abs_working_path
     this.workflow_library_paths = workflow_library_paths
 
-    logger.info(f"working_path: { this.working_path}")
+    logger.info(f"working_path: {this.working_path}")
+    os.environ['CEGAL_PWR_TASK_WORKING_PATH'] = this.working_path
 
     refresh_library(True)
 
 
 def refresh_library(reset_library: bool = False):
     if this.workflow_library_paths is None:
         return
@@ -159,14 +160,19 @@
                         logger.warning(f'{filepath}: {error_message}')
                     elif parameters_script.is_error:
                         error_message = parameters_script.error_message
                         info._set_error_message(error_message)
                         logger.warning(f'{filepath}: {error_message}')
                     elif workflow_description[1] in parameters_script.variables.keys():
                         info = parameters_script.variables[workflow_description[1]]
+                        try:
+                            info.is_valid()
+                        except Exception as error:
+                            info._set_error_message(error.args[0])
+                            logger.warning(f'{filepath}: {error.args[0]}')
                     else:
                         error_message = f"WorkflowDescription object incorrectly defined"
                         info._set_error_message(error_message)
                         logger.warning(f'{filepath}: {error_message}')
                 else:
                     info._set_error_message(workflow_description[2])
                     logger.warning(workflow_description[2])
@@ -215,16 +221,16 @@
                 script = Script("temp", code)
 
                 if not script.is_valid:
                     return [(False, True, None, script.error_message)]
 
                 return script.run_capture_outputs(parameters)
         else:
-            logger.warning(f'{e}')
-            return [(False, True, None, f"Error running {info.name}")]
+            logger.warning(f'Unsupported script type: {info.script_type}')
+            return [(False, True, None, f"Error running {info.name} due to unsupported script type: {info.script_type}")]
 
     except Exception as e:
         logger.warning(f'{e}')
         return [(False, True, None, f"Error running workflow {e}")]
 
 
 def list_available_workflows() -> Iterable[Tuple[str, WorkflowDescription]]:

cegalprizm/pycoderunner/enums/domain_objects.py

@@ -6,14 +6,16 @@
 
 
 class DomainObjectsEnum(Enum):
     """The DomainObjectsEnum defines the supported domain objects"""
 
     Checkshots = "checkshots"
 
+    FaultInterpretation = "fault_interpretation"
+
     GlobalLogContinuous = "global_continuous_log"
     GlobalLogDiscrete = "global_discrete_log"
 
     Grid = "grid"
     GridContinuousProperty = "grid_continuous_property"
     GridDiscreteProperty = "grid_discrete_property"
     GridZone = "grid_zone"
@@ -28,14 +30,16 @@
     ObservedDataset = "observed_dataset"
     ObservedDatasetForWell = "observed_dataset_for_well"
     ObservedData = "observed_data"
 
     PointSet = "pointset"
 
     PolylineSet = "polylineset"
+    PolylineSetContinuousProperty = "polylineset_continuous_property"
+    PolylineSetDiscreteProperty = "polylineset_discrete_property"
 
     Seismic2D = "seismic_2d"
     SeismicLine = "seismic_2d"
     Seismic3D = "seismic_3d"
     SeismicCube = "seismic_3d"
 
     Surface = "surface"

Comparing cegalprizm_pycoderunner-1.0.1.dist-info/LICENSE & cegalprizm_pycoderunner-1.1.0.dist-info/LICENSE

  • Files identical despite different names

Comparing cegalprizm_pycoderunner-1.0.1.dist-info/METADATA & cegalprizm_pycoderunner-1.1.0.dist-info/METADATA

  • Files 1% similar despite different names
@@ -1,10 +1,10 @@
 Metadata-Version: 2.1
 Name: cegalprizm-pycoderunner
-Version: 1.0.1
+Version: 1.1.0
 Summary: Cegal Prizm PyCode Runner
 Home-page: https://docs.prizm.cegal-geo.com/
 Author: Cegal Prizm Team
 Author-email: [email protected]
 Classifier: Programming Language :: Python :: 3
 Classifier: License :: Other/Proprietary License
 Classifier: Operating System :: OS Independent

Comparing cegalprizm_pycoderunner-1.0.1.dist-info/RECORD & cegalprizm_pycoderunner-1.1.0.dist-info/RECORD

  • Files 10% similar despite different names
@@ -1,29 +1,29 @@
-cegalprizm/pycoderunner/__init__.py,sha256=Bo9kYmEFojzppAz2ayEHXDfMSV6jX-lq95p73JTpGek,524
-cegalprizm/pycoderunner/__main__.py,sha256=FSucCO9d47XISI8orU2bKtUasVm_f5f6FmsKV2KhLXg,5485
+cegalprizm/pycoderunner/__init__.py,sha256=rQ6WxOg8HNPu143Q6vMFINeuJRwIazEdaFfCTZSXQq0,686
+cegalprizm/pycoderunner/__main__.py,sha256=1tl7Bia4n8Os_ex2gw7A8HTVToV1eIugQ8_T8TCzOvQ,5412
 cegalprizm/pycoderunner/file_services.py,sha256=8nbnaPDAwJl7fG3DiS_723WoKGDr_Z6De-aNI66E3HI,8431
 cegalprizm/pycoderunner/hub_helper.py,sha256=QD-IgImj7-AX8_vcAf5LdunQyjDc8jEuVNu_GJO4BU8,1150
 cegalprizm/pycoderunner/notebook.py,sha256=0zoG0aFhOmIZC8hjTDrFdh3wi-P86Ez9aVNp23nCQAU,7067
 cegalprizm/pycoderunner/prizmworkflowrunner_pb2.py,sha256=xGQH9Z3MgYVdtbdV1qY0aWIR9smMyIN7_HRLOfvr6jI,11612
-cegalprizm/pycoderunner/pycoderunner_pb2.py,sha256=yDskMemKK6RgOf0glXS2qtvlHBcqk5Ic8mnRzCntKEE,74051
+cegalprizm/pycoderunner/pycoderunner_pb2.py,sha256=eoiuSXhQFjm38KPQJX104ktBOi0z69xpM8-YdgxpOMs,79221
 cegalprizm/pycoderunner/python_code_parser.py,sha256=gc51XuJBy2x0yAj0cVmgVAaXyUIg_NirOWQHkrEHz4M,5168
 cegalprizm/pycoderunner/redirects.py,sha256=m84urvWeVGS38fHFy5jOSQZyiKayfrVWp9NqChZw3V8,1313
 cegalprizm/pycoderunner/script.py,sha256=f0zkUMqXp1-LmY5P-ZJB44ULMLc2IYbK8stPBEvleHs,10576
 cegalprizm/pycoderunner/script_library.py,sha256=WiQ25O8vMkWz1d-JhZp7Dw353a83-Vwia49aukY45dI,3233
 cegalprizm/pycoderunner/task_registry.py,sha256=bhEvSNXdv3_z-vvFG3rQSgEpIGS1jtt7_LF-KmcOn_s,2893
 cegalprizm/pycoderunner/value_parameters.py,sha256=pFTx4Kb2buRT2dx4oYPRisbu97-ToDiFhZK4Kjnr7uQ,4610
-cegalprizm/pycoderunner/workflow_description.py,sha256=cONtEKAxCWH555iqkKB3-d7z4Ky-13Lsk3R-nhszhfc,29612
-cegalprizm/pycoderunner/workflow_inputs.py,sha256=P7tTpYjECyTeW7FuC3z02gtzlTnUVgNvdLivSzJjmvs,7408
-cegalprizm/pycoderunner/workflow_library.py,sha256=DySHOZ62I95ucGiUptP4E5OxQEF2F64ab23yraEkQ90,10174
-cegalprizm/pycoderunner/enums/domain_objects.py,sha256=VBWX-oHlqTso503kYaFB0U7ZszJ_HPkFtEKXGcveUKQ,2300
+cegalprizm/pycoderunner/workflow_description.py,sha256=qKYKieQDM-XMxzq_pxPQ1LOoQpziGyBEmOfhHPLqFU8,51203
+cegalprizm/pycoderunner/workflow_inputs.py,sha256=GzRDZCiyan5kU6Z1fixUppSUuwMseUttU5N6zxBLDMw,8830
+cegalprizm/pycoderunner/workflow_library.py,sha256=ASOh58cgI0v7FMtnKCX1cWmEfvsVNODmWJcreFyuh-s,10596
+cegalprizm/pycoderunner/enums/domain_objects.py,sha256=0RhBYDeGLgtdAl8te9RmHrW6cA6v7m-rAfrKj7j6s5k,2486
 cegalprizm/pycoderunner/enums/measurement_names.py,sha256=d5cpf0sslxi51PqYPBs7QBv01ZL7qplDyRGC8ir31SQ,4114
 cegalprizm/pycoderunner/enums/template_names.py,sha256=o3HdEWvaDkgC5-cPV58TVci9lGA5mQH3DZ90nDTfDAg,15698
 cegalprizm/pycoderunner/tasks/create_function.py,sha256=wi0Zv0Oi3WhNDQY1gFBcInz-AbBxM9Xfzj6AvFqORZE,1215
 cegalprizm/pycoderunner/tasks/execute_function.py,sha256=0U5PPpbqeA-EXBO8gd5vMFbHu4Am4JB9ANQu0zDuj2s,3672
 cegalprizm/pycoderunner/tasks/list_workflows.py,sha256=obYrZYtZbT1j-kxIekjOkZEVvoaGG66NQIdkkrwNnuk,1866
 cegalprizm/pycoderunner/tasks/run_script.py,sha256=UJg8hcqx0YBuXiI3dhvFKi6iEqLbdf662h0rqLCVo50,1267
 cegalprizm/pycoderunner/tasks/run_workflow.py,sha256=nxtHsF9dRGrCnSD5x08R9hRxWVmrB21UtOub4uY4m_c,3801
-cegalprizm_pycoderunner-1.0.1.dist-info/LICENSE,sha256=thvYaLNgHwrt1pAUgKXjtwjuBjlnmKi6UmJQTeNkMEo,1212
-cegalprizm_pycoderunner-1.0.1.dist-info/METADATA,sha256=g1qQ9FUKiXd6CuzjcHfeeZD2QjDsW4q271pCOC5X0Hk,2185
-cegalprizm_pycoderunner-1.0.1.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
-cegalprizm_pycoderunner-1.0.1.dist-info/top_level.txt,sha256=nyMrfe0bxu0S208gH9jYDd4o71SziEdOPhjsY3Rq5h8,16
-cegalprizm_pycoderunner-1.0.1.dist-info/RECORD,,
+cegalprizm_pycoderunner-1.1.0.dist-info/LICENSE,sha256=thvYaLNgHwrt1pAUgKXjtwjuBjlnmKi6UmJQTeNkMEo,1212
+cegalprizm_pycoderunner-1.1.0.dist-info/METADATA,sha256=2CVRNJZeozrmOngb6kQoAZTvyGwr31H3j6sfM_0EbOE,2185
+cegalprizm_pycoderunner-1.1.0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
+cegalprizm_pycoderunner-1.1.0.dist-info/top_level.txt,sha256=nyMrfe0bxu0S208gH9jYDd4o71SziEdOPhjsY3Rq5h8,16
+cegalprizm_pycoderunner-1.1.0.dist-info/RECORD,,