lockss-pyclient 0.1.0.dev2__tar.gz → 0.1.0.dev3__tar.gz

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 (197) hide show
  1. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/PKG-INFO +10 -3
  2. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/pyproject.toml +10 -4
  3. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/__init__.py +8 -29
  4. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/__main__.py +37 -0
  5. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/_internal_common.py +395 -0
  6. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/_internal_config.py +207 -0
  7. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/_internal_crawler.py +251 -0
  8. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/_internal_md.py +111 -0
  9. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/_internal_poller.py +174 -0
  10. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/_internal_rs.py +232 -0
  11. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/cli.py +839 -0
  12. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/__init__.py +15 -0
  13. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/aus_api.py +14 -6
  14. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/config_api.py +12 -12
  15. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/utils_api.py +2 -2
  16. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/configuration.py +1 -1
  17. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/__init__.py +15 -0
  18. lockss_pyclient-0.1.0.dev2/src/lockss/pyclient/config/models/au_status.py → lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/access_type.py +11 -34
  19. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/au_agreements.py +136 -0
  20. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/au_config_page_info.py +140 -0
  21. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/au_state_bean.py +942 -0
  22. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/au_status.py +942 -0
  23. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/au_suspect_url_versions.py +136 -0
  24. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/check_substance_result.py +6 -22
  25. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/dated_peer_id_set_impl.py +162 -0
  26. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/hash_result.py +136 -0
  27. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/page_info.py +226 -0
  28. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/peer_agreement.py +188 -0
  29. lockss_pyclient-0.1.0.dev2/src/lockss/pyclient/config/models/platform_configuration_ws_result.py → lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/peer_agreements.py +45 -22
  30. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/platform_configuration_ws_result.py +526 -0
  31. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/platform_configuration_ws_result_daemon_version.py +188 -0
  32. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/platform_configuration_ws_result_java_version.py +188 -0
  33. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/platform_configuration_ws_result_platform.py +162 -0
  34. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/substance_checker_state.py +91 -0
  35. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/models/suspect_url_version.py +214 -0
  36. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/config/swagger.yaml +2031 -0
  37. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/__init__.py +1 -0
  38. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api/crawls_api.py +2 -2
  39. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/configuration.py +1 -1
  40. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/__init__.py +1 -0
  41. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawl_desc.py +4 -12
  42. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/crawler/models/crawl_kind_enum.py +90 -0
  43. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/page_info.py +22 -24
  44. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/crawler/swagger.yaml +1197 -0
  45. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/configuration.py +1 -1
  46. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/page_info.py +22 -24
  47. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/md/swagger.yaml +583 -0
  48. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/output.py +131 -0
  49. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/__init__.py +11 -5
  50. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/export_api.py +5 -5
  51. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/hash_api.py +3 -3
  52. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/poll_detail_api.py +42 -42
  53. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/poller_polls_api.py +18 -18
  54. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/service_api.py +2 -2
  55. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/voter_polls_api.py +18 -18
  56. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/configuration.py +1 -1
  57. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/__init__.py +11 -5
  58. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/export_file_type_enum.py +93 -0
  59. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/export_filename_translation_enum.py +91 -0
  60. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/page_info.py +226 -0
  61. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/poll_desc.py +3 -11
  62. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/poll_variant_enum.py +92 -0
  63. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/poller_page_info.py +140 -0
  64. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/repair_page_info.py +140 -0
  65. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/repair_type_enum.py +91 -0
  66. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/tally_type_enum.py +93 -0
  67. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/url_page_info.py +140 -0
  68. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/voter_page_info.py +140 -0
  69. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/models/voter_urls_enum.py +92 -0
  70. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/poller/swagger.yaml +1658 -0
  71. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/__init__.py +6 -0
  72. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api/artifacts_api.py +20 -20
  73. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api/aus_api.py +5 -5
  74. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api/repo_api.py +4 -4
  75. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api/status_api.py +1 -1
  76. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api/wayback_api.py +12 -12
  77. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/configuration.py +254 -0
  78. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/__init__.py +6 -0
  79. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/artifact.py +111 -81
  80. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/au_size.py +6 -0
  81. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/auid_page_info.py +2 -2
  82. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/models/bulk_au_op_enum.py +90 -0
  83. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/models/include_content_enum.py +91 -0
  84. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/page_info.py +26 -29
  85. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/models/pywb_match_enum.py +93 -0
  86. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/models/pywb_output_enum.py +90 -0
  87. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/models/pywb_sort_enum.py +91 -0
  88. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/storage_info.py +131 -80
  89. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/models/versions_enum.py +90 -0
  90. lockss_pyclient-0.1.0.dev3/src/lockss/pyclient/rs/swagger.yaml +1306 -0
  91. lockss_pyclient-0.1.0.dev2/src/lockss/pyclient/rs/configuration.py +0 -247
  92. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/CHANGELOG.rst +0 -0
  93. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/LICENSE +0 -0
  94. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/README.rst +0 -0
  95. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/__init__.py +0 -0
  96. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/plugins_api.py +0 -0
  97. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/status_api.py +0 -0
  98. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/tdb_api.py +0 -0
  99. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api/users_api.py +0 -0
  100. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/api_client.py +0 -0
  101. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/api_status.py +0 -0
  102. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/au_configuration.py +0 -0
  103. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/au_ws_result.py +0 -0
  104. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/auids_body.py +0 -0
  105. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/content_configuration_result.py +0 -0
  106. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/file_section_name_body.py +0 -0
  107. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/plugin_ws_result.py +0 -0
  108. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/request_au_control_result.py +0 -0
  109. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/tdb_au_ws_result.py +0 -0
  110. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/tdb_publisher_ws_result.py +0 -0
  111. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/models/tdb_title_ws_result.py +0 -0
  112. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/config/rest.py +0 -0
  113. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api/__init__.py +0 -0
  114. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api/crawlers_api.py +0 -0
  115. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api/jobs_api.py +0 -0
  116. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api/status_api.py +0 -0
  117. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api/ws_api.py +0 -0
  118. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/api_client.py +0 -0
  119. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/api_status.py +0 -0
  120. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/counter.py +0 -0
  121. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawl_job.py +0 -0
  122. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawl_pager.py +0 -0
  123. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawl_status.py +0 -0
  124. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawl_ws_result.py +0 -0
  125. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawl_ws_result_pages_with_errors.py +0 -0
  126. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawler_config.py +0 -0
  127. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawler_status.py +0 -0
  128. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/crawler_statuses.py +0 -0
  129. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/error_result.py +0 -0
  130. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/job_pager.py +0 -0
  131. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/job_status.py +0 -0
  132. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/mime_counter.py +0 -0
  133. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/url_error.py +0 -0
  134. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/url_info.py +0 -0
  135. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/models/url_pager.py +0 -0
  136. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/crawler/rest.py +0 -0
  137. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/__init__.py +0 -0
  138. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/api/__init__.py +0 -0
  139. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/api/mdupdates_api.py +0 -0
  140. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/api/metadata_api.py +0 -0
  141. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/api/status_api.py +0 -0
  142. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/api/urls_api.py +0 -0
  143. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/api_client.py +0 -0
  144. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/__init__.py +0 -0
  145. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/api_status.py +0 -0
  146. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/au.py +0 -0
  147. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/au_metadata_page_info.py +0 -0
  148. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/error_result.py +0 -0
  149. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/item_metadata.py +0 -0
  150. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/job.py +0 -0
  151. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/job_page_info.py +0 -0
  152. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/metadata_update_spec.py +0 -0
  153. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/status.py +0 -0
  154. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/models/url_info.py +0 -0
  155. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/md/rest.py +0 -0
  156. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/__init__.py +0 -0
  157. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/import_api.py +0 -0
  158. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api/repo_api.py +0 -0
  159. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/api_client.py +0 -0
  160. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/api_status.py +0 -0
  161. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/aus_import_body.py +0 -0
  162. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/cached_uri_set_spec.py +0 -0
  163. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/error_result.py +0 -0
  164. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/hasher_ws_params.py +0 -0
  165. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/link_desc.py +0 -0
  166. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/page_desc.py +0 -0
  167. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/peer_data.py +0 -0
  168. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/peer_ws_result.py +0 -0
  169. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/poll_ws_result.py +0 -0
  170. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/poller_detail.py +0 -0
  171. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/poller_pager.py +0 -0
  172. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/poller_summary.py +0 -0
  173. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/repair_data.py +0 -0
  174. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/repair_pager.py +0 -0
  175. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/repair_queue.py +0 -0
  176. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/repository_space_ws_result.py +0 -0
  177. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/repository_ws_result.py +0 -0
  178. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/tally_data.py +0 -0
  179. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/url_pager.py +0 -0
  180. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/vote_ws_result.py +0 -0
  181. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/voter_detail.py +0 -0
  182. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/voter_pager.py +0 -0
  183. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/models/voter_summary.py +0 -0
  184. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/poller/rest.py +0 -0
  185. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api/__init__.py +0 -0
  186. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/api_client.py +0 -0
  187. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/api_status.py +0 -0
  188. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/archives_body.py +0 -0
  189. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/artifact_page_info.py +0 -0
  190. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/artifact_properties.py +0 -0
  191. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/artifacts_body.py +0 -0
  192. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/error_result.py +0 -0
  193. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/import_status.py +0 -0
  194. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/repository_info.py +0 -0
  195. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/repository_statistics.py +0 -0
  196. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/models/streaming_response_body.py +0 -0
  197. {lockss_pyclient-0.1.0.dev2 → lockss_pyclient-0.1.0.dev3}/src/lockss/pyclient/rs/rest.py +0 -0
@@ -1,13 +1,14 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: lockss-pyclient
3
- Version: 0.1.0.dev2
3
+ Version: 0.1.0.dev3
4
4
  Summary: LOCKSS Python clients
5
5
  License: BSD-3-Clause
6
+ License-File: LICENSE
6
7
  Author: Thib Guicherd-Callin
7
8
  Author-email: thib@cs.stanford.edu
8
9
  Maintainer: Thib Guicherd-Callin
9
10
  Maintainer-email: thib@cs.stanford.edu
10
- Requires-Python: >=3.9,<4.0
11
+ Requires-Python: >=3.9,<3.14
11
12
  Classifier: Development Status :: 5 - Production/Stable
12
13
  Classifier: Environment :: Console
13
14
  Classifier: Intended Audience :: Developers
@@ -17,8 +18,14 @@ Classifier: Topic :: Software Development :: Libraries
17
18
  Classifier: Topic :: System :: Archiving
18
19
  Classifier: Topic :: Utilities
19
20
  Requires-Dist: certifi (>=2025.8.0,<2025.9.0)
21
+ Requires-Dist: lockss-pybasic (==0.2.0-dev2)
22
+ Requires-Dist: multipart (>=1.3.0,<1.4.0)
23
+ Requires-Dist: pydantic (>=2.11.0,<2.12.0)
24
+ Requires-Dist: python-jsonpath (>=2.0.0,<2.1.0)
20
25
  Requires-Dist: python_dateutil (>=2.9.0,<2.10.0)
26
+ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
21
27
  Requires-Dist: six (>=1.17,<1.18)
28
+ Requires-Dist: tabulate (>=0.9.0,<0.10.0)
22
29
  Requires-Dist: urllib3 (>=2.5.0,<2.6.0)
23
30
  Project-URL: Documentation, https://docs.lockss.org/en/latest/software/pyclient
24
31
  Project-URL: Repository, https://github.com/lockss/lockss-pyclient
@@ -28,11 +28,11 @@
28
28
 
29
29
  [project]
30
30
  name = "lockss-pyclient"
31
- version = "0.1.0-dev2" # Always change in __init__.py, and at release time in README.rst and CHANGELOG.rst
31
+ version = "0.1.0-dev3" # Always change in __init__.py, and at release time in README.rst and CHANGELOG.rst
32
32
  description = "LOCKSS Python clients"
33
33
  license = { text = "BSD-3-Clause" }
34
34
  readme = "README.rst"
35
- requires-python = ">=3.9,<4.0"
35
+ requires-python = ">=3.9,<3.14"
36
36
  authors = [
37
37
  { name = "Thib Guicherd-Callin", email = "thib@cs.stanford.edu" },
38
38
  { name = "Daniel Vargas", email = "dlvargas@stanford.edu" },
@@ -43,8 +43,14 @@ maintainers = [
43
43
  ]
44
44
  dependencies = [
45
45
  "certifi (>=2025.8.0,<2025.9.0)",
46
+ "lockss-pybasic (==0.2.0-dev2)",
47
+ "multipart (>=1.3.0,<1.4.0)",
48
+ "pydantic (>=2.11.0,<2.12.0)",
46
49
  "python_dateutil (>=2.9.0,<2.10.0)",
50
+ "python-jsonpath (>=2.0.0,<2.1.0)",
51
+ "pyyaml (>=6.0.2,<7.0.0)",
47
52
  "six (>=1.17,<1.18)",
53
+ "tabulate (>=0.9.0,<0.10.0)",
48
54
  "urllib3 (>=2.5.0,<2.6.0)",
49
55
  ]
50
56
  classifiers = [
@@ -74,8 +80,8 @@ packages = [
74
80
  { include = "lockss", from = "src" }
75
81
  ]
76
82
 
77
- #[tool.poetry.scripts]
78
- #pyclient = 'lockss.pyclient.cli:main'
83
+ [tool.poetry.scripts]
84
+ lockssapi = 'lockss.pyclient.cli:main'
79
85
 
80
86
  [build-system]
81
87
  requires = ["poetry-core>=2.0.0,<3.0.0"]
@@ -1,38 +1,10 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- # Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
4
- #
5
- # Redistribution and use in source and binary forms, with or without
6
- # modification, are permitted provided that the following conditions are met:
7
- #
8
- # 1. Redistributions of source code must retain the above copyright notice,
9
- # this list of conditions and the following disclaimer.
10
- #
11
- # 2. Redistributions in binary form must reproduce the above copyright notice,
12
- # this list of conditions and the following disclaimer in the documentation
13
- # and/or other materials provided with the distribution.
14
- #
15
- # 3. Neither the name of the copyright holder nor the names of its contributors
16
- # may be used to endorse or promote products derived from this software without
17
- # specific prior written permission.
18
- #
19
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23
- # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
- # POSSIBILITY OF SUCH DAMAGE.
30
-
31
3
  """
32
4
  LOCKSS Python clients
33
5
  """
34
6
 
35
- __version__ = '0.1.0-dev2'
7
+ __version__ = '0.1.0-dev3'
36
8
 
37
9
  __copyright__ = '''
38
10
  Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
@@ -65,3 +37,10 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
65
37
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
66
38
  POSSIBILITY OF SUCH DAMAGE.
67
39
  '''.strip()
40
+
41
+ from ._internal_common import *
42
+ from ._internal_config import *
43
+ from ._internal_crawler import *
44
+ from ._internal_md import *
45
+ from ._internal_poller import *
46
+ from ._internal_rs import *
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python3
2
+
3
+ # Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # 1. Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # 3. Neither the name of the copyright holder nor the names of its contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ """
32
+ Entry point for the ``lockss.pyclient`` module.
33
+ """
34
+
35
+ from .cli import main
36
+
37
+ main()
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env python3
2
+
3
+ # Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # 1. Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # 3. Neither the name of the copyright holder nor the names of its contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ """
32
+ Base of the lockss.pyclient package.
33
+ """
34
+
35
+ # Remove in Python 3.14; see https://stackoverflow.com/a/33533514
36
+ from __future__ import annotations
37
+
38
+ from collections.abc import Callable, Iterable, Iterator
39
+ from getpass import getpass
40
+ from importlib import resources
41
+ from io import BytesIO
42
+ from typing import Any, ClassVar, Optional, TypeVar, Union
43
+
44
+ from jsonpath import query
45
+ from multipart import MultipartParser
46
+ import yaml
47
+
48
+ from . import config, crawler, md, poller, rs
49
+
50
+
51
+ YamlT = Any
52
+
53
+
54
+ def _load_swagger(package) -> YamlT:
55
+ with resources.path(package, 'swagger.yaml') as p:
56
+ with p.open('rb') as f:
57
+ return yaml.safe_load(f)
58
+
59
+
60
+ _CONFIG = _load_swagger(config)
61
+
62
+
63
+ _CRAWLER = _load_swagger(crawler)
64
+
65
+
66
+ _MD = _load_swagger(md)
67
+
68
+
69
+ _POLLER = _load_swagger(poller)
70
+
71
+
72
+ _RS = _load_swagger(rs)
73
+
74
+
75
+ def _first(data: YamlT, json_path: str) -> Any:
76
+ return query(json_path, data).first_one().value
77
+
78
+
79
+ def _param_default(data: YamlT, path: str, method: str, param_name: str) -> Any:
80
+ return _first(data, f'$.paths["{path}"].{method}.parameters[?(@.name == "{param_name}")].schema.default')
81
+
82
+
83
+ def _schema_default(data: YamlT, schema_name: str) -> Any:
84
+ return _first(data, f'$.components.schemas.{schema_name}.default')
85
+
86
+
87
+ __JSON_PATH_DEFAULT_PORT = '$.servers[0].variables.port.default'
88
+
89
+
90
+ CONFIG_DEFAULT_PORT: int = _first(_CONFIG, __JSON_PATH_DEFAULT_PORT)
91
+
92
+
93
+ CRAWLER_DEFAULT_PORT: int = _first(_CRAWLER, __JSON_PATH_DEFAULT_PORT)
94
+
95
+
96
+ MD_DEFAULT_PORT: int = _first(_MD, __JSON_PATH_DEFAULT_PORT)
97
+
98
+
99
+ POLLER_DEFAULT_PORT: int = _first(_POLLER, __JSON_PATH_DEFAULT_PORT)
100
+
101
+
102
+ RS_DEFAULT_PORT: int = _first(_RS, __JSON_PATH_DEFAULT_PORT)
103
+
104
+
105
+ ConfT = Union[
106
+ config.Configuration,
107
+ crawler.Configuration,
108
+ md.Configuration,
109
+ poller.Configuration,
110
+ rs.Configuration,
111
+ ]
112
+
113
+
114
+ ConfSupplier = Callable[[], ConfT]
115
+
116
+
117
+ PortGetter = Callable[..., int]
118
+
119
+
120
+ StrSupplier = Callable[[], str]
121
+
122
+
123
+ class Node(object):
124
+
125
+ DEFAULT_PROTOCOL: ClassVar[str] = 'http'
126
+
127
+ # DECORATOR
128
+ @staticmethod
129
+ def _make_conf_template(make_conf: ConfSupplier,
130
+ get_port: PortGetter):
131
+ def decorate(f):
132
+ def decorated_make_conf(self: Node,
133
+ needs_auth: bool = True) -> ConfT:
134
+ conf = make_conf()
135
+ conf.host = f'{self.get_host()}:{get_port(self)}'
136
+ if needs_auth:
137
+ conf.username = self.get_username()
138
+ conf.password = self.get_password()()
139
+ return conf
140
+ return decorated_make_conf
141
+ return decorate
142
+
143
+ # DECORATOR
144
+ @staticmethod
145
+ def _set_port_template(port_name: str):
146
+ def decorate(f):
147
+ def decorated_set_port(self: Node,
148
+ port: int) -> Node:
149
+ setattr(self, port_name, port)
150
+ return self
151
+ return decorated_set_port
152
+ return decorate
153
+
154
+ # DECORATOR
155
+ @staticmethod
156
+ def _get_port_template(port_name: str,
157
+ default_port: int):
158
+ def decorate(f):
159
+ def decorated_get_port(self: Node) -> int:
160
+ return getattr(self, port_name, default_port)
161
+ return decorated_get_port
162
+ return decorate
163
+
164
+ def __init__(self,
165
+ node_reference: str,
166
+ username: Optional[str] = None,
167
+ password: Optional[StrSupplier] = None,
168
+ interactive: bool = True,
169
+ config_port: int = CONFIG_DEFAULT_PORT,
170
+ crawler_port: int = CRAWLER_DEFAULT_PORT,
171
+ md_port: int = MD_DEFAULT_PORT,
172
+ poller_port: int = POLLER_DEFAULT_PORT,
173
+ rs_port: int = RS_DEFAULT_PORT):
174
+ super().__init__()
175
+ self._host: str = Node._compute_host(node_reference)
176
+ self._username: Optional[str] = username
177
+ self._password: Optional[StrSupplier] = password
178
+ self._interactive: bool = interactive
179
+ self._config_port = config_port
180
+ self._crawler_port = crawler_port
181
+ self._md_port: int = md_port
182
+ self._poller_port: int = poller_port
183
+ self._rs_port: int = rs_port
184
+
185
+ @_get_port_template('_config_port', CONFIG_DEFAULT_PORT)
186
+ def get_config_port(self: Node) -> int:
187
+ pass
188
+
189
+ @_get_port_template('_crawler_port', CRAWLER_DEFAULT_PORT)
190
+ def get_crawler_port(self: Node) -> int:
191
+ pass
192
+
193
+ def get_host(self) -> str:
194
+ return self._host
195
+
196
+ @_get_port_template('_md_port', MD_DEFAULT_PORT)
197
+ def get_md_port(self: Node) -> int:
198
+ pass
199
+
200
+ @_get_port_template('_poller_port', POLLER_DEFAULT_PORT)
201
+ def get_poller_port(self: Node) -> int:
202
+ pass
203
+
204
+ @_get_port_template('_rs_port', RS_DEFAULT_PORT)
205
+ def get_rs_port(self: Node) -> int:
206
+ pass
207
+
208
+ def get_username(self) -> str:
209
+ return self._username
210
+
211
+ def get_password(self) -> Optional[StrSupplier]:
212
+ if not self._password:
213
+ if not self._interactive:
214
+ raise RuntimeError('interactive prompts not allowed')
215
+ _p = getpass(f'Password ({self.get_host().partition("://")[2]}): ')
216
+ self._password = lambda: _p
217
+ return self._password
218
+
219
+ @_make_conf_template(config.Configuration, get_config_port)
220
+ def make_config_conf(self, needs_auth: bool = True) -> config.Configuration:
221
+ pass
222
+
223
+ @_make_conf_template(crawler.Configuration, get_crawler_port)
224
+ def make_crawler_conf(self, needs_auth: bool = True) -> crawler.Configuration:
225
+ pass
226
+
227
+ @_make_conf_template(md.Configuration, get_md_port)
228
+ def make_md_conf(self, needs_auth: bool = True) -> md.Configuration:
229
+ pass
230
+
231
+ @_make_conf_template(poller.Configuration, get_poller_port)
232
+ def make_poller_conf(self, needs_auth: bool = True) -> poller.Configuration:
233
+ pass
234
+
235
+ @_make_conf_template(rs.Configuration, get_rs_port)
236
+ def make_rs_conf(self, needs_auth: bool = True) -> rs.Configuration:
237
+ pass
238
+
239
+ @_set_port_template('_config_port')
240
+ def set_config_port(self, port: int) -> Node:
241
+ pass
242
+
243
+ @_set_port_template('_crawler_port')
244
+ def set_crawler_port(self, port: int) -> Node:
245
+ pass
246
+
247
+ @_set_port_template('_md_port')
248
+ def set_md_port(self, port: int) -> Node:
249
+ pass
250
+
251
+ @_set_port_template('_poller_port')
252
+ def set_poller_port(self, port: int) -> Node:
253
+ pass
254
+
255
+ @_set_port_template('_rs_port')
256
+ def set_rs_port(self, port: int) -> Node:
257
+ pass
258
+
259
+ def set_username(self, username: str) -> Node:
260
+ self._username = username
261
+ return self
262
+
263
+ @staticmethod
264
+ def _compute_host(node_reference: str) -> str:
265
+ if node_reference.endswith('/'):
266
+ node_reference = node_reference[:-1]
267
+ x, y, z = node_reference.rpartition(':')
268
+ if z.isdigit():
269
+ node_reference = x # Ignore port if passed in
270
+ if '://' not in node_reference:
271
+ node_reference = f'{Node.DEFAULT_PROTOCOL}://{node_reference}'
272
+ return node_reference
273
+
274
+
275
+ ConfFunction = Callable[..., ConfT]
276
+
277
+
278
+ ApiClientT = Union[
279
+ config.ApiClient,
280
+ crawler.ApiClient,
281
+ md.ApiClient,
282
+ poller.ApiClient,
283
+ rs.ApiClient,
284
+ ]
285
+
286
+
287
+ ApiClientFunction = Callable[..., ApiClientT]
288
+
289
+
290
+ ApiInstanceT = Union[
291
+ config.AusApi, config.ConfigApi, config.PluginsApi, config.StatusApi, config.TdbApi, config.UsersApi, config.UtilsApi,
292
+ crawler.CrawlersApi, crawler.CrawlsApi, crawler.JobsApi, crawler.StatusApi, crawler.WsApi,
293
+ md.MdupdatesApi, md.MetadataApi, md.StatusApi, md.UrlsApi,
294
+ poller.ExportApi, poller.HashApi, poller.ImportApi, poller.PollDetailApi, poller.PollerPollsApi, poller.RepoApi, poller.ServiceApi, poller.VoterPollsApi,
295
+ rs.ArtifactsApi, rs.AusApi, rs.RepoApi, rs.StatusApi, rs.WaybackApi,
296
+ ]
297
+
298
+
299
+ ApiInstanceFunction = Callable[[ApiClientT], ApiInstanceT]
300
+
301
+
302
+ ApiResultT = TypeVar('ApiResultT')
303
+
304
+
305
+ ApiResultFunction = Callable[..., ApiResultT]
306
+
307
+
308
+ ResultT = TypeVar('ResultT')
309
+
310
+
311
+ ResultFunction = Callable[[ApiResultT], ResultT]
312
+
313
+
314
+ def _single_request_template(make_conf: ConfFunction,
315
+ make_api_client: ApiClientFunction,
316
+ make_api_instance: ApiInstanceFunction,
317
+ api_operation: ApiResultFunction,
318
+ needs_auth: bool = True,
319
+ remove_kwargs: Optional[list[str]] = None,
320
+ transform_result: ResultFunction = lambda x: x,
321
+ transform_raw_result: Optional[Any] = None):
322
+ def decorate(f):
323
+ def decorated_single_request(node: Node, *args, **kwargs) -> ResultT:
324
+ if needs_auth:
325
+ conf: ConfT = make_conf(node)
326
+ api_client: ApiClientT = make_api_client(conf, "Authorization", conf.get_basic_auth_token())
327
+ else:
328
+ conf: ConfT = make_conf(node, needs_auth=False)
329
+ api_client: ApiClientT = make_api_client(conf)
330
+ api_instance: ApiInstanceT = make_api_instance(api_client)
331
+ for remove in [key for key, val in kwargs.items() if key in (remove_kwargs or []) and val is None]:
332
+ kwargs.pop(remove, None)
333
+ if transform_raw_result:
334
+ kwargs['_preload_content'] = False
335
+ api_response: ApiResultT = api_operation(api_instance, *args, **kwargs)
336
+ if transform_raw_result:
337
+ result = api_client.deserialize(api_response, transform_raw_result)
338
+ else:
339
+ result: ResultT = transform_result(api_response)
340
+ return result
341
+ return decorated_single_request
342
+ return decorate
343
+
344
+
345
+ PageInfoResultT = Union[
346
+ config.AuConfigPageInfo,
347
+ crawler.CrawlPager, crawler.JobPager, crawler.UrlPager,
348
+ md.AuMetadataPageInfo, md.JobPageInfo,
349
+ poller.PollerPageInfo, poller.RepairPageInfo, poller.UrlPageInfo,
350
+ rs.ArtifactPageInfo, rs.AuidPageInfo,
351
+ ]
352
+
353
+
354
+ PageInfoResultFunction = Callable[..., PageInfoResultT]
355
+
356
+
357
+ PageInfoAccessorFunction = Callable[[PageInfoResultT], Iterable[ResultT]]
358
+
359
+
360
+ def _paged_request_iterator_template(single_request: PageInfoResultFunction,
361
+ item_accessor: PageInfoAccessorFunction,
362
+ remove_kwargs: Optional[list[str]] = None,
363
+ default_limit: int = 100):
364
+ def decorate(f):
365
+ def decorated_paged_request_iterator(*args, **kwargs) -> Iterator[ResultT]:
366
+ for remove in [key for key, val in kwargs.items() if key in (remove_kwargs or []) and val is None]:
367
+ kwargs.pop(remove, None)
368
+ token = None
369
+ while True:
370
+ if token:
371
+ kwargs['continuation_token'] = token
372
+ else:
373
+ kwargs.pop('continuation_token', None)
374
+ if kwargs.get('limit') is None:
375
+ kwargs['limit'] = default_limit
376
+ result_page: PageInfoResultT = single_request(*args, **kwargs)
377
+ token = result_page.page_info.continuation_token
378
+ for result in item_accessor(result_page):
379
+ result_t: ResultT = result
380
+ yield result_t
381
+ if token is None:
382
+ break
383
+ return decorated_paged_request_iterator
384
+ return decorate
385
+
386
+
387
+ def bytes_repr_to_multipart(bytes_repr: str) -> MultipartParser:
388
+ byte_input: bytes = eval(bytes_repr)
389
+ boundary: bytes = byte_input.partition(b'\r\n')[0].partition(b'--')[2]
390
+ return MultipartParser(BytesIO(byte_input), boundary)
391
+
392
+
393
+ def bytes_repr_to_string(bytes_repr: str) -> str:
394
+ byte_input: bytes = eval(bytes_repr)
395
+ return byte_input.decode()