ocrd 3.0.0a2__py3-none-any.whl → 3.0.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. ocrd/cli/__init__.py +34 -26
  2. ocrd/cli/bashlib.py +32 -18
  3. ocrd/cli/ocrd_tool.py +7 -5
  4. ocrd/cli/workspace.py +10 -8
  5. ocrd/decorators/__init__.py +13 -7
  6. ocrd/lib.bash +2 -0
  7. ocrd/mets_server.py +2 -3
  8. ocrd/processor/base.py +163 -63
  9. ocrd/processor/builtin/dummy_processor.py +4 -11
  10. ocrd/processor/helpers.py +23 -17
  11. ocrd/processor/ocrd_page_result.py +3 -3
  12. ocrd/resolver.py +0 -3
  13. ocrd/resource_manager.py +9 -5
  14. ocrd/workspace.py +8 -9
  15. ocrd/workspace_backup.py +1 -1
  16. {ocrd-3.0.0a2.dist-info → ocrd-3.0.0b1.dist-info}/METADATA +1 -1
  17. {ocrd-3.0.0a2.dist-info → ocrd-3.0.0b1.dist-info}/RECORD +47 -46
  18. ocrd_modelfactory/__init__.py +1 -1
  19. ocrd_models/constants.py +0 -1
  20. ocrd_models/ocrd_exif.py +2 -2
  21. ocrd_models/ocrd_file.py +2 -2
  22. ocrd_models/ocrd_mets.py +22 -22
  23. ocrd_models/ocrd_page.py +0 -1
  24. ocrd_models/ocrd_xml_base.py +2 -2
  25. ocrd_network/cli/client.py +134 -30
  26. ocrd_network/client.py +53 -27
  27. ocrd_network/client_utils.py +101 -0
  28. ocrd_network/processing_server.py +1 -1
  29. ocrd_network/runtime_data/deployer.py +12 -3
  30. ocrd_network/server_utils.py +12 -10
  31. ocrd_utils/__init__.py +2 -0
  32. ocrd_utils/config.py +16 -2
  33. ocrd_utils/image.py +25 -25
  34. ocrd_utils/logging.py +17 -19
  35. ocrd_utils/os.py +4 -5
  36. ocrd_utils/str.py +10 -3
  37. ocrd_validators/json_validator.py +1 -3
  38. ocrd_validators/ocrd_tool_validator.py +2 -2
  39. ocrd_validators/page_validator.py +56 -56
  40. ocrd_validators/parameter_validator.py +2 -2
  41. ocrd_validators/resource_list_validator.py +4 -3
  42. ocrd_validators/workspace_validator.py +21 -21
  43. ocrd_validators/xsd_validator.py +1 -1
  44. {ocrd-3.0.0a2.dist-info → ocrd-3.0.0b1.dist-info}/LICENSE +0 -0
  45. {ocrd-3.0.0a2.dist-info → ocrd-3.0.0b1.dist-info}/WHEEL +0 -0
  46. {ocrd-3.0.0a2.dist-info → ocrd-3.0.0b1.dist-info}/entry_points.txt +0 -0
  47. {ocrd-3.0.0a2.dist-info → ocrd-3.0.0b1.dist-info}/top_level.txt +0 -0
@@ -1,67 +1,68 @@
1
1
  ocrd/__init__.py,sha256=ZswMVmlqFhAEIzMR3my6IKPq9XLH21aDPC_m_8Jh4dA,1076
2
2
  ocrd/constants.py,sha256=6dn3mG54WqHsKInmLZp4kJjNqqPtBoFoSuLUuRbOps0,740
3
- ocrd/lib.bash,sha256=nG5itqaYJFPHGe4gSEE_zikcyooGGAThKAJOU2CnYS8,10595
4
- ocrd/mets_server.py,sha256=YMfaN333aIBTS9RLIboHvPWJWgde_4IOT09YuXan5KY,20189
3
+ ocrd/lib.bash,sha256=7amCf_0mwE3tkz-e_HxA30aQnL1x2O4BF_8dE9fbqJg,10692
4
+ ocrd/mets_server.py,sha256=M7hZOvOEbCfx5jCjeZ5Uv4CgviVZjGV15N8SN1ATpNY,20149
5
5
  ocrd/ocrd-all-tool.json,sha256=9bX2VYnUwhTAzAvKaoT77BFzbgBGgyIt7qBqARpwWNc,586
6
- ocrd/resolver.py,sha256=P3UpKMz2xWiUdsbGWKvlEYhQQ4MSGDchNa2diWu3BBs,15005
6
+ ocrd/resolver.py,sha256=Ba9ALQbTXz6_mla4VqN9tAfHoj6aKuNJAU4tIDnjcHE,14952
7
7
  ocrd/resource_list.yml,sha256=82-PiqkZnka1kTj3MQqNn4wXWKHHtoFchsQuetWuqFs,2633
8
- ocrd/resource_manager.py,sha256=5XG7rhrnTXuWDl6Oj9S04cwpkOcHmCbqIUW9ZlCzPr4,16698
8
+ ocrd/resource_manager.py,sha256=8BMVKJq8J56hugi8vtGn9Ffuk7oRkbs197aG74aKbCY,16733
9
9
  ocrd/task_sequence.py,sha256=spiaUQaMM7M8WdBDoQGmLuTPm7tOugYXD6rcJ2UXzxw,6991
10
- ocrd/workspace.py,sha256=DPqK4zFj8gwCDvwsJKnwk27HKcIwyE4hRYJKrDZKZvQ,65596
11
- ocrd/workspace_backup.py,sha256=z6gMo3_RfbSTatcNrbj8dGP4oqLyZm1q8iZjlLy-KC8,3630
10
+ ocrd/workspace.py,sha256=t5xveWhSLj5cbsuVkOqT6VZEQ9DRCxucT7FUvTNFnDA,65604
11
+ ocrd/workspace_backup.py,sha256=iab_JjZ_mMP-G8NIUk4PZmfpNlQuGRoqc3NbTSSew1w,3621
12
12
  ocrd/workspace_bagger.py,sha256=yU8H3xR5WmQKvgQewac71ie-DUWcfLnMS01D55zsEHQ,11971
13
- ocrd/cli/__init__.py,sha256=xsWkQcbyHBkMEDrACbzlLNs4Wpwoxd96H1ZxRJwAw1g,2407
14
- ocrd/cli/bashlib.py,sha256=4IWPdVKa-xeNLUh15tvp37XuQ-zBxultK2P2yJptvZQ,4969
13
+ ocrd/cli/__init__.py,sha256=XyYcbIuajaS2YM6HEWD4dfitdAzn111AWIaFPsTHoKQ,2621
14
+ ocrd/cli/bashlib.py,sha256=XGcO-MmYM3xJBRkSCLEZcGs0hqbw2GR8oyijJPtKnYM,5888
15
15
  ocrd/cli/log.py,sha256=6_FrVmTKIIVNUaNLkuOJx8pvPhensHMuayJ0PA7T-XA,1562
16
16
  ocrd/cli/network.py,sha256=oWBHFEURxfUdb_t-F4svP_ri7o5mqBoNQnLZLbsZLTA,602
17
- ocrd/cli/ocrd_tool.py,sha256=B5D64t__2A6mETvIcXONfiWclXjGuem_nlIRmSRHtXA,6682
17
+ ocrd/cli/ocrd_tool.py,sha256=Sqh9Q5-H3u5IPPovp9bpL-QaP01zAHKZDSsi5MhvnQ8,7028
18
18
  ocrd/cli/process.py,sha256=8KD0i7LT01H9u5CC1vktYMEVpS67da_rp_09_EOECmw,1233
19
19
  ocrd/cli/resmgr.py,sha256=bTE-MpF7RRCHhgAbknqZUFHgHScIK6FR3S4h4DEAets,10080
20
20
  ocrd/cli/validate.py,sha256=s5GtioCtO0UfRmYi_tdxNkKx0bJIzdAXGMCPA-PTbto,5563
21
- ocrd/cli/workspace.py,sha256=rDbU6oRBABoG2GzzU9eKfCVcUczFoVpouKfx4jlXzgA,40552
21
+ ocrd/cli/workspace.py,sha256=ETx3qjqUIXJp-Addv8eYmI2T_Js4PJR5UuZ4O6H7mis,40640
22
22
  ocrd/cli/zip.py,sha256=MMJLw3OXWiJVfVtrdJcBkbB8vA1IzSautluazZRuCQ0,5910
23
- ocrd/decorators/__init__.py,sha256=UwzbQbCSoat0Apdh3baIMxifxBPGRBmCo5sSt7ar0qk,7421
23
+ ocrd/decorators/__init__.py,sha256=IJlA1XcdVBO6Hxm9rNDya7QYcqeWcaXXuLtGjfjcen8,7596
24
24
  ocrd/decorators/loglevel_option.py,sha256=tgipROEu3t4hkwWvFssd80k2SbTBwBIC4WNE6Gc-XAg,798
25
25
  ocrd/decorators/mets_find_options.py,sha256=d4oATKMP6bFQHNqOK6nLqgUiWF2FYdkPvzkTVRMYpKo,635
26
26
  ocrd/decorators/ocrd_cli_options.py,sha256=-bpYOyHod3pMmbooyw_dIOqRnhCoZbdmE8vrnWbQRNA,2621
27
27
  ocrd/decorators/parameter_option.py,sha256=n8hYw7XVTd3i3tvpK8F1Jx_CqRp6EGF9qJVH95yj92Q,1076
28
28
  ocrd/processor/__init__.py,sha256=m2lYRvJogmt2Xb4UgqjCXWkfOtqpKW3h8OEWDnblwTQ,273
29
- ocrd/processor/base.py,sha256=6FjkUa2nc6D2JgI_g2S9iIgbu6gT5rX9PcBIDczKdw4,35220
30
- ocrd/processor/helpers.py,sha256=o4ECw2NmzdrbvbHMJfvD5YlZb0n9ivWs6zBPKiYKLK4,15858
31
- ocrd/processor/ocrd_page_result.py,sha256=FaTxGoqSGec5JxA4d7ae1Xi19KShmZc77WTbeqJIPS0,456
29
+ ocrd/processor/base.py,sha256=EvzR-uN5fDH1jKRWnm4CpCVpqge4Z7aprzW2PeXMqxU,38521
30
+ ocrd/processor/helpers.py,sha256=7TmhKRrgi-T_q8dJX6DIVEVZ3qmNABJEcz3S9RXSUjI,16484
31
+ ocrd/processor/ocrd_page_result.py,sha256=AazEmnWyPEN47TxXVg0WUQpgFNV_mlIiExwwycUj0nQ,490
32
32
  ocrd/processor/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- ocrd/processor/builtin/dummy_processor.py,sha256=uWRirZkufclg7cYfB7hq3GSNRKO9tEoagpAn74xbbA8,3861
33
+ ocrd/processor/builtin/dummy_processor.py,sha256=6ORike_59wb_UUivhA6Iw_Ldg0AaMzX37F7qL9R8S_A,3704
34
34
  ocrd/processor/builtin/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  ocrd/processor/builtin/dummy/ocrd-tool.json,sha256=aTA2FZRsRsrkbTctkazFeRu4xsTF6yCdeY07cMzOyt4,677
36
- ocrd_modelfactory/__init__.py,sha256=kqTxkccX7Wgau3PCkY_dvfCjGYbmsCnExgBkwIBay7E,4098
36
+ ocrd_modelfactory/__init__.py,sha256=0baYSJXrOCTCguHkE6hBeqpGNVUe3aZUocv64A-DMDk,4094
37
37
  ocrd_models/__init__.py,sha256=A0aj0mOraNb-xfiUueACdoaqISnp0qH-F49nTJg2vCs,380
38
- ocrd_models/constants.py,sha256=7u68kGLnfnouXiS-yR_i4QoVf0Jxxo4Ds0j9EV0e0SY,2757
38
+ ocrd_models/constants.py,sha256=fI6Qz4OPOm6UBLQ_P2dlpjcwB0XFJZ7AgxxKqgc75X0,2724
39
39
  ocrd_models/mets-empty.xml,sha256=dFixfbxSXrgjZx9BfdIKWHX-khNmp7dNYaFe2qQSwCY,1203
40
40
  ocrd_models/ocrd_agent.py,sha256=E9OtDhz9UfKb6ou2qvsuCL9NlO1V6zMb0s8nVq8dVos,5609
41
- ocrd_models/ocrd_exif.py,sha256=uhveyXOm5coLRaJa-OBwljBFgdDHnXiajl9V3KyJxyE,4595
42
- ocrd_models/ocrd_file.py,sha256=lAEihsCMfuVAymiPmUHqsJqWHa5XYoS7n0sfOeHAfQE,9649
43
- ocrd_models/ocrd_mets.py,sha256=7WVWdCgh9aCuYy4qJji-moJPC9kzeWAk98m8DmA-qh8,42613
44
- ocrd_models/ocrd_page.py,sha256=5J6uT1R1IDDYGwyTzeu-WcopiNl4DnrofMfDT2rdAtM,5424
41
+ ocrd_models/ocrd_exif.py,sha256=5BRLjvB6jg36V68i8jvVnT2SSNnpqLbhLsaMuP51Scw,4583
42
+ ocrd_models/ocrd_file.py,sha256=7lyHezuNnl2FEYV1lV35-QTCrgYAL-3wO2ulFUNq2Ak,9717
43
+ ocrd_models/ocrd_mets.py,sha256=h3y_WI5fVLsbBoUIRNH2ebjuO1-_P6T3BMIULX-ZOIs,42514
44
+ ocrd_models/ocrd_page.py,sha256=sVIvvMeBT8eZnOfW0DTjQUNyu62-llz0v_Ga5Xo-tUM,5393
45
45
  ocrd_models/ocrd_page_generateds.py,sha256=XpzRaJAvGc_N58Mb2_Sk42S59pDqMRFiplqce1pUubw,772504
46
- ocrd_models/ocrd_xml_base.py,sha256=3pDA0pjnSyLx63nbbiJnH3oKN8qmvBgL8Lo-WAzlSjY,1642
46
+ ocrd_models/ocrd_xml_base.py,sha256=OW57mXLlwm1nH8CNefvXmwLRws9KL9zSrb-3vH--mX8,1641
47
47
  ocrd_models/report.py,sha256=luZxvzAAQyGYOlRNSJQUIUIANG81iGmBW5ag-uXxKCA,2026
48
48
  ocrd_models/utils.py,sha256=0_WHf5NEn1WC8MKJc6X_RK8gW-70Z09_mslkKOj7uF8,2369
49
49
  ocrd_network/__init__.py,sha256=gMejC614J5PPGgXDKBiQS0jt-Jx8qOrLbWH7zt8x8Gs,374
50
- ocrd_network/client.py,sha256=fXXphI5tLlkQolDlV8vX2ASQsEaDU0LH1KR61huZOSo,1628
50
+ ocrd_network/client.py,sha256=j9PJ9QHI6qJ_qAxVlpTk5mLfq0Xemj_Br-0SX-09U5M,2834
51
+ ocrd_network/client_utils.py,sha256=JDBzDOGY2G_bgS8fQ677CMHG9DWSvIuWTlEFzdsXr_Q,4527
51
52
  ocrd_network/constants.py,sha256=IeNtcU6dqonDE3Zw83_61auhS8X2b8wsjAxYg1zvK-M,1902
52
53
  ocrd_network/database.py,sha256=fcft7vdRDoR7vmPL1xNYTIeOg5DwRPcggwYDYxLy5ik,10706
53
54
  ocrd_network/logging_utils.py,sha256=bO9TQqBXw9CIZEKp8tHXbeE2NuJWMiaQDHzS05b4ajo,2153
54
55
  ocrd_network/param_validators.py,sha256=Jl1VwiPPKJ50k-xEHLdvW-1QDOkJHCiMz4k9Ipqm-Uc,1489
55
56
  ocrd_network/process_helpers.py,sha256=KpkInXsa5bgrxvTOouyMJ0NgJhaz0J9Gjs5sZHBcH64,2373
56
- ocrd_network/processing_server.py,sha256=77rP7X4pdr3G9smsmCUo23JgCKtAiXq0lkvmqChcfe4,41128
57
+ ocrd_network/processing_server.py,sha256=8EFQIcjiQ-AEc4goaggxa-hYWhJW9fMzR768ZIX8vZE,41139
57
58
  ocrd_network/processing_worker.py,sha256=VV_pC5ljtjPpMY89MElAMZ-YUJdKk7IPugxFfDy8viA,12396
58
59
  ocrd_network/processor_server.py,sha256=RVX0MSzzayDdqHg7Kga7L4vOsjmQcoRYObh6Naxz-U4,9858
59
60
  ocrd_network/server_cache.py,sha256=GKX91SkVahgAk0nGWT0S-0qWp7a9ubxncjwwLTKs7JY,12829
60
- ocrd_network/server_utils.py,sha256=m43sqLqK111LxERpe1y1JVnOOc_txfdTaGxs1Hg8WOM,10903
61
+ ocrd_network/server_utils.py,sha256=NBSZvLD7o43fMtSkqR70ougW-IWCW9J71GHqZIBeD0Q,10982
61
62
  ocrd_network/tcp_to_uds_mets_proxy.py,sha256=pNEl5jH09M-zuUIx25nog7IZ-fkXabi3724kQ_3iMTs,2894
62
63
  ocrd_network/utils.py,sha256=Vm8EiBBSKv5fAlkcb6nB8-duFN633ZIRAcPKfk7iyZY,6366
63
64
  ocrd_network/cli/__init__.py,sha256=F7YVqxw-9glz6-ghG0Kp5XXeV1-rL1emVSXLCWxdTF0,306
64
- ocrd_network/cli/client.py,sha256=OvEuXj9KpaWYfeZWsbbU7bjLs0DvcDsrywnHDj3V5QQ,2644
65
+ ocrd_network/cli/client.py,sha256=4bpsDRwm3WVFHA6ITM-VKAFx-JQ6ldbBKFVYleWhiW8,7515
65
66
  ocrd_network/cli/processing_server.py,sha256=rAci6RsHlZ0c87GuLdfdCQCiGNcDEu4NEEQiwKJqVUo,796
66
67
  ocrd_network/cli/processing_worker.py,sha256=ZuaCkbKV_WKJV7cGOjZ6RLrjjppymnwNCiznFMlclAg,1897
67
68
  ocrd_network/cli/processor_server.py,sha256=Vto7UekFo_g83aHqwDmhge9bhPzk0b7O-L46dSfIpJc,1259
@@ -81,45 +82,45 @@ ocrd_network/rabbitmq_utils/publisher.py,sha256=mw4XQQhRE1xUQVgEUseyG845iIgVO-9G
81
82
  ocrd_network/runtime_data/__init__.py,sha256=3jYkmT4mxMUcpbDaSw7Ld0KTedGEx_5vUQPDjwUyJZc,367
82
83
  ocrd_network/runtime_data/config_parser.py,sha256=Vr0FbsqmsoiuhDgZ7KFdeFZj9JvUulcOS2PCRFQQNHY,2364
83
84
  ocrd_network/runtime_data/connection_clients.py,sha256=DZyAvkNyMaIddGJs56s2pMP_fK-XWAtICxk1cjvkWYM,4207
84
- ocrd_network/runtime_data/deployer.py,sha256=mtVHaJCxTzVUfhODHQFawd69QllR7-VeJ4uv43kn3I8,7943
85
+ ocrd_network/runtime_data/deployer.py,sha256=W7SHn6XBC5fIaTJIMnHOMxEyp7dVqvHY4_cepaloMhQ,8315
85
86
  ocrd_network/runtime_data/hosts.py,sha256=ml19ptzH4TFofyJR-Qp_Mn3sZUFbWoNe__rRXZSj_WE,12185
86
87
  ocrd_network/runtime_data/network_agents.py,sha256=5p_zKLqECBIHLw-Ya6eKcKSZcUM4ESiipEIphVxHBEA,5192
87
88
  ocrd_network/runtime_data/network_services.py,sha256=xrPpFUU_Pa-XzGe2FEt5RmO17xqykIUmTr_9g6S7XSs,7892
88
- ocrd_utils/__init__.py,sha256=RkAiJSbD90kIOMWJkDSiJnP_XpWVO3FHR5pUY9LNTd0,5898
89
- ocrd_utils/config.py,sha256=q-xwUesiZTCX37L9eEMhgkxsNUoFUc15gr3pzIBOAbM,9436
89
+ ocrd_utils/__init__.py,sha256=U_zAQJwxg_aJ4CR84CKMNAUP6Cob8Er8Ikj42JmnUKo,5977
90
+ ocrd_utils/config.py,sha256=Zs7XXjfWa1oQ1tvnu6DR1WmfafohMPU9KR-Qx3qoC74,9818
90
91
  ocrd_utils/constants.py,sha256=ImbG1d8t2MW3uuFi-mN6aY90Zn74liAKZBKlfuKN86w,3278
91
92
  ocrd_utils/deprecate.py,sha256=4i50sZsA3Eevqn5D-SL5yGf9KEZfGCV4A5Anzn1GRMs,1026
92
- ocrd_utils/image.py,sha256=Df9QYSB0GvhSF9S1DyXetl9Qk038RL5yjGUVTUtFpWA,24531
93
+ ocrd_utils/image.py,sha256=zNNX1cnRy6yvrxx8mnYQiqWraAh5-i4a1AOfCCg4SmI,24781
93
94
  ocrd_utils/introspect.py,sha256=gfBlmeEFuRmRUSgdSK0jOxRpYqDRXl2IAE6gv2MZ6as,1977
94
- ocrd_utils/logging.py,sha256=0FWmyeJ3c_8FzeEUfCH3pXSlJ8rNKulHxPf9-bdLziY,8135
95
+ ocrd_utils/logging.py,sha256=Mw49E_JX3lGNi2TEOK3qXInQf5E2zg-Vbse5uFgxO9M,8156
95
96
  ocrd_utils/ocrd_logging.conf,sha256=kl9x9JS1d8h8F0QZabvrjZtW1iApIaChvkImYafKO5g,3623
96
- ocrd_utils/os.py,sha256=oi53XJ_k7CssPoK32OYGc3aXXPktOe_m-pRp2TMs-ao,9842
97
- ocrd_utils/str.py,sha256=eB0JRycz9wHTE4oXHOC8BiLuGPPw_TYb8dD36Izv4m4,9809
97
+ ocrd_utils/os.py,sha256=acRRdDBI8L6BK0Mf773yKEzwdpZSFRBJEKB2crL4EjU,9865
98
+ ocrd_utils/str.py,sha256=JIhsyWphqJuxJAzhRQJUqlZ44AGOeObEPJMFhfWhfhQ,10084
98
99
  ocrd_validators/__init__.py,sha256=ZFc-UqRVBk9o1YesZFmr9lOepttNJ_NKx1Zdb7g_YsU,972
99
100
  ocrd_validators/bagit-profile.yml,sha256=sdQJlSi7TOn1E9WYMOZ1shewJ-i_nPaKmsAFkh28TGY,1011
100
101
  ocrd_validators/constants.py,sha256=FLP57T3F39weka_XovG40RgVMW1GunnbK04QRQ9tmlE,1802
101
- ocrd_validators/json_validator.py,sha256=e-MBWGLOGIHXOF2JTc8gFuoNijvq-5kcza0So0AMkOU,2704
102
+ ocrd_validators/json_validator.py,sha256=jkVYwBtXwoubcNbLFWy8kC-DRqdf-9ryoqEf5HHi3Ds,2651
102
103
  ocrd_validators/message_processing.schema.yml,sha256=HL7o96-7ejslVMXcp16sbo5IjfUcW0wH8rPXHXdTyyA,1947
103
104
  ocrd_validators/message_result.schema.yml,sha256=G6vt_JgIU7OGSaHj-2Jna6KWQ3bFWol5tnBArWEiVjM,681
104
105
  ocrd_validators/mets.xsd,sha256=0Wrs9bObn0n-yEEIWyguIcUUuuP6KMEjD4I_p1_UlwY,138290
105
106
  ocrd_validators/ocrd_network_message_validator.py,sha256=oafNWOjieBmTHFfYeCtyFFpW1gI0lDT6ycRr5Kvmfq0,561
106
107
  ocrd_validators/ocrd_tool.schema.yml,sha256=wi9n5Ooi3feic5D_xqygUhhPYEF1TMKg60cY8OmRf8c,9912
107
- ocrd_validators/ocrd_tool_validator.py,sha256=nnzW4fyTzY1jw8mJaLu0OB1KNhU6pvhDOpNRfTqk1eY,752
108
+ ocrd_validators/ocrd_tool_validator.py,sha256=CvfUHC0vJsPnmFBNf4ndQMXX6pcERCjJMAWk2L-T_ww,747
108
109
  ocrd_validators/ocrd_zip_validator.py,sha256=udAImFFliJY3y1FcKwZ52rhpjYB2Iv491hWDxdet8w0,3685
109
110
  ocrd_validators/page.xsd,sha256=abQ8C3gRLPMFm8lH62aTCfvTIWI23TpgEDcaW9YCt7I,85770
110
- ocrd_validators/page_validator.py,sha256=X3h-kp7QzleD4DGkOYWto67umYQAooNCFiC9LQIGm6M,23172
111
- ocrd_validators/parameter_validator.py,sha256=clYO3HS4WCpAMXVuKhlcHj2PlRUNDW7rgbqEWkKUAzI,1413
111
+ ocrd_validators/page_validator.py,sha256=0fI278TLTsrw6htcwk7d9WkTFcbHNip87VMS2uw4Bzc,21765
112
+ ocrd_validators/parameter_validator.py,sha256=_5Y3IS24Sf_xHBkB3TE3jB9VTCbbjWO8bSwcQDP0ewI,1365
112
113
  ocrd_validators/processing_server_config.schema.yml,sha256=8NQbhSshm1exTvbdYiu694rZZ-Xe70_vQtsJ0nd7ZCM,5432
113
114
  ocrd_validators/processing_server_config_validator.py,sha256=lQ2-ZxsvbFki_SvE_N4_1ptBnBHcwOTJ5grtL2G9F8A,810
114
- ocrd_validators/resource_list_validator.py,sha256=Z0Iwqm7DmcXCKJPsw76FeM9_v_yWVLuVL9oGEjd_jY8,689
115
- ocrd_validators/workspace_validator.py,sha256=tbN_K2MDC-gavdn7uqO92LRBjK3Ias48YybOhjEsBOc,18038
115
+ ocrd_validators/resource_list_validator.py,sha256=cFMj0n_x-tjhuNUpjgEvPP8iPVm7lme9TWAaqATasV0,776
116
+ ocrd_validators/workspace_validator.py,sha256=rEXIwjtNpt8HcTv94fKed3vVlA3U4z7Xmm1ZL1VHC84,17892
116
117
  ocrd_validators/xlink.xsd,sha256=8fW7YAMWXN2PbB_MMvj9H5ZeFoEBDzuYBtlGC8_6ijw,3180
117
118
  ocrd_validators/xsd_mets_validator.py,sha256=4GWfLyqkmca0x7osDuXuExYuM0HWVrKoqn0S35sFhHU,467
118
119
  ocrd_validators/xsd_page_validator.py,sha256=BNz_9u-Ek4UCeyZu3KxSQoolfW9lvuaSR9nIu1XXxeE,467
119
- ocrd_validators/xsd_validator.py,sha256=dOFZ4fWSvnnrwRCgILTNpn5okZOnPKxy41KH1VgBZaw,2093
120
- ocrd-3.0.0a2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
121
- ocrd-3.0.0a2.dist-info/METADATA,sha256=HjSzMpUo0KfKVpZl2W0KHWEY9o9z4VEggaCEm0EE-SA,8785
122
- ocrd-3.0.0a2.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
123
- ocrd-3.0.0a2.dist-info/entry_points.txt,sha256=tV_gAdO8cbnOjS0GmKfJKbN60xBAV2DQRX6hEjleSjE,94
124
- ocrd-3.0.0a2.dist-info/top_level.txt,sha256=pUgiN42t4KXC5rvpi6V8atza31XP4SCznXpXlVlvomM,75
125
- ocrd-3.0.0a2.dist-info/RECORD,,
120
+ ocrd_validators/xsd_validator.py,sha256=6HrVAf6SzCvfUIuQdIzz9bOq4V-zhyii9yrUPoK2Uvo,2094
121
+ ocrd-3.0.0b1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
122
+ ocrd-3.0.0b1.dist-info/METADATA,sha256=NKl_vrDFcwK3ayhp9_fe_2gAPESgGghDz3QQcdJRSRw,8785
123
+ ocrd-3.0.0b1.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
124
+ ocrd-3.0.0b1.dist-info/entry_points.txt,sha256=tV_gAdO8cbnOjS0GmKfJKbN60xBAV2DQRX6hEjleSjE,94
125
+ ocrd-3.0.0b1.dist-info/top_level.txt,sha256=pUgiN42t4KXC5rvpi6V8atza31XP4SCznXpXlVlvomM,75
126
+ ocrd-3.0.0b1.dist-info/RECORD,,
@@ -72,7 +72,7 @@ def page_from_image(input_file : Union[OcrdFile, ClientSideOcrdFile], **kwargs)
72
72
  ),
73
73
  pcGtsId=input_file.ID
74
74
  )
75
- mapping = dict()
75
+ mapping = {}
76
76
  etree : ET._Element = pcgts.to_etree(mapping_=mapping)
77
77
  revmap = dict(((node, element) for element, node in mapping.items()))
78
78
  return OcrdPage(pcgts, etree, mapping, revmap)
ocrd_models/constants.py CHANGED
@@ -44,7 +44,6 @@ NAMESPACES = {
44
44
  'ocrd': 'https://ocr-d.de',
45
45
  }
46
46
 
47
- # pylint: disable=bad-whitespace
48
47
  TAG_METS_AGENT = '{%s}agent' % NAMESPACES['mets']
49
48
  TAG_METS_DIV = '{%s}div' % NAMESPACES['mets']
50
49
  TAG_METS_FILE = '{%s}file' % NAMESPACES['mets']
ocrd_models/ocrd_exif.py CHANGED
@@ -102,7 +102,7 @@ class OcrdExif():
102
102
  Serialize all properties as XML string.
103
103
  """
104
104
  ret = '<exif>'
105
- for k in self.__dict__:
106
- ret += '<%s>%s</%s>' % (k, self.__dict__[k], k)
105
+ for k, v in self.__dict__.items():
106
+ ret += f'<{k}>{v}</{k}>'
107
107
  ret += '</exif>'
108
108
  return ret
ocrd_models/ocrd_file.py CHANGED
@@ -230,12 +230,12 @@ class ClientSideOcrdFile:
230
230
 
231
231
  def __init__(
232
232
  self,
233
- el,
233
+ el, # pylint: disable=unused-argument
234
234
  mimetype: str = '',
235
235
  pageId: str = '',
236
236
  loctype: str ='OTHER',
237
237
  local_filename: Optional[str] = None,
238
- mets : Any = None,
238
+ mets : Any = None, # pylint: disable=unused-argument
239
239
  url: str = '',
240
240
  ID: str = '',
241
241
  fileGrp: str = ''
ocrd_models/ocrd_mets.py CHANGED
@@ -75,7 +75,7 @@ class OcrdMets(OcrdXmlDocument):
75
75
  def __init__(self, **kwargs) -> None:
76
76
  """
77
77
  """
78
- super(OcrdMets, self).__init__(**kwargs)
78
+ super().__init__(**kwargs)
79
79
 
80
80
  # XXX If the environment variable OCRD_METS_CACHING is set to "true",
81
81
  # then enable caching, if "false", disable caching, overriding the
@@ -198,7 +198,7 @@ class OcrdMets(OcrdXmlDocument):
198
198
  """
199
199
  return [OcrdAgent(el_agent) for el_agent in self._tree.getroot().findall('mets:metsHdr/mets:agent', NS)]
200
200
 
201
- def add_agent(self, *args, **kwargs) -> OcrdAgent:
201
+ def add_agent(self, **kwargs) -> OcrdAgent:
202
202
  """
203
203
  Add an :py:class:`ocrd_models.ocrd_agent.OcrdAgent` to the list of agents in the ``metsHdr``.
204
204
  """
@@ -213,7 +213,7 @@ class OcrdMets(OcrdXmlDocument):
213
213
  el_agent_last.addnext(el_agent)
214
214
  except StopIteration:
215
215
  el_metsHdr.insert(0, el_agent)
216
- return OcrdAgent(el_agent, *args, **kwargs)
216
+ return OcrdAgent(el_agent, **kwargs)
217
217
 
218
218
  @property
219
219
  def file_groups(self) -> List[str]:
@@ -488,11 +488,12 @@ class OcrdMets(OcrdXmlDocument):
488
488
  f"A file with ID=={ID} already exists {mets_file} but unrelated - cannot mitigate")
489
489
 
490
490
  # To get rid of Python's FutureWarning - checking if v is not None
491
- kwargs = {k: v for k, v in locals().items() if
492
- k in ['url', 'ID', 'mimetype', 'pageId', 'local_filename'] and v is not None}
491
+ kwargs = {k: v for k, v in locals().items()
492
+ if k in ['url', 'ID', 'mimetype', 'pageId', 'local_filename'] and v is not None}
493
493
  # This separation is needed to reuse the same el_mets_file element in the caching if block
494
494
  el_mets_file = ET.SubElement(el_fileGrp, TAG_METS_FILE)
495
495
  # The caching of the physical page is done in the OcrdFile constructor
496
+ # (which calls us back with set_physical_page_for_file)
496
497
  mets_file = OcrdFile(el_mets_file, mets=self, **kwargs)
497
498
 
498
499
  if self._cache_flag:
@@ -542,9 +543,9 @@ class OcrdMets(OcrdXmlDocument):
542
543
  # Delete the physical page ref
543
544
  fptrs = []
544
545
  if self._cache_flag:
545
- for page in self._fptr_cache.keys():
546
- if ID in self._fptr_cache[page]:
547
- fptrs.append(self._fptr_cache[page][ID])
546
+ for pageId, fptrdict in self._fptr_cache.items():
547
+ if ID in fptrdict:
548
+ fptrs.append(fptrdict[ID])
548
549
  else:
549
550
  fptrs = self._tree.getroot().findall('.//mets:fptr[@FILEID="%s"]' % ID, namespaces=NS)
550
551
 
@@ -700,8 +701,8 @@ class OcrdMets(OcrdXmlDocument):
700
701
  assert for_fileIds # at this point we know for_fileIds is set, assert to convince pyright
701
702
  ret = [None] * len(for_fileIds)
702
703
  if self._cache_flag:
703
- for pageId in self._fptr_cache.keys():
704
- for fptr in self._fptr_cache[pageId].keys():
704
+ for pageId, fptrdict in self._fptr_cache.items():
705
+ for fptr in fptrdict:
705
706
  if fptr in for_fileIds:
706
707
  index = for_fileIds.index(fptr)
707
708
  if return_divs:
@@ -737,10 +738,10 @@ class OcrdMets(OcrdXmlDocument):
737
738
  # delete any existing page mapping for this file.ID
738
739
  fptrs = []
739
740
  if self._cache_flag:
740
- for page_id in self._fptr_cache.keys():
741
- if ocrd_file.ID in self._fptr_cache[page_id].keys():
742
- if self._fptr_cache[page_id][ocrd_file.ID] is not None:
743
- fptrs.append(self._fptr_cache[page_id][ocrd_file.ID])
741
+ for page, fptrdict in self._fptr_cache.items():
742
+ if ocrd_file.ID in fptrdict:
743
+ if fptrdict[ocrd_file.ID] is not None:
744
+ fptrs.append(fptrdict[ocrd_file.ID])
744
745
  else:
745
746
  fptrs = self._tree.getroot().findall(
746
747
  'mets:structMap[@TYPE="PHYSICAL"]/mets:div[@TYPE="physSequence"]/mets:div[@TYPE="page"]/mets:fptr[@FILEID="%s"]' %
@@ -791,7 +792,7 @@ class OcrdMets(OcrdXmlDocument):
791
792
  self._fptr_cache[pageId].update({ocrd_file.ID: el_fptr})
792
793
 
793
794
  def update_physical_page_attributes(self, page_id : str, **kwargs) -> None:
794
- invalid_keys = list(k for k in kwargs.keys() if k not in METS_PAGE_DIV_ATTRIBUTE.names())
795
+ invalid_keys = list(k for k in kwargs if k not in METS_PAGE_DIV_ATTRIBUTE.names())
795
796
  if invalid_keys:
796
797
  raise ValueError(f"Invalid attribute {invalid_keys}. Allowed values: {METS_PAGE_DIV_ATTRIBUTE.names()}")
797
798
 
@@ -812,8 +813,8 @@ class OcrdMets(OcrdXmlDocument):
812
813
  corresponding to the ``mets:file`` :py:attr:`ocrd_file`.
813
814
  """
814
815
  if self._cache_flag:
815
- for pageId in self._fptr_cache.keys():
816
- if ocrd_file.ID in self._fptr_cache[pageId].keys():
816
+ for pageId, fptrdict in self._fptr_cache.items():
817
+ if ocrd_file.ID in fptrdict:
817
818
  return pageId
818
819
  else:
819
820
  ret = self._tree.getroot().find(
@@ -828,7 +829,7 @@ class OcrdMets(OcrdXmlDocument):
828
829
  """
829
830
  mets_div = None
830
831
  if self._cache_flag:
831
- if ID in self._page_cache[METS_PAGE_DIV_ATTRIBUTE.ID].keys():
832
+ if ID in self._page_cache[METS_PAGE_DIV_ATTRIBUTE.ID]:
832
833
  mets_div = [self._page_cache[METS_PAGE_DIV_ATTRIBUTE.ID][ID]]
833
834
  else:
834
835
  mets_div = self._tree.getroot().xpath(
@@ -857,9 +858,9 @@ class OcrdMets(OcrdXmlDocument):
857
858
  # If that's the case then we do not need to iterate 2 loops, just one.
858
859
  mets_fptrs = []
859
860
  if self._cache_flag:
860
- for page_id in self._fptr_cache.keys():
861
- if fileId in self._fptr_cache[page_id].keys():
862
- mets_fptrs.append(self._fptr_cache[page_id][fileId])
861
+ for pageId, fptrdict in self._fptr_cache.items():
862
+ if fileId in fptrdict:
863
+ mets_fptrs.append(fptrdict[fileId])
863
864
  else:
864
865
  mets_fptrs = self._tree.getroot().xpath(
865
866
  'mets:structMap[@TYPE="PHYSICAL"]/mets:div[@TYPE="physSequence"]/mets:div[@TYPE="page"]/mets:fptr[@FILEID="%s"]' % fileId,
@@ -919,4 +920,3 @@ class OcrdMets(OcrdXmlDocument):
919
920
  # FIXME: merge structMap logical and structLink as well
920
921
  if after_add_cb:
921
922
  after_add_cb(f_dest)
922
-
ocrd_models/ocrd_page.py CHANGED
@@ -3,7 +3,6 @@ API to PAGE-XML, generated with generateDS from XML schema.
3
3
  """
4
4
  from io import StringIO
5
5
  from typing import Dict, Union
6
- from inspect import getmembers
7
6
  from lxml import etree as ET
8
7
 
9
8
  __all__ = [
@@ -8,8 +8,8 @@ from .constants import NAMESPACES
8
8
  from .utils import xmllint_format
9
9
 
10
10
 
11
- for curie in NAMESPACES:
12
- ET.register_namespace(curie, NAMESPACES[curie])
11
+ for curie, url in NAMESPACES.items():
12
+ ET.register_namespace(curie, url)
13
13
 
14
14
  class OcrdXmlDocument():
15
15
  """
@@ -1,9 +1,11 @@
1
1
  import click
2
- from typing import Optional
3
-
4
- from ocrd.decorators import parameter_option
5
- from ocrd_network import Client
2
+ from json import dumps
3
+ from typing import List, Optional, Tuple
4
+ from ocrd.decorators.parameter_option import parameter_option, parameter_override_option
6
5
  from ocrd_utils import DEFAULT_METS_BASENAME
6
+ from ocrd_utils.introspect import set_json_key_value_overrides
7
+ from ocrd_utils.str import parse_json_string_or_file
8
+ from ..client import Client
7
9
 
8
10
 
9
11
  @click.group('client')
@@ -23,6 +25,34 @@ def discovery_cli():
23
25
  pass
24
26
 
25
27
 
28
+ @discovery_cli.command('processors')
29
+ @click.option('--address',
30
+ help='The address of the Processing Server. If not provided, '
31
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
32
+ def check_deployed_processors(address: Optional[str]):
33
+ """
34
+ Get a list of deployed processing workers/processor servers.
35
+ Each processor is shown only once regardless of the amount of deployed instances.
36
+ """
37
+ client = Client(server_addr_processing=address)
38
+ processors_list = client.check_deployed_processors()
39
+ print(dumps(processors_list, indent=4))
40
+
41
+
42
+ @discovery_cli.command('processor')
43
+ @click.option('--address',
44
+ help='The address of the Processing Server. If not provided, '
45
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
46
+ @click.argument('processor_name', required=True, type=click.STRING)
47
+ def check_processor_ocrd_tool(address: Optional[str], processor_name: str):
48
+ """
49
+ Get the json tool of a deployed processor specified with `processor_name`
50
+ """
51
+ client = Client(server_addr_processing=address)
52
+ ocrd_tool = client.check_deployed_processor_ocrd_tool(processor_name=processor_name)
53
+ print(dumps(ocrd_tool, indent=4))
54
+
55
+
26
56
  @client_cli.group('processing')
27
57
  def processing_cli():
28
58
  """
@@ -31,56 +61,92 @@ def processing_cli():
31
61
  pass
32
62
 
33
63
 
34
- @processing_cli.command('processor')
64
+ @processing_cli.command('check-log')
65
+ @click.option('--address',
66
+ help='The address of the Processing Server. If not provided, '
67
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
68
+ @click.option('-j', '--processing-job-id', required=True)
69
+ def check_processing_job_status(address: Optional[str], processing_job_id: str):
70
+ """
71
+ Check the log of a previously submitted processing job.
72
+ """
73
+ client = Client(server_addr_processing=address)
74
+ response = client.check_job_log(job_id=processing_job_id)
75
+ print(response._content.decode(encoding='utf-8'))
76
+
77
+
78
+ @processing_cli.command('check-status')
79
+ @click.option('--address',
80
+ help='The address of the Processing Server. If not provided, '
81
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
82
+ @click.option('-j', '--processing-job-id', required=True)
83
+ def check_processing_job_status(address: Optional[str], processing_job_id: str):
84
+ """
85
+ Check the status of a previously submitted processing job.
86
+ """
87
+ client = Client(server_addr_processing=address)
88
+ job_status = client.check_job_status(processing_job_id)
89
+ assert job_status
90
+ print(f"Processing job status: {job_status}")
91
+
92
+
93
+ @processing_cli.command('run')
35
94
  @click.argument('processor_name', required=True, type=click.STRING)
36
- @click.option('--address')
95
+ @click.option('--address',
96
+ help='The address of the Processing Server. If not provided, '
97
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
37
98
  @click.option('-m', '--mets', required=True, default=DEFAULT_METS_BASENAME)
38
99
  @click.option('-I', '--input-file-grp', default='OCR-D-INPUT')
39
100
  @click.option('-O', '--output-file-grp', default='OCR-D-OUTPUT')
40
101
  @click.option('-g', '--page-id')
41
102
  @parameter_option
103
+ @parameter_override_option
42
104
  @click.option('--result-queue-name')
43
105
  @click.option('--callback-url')
44
106
  @click.option('--agent-type', default='worker')
45
- def send_processing_request(
46
- address: Optional[str],
47
- processor_name: str,
48
- mets: str,
49
- input_file_grp: str,
50
- output_file_grp: Optional[str],
51
- page_id: Optional[str],
52
- parameter: Optional[dict],
53
- result_queue_name: Optional[str],
54
- callback_url: Optional[str],
55
- # TODO: This is temporally available to toggle
56
- # between the ProcessingWorker/ProcessorServer
57
- agent_type: Optional[str]
107
+ @click.option('-b', '--block', default=False,
108
+ help='If set, the client will block till job timeout, fail or success.')
109
+ def send_processing_job_request(
110
+ address: Optional[str],
111
+ processor_name: str,
112
+ mets: str,
113
+ input_file_grp: str,
114
+ output_file_grp: Optional[str],
115
+ page_id: Optional[str],
116
+ parameter: List[str],
117
+ parameter_override: List[Tuple[str, str]],
118
+ result_queue_name: Optional[str],
119
+ callback_url: Optional[str],
120
+ # TODO: This is temporally available to toggle
121
+ # between the ProcessingWorker/ProcessorServer
122
+ agent_type: Optional[str],
123
+ block: Optional[bool]
58
124
  ):
125
+ """
126
+ Submit a processing job to the processing server.
127
+ """
59
128
  req_params = {
60
129
  "path_to_mets": mets,
61
130
  "description": "OCR-D Network client request",
62
131
  "input_file_grps": input_file_grp.split(','),
63
- "parameters": parameter if parameter else {},
64
- "agent_type": agent_type,
132
+ "agent_type": agent_type
65
133
  }
66
134
  if output_file_grp:
67
135
  req_params["output_file_grps"] = output_file_grp.split(',')
68
136
  if page_id:
69
137
  req_params["page_id"] = page_id
138
+ req_params["parameters"] = set_json_key_value_overrides(parse_json_string_or_file(*parameter), *parameter_override)
70
139
  if result_queue_name:
71
140
  req_params["result_queue_name"] = result_queue_name
72
141
  if callback_url:
73
142
  req_params["callback_url"] = callback_url
74
-
75
- client = Client(
76
- server_addr_processing=address
77
- )
78
- response = client.send_processing_request(
79
- processor_name=processor_name,
80
- req_params=req_params
81
- )
82
- processing_job_id = response.get('job_id', None)
143
+ client = Client(server_addr_processing=address)
144
+ processing_job_id = client.send_processing_job_request(
145
+ processor_name=processor_name, req_params=req_params)
146
+ assert processing_job_id
83
147
  print(f"Processing job id: {processing_job_id}")
148
+ if block:
149
+ client.poll_job_status(job_id=processing_job_id)
84
150
 
85
151
 
86
152
  @client_cli.group('workflow')
@@ -91,6 +157,44 @@ def workflow_cli():
91
157
  pass
92
158
 
93
159
 
160
+ @workflow_cli.command('check-status')
161
+ @click.option('--address', help='The address of the Processing Server. If not provided, '
162
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
163
+ @click.option('-j', '--workflow-job-id', required=True)
164
+ def check_workflow_job_status(address: Optional[str], workflow_job_id: str):
165
+ """
166
+ Check the status of a previously submitted workflow job.
167
+ """
168
+ client = Client(server_addr_processing=address)
169
+ job_status = client.check_workflow_status(workflow_job_id)
170
+ assert job_status
171
+ print(f"Workflow job status: {job_status}")
172
+
173
+
174
+ @workflow_cli.command('run')
175
+ @click.option('--address', help='The address of the Processing Server. If not provided, '
176
+ 'the "OCRD_NETWORK_SERVER_ADDR_PROCESSING" env variable is used by default')
177
+ @click.option('-m', '--path-to-mets', required=True)
178
+ @click.option('-w', '--path-to-workflow', required=True)
179
+ @click.option('-b', '--block', default=False,
180
+ help='If set, the client will block till job timeout, fail or success.')
181
+ def send_workflow_job_request(
182
+ address: Optional[str],
183
+ path_to_mets: str,
184
+ path_to_workflow: str,
185
+ block: Optional[bool]
186
+ ):
187
+ """
188
+ Submit a workflow job to the processing server.
189
+ """
190
+ client = Client(server_addr_processing=address)
191
+ workflow_job_id = client.send_workflow_job_request(path_to_wf=path_to_workflow, path_to_mets=path_to_mets)
192
+ assert workflow_job_id
193
+ print(f"Workflow job id: {workflow_job_id}")
194
+ if block:
195
+ client.poll_workflow_status(job_id=workflow_job_id)
196
+
197
+
94
198
  @client_cli.group('workspace')
95
199
  def workspace_cli():
96
200
  """