First pass at workflow step models - linked and unlinked.

Work scoped out in 18536.
This commit is contained in:
John Chilton
2024-08-23 09:46:44 -04:00
parent cc420a64ae
commit da220efd23
9 changed files with 585 additions and 44 deletions
@@ -1,14 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="610px" preserveAspectRatio="none" style="width:1216px;height:610px;background:#FFFFFF;" version="1.1" viewBox="0 0 1216 610" width="1216px" zoomAndPan="magnify"><defs/><g><!--MD5=[85f7edf671c9ca26ac4c2dd7910a1a26]
cluster galaxy.tool_util.parameters.state--><g id="cluster_galaxy.tool_util.parameters.state"><path d="M8.5,6 L242.5,6 A3.75,3.75 0 0 1 245,8.5 L252,28.4883 L1206.5,28.4883 A2.5,2.5 0 0 1 1209,30.9883 L1209,600.5 A2.5,2.5 0 0 1 1206.5,603 L8.5,603 A2.5,2.5 0 0 1 6,600.5 L6,8.5 A2.5,2.5 0 0 1 8.5,6 " fill="none" style="stroke:#FF8C00;stroke-width:1.5;"/><line style="stroke:#FF8C00;stroke-width:1.5;" x1="6" x2="252" y1="28.4883" y2="28.4883"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="233" x="10" y="21.5352">galaxy.tool_util.parameters.state</text></g><!--MD5=[001dd53740ce1259671441135e7c1cd4]
class ToolState--><g id="elem_ToolState"><rect codeLine="5" fill="#FFEFD5" height="113.9531" id="ToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="588" x="602" y="41"/><ellipse cx="859.25" cy="57" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M861.7231,63.1431 Q861.1421,63.4419 860.5029,63.5913 Q859.8638,63.7407 859.1582,63.7407 Q856.6514,63.7407 855.3315,62.0889 Q854.0117,60.437 854.0117,57.3159 Q854.0117,54.1865 855.3315,52.5347 Q856.6514,50.8828 859.1582,50.8828 Q859.8638,50.8828 860.5112,51.0322 Q861.1587,51.1816 861.7231,51.4805 L861.7231,54.2031 Q861.0923,53.6221 860.4988,53.3523 Q859.9053,53.0825 859.2744,53.0825 Q857.9297,53.0825 857.2449,54.1492 Q856.5601,55.2158 856.5601,57.3159 Q856.5601,59.4077 857.2449,60.4744 Q857.9297,61.541 859.2744,61.541 Q859.9053,61.541 860.4988,61.2712 Q861.0923,61.0015 861.7231,60.4204 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="879.75" y="62.291">ToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="603" x2="1189" y1="73" y2="73"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="167" x="608" y="90.5352">state_representation: str</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="172" x="608" y="107.0234">input_state: Dict[str, Any]</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="603" x2="1189" y1="113.9766" y2="113.9766"/><ellipse cx="613" cy="127.7207" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="312" x="622" y="131.5117">validate(input_models: ToolParameterBundle)</text><ellipse cx="613" cy="144.209" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="562" x="622" y="148">_to_base_model(input_models: ToolParameterBundle): Optional[Type[BaseModel]]</text></g><!--MD5=[93f66f43011efc5ae11c3d66e5c838fe]
class RequestToolState--><g id="elem_RequestToolState"><rect codeLine="12" fill="#FFEFD5" height="80.9766" id="RequestToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="22.5" y="216"/><ellipse cx="217.75" cy="232" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M220.2231,238.1431 Q219.6421,238.4419 219.0029,238.5913 Q218.3638,238.7407 217.6582,238.7407 Q215.1514,238.7407 213.8315,237.0889 Q212.5117,235.437 212.5117,232.3159 Q212.5117,229.1865 213.8315,227.5347 Q215.1514,225.8828 217.6582,225.8828 Q218.3638,225.8828 219.0112,226.0322 Q219.6587,226.1816 220.2231,226.4805 L220.2231,229.2031 Q219.5923,228.6221 218.9988,228.3523 Q218.4053,228.0825 217.7744,228.0825 Q216.4297,228.0825 215.7449,229.1492 Q215.0601,230.2158 215.0601,232.3159 Q215.0601,234.4077 215.7449,235.4744 Q216.4297,236.541 217.7744,236.541 Q218.4053,236.541 218.9988,236.2712 Q219.5923,236.0015 220.2231,235.4204 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="120" x="238.25" y="237.291">RequestToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="23.5" x2="540.5" y1="248" y2="248"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="222" x="28.5" y="265.5352">state_representation = "request"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="23.5" x2="540.5" y1="272.4883" y2="272.4883"/><ellipse cx="33.5" cy="286.2324" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="42.5" y="290.0234">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN5"><path d="M117.5,386.5 L117.5,442.4316 A0,0 0 0 0 117.5,442.4316 L360.5,442.4316 A0,0 0 0 0 360.5,442.4316 L360.5,396.5 L350.5,386.5 L250.56,386.5 L271.04,297.27 L242.56,386.5 L117.5,386.5 A0,0 0 0 0 117.5,386.5 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M350.5,386.5 L350.5,396.5 L360.5,396.5 L350.5,386.5 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="123.5" y="404.0684">Object references of the form</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="123.5" y="419.3789">{src: "hda", id: &lt;encoded_id&gt;}.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="218" x="127.5" y="434.6895">Allow mapping/reduce constructs.</text></g><!--MD5=[93d581e844301c3bb0d1bdd786d99f81]
class RequestInternalToolState--><g id="elem_RequestInternalToolState"><rect codeLine="18" fill="#FFEFD5" height="80.9766" id="RequestInternalToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="636.5" y="216"/><ellipse cx="805.25" cy="232" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M807.7231,238.1431 Q807.1421,238.4419 806.5029,238.5913 Q805.8638,238.7407 805.1582,238.7407 Q802.6514,238.7407 801.3315,237.0889 Q800.0117,235.437 800.0117,232.3159 Q800.0117,229.1865 801.3315,227.5347 Q802.6514,225.8828 805.1582,225.8828 Q805.8638,225.8828 806.5112,226.0322 Q807.1587,226.1816 807.7231,226.4805 L807.7231,229.2031 Q807.0923,228.6221 806.4988,228.3523 Q805.9053,228.0825 805.2744,228.0825 Q803.9297,228.0825 803.2449,229.1492 Q802.5601,230.2158 802.5601,232.3159 Q802.5601,234.4077 803.2449,235.4744 Q803.9297,236.541 805.2744,236.541 Q805.9053,236.541 806.4988,236.2712 Q807.0923,236.0015 807.7231,235.4204 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="173" x="825.75" y="237.291">RequestInternalToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="637.5" x2="1154.5" y1="248" y2="248"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="282" x="642.5" y="265.5352">state_representation = "request_internal"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="637.5" x2="1154.5" y1="272.4883" y2="272.4883"/><ellipse cx="647.5" cy="286.2324" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="656.5" y="290.0234">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN9"><path d="M395.5,386.5 L395.5,442.4316 A0,0 0 0 0 395.5,442.4316 L638.5,442.4316 A0,0 0 0 0 638.5,442.4316 L638.5,396.5 L628.5,386.5 L586.6,386.5 L799.87,297.07 L578.6,386.5 L395.5,386.5 A0,0 0 0 0 395.5,386.5 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M628.5,386.5 L628.5,396.5 L638.5,396.5 L628.5,386.5 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="401.5" y="404.0684">Object references of the form</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="401.5" y="419.3789">{src: "hda", id: &lt;decoded_id&gt;}.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="218" x="405.5" y="434.6895">Allow mapping/reduce constructs.</text></g><!--MD5=[48b694eadbf7bc2510a32379c1b70352]
class JobInternalToolState--><g id="elem_JobInternalToolState"><rect codeLine="24" fill="#FFEFD5" height="80.9766" id="JobInternalToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="673.5" y="374"/><ellipse cx="858.75" cy="390" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M861.2231,396.1431 Q860.6421,396.4419 860.0029,396.5913 Q859.3638,396.7407 858.6582,396.7407 Q856.1514,396.7407 854.8315,395.0889 Q853.5117,393.437 853.5117,390.3159 Q853.5117,387.1865 854.8315,385.5347 Q856.1514,383.8828 858.6582,383.8828 Q859.3638,383.8828 860.0112,384.0322 Q860.6587,384.1816 861.2231,384.4805 L861.2231,387.2031 Q860.5923,386.6221 859.9988,386.3523 Q859.4053,386.0825 858.7744,386.0825 Q857.4297,386.0825 856.7449,387.1492 Q856.0601,388.2158 856.0601,390.3159 Q856.0601,392.4077 856.7449,393.4744 Q857.4297,394.541 858.7744,394.541 Q859.4053,394.541 859.9988,394.2712 Q860.5923,394.0015 861.2231,393.4204 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="140" x="879.25" y="395.291">JobInternalToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="674.5" x2="1191.5" y1="406" y2="406"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="252" x="679.5" y="423.5352">state_representation = "job_internal"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="674.5" x2="1191.5" y1="430.4883" y2="430.4883"/><ellipse cx="684.5" cy="444.2324" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="693.5" y="448.0234">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN13"><path d="M811,516 L811,587.2422 A0,0 0 0 0 811,587.2422 L1055,587.2422 A0,0 0 0 0 1055,587.2422 L1055,526 L1045,516 L937,516 L933,455.27 L929,516 L811,516 A0,0 0 0 0 811,516 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M1045,516 L1045,526 L1055,526 L1045,516 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="817" y="533.5684">Object references of the form</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="817" y="548.8789">{src: "hda", id: &lt;decoded_id&gt;}.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="219" x="821" y="564.1895">Mapping constructs expanded out.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="144" x="821" y="579.5">(Defaults are inserted?)</text></g><!--MD5=[269f52e8487e2a76b96d386d755c75d8]
reverse link ToolState to RequestToolState--><g id="link_ToolState_RequestToolState"><path codeLine="31" d="M656.48,160.05 C582.86,178.81 503.81,198.96 437.39,215.89 " fill="none" id="ToolState-backto-RequestToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="654.96,153.21,676.07,155.06,658.41,166.78,654.96,153.21" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[dd93b154e0c0c396ba5562a34580b1a6]
reverse link ToolState to RequestInternalToolState--><g id="link_ToolState_RequestInternalToolState"><path codeLine="32" d="M896,175.22 C896,189.16 896,203.19 896,215.53 " fill="none" id="ToolState-backto-RequestInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="889,175.06,896,155.06,903,175.06,889,175.06" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[36305bbce111c7e7d9f6236ae242d2c7]
reverse link ToolState to JobInternalToolState--><g id="link_ToolState_JobInternalToolState"><path codeLine="33" d="M1122.97,165.89 C1142.51,179.6 1159.81,196.12 1173,216 C1192.9,246 1192.11,266.49 1173,297 C1151.18,331.84 1115.65,356.52 1078.53,373.91 " fill="none" id="ToolState-backto-JobInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="1119.11,171.73,1106.08,155.02,1126.69,159.96,1119.11,171.73" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[7b766fbe81ea9c5eae779649ae0bfd4b]
link RequestToolState to RequestInternalToolState--><g id="link_RequestToolState_RequestInternalToolState"><path codeLine="35" d="M541.5,256.5 C572.92,256.5 605.02,256.5 636.44,256.5 " fill="none" id="RequestToolState-RequestInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="#FF8C00" points="569,245.1553,559.9549,242.2163,559.9549,248.0942,569,245.1553" style="stroke:#FF8C00;stroke-width:1.0;"/><text fill="#FF8C00" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="45" x="573" y="250.0684">decode</text></g><!--MD5=[58ea8d0dd38b3ecdcd8a6254103a6005]
reverse link RequestInternalToolState to JobInternalToolState--><g id="link_RequestInternalToolState_JobInternalToolState"><path codeLine="37" d="M908.49,310.15 C913.42,330.96 919,354.47 923.58,373.8 " fill="none" id="RequestInternalToolState-backto-JobInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="905.43,297.27,902.9233,304.0314,908.2005,308.9458,910.7072,302.1844,905.43,297.27" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="#FF8C00" points="921.1534,340.5204,921.9265,331.0413,916.2072,332.3973,921.1534,340.5204" style="stroke:#FF8C00;stroke-width:1.0;"/><text fill="#FF8C00" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="46" x="929" y="340.5684">expand</text></g><!--MD5=[0d7ae2a554129f1319cf4558a344912d]
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="610px" preserveAspectRatio="none" style="width:2482px;height:610px;background:#FFFFFF;" version="1.1" viewBox="0 0 2482 610" width="2482px" zoomAndPan="magnify"><defs/><g><!--MD5=[85f7edf671c9ca26ac4c2dd7910a1a26]
cluster galaxy.tool_util.parameters.state--><g id="cluster_galaxy.tool_util.parameters.state"><path d="M8.5,6 L242.5,6 A3.75,3.75 0 0 1 245,8.5 L252,28.4883 L2472.5,28.4883 A2.5,2.5 0 0 1 2475,30.9883 L2475,600.65 A2.5,2.5 0 0 1 2472.5,603.15 L8.5,603.15 A2.5,2.5 0 0 1 6,600.65 L6,8.5 A2.5,2.5 0 0 1 8.5,6 " fill="none" style="stroke:#FF8C00;stroke-width:1.5;"/><line style="stroke:#FF8C00;stroke-width:1.5;" x1="6" x2="252" y1="28.4883" y2="28.4883"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="233" x="10" y="21.5352">galaxy.tool_util.parameters.state</text></g><!--MD5=[001dd53740ce1259671441135e7c1cd4]
class ToolState--><g id="elem_ToolState"><rect codeLine="5" fill="#FFEFD5" height="113.9531" id="ToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="588" x="971" y="41"/><ellipse cx="1228.25" cy="57" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M1230.7231,63.1431 Q1230.1421,63.4419 1229.5029,63.5913 Q1228.8638,63.7407 1228.1582,63.7407 Q1225.6514,63.7407 1224.3315,62.0889 Q1223.0117,60.437 1223.0117,57.3159 Q1223.0117,54.1865 1224.3315,52.5347 Q1225.6514,50.8828 1228.1582,50.8828 Q1228.8638,50.8828 1229.5112,51.0322 Q1230.1587,51.1816 1230.7231,51.4805 L1230.7231,54.2031 Q1230.0923,53.6221 1229.4988,53.3523 Q1228.9053,53.0825 1228.2744,53.0825 Q1226.9297,53.0825 1226.2449,54.1492 Q1225.5601,55.2158 1225.5601,57.3159 Q1225.5601,59.4077 1226.2449,60.4744 Q1226.9297,61.541 1228.2744,61.541 Q1228.9053,61.541 1229.4988,61.2712 Q1230.0923,61.0015 1230.7231,60.4204 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="65" x="1248.75" y="62.291">ToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="972" x2="1558" y1="73" y2="73"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="167" x="977" y="90.5352">state_representation: str</text><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="172" x="977" y="107.0234">input_state: Dict[str, Any]</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="972" x2="1558" y1="113.9766" y2="113.9766"/><ellipse cx="982" cy="127.7207" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="312" x="991" y="131.5117">validate(input_models: ToolParameterBundle)</text><ellipse cx="982" cy="144.209" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacing" textLength="562" x="991" y="148">_to_base_model(input_models: ToolParameterBundle): Optional[Type[BaseModel]]</text></g><!--MD5=[93f66f43011efc5ae11c3d66e5c838fe]
class RequestToolState--><g id="elem_RequestToolState"><rect codeLine="12" fill="#FFEFD5" height="80.9766" id="RequestToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="21.5" y="215.95"/><ellipse cx="216.75" cy="231.95" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M219.2231,238.0931 Q218.6421,238.3919 218.0029,238.5413 Q217.3638,238.6907 216.6582,238.6907 Q214.1514,238.6907 212.8315,237.0389 Q211.5117,235.387 211.5117,232.2659 Q211.5117,229.1365 212.8315,227.4847 Q214.1514,225.8328 216.6582,225.8328 Q217.3638,225.8328 218.0112,225.9822 Q218.6587,226.1316 219.2231,226.4305 L219.2231,229.1531 Q218.5923,228.5721 217.9988,228.3023 Q217.4053,228.0325 216.7744,228.0325 Q215.4297,228.0325 214.7449,229.0992 Q214.0601,230.1658 214.0601,232.2659 Q214.0601,234.3577 214.7449,235.4244 Q215.4297,236.491 216.7744,236.491 Q217.4053,236.491 217.9988,236.2212 Q218.5923,235.9515 219.2231,235.3704 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="120" x="237.25" y="237.241">RequestToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="22.5" x2="539.5" y1="247.95" y2="247.95"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="222" x="27.5" y="265.4852">state_representation = "request"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="22.5" x2="539.5" y1="272.4383" y2="272.4383"/><ellipse cx="32.5" cy="286.1824" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="41.5" y="289.9734">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN5"><path d="M22.5,386.45 L22.5,442.3816 A0,0 0 0 0 22.5,442.3816 L265.5,442.3816 A0,0 0 0 0 265.5,442.3816 L265.5,396.45 L255.5,386.45 L172.07,386.45 L246.07,297.21 L164.07,386.45 L22.5,386.45 A0,0 0 0 0 22.5,386.45 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M255.5,386.45 L255.5,396.45 L265.5,396.45 L255.5,386.45 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="28.5" y="404.0184">Object references of the form</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="28.5" y="419.3289">{src: "hda", id: &lt;encoded_id&gt;}.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="218" x="32.5" y="434.6395">Allow mapping/reduce constructs.</text></g><!--MD5=[93d581e844301c3bb0d1bdd786d99f81]
class RequestInternalToolState--><g id="elem_RequestInternalToolState"><rect codeLine="18" fill="#FFEFD5" height="80.9766" id="RequestInternalToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="634.5" y="215.95"/><ellipse cx="803.25" cy="231.95" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M805.7231,238.0931 Q805.1421,238.3919 804.5029,238.5413 Q803.8638,238.6907 803.1582,238.6907 Q800.6514,238.6907 799.3315,237.0389 Q798.0117,235.387 798.0117,232.2659 Q798.0117,229.1365 799.3315,227.4847 Q800.6514,225.8328 803.1582,225.8328 Q803.8638,225.8328 804.5112,225.9822 Q805.1587,226.1316 805.7231,226.4305 L805.7231,229.1531 Q805.0923,228.5721 804.4988,228.3023 Q803.9053,228.0325 803.2744,228.0325 Q801.9297,228.0325 801.2449,229.0992 Q800.5601,230.1658 800.5601,232.2659 Q800.5601,234.3577 801.2449,235.4244 Q801.9297,236.491 803.2744,236.491 Q803.9053,236.491 804.4988,236.2212 Q805.0923,235.9515 805.7231,235.3704 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="173" x="823.75" y="237.241">RequestInternalToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="635.5" x2="1152.5" y1="247.95" y2="247.95"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="282" x="640.5" y="265.4852">state_representation = "request_internal"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="635.5" x2="1152.5" y1="272.4383" y2="272.4383"/><ellipse cx="645.5" cy="286.1824" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="654.5" y="289.9734">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN9"><path d="M300.5,386.45 L300.5,442.3816 A0,0 0 0 0 300.5,442.3816 L543.5,442.3816 A0,0 0 0 0 543.5,442.3816 L543.5,396.45 L533.5,386.45 L509.08,386.45 L773.06,297.41 L501.08,386.45 L300.5,386.45 A0,0 0 0 0 300.5,386.45 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M533.5,386.45 L533.5,396.45 L543.5,396.45 L533.5,386.45 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="306.5" y="404.0184">Object references of the form</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="306.5" y="419.3289">{src: "hda", id: &lt;decoded_id&gt;}.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="218" x="310.5" y="434.6395">Allow mapping/reduce constructs.</text></g><!--MD5=[48b694eadbf7bc2510a32379c1b70352]
class JobInternalToolState--><g id="elem_JobInternalToolState"><rect codeLine="24" fill="#FFEFD5" height="80.9766" id="JobInternalToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="578.5" y="373.93"/><ellipse cx="763.75" cy="389.93" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M766.2231,396.0731 Q765.6421,396.3719 765.0029,396.5213 Q764.3638,396.6707 763.6582,396.6707 Q761.1514,396.6707 759.8315,395.0189 Q758.5117,393.367 758.5117,390.2459 Q758.5117,387.1165 759.8315,385.4647 Q761.1514,383.8128 763.6582,383.8128 Q764.3638,383.8128 765.0112,383.9622 Q765.6587,384.1116 766.2231,384.4105 L766.2231,387.1331 Q765.5923,386.5521 764.9988,386.2823 Q764.4053,386.0125 763.7744,386.0125 Q762.4297,386.0125 761.7449,387.0792 Q761.0601,388.1458 761.0601,390.2459 Q761.0601,392.3377 761.7449,393.4044 Q762.4297,394.471 763.7744,394.471 Q764.4053,394.471 764.9988,394.2012 Q765.5923,393.9315 766.2231,393.3504 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="140" x="784.25" y="395.221">JobInternalToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="579.5" x2="1096.5" y1="405.93" y2="405.93"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="252" x="584.5" y="423.4652">state_representation = "job_internal"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="579.5" x2="1096.5" y1="430.4183" y2="430.4183"/><ellipse cx="589.5" cy="444.1624" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="598.5" y="447.9534">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN13"><path d="M716,515.91 L716,587.1522 A0,0 0 0 0 716,587.1522 L960,587.1522 A0,0 0 0 0 960,587.1522 L960,525.91 L950,515.91 L842,515.91 L838,455.23 L834,515.91 L716,515.91 A0,0 0 0 0 716,515.91 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M950,515.91 L950,525.91 L960,525.91 L950,515.91 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="722" y="533.4784">Object references of the form</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="192" x="722" y="548.7889">{src: "hda", id: &lt;decoded_id&gt;}.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="219" x="726" y="564.0995">Mapping constructs expanded out.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="144" x="726" y="579.41">(Defaults are inserted?)</text></g><!--MD5=[b5be25705a3035794fde528f69705fe5]
class TestCaseToolState--><g id="elem_TestCaseToolState"><rect codeLine="31" fill="#FFEFD5" height="80.9766" id="TestCaseToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="1224.5" y="215.95"/><ellipse cx="1416.25" cy="231.95" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M1418.7231,238.0931 Q1418.1421,238.3919 1417.5029,238.5413 Q1416.8638,238.6907 1416.1582,238.6907 Q1413.6514,238.6907 1412.3315,237.0389 Q1411.0117,235.387 1411.0117,232.2659 Q1411.0117,229.1365 1412.3315,227.4847 Q1413.6514,225.8328 1416.1582,225.8328 Q1416.8638,225.8328 1417.5112,225.9822 Q1418.1587,226.1316 1418.7231,226.4305 L1418.7231,229.1531 Q1418.0923,228.5721 1417.4988,228.3023 Q1416.9053,228.0325 1416.2744,228.0325 Q1414.9297,228.0325 1414.2449,229.0992 Q1413.5601,230.1658 1413.5601,232.2659 Q1413.5601,234.3577 1414.2449,235.4244 Q1414.9297,236.491 1416.2744,236.491 Q1416.9053,236.491 1417.4988,236.2212 Q1418.0923,235.9515 1418.7231,235.3704 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="127" x="1436.75" y="237.241">TestCaseToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="1225.5" x2="1742.5" y1="247.95" y2="247.95"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="232" x="1230.5" y="265.4852">state_representation = "test_case"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="1225.5" x2="1742.5" y1="272.4383" y2="272.4383"/><ellipse cx="1235.5" cy="286.1824" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="1244.5" y="289.9734">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN17"><path d="M1132.5,386.45 L1132.5,442.3816 A0,0 0 0 0 1132.5,442.3816 L1463.5,442.3816 A0,0 0 0 0 1463.5,442.3816 L1463.5,396.45 L1453.5,386.45 L1334.68,386.45 L1436.58,297.21 L1326.68,386.45 L1132.5,386.45 A0,0 0 0 0 1132.5,386.45 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M1453.5,386.45 L1453.5,396.45 L1463.5,396.45 L1453.5,386.45 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="310" x="1138.5" y="404.0184">Object references of the form file name and URIs.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="206" x="1142.5" y="419.3289">Mapping constructs not allowed.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="4" x="1138.5" y="434.6395"> </text></g><!--MD5=[0b5cf8096012b23efe80636e21325a2e]
class WorkflowStepToolState--><g id="elem_WorkflowStepToolState"><rect codeLine="37" fill="#FFEFD5" height="80.9766" id="WorkflowStepToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="1778.5" y="215.95"/><ellipse cx="1954.25" cy="231.95" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M1956.7231,238.0931 Q1956.1421,238.3919 1955.5029,238.5413 Q1954.8638,238.6907 1954.1582,238.6907 Q1951.6514,238.6907 1950.3315,237.0389 Q1949.0117,235.387 1949.0117,232.2659 Q1949.0117,229.1365 1950.3315,227.4847 Q1951.6514,225.8328 1954.1582,225.8328 Q1954.8638,225.8328 1955.5112,225.9822 Q1956.1587,226.1316 1956.7231,226.4305 L1956.7231,229.1531 Q1956.0923,228.5721 1955.4988,228.3023 Q1954.9053,228.0325 1954.2744,228.0325 Q1952.9297,228.0325 1952.2449,229.0992 Q1951.5601,230.1658 1951.5601,232.2659 Q1951.5601,234.3577 1952.2449,235.4244 Q1952.9297,236.491 1954.2744,236.491 Q1954.9053,236.491 1955.4988,236.2212 Q1956.0923,235.9515 1956.7231,235.3704 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="159" x="1974.75" y="237.241">WorkflowStepToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="1779.5" x2="2296.5" y1="247.95" y2="247.95"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="269" x="1784.5" y="265.4852">state_representation = "workflow_step"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="1779.5" x2="2296.5" y1="272.4383" y2="272.4383"/><ellipse cx="1789.5" cy="286.1824" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="1798.5" y="289.9734">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN21"><path d="M1498.5,394.11 L1498.5,434.7311 A0,0 0 0 0 1498.5,434.7311 L1905.5,434.7311 A0,0 0 0 0 1905.5,434.7311 L1905.5,404.11 L1895.5,394.11 L1748.36,394.11 L1951.91,297.41 L1740.36,394.11 L1498.5,394.11 A0,0 0 0 0 1498.5,394.11 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M1895.5,394.11 L1895.5,404.11 L1905.5,404.11 L1895.5,394.11 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="386" x="1504.5" y="411.6784">Nearly everything optional except conditional discriminators.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="4" x="1504.5" y="426.9889"> </text></g><!--MD5=[542f134bb4b15aef48a778eaaf117be7]
class WorkflowStepLinkedToolState--><g id="elem_WorkflowStepLinkedToolState"><rect codeLine="43" fill="#FFEFD5" height="80.9766" id="WorkflowStepLinkedToolState" rx="2.5" ry="2.5" style="stroke:#FF8C00;stroke-width:0.5;" width="519" x="1940.5" y="373.93"/><ellipse cx="2093.75" cy="389.93" fill="#ADD1B2" rx="11" ry="11" style="stroke:#181818;stroke-width:1.0;"/><path d="M2096.2231,396.0731 Q2095.6421,396.3719 2095.0029,396.5213 Q2094.3638,396.6707 2093.6582,396.6707 Q2091.1514,396.6707 2089.8315,395.0189 Q2088.5117,393.367 2088.5117,390.2459 Q2088.5117,387.1165 2089.8315,385.4647 Q2091.1514,383.8128 2093.6582,383.8128 Q2094.3638,383.8128 2095.0112,383.9622 Q2095.6587,384.1116 2096.2231,384.4105 L2096.2231,387.1331 Q2095.5923,386.5521 2094.9988,386.2823 Q2094.4053,386.0125 2093.7744,386.0125 Q2092.4297,386.0125 2091.7449,387.0792 Q2091.0601,388.1458 2091.0601,390.2459 Q2091.0601,392.3377 2091.7449,393.4044 Q2092.4297,394.471 2093.7744,394.471 Q2094.4053,394.471 2094.9988,394.2012 Q2095.5923,393.9315 2096.2231,393.3504 Z " fill="#000000"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="204" x="2114.25" y="395.221">WorkflowStepLinkedToolState</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="1941.5" x2="2458.5" y1="405.93" y2="405.93"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="318" x="1946.5" y="423.4652">state_representation = "workflow_step_linked"</text><line style="stroke:#FF8C00;stroke-width:0.5;" x1="1941.5" x2="2458.5" y1="430.4183" y2="430.4183"/><ellipse cx="1951.5" cy="444.1624" fill="#84BE84" rx="3" ry="3" style="stroke:#038048;stroke-width:1.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="493" x="1960.5" y="447.9534">_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]</text></g><g id="elem_GMN25"><path d="M1977.5,523.56 L1977.5,579.4916 A0,0 0 0 0 1977.5,579.4916 L2422.5,579.4916 A0,0 0 0 0 2422.5,579.4916 L2422.5,533.56 L2412.5,523.56 L2204,523.56 L2200,455.23 L2196,523.56 L1977.5,523.56 A0,0 0 0 0 1977.5,523.56 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><path d="M2412.5,523.56 L2412.5,533.56 L2422.5,533.56 L2412.5,523.56 " fill="#FFEFD5" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="424" x="1983.5" y="541.1284">Expect pre-process ``in`` dictionaries and bring in representation</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="309" x="1987.5" y="556.4389">of links and defaults and validate them in model.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="4" x="1983.5" y="571.7495"> </text></g><!--MD5=[269f52e8487e2a76b96d386d755c75d8]
reverse link ToolState to RequestToolState--><g id="link_ToolState_RequestToolState"><path codeLine="49" d="M949.73,149.11 C814.82,170.56 659.47,195.26 532.47,215.46 " fill="none" id="ToolState-backto-RequestToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="948.42,142.23,969.27,146,950.62,156.06,948.42,142.23" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[dd93b154e0c0c396ba5562a34580b1a6]
reverse link ToolState to RequestInternalToolState--><g id="link_ToolState_RequestInternalToolState"><path codeLine="50" d="M1111.71,163.63 C1070,181.22 1026.04,199.76 988.64,215.53 " fill="none" id="ToolState-backto-RequestInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="1108.78,157.27,1129.93,155.94,1114.22,170.16,1108.78,157.27" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[36305bbce111c7e7d9f6236ae242d2c7]
reverse link ToolState to JobInternalToolState--><g id="link_ToolState_JobInternalToolState"><path codeLine="51" d="M1227.07,174.31 C1220.29,188.11 1213.36,202.43 1207,215.95 C1190.25,251.6 1199.97,270.24 1171,296.93 C1133.16,331.79 1084.3,356.32 1035.73,373.54 " fill="none" id="ToolState-backto-JobInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="1220.68,171.45,1235.82,156.63,1233.22,177.66,1220.68,171.45" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[9c881c60fbac45c77e4761a7bd9f78b2]
reverse link ToolState to TestCaseToolState--><g id="link_ToolState_TestCaseToolState"><path codeLine="52" d="M1361.08,167.63 C1384.04,184.03 1407.79,201 1428.23,215.6 " fill="none" id="ToolState-backto-TestCaseToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="1357.19,173.45,1344.99,156.12,1365.33,162.06,1357.19,173.45" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[6e0dcd3c78d7670a6ff8f7e8edcb95ac]
reverse link ToolState to WorkflowStepToolState--><g id="link_ToolState_WorkflowStepToolState"><path codeLine="53" d="M1564.67,159.64 C1657.25,178.37 1756.83,198.53 1840.66,215.5 " fill="none" id="ToolState-backto-WorkflowStepToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="1563.49,166.54,1545.28,155.71,1566.27,152.82,1563.49,166.54" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[4d55efd884362c553ce3b70d5bb3d0d7]
reverse link ToolState to WorkflowStepLinkedToolState--><g id="link_ToolState_WorkflowStepLinkedToolState"><path codeLine="54" d="M1580.52,114.48 C1870.58,131.86 2263.29,164.53 2315,215.95 C2355.54,256.27 2357.23,294.8 2328,343.93 C2321.08,355.56 2311.47,365.36 2300.58,373.59 " fill="none" id="ToolState-backto-WorkflowStepLinkedToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="1580.45,121.49,1560.9,113.32,1581.28,107.51,1580.45,121.49" style="stroke:#FFA500;stroke-width:1.0;"/></g><!--MD5=[7b766fbe81ea9c5eae779649ae0bfd4b]
link RequestToolState to RequestInternalToolState--><g id="link_RequestToolState_RequestInternalToolState"><path codeLine="56" d="M540.97,256.44 C571.8,256.44 603.28,256.44 634.12,256.44 " fill="none" id="RequestToolState-RequestInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="#FF8C00" points="567.5,245.0953,558.4549,242.1563,558.4549,248.0342,567.5,245.0953" style="stroke:#FF8C00;stroke-width:1.0;"/><text fill="#FF8C00" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="45" x="571.5" y="250.0084">decode</text></g><!--MD5=[58ea8d0dd38b3ecdcd8a6254103a6005]
reverse link RequestInternalToolState to JobInternalToolState--><g id="link_RequestInternalToolState_JobInternalToolState"><path codeLine="58" d="M874.91,310.62 C867.52,331.2 859.21,354.35 852.35,373.46 " fill="none" id="RequestInternalToolState-backto-JobInternalToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="879.21,298.63,873.4193,302.9274,875.1589,309.9255,880.9496,305.6281,879.21,298.63" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="#FF8C00" points="870.3105,340.2912,876.1329,332.7711,870.6007,330.7851,870.3105,340.2912" style="stroke:#FF8C00;stroke-width:1.0;"/><text fill="#FF8C00" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="46" x="881" y="340.4984">expand</text></g><!--MD5=[1bcb7e5577c97a9a9dc82459e6e9a8ef]
reverse link WorkflowStepToolState to WorkflowStepLinkedToolState--><g id="link_WorkflowStepToolState_WorkflowStepLinkedToolState"><path codeLine="60" d="M2079.85,308 C2090.6,320.14 2102.4,332.81 2114,343.93 C2124.53,354.03 2136.38,364.26 2147.85,373.65 " fill="none" id="WorkflowStepToolState-backto-WorkflowStepLinkedToolState" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="none" points="2071.32,298.19,2072.2363,305.3426,2079.1912,307.2478,2078.2749,300.0952,2071.32,298.19" style="stroke:#FFA500;stroke-width:1.0;"/><polygon fill="#FF8C00" points="2122.5971,339.0581,2118.1311,330.6613,2114.0486,334.89,2122.5971,339.0581" style="stroke:#FF8C00;stroke-width:1.0;"/><text fill="#FF8C00" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="195" x="2128" y="340.4984">preprocess_links_and_defaults</text></g><!--MD5=[220dfebf4a9727230486ad40d40caad6]
@startuml
!include plantuml_options.txt

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 28 KiB

+17 -1
View File
@@ -42,6 +42,8 @@ from .models import (
validate_internal_request,
validate_request,
validate_test_case,
validate_workflow_step,
validate_workflow_step_linked,
)
from .state import (
JobInternalToolState,
@@ -49,8 +51,15 @@ from .state import (
RequestToolState,
TestCaseToolState,
ToolState,
WorkflowStepLinkedToolState,
WorkflowStepToolState,
)
from .visitor import (
flat_state_path,
keys_starting_with,
repeat_inputs_to_array,
visit_input_values,
)
from .visitor import visit_input_values
__all__ = (
"from_input_source",
@@ -89,13 +98,20 @@ __all__ = (
"validate_internal_request",
"validate_request",
"validate_test_case",
"validate_workflow_step",
"validate_workflow_step_linked",
"ToolState",
"TestCaseToolState",
"ToolParameterT",
"to_json_schema_string",
"RequestToolState",
"RequestInternalToolState",
"flat_state_path",
"keys_starting_with",
"visit_input_values",
"repeat_inputs_to_array",
"decode",
"encode",
"WorkflowStepToolState",
"WorkflowStepLinkedToolState",
)
+6 -1
View File
@@ -20,10 +20,15 @@ from typing_extensions import (
)
def optional(type: Type) -> Type:
return_type: Type = Optional[type] # type: ignore[assignment]
return return_type
def optional_if_needed(type: Type, is_optional: bool) -> Type:
return_type: Type = type
if is_optional:
return_type = Optional[type] # type: ignore[assignment]
return_type = optional(type)
return return_type
+2 -10
View File
@@ -19,6 +19,7 @@ from .models import (
BaseUrlParameterModel,
BooleanParameterModel,
ColorParameterModel,
cond_test_parameter_default_value,
ConditionalParameterModel,
ConditionalWhen,
CwlBooleanParameterModel,
@@ -211,16 +212,7 @@ def _from_input_source_galaxy(input_source: InputSource) -> ToolParameterT:
Union[BooleanParameterModel, SelectParameterModel], _from_input_source_galaxy(test_param_input_source)
)
whens = []
default_value = object()
if isinstance(test_parameter, BooleanParameterModel):
default_value = test_parameter.value
elif isinstance(test_parameter, SelectParameterModel):
select_parameter = cast(SelectParameterModel, test_parameter)
select_default_value = select_parameter.default_value
if select_default_value is not None:
default_value = select_default_value
# TODO: handle select parameter model...
default_value = cond_test_parameter_default_value(test_parameter)
for value, case_inputs_sources in input_source.parse_when_input_sources():
if isinstance(test_parameter, BooleanParameterModel):
# TODO: investigate truevalue/falsevalue when...
+136 -17
View File
@@ -44,6 +44,7 @@ from ._types import (
cast_as_type,
is_optional,
list_type,
optional,
optional_if_needed,
union_type,
)
@@ -55,7 +56,9 @@ from ._types import (
# + request: Return info needed to build request pydantic model at runtime.
# + request_internal: This is a pydantic model to validate what Galaxy expects to find in the database,
# in particular dataset and collection references should be decoded integers.
StateRepresentationT = Literal["request", "request_internal", "job_internal", "test_case"]
StateRepresentationT = Literal[
"request", "request_internal", "job_internal", "test_case", "workflow_step", "workflow_step_linked"
]
# could be made more specific - validators need to be classmethod
@@ -72,6 +75,14 @@ class StrictModel(BaseModel):
model_config = ConfigDict(extra="forbid")
class ConnectedValue(BaseModel):
discriminator: Literal["ConnectedValue"] = Field(alias="__class__")
def allow_connected_value(type: Type):
return union_type([type, ConnectedValue])
def allow_batching(job_template: DynamicModelInformation, batch_type: Optional[Type] = None) -> DynamicModelInformation:
job_py_type: Type = job_template.definition[0]
default_value = job_template.definition[1]
@@ -107,11 +118,15 @@ class ParamModel(Protocol):
...
def dynamic_model_information_from_py_type(param_model: ParamModel, py_type: Type):
def dynamic_model_information_from_py_type(
param_model: ParamModel, py_type: Type, requires_value: Optional[bool] = None
):
name = param_model.name
initialize = ... if param_model.request_requires_value else None
if requires_value is None:
requires_value = param_model.request_requires_value
initialize = ... if requires_value else None
py_type_is_optional = is_optional(py_type)
if not py_type_is_optional and not param_model.request_requires_value:
if not py_type_is_optional and not requires_value:
validators = {"not_null": field_validator(name)(Validators.validate_not_none)}
else:
validators = {}
@@ -161,7 +176,10 @@ class TextParameterModel(BaseGalaxyToolParameterModelDefinition):
return optional_if_needed(StrictStr, self.optional)
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
return dynamic_model_information_from_py_type(self, self.py_type)
py_type = self.py_type
if state_representation == "workflow_step_linked":
py_type = allow_connected_value(py_type)
return dynamic_model_information_from_py_type(self, py_type)
@property
def request_requires_value(self) -> bool:
@@ -180,7 +198,10 @@ class IntegerParameterModel(BaseGalaxyToolParameterModelDefinition):
return optional_if_needed(StrictInt, self.optional)
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
return dynamic_model_information_from_py_type(self, self.py_type)
py_type = self.py_type
if state_representation == "workflow_step_linked":
py_type = allow_connected_value(py_type)
return dynamic_model_information_from_py_type(self, py_type)
@property
def request_requires_value(self) -> bool:
@@ -198,7 +219,10 @@ class FloatParameterModel(BaseGalaxyToolParameterModelDefinition):
return optional_if_needed(union_type([StrictInt, StrictFloat]), self.optional)
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
return dynamic_model_information_from_py_type(self, self.py_type)
py_type = self.py_type
if state_representation == "workflow_step_linked":
py_type = allow_connected_value(py_type)
return dynamic_model_information_from_py_type(self, py_type)
@property
def request_requires_value(self) -> bool:
@@ -302,6 +326,10 @@ class DataParameterModel(BaseGalaxyToolParameterModelDefinition):
return dynamic_model_information_from_py_type(self, self.py_type_internal)
elif state_representation == "test_case":
return dynamic_model_information_from_py_type(self, self.py_type_test_case)
elif state_representation == "workflow_step":
return dynamic_model_information_from_py_type(self, type(None), requires_value=False)
elif state_representation == "workflow_step_linked":
return dynamic_model_information_from_py_type(self, ConnectedValue)
@property
def request_requires_value(self) -> bool:
@@ -337,8 +365,14 @@ class DataCollectionParameterModel(BaseGalaxyToolParameterModelDefinition):
return allow_batching(dynamic_model_information_from_py_type(self, self.py_type))
elif state_representation == "request_internal":
return allow_batching(dynamic_model_information_from_py_type(self, self.py_type_internal))
elif state_representation == "workflow_step":
return dynamic_model_information_from_py_type(self, type(None), requires_value=False)
elif state_representation == "workflow_step_linked":
return dynamic_model_information_from_py_type(self, ConnectedValue)
else:
raise NotImplementedError("...")
raise NotImplementedError(
f"Have not implemented data collection parameter models for state representation {state_representation}"
)
@property
def request_requires_value(self) -> bool:
@@ -354,7 +388,15 @@ class HiddenParameterModel(BaseGalaxyToolParameterModelDefinition):
return optional_if_needed(StrictStr, self.optional)
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
return dynamic_model_information_from_py_type(self, self.py_type)
py_type = self.py_type
requires_value = not self.optional and self.value is None
if state_representation == "workflow_step_linked":
py_type = allow_connected_value(py_type)
elif state_representation == "workflow_step" and not self.optional:
# allow it to be linked in so force allow optional...
py_type = optional(py_type)
requires_value = False
return dynamic_model_information_from_py_type(self, py_type, requires_value=requires_value)
@property
def request_requires_value(self) -> bool:
@@ -390,11 +432,34 @@ class ColorParameterModel(BaseGalaxyToolParameterModelDefinition):
ensure_color_valid(value)
return value
@staticmethod
def validate_color_str_if_value(value) -> str:
if value:
ensure_color_valid(value)
return value
@staticmethod
def validate_color_str_or_connected_value(value) -> str:
if not isinstance(value, ConnectedValue):
ensure_color_valid(value)
return value
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
validators = {"color_format": field_validator(self.name)(ColorParameterModel.validate_color_str)}
py_type = self.py_type
initialize: Any = ...
if state_representation == "workflow_step_linked":
py_type = allow_connected_value(py_type)
validators = {
"color_format": field_validator(self.name)(ColorParameterModel.validate_color_str_or_connected_value)
}
elif state_representation == "workflow_step":
initialize = None
validators = {"color_format": field_validator(self.name)(ColorParameterModel.validate_color_str_if_value)}
else:
validators = {"color_format": field_validator(self.name)(ColorParameterModel.validate_color_str)}
return DynamicModelInformation(
self.name,
(self.py_type, ...),
(py_type, initialize),
validators,
)
@@ -414,7 +479,10 @@ class BooleanParameterModel(BaseGalaxyToolParameterModelDefinition):
return optional_if_needed(StrictBool, self.optional)
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
return dynamic_model_information_from_py_type(self, self.py_type)
py_type = self.py_type
if state_representation == "workflow_step_linked":
py_type = allow_connected_value(py_type)
return dynamic_model_information_from_py_type(self, py_type)
@property
def request_requires_value(self) -> bool:
@@ -468,8 +536,7 @@ class SelectParameterModel(BaseGalaxyToolParameterModelDefinition):
options: Optional[List[LabelValue]] = None
multiple: bool
@property
def py_type(self) -> Type:
def py_type_if_required(self, allow_connections=False) -> Type:
if self.options is not None:
if len(self.options) > 0:
literal_options: List[Type] = [cast_as_type(Literal[o.value]) for o in self.options]
@@ -479,11 +546,31 @@ class SelectParameterModel(BaseGalaxyToolParameterModelDefinition):
else:
py_type = StrictStr
if self.multiple:
py_type = list_type(py_type)
return optional_if_needed(py_type, self.optional)
if allow_connections:
py_type = list_type(allow_connected_value(py_type))
else:
py_type = list_type(py_type)
elif allow_connections:
py_type = allow_connected_value(py_type)
return py_type
@property
def py_type(self) -> Type:
return optional_if_needed(self.py_type_if_required(), self.optional)
@property
def py_type_workflow_step(self) -> Type:
# this is always optional in this context
return optional(self.py_type_if_required())
def pydantic_template(self, state_representation: StateRepresentationT) -> DynamicModelInformation:
return dynamic_model_information_from_py_type(self, self.py_type)
if state_representation == "workflow_step":
return dynamic_model_information_from_py_type(self, self.py_type_workflow_step, requires_value=False)
elif state_representation == "workflow_step_linked":
py_type = self.py_type_if_required(allow_connections=True)
return dynamic_model_information_from_py_type(self, optional_if_needed(py_type, self.optional))
else:
return dynamic_model_information_from_py_type(self, self.py_type)
@property
def has_selected_static_option(self):
@@ -658,6 +745,20 @@ class BaseUrlParameterModel(BaseGalaxyToolParameterModelDefinition):
DiscriminatorType = Union[bool, str]
def cond_test_parameter_default_value(
test_parameter: Union["BooleanParameterModel", "SelectParameterModel"]
) -> Optional[DiscriminatorType]:
default_value: Optional[DiscriminatorType] = None
if isinstance(test_parameter, BooleanParameterModel):
default_value = test_parameter.value
elif isinstance(test_parameter, SelectParameterModel):
select_parameter = cast(SelectParameterModel, test_parameter)
select_default_value = select_parameter.default_value
if select_default_value is not None:
default_value = select_default_value
return default_value
class ConditionalWhen(StrictModel):
discriminator: DiscriminatorType
parameters: List["ToolParameterT"]
@@ -1068,6 +1169,14 @@ def create_test_case_model(tool: ToolParameterBundle, name: str = "DynamicModelF
return create_field_model(tool.input_models, name, "test_case")
def create_workflow_step_model(tool: ToolParameterBundle, name: str = "DynamicModelForTool") -> Type[BaseModel]:
return create_field_model(tool.input_models, name, "workflow_step")
def create_workflow_step_linked_model(tool: ToolParameterBundle, name: str = "DynamicModelForTool") -> Type[BaseModel]:
return create_field_model(tool.input_models, name, "workflow_step_linked")
def create_field_model(
tool_parameter_models: Union[List[ToolParameterModel], List[ToolParameterT]],
name: str,
@@ -1120,3 +1229,13 @@ def validate_internal_job(tool: ToolParameterBundle, request: Dict[str, Any]) ->
def validate_test_case(tool: ToolParameterBundle, request: Dict[str, Any]) -> None:
pydantic_model = create_test_case_model(tool)
validate_against_model(pydantic_model, request)
def validate_workflow_step(tool: ToolParameterBundle, request: Dict[str, Any]) -> None:
pydantic_model = create_workflow_step_model(tool)
validate_against_model(pydantic_model, request)
def validate_workflow_step_linked(tool: ToolParameterBundle, request: Dict[str, Any]) -> None:
pydantic_model = create_workflow_step_linked_model(tool)
validate_against_model(pydantic_model, request)
+20 -3
View File
@@ -6,7 +6,6 @@ from typing import (
Any,
Dict,
List,
Optional,
Type,
Union,
)
@@ -18,6 +17,8 @@ from .models import (
create_job_internal_model,
create_request_internal_model,
create_request_model,
create_workflow_step_linked_model,
create_workflow_step_model,
StateRepresentationT,
ToolParameterBundle,
ToolParameterBundleModel,
@@ -51,7 +52,7 @@ class ToolState(ABC):
"""Get state representation of the inputs."""
@classmethod
def parameter_model_for(cls, input_models: HasToolParameters) -> Optional[Type[BaseModel]]:
def parameter_model_for(cls, input_models: HasToolParameters) -> Type[BaseModel]:
bundle: ToolParameterBundle
if isinstance(input_models, list):
bundle = ToolParameterBundleModel(input_models=input_models)
@@ -61,7 +62,7 @@ class ToolState(ABC):
@classmethod
@abstractmethod
def _parameter_model_for(cls, input_models: ToolParameterBundle) -> Optional[Type[BaseModel]]:
def _parameter_model_for(cls, input_models: ToolParameterBundle) -> Type[BaseModel]:
"""Return a model type for this tool state kind."""
@@ -96,3 +97,19 @@ class TestCaseToolState(ToolState):
def _parameter_model_for(cls, input_models: ToolParameterBundle) -> Type[BaseModel]:
# implement a test case model...
return create_request_internal_model(input_models)
class WorkflowStepToolState(ToolState):
state_representation: Literal["workflow_step"] = "workflow_step"
@classmethod
def _parameter_model_for(cls, input_models: ToolParameterBundle) -> Type[BaseModel]:
return create_workflow_step_model(input_models)
class WorkflowStepLinkedToolState(ToolState):
state_representation: Literal["workflow_step_linked"] = "workflow_step_linked"
@classmethod
def _parameter_model_for(cls, input_models: ToolParameterBundle) -> Type[BaseModel]:
return create_workflow_step_linked_model(input_models)
@@ -1,7 +1,12 @@
from typing import (
Any,
cast,
Dict,
Iterable,
List,
Optional,
TypeVar,
Union,
)
from typing_extensions import Protocol
@@ -54,3 +59,49 @@ def _visit_input_values(
else:
new_input_values[name] = input_value
return new_input_values
def flat_state_path(has_name: Union[str, ToolParameterT], prefix: Optional[str] = None) -> str:
"""Given a parameter name or model and an optional prefix, give 'flat' name for parameter in tree."""
if hasattr(has_name, "name"):
name = cast(ToolParameterT, has_name).name
else:
name = cast(str, has_name)
return name if prefix is None else f"{prefix}|{name}"
KVT = TypeVar("KVT")
def keys_starting_with(flat_tree: Dict[str, KVT], flat_state_path: str) -> Dict[str, KVT]:
subset: Dict[str, KVT] = {}
for key, value in flat_tree.items():
if key.startswith(flat_state_path):
subset[key] = value
return subset
def repeat_inputs_to_array(flat_state_path: str, inputs: Dict[str, KVT]) -> List[Dict[str, KVT]]:
repeat_inputs = keys_starting_with(inputs, flat_state_path + "_")
highest_count = -1
for key in repeat_inputs.keys():
repeat_num_str = key[len(flat_state_path) + 1 :].split("|")[0]
try:
repeat_num = int(repeat_num_str)
if repeat_num > highest_count:
highest_count = repeat_num
except ValueError:
continue
params: List[Dict[str, KVT]] = []
for _ in range(highest_count + 1):
instance_params: Dict[str, KVT] = {}
params.append(instance_params)
for key, value in repeat_inputs.items():
repeat_num_str = key[len(flat_state_path) + 1 :].split("|")[0]
try:
repeat_num = int(repeat_num_str)
params[repeat_num][key] = value
except ValueError:
continue
return params
+283 -1
View File
@@ -14,6 +14,7 @@
# Things to verify:
# - non optional, multi-selects require a selection (see TODO below...)
# - https://github.com/galaxyproject/galaxy/issues/18541
gx_int:
request_valid:
- parameter: 5
@@ -25,12 +26,27 @@ gx_int:
- parameter: "null"
- parameter: "None"
- parameter: { 5 }
- parameter: {__class__: 'ConnectedValue'}
test_case_valid:
- parameter: 5
- {}
test_case_invalid:
- parameter: null
- parameter: "5"
workflow_step_valid:
- parameter: 5
- {}
workflow_step_invalid:
- parameterx: 5
- parameter: 'foobar'
workflow_step_linked_valid:
- parameter: 5
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: null
- parameter: 'foobar'
- parameter: {__class__: 'ConnectedValue2'}
gx_boolean:
request_valid:
@@ -44,6 +60,21 @@ gx_boolean:
# Marius and John were on fence here.
- parameter: "mytrue"
- parameter: null
- parameter: {__class__: 'ConnectedValue'}
workflow_step_valid:
- parameter: True
- {}
workflow_step_invalid:
- parameter: "true"
- parameter: mytrue
- parameter: null
workflow_step_linked_valid:
- parameter: True
- {}
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: "true"
- parameter: {__class__: 'ConnectedValue3'}
gx_int_optional:
request_valid:
@@ -55,6 +86,21 @@ gx_int_optional:
- parameter: "None"
- parameter: "null"
- parameter: [5]
- parameter: {__class__: 'ConnectedValue'}
workflow_step_valid:
- parameter: 5
- parameter: null
- {}
workflow_step_invalid:
- parameter: "5"
- parameter: "None"
- parameter: "null"
- parameter: [5]
workflow_step_linked_valid:
- parameter: 5
- parameter: null
- {}
- parameter: {__class__: 'ConnectedValue'}
gx_int_required: &gx_int_required
request_valid:
@@ -76,11 +122,36 @@ gx_text:
- parameter: moocow
- parameter: 'some spaces'
- parameter: ''
- {}
request_invalid:
- parameter: 5
- parameter: null
- parameter: {}
- parameter: { "moo": "cow" }
- parameter: {__class__: 'ConnectedValue'}
workflow_step_valid:
- parameter: moocow
- parameter: 'some spaces'
- parameter: ''
- {}
workflow_step_invalid:
- parameter: 5
- parameter: null
- parameter: {}
- parameter: { "moo": "cow" }
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_valid:
- parameter: moocow
- parameter: 'some spaces'
- parameter: ''
- {}
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: 5
- parameter: null
- parameter: {}
- parameter: { "moo": "cow" }
- parameter: {"class": 'ConnectedValue'}
gx_text_optional:
request_valid:
@@ -92,6 +163,26 @@ gx_text_optional:
- parameter: 5
- parameter: {}
- parameter: { "moo": "cow" }
workflow_step_valid:
- parameter: moocow
- parameter: 'some spaces'
- parameter: ''
- parameter: null
workflow_step_invalid:
- parameter: 5
- parameter: {}
- parameter: { "moo": "cow" }
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_valid:
- parameter: moocow
- parameter: 'some spaces'
- parameter: ''
- parameter: null
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: 5
- parameter: {}
- parameter: { "moo": "cow" }
gx_select:
request_valid:
@@ -120,6 +211,19 @@ gx_select:
test_case_invalid:
- parameter: {}
- parameter: null
workflow_step_valid:
- parameter: "--ex1"
- {}
workflow_step_invalid:
- parameter: 'foobar'
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_valid:
- parameter: "--ex1"
- parameter: {__class__: 'ConnectedValue'}
- {}
workflow_step_linked_invalid:
- parameter: 'foobar'
- parameter: null
gx_select_optional:
request_valid:
@@ -135,6 +239,28 @@ gx_select_optional:
- parameter: ["ex2"]
- parameter: {}
- parameter: 5
workflow_step_valid:
- parameter: "--ex1"
- parameter: "ex2"
- parameter: null
- {}
workflow_step_invalid:
- parameter: "Ex1"
- parameter: ["ex2"]
- parameter: {}
- parameter: 5
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_valid:
- parameter: "--ex1"
- parameter: "ex2"
- parameter: null
- {}
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: "Ex1"
- parameter: ["ex2"]
- parameter: {}
- parameter: 5
gx_select_multiple:
request_valid:
@@ -147,6 +273,32 @@ gx_select_multiple:
- parameter: {}
- parameter: 5
- {}
workflow_step_valid:
- parameter: ["--ex1"]
- parameter: ["ex2"]
- {} # could come in linked...
# ... hmmm? this should maybe be invalid right?
- parameter: null
workflow_step_invalid:
- parameter: ["Ex1"]
- parameter: {}
- parameter: 5
- parameter: {__class__: 'ConnectedValue'}
- parameter: [{__class__: 'ConnectedValue'}]
workflow_step_linked_valid:
- parameter: ["--ex1"]
- parameter: ["ex2"]
- parameter: [{__class__: 'ConnectedValue'}]
workflow_step_linked_invalid:
- parameter: ["Ex1"]
- parameter: {}
- parameter: 5
- {}
# might be wrong? I guess we would expect the semantic of this to do like a map-over
# but as far as I am aware that is not implemented https://github.com/galaxyproject/galaxy/issues/18541
- parameter: {__class__: 'ConnectedValue'}
# they are non-optinoal right?
- parameter: null
gx_select_multiple_optional:
request_valid:
@@ -209,6 +361,19 @@ gx_hidden:
- parameter: 5
- parameter: {}
- parameter: { "moo": "cow" }
workflow_step_valid:
- parameter: moocow
- {}
workflow_step_invalid:
- parmaeter: 5
- parameter: {}
- parameter: { "moo": "cow" }
workflow_step_linked_valid:
- parameter: moocow
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: 5
- parameter: null
gx_hidden_optional:
request_valid:
@@ -220,7 +385,21 @@ gx_hidden_optional:
- parameter: 5
- parameter: {}
- parameter: { "moo": "cow" }
workflow_step_valid:
- parameter: moocow
- {}
- parameter: null
workflow_step_invalid:
- parmaeter: 5
- parameter: {}
- parameter: { "moo": "cow" }
workflow_step_linked_valid:
- parameter: moocow
- parameter: {__class__: 'ConnectedValue'}
- parameter: null
workflow_step_linked_invalid:
- parameter: 5
gx_float:
request_valid:
- parameter: 5
@@ -233,6 +412,30 @@ gx_float:
- parameter: "5"
- parameter: "5.0"
- parameter: { "moo": "cow" }
test_case_valid:
- parameter: 5
- parameter: 5.0
- {}
test_case_invalid:
- parameter: null
- parameter: "5.0"
- parameter: "5.1"
workflow_step_valid:
- parameter: 5
- parameter: 5.0
- {}
workflow_step_invalid:
- parameterx: 5
- parameter: 'foobar'
workflow_step_linked_valid:
- parameter: 5
- parameter: 5.4
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: null
- parameter: 'foobar'
- parameter: {__class__: 'ConnectedValue2'}
gx_float_optional:
request_valid:
@@ -246,6 +449,29 @@ gx_float_optional:
- parameter: "5.0"
- parameter: {}
- parameter: { "moo": "cow" }
test_case_valid:
- parameter: 5
- parameter: 5.0
- {}
- parameter: null
test_case_invalid:
- parameter: "5.0"
- parameter: "5.1"
workflow_step_valid:
- parameter: 5
- parameter: 5.0
- {}
workflow_step_invalid:
- parameterx: 5
- parameter: 'foobar'
workflow_step_linked_valid:
- parameter: 5
- parameter: 5.4
- parameter: {__class__: 'ConnectedValue'}
- parameter: null
workflow_step_linked_invalid:
- parameter: 'foobar'
- parameter: {__class__: 'ConnectedValue2'}
gx_color:
request_valid:
@@ -255,6 +481,22 @@ gx_color:
- parameter: null
- parameter: {}
- parameter: '#abcd'
workflow_step_valid:
- parameter: '#aabbcc'
- parameter: '#000000'
- {}
workflow_step_invalid:
- parameterx: '#aabbcc'
- parameter: 'foobar'
- parameter: 5
workflow_step_linked_valid:
- parameter: '#aabbcc'
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- parameter: null
- parameter: 'foobar'
- parameter: 5
- parameter: {__class__: 'ConnectedValue2'}
gx_data:
request_valid:
@@ -291,6 +533,21 @@ gx_data:
# expanded out.
- parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]}
- parameter: {src: hda, id: abcdabcd}
workflow_step_valid:
- {}
workflow_step_invalid:
- {src: hda, id: abcdabcd}
- {src: hda, id: 7}
- parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]}
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_valid:
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- {}
- {src: hda, id: abcdabcd}
- {src: hda, id: 7}
- parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]}
- parameter: {__class__: 'ConnectedValueX'}
gx_data_optional:
@@ -320,6 +577,21 @@ gx_data_optional:
- parameter: true
- parameter: 5
- parameter: "5"
workflow_step_valid:
- {}
workflow_step_invalid:
- {src: hda, id: abcdabcd}
- {src: hda, id: 7}
- parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]}
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_valid:
- {}
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- {src: hda, id: abcdabcd}
- {src: hda, id: 7}
- parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]}
- parameter: {__class__: 'ConnectedValueX'}
gx_data_multiple:
request_valid:
@@ -408,6 +680,16 @@ gx_data_collection:
- parameter: true
- parameter: 5
- parameter: "5"
workflow_step_valid:
- {}
workflow_step_invalid:
- parameter: {src: hdca, id: abcdabcd}
- parameter: 5
- parameter: {}
workflow_step_linked_valid:
- parameter: {__class__: 'ConnectedValue'}
workflow_step_linked_invalid:
- {}
gx_data_collection_optional:
request_valid:
@@ -20,6 +20,8 @@ from galaxy.tool_util.parameters import (
validate_internal_request,
validate_request,
validate_test_case,
validate_workflow_step,
validate_workflow_step_linked,
)
from galaxy.tool_util.parameters.json import to_json_schema_string
from galaxy.tool_util.unittest_utils.parameters import (
@@ -93,6 +95,10 @@ def _test_file(file: str, specification=None, parameter_bundle: Optional[ToolPar
"job_internal_invalid": _assert_internal_jobs_invalid,
"test_case_valid": _assert_test_cases_validate,
"test_case_invalid": _assert_test_cases_invalid,
"workflow_step_valid": _assert_workflow_steps_validate,
"workflow_step_invalid": _assert_workflow_steps_invalid,
"workflow_step_linked_valid": _assert_workflow_steps_linked_validate,
"workflow_step_linked_invalid": _assert_workflow_steps_linked_invalid,
}
for valid_or_invalid, tests in combos.items():
@@ -183,6 +189,48 @@ def _assert_test_case_invalid(parameters: ToolParameterBundleModel, test_case: R
), f"Parameters {parameters} didn't result in validation error on test_case {test_case} as expected."
def _assert_workflow_step_validates(parameters: ToolParameterBundleModel, workflow_step: RawStateDict) -> None:
try:
validate_workflow_step(parameters, workflow_step)
except RequestParameterInvalidException as e:
raise AssertionError(f"Parameters {parameters} failed to validate workflow step {workflow_step}. {e}")
def _assert_workflow_step_invalid(parameters: ToolParameterBundleModel, workflow_step: RawStateDict) -> None:
exc = None
try:
validate_workflow_step(parameters, workflow_step)
except RequestParameterInvalidException as e:
exc = e
assert (
exc is not None
), f"Parameters {parameters} didn't result in validation error on workflow step {workflow_step} as expected."
def _assert_workflow_step_linked_validates(
parameters: ToolParameterBundleModel, workflow_step_linked: RawStateDict
) -> None:
try:
validate_workflow_step_linked(parameters, workflow_step_linked)
except RequestParameterInvalidException as e:
raise AssertionError(
f"Parameters {parameters} failed to validate linked workflow step {workflow_step_linked}. {e}"
)
def _assert_workflow_step_linked_invalid(
parameters: ToolParameterBundleModel, workflow_step_linked: RawStateDict
) -> None:
exc = None
try:
validate_workflow_step_linked(parameters, workflow_step_linked)
except RequestParameterInvalidException as e:
exc = e
assert (
exc is not None
), f"Parameters {parameters} didn't result in validation error on linked workflow step {workflow_step_linked} as expected."
_assert_requests_validate = partial(_for_each, _assert_request_validates)
_assert_requests_invalid = partial(_for_each, _assert_request_invalid)
_assert_internal_requests_validate = partial(_for_each, _assert_internal_request_validates)
@@ -191,6 +239,10 @@ _assert_internal_jobs_validate = partial(_for_each, _assert_internal_job_validat
_assert_internal_jobs_invalid = partial(_for_each, _assert_internal_job_invalid)
_assert_test_cases_validate = partial(_for_each, _assert_test_case_validates)
_assert_test_cases_invalid = partial(_for_each, _assert_test_case_invalid)
_assert_workflow_steps_validate = partial(_for_each, _assert_workflow_step_validates)
_assert_workflow_steps_invalid = partial(_for_each, _assert_workflow_step_invalid)
_assert_workflow_steps_linked_validate = partial(_for_each, _assert_workflow_step_linked_validates)
_assert_workflow_steps_linked_invalid = partial(_for_each, _assert_workflow_step_linked_invalid)
def decode_val(val: str) -> int: