rucio-clients 36.1.0__tar.gz → 36.2.0__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.
Potentially problematic release.
This version of rucio-clients might be problematic. Click here for more details.
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/PKG-INFO +1 -1
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/bin/rucio +14 -5
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/bin/rucio-admin +4 -1
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/rucio_admin.py +5 -4
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/config.py +7 -16
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/exception.py +15 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/translation.py +3 -2
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/vcsversion.py +3 -3
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio_clients.egg-info/SOURCES.txt +0 -3
- rucio_clients-36.2.0/tests/test_dumper.py +47 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_hermes.py +2 -2
- rucio_clients-36.1.0/tests/test_dumper.py +0 -237
- rucio_clients-36.1.0/tests/test_dumper_consistency.py +0 -407
- rucio_clients-36.1.0/tests/test_dumper_data_model.py +0 -334
- rucio_clients-36.1.0/tests/test_dumper_path_parsing.py +0 -47
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/AUTHORS.rst +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/ChangeLog +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/LICENSE +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/MANIFEST.in +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/README.md +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/etc/rse-accounts.cfg.template +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/etc/rucio.cfg.template +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/alembicrevision.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/accountclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/baseclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/client.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/account.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/rucio.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/command.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/command_base.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/config.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/did.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/download.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/lifetime_exception.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/replica.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/rse.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/rule.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/scope.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/subscription.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/upload.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/utils.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/configclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/credentialclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/didclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/diracclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/downloadclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/exportclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/fileclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/importclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/lockclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/metaconventionsclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/pingclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/replicaclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/requestclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/richclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/rseclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/ruleclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/scopeclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/touchclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/uploadclient.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/bittorrent.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/cache.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/checksum.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/client.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/constants.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/constraints.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/didtype.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/extra.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/logging.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/pcache.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/plugins.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/policy.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/schema/generic.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/stopwatch.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/types.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/common/utils.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/bittorrent.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/gsiftp.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/version.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/pylintrc +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/pyproject.toml +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/requirements/requirements.client.txt +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/setup.cfg +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/setup.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/setuputil.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_abacus_account.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_abacus_collection_replica.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_abacus_rse.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_account.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_account_limits.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_archive.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_auditor.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_auditor_hdfs.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_auditor_srmdumps.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_authentication.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_automatix.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_bad_replica.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_bb8.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_belleii.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_bin_rucio.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_boolean.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_cli_client_structure.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_clients.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_config.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_conveyor.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_conveyor_submitter.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_counter.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_credential.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_curl.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_daemons.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_dataset_replicas.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_db.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_did.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_did_meta_plugins.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_download.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_filter_engine.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_gateway_external_representation.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_heartbeat.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_identity.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_impl_upload_download.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_import_export.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_cleaner.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_evaluator.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_injector.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_judge_repairer.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_lifetime.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_message.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_meta_conventions.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_meta_did.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_module_import.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_monitor.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_multi_vo.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_naming_convention.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_oauthmanager.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_oidc.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_permission.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_pfns.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_ping.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_policy_package.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_preparer.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_qos.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_quarantined_replica.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_reaper.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_redirect.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_replica.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_replica_recoverer.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_replica_sorting.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_request.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_root_proxy.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_expression_parser.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_lfn2path.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_posix.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_srm.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rse_selector.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rucio_server.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_rule.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_scope.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_subscription.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_throttler.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_tpc.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_trace.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_transfer.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_transfer_plugins.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_undertaker.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_upload.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tests/test_utils.py +0 -0
- {rucio_clients-36.1.0 → rucio_clients-36.2.0}/tools/merge_rucio_configs.py +0 -0
|
@@ -21,6 +21,16 @@ from rucio.client.commands.bin_legacy.rucio import main as main_legacy
|
|
|
21
21
|
from rucio.client.commands.command import main
|
|
22
22
|
|
|
23
23
|
|
|
24
|
+
def _get_first_command(args: list[str]) -> Optional[str]:
|
|
25
|
+
return next(
|
|
26
|
+
(
|
|
27
|
+
arg for arg in args
|
|
28
|
+
if arg != 'rucio' and (arg[0] != "-" or arg in ("-h", "--help", "--version"))
|
|
29
|
+
),
|
|
30
|
+
None
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
24
34
|
def make_warning():
|
|
25
35
|
base_warning = "\nWARNING: This method is being deprecated."
|
|
26
36
|
new_command = map_legacy_command()
|
|
@@ -33,10 +43,7 @@ def make_warning():
|
|
|
33
43
|
|
|
34
44
|
|
|
35
45
|
def map_legacy_command() -> Optional[list[str]]:
|
|
36
|
-
|
|
37
|
-
command = [arg for arg in sys.argv if arg[0] != "-" or arg in ("-h", "--version")][1]
|
|
38
|
-
except IndexError:
|
|
39
|
-
command = None
|
|
46
|
+
command = _get_first_command(sys.argv[1:])
|
|
40
47
|
|
|
41
48
|
new_command = None
|
|
42
49
|
if command not in ("-h", "--version", None):
|
|
@@ -89,7 +96,9 @@ def map_legacy_command() -> Optional[list[str]]:
|
|
|
89
96
|
|
|
90
97
|
if __name__ == "__main__":
|
|
91
98
|
commands = ("-h", "--help", "--version", "account", "config", "did", "replica", "rse", "rule", "scope", "subscription", "ping", "whoami", "test-server", "lifetime-exception", "upload", "download")
|
|
92
|
-
|
|
99
|
+
|
|
100
|
+
first_command = _get_first_command(sys.argv[1:])
|
|
101
|
+
|
|
93
102
|
is_legacy = '--legacy' in sys.argv
|
|
94
103
|
|
|
95
104
|
if (first_command in commands) and not is_legacy:
|
|
@@ -20,7 +20,10 @@ from rucio.client.commands.bin_legacy.rucio_admin import main as main_legacy
|
|
|
20
20
|
def make_warning():
|
|
21
21
|
base_warning = "\nWARNING: This method is being deprecated."
|
|
22
22
|
args = [arg for arg in sys.argv if arg[0] != "-" or arg in ("-h", "--help", "--version")]
|
|
23
|
-
|
|
23
|
+
try:
|
|
24
|
+
first_command = args[1]
|
|
25
|
+
except IndexError:
|
|
26
|
+
first_command = None
|
|
24
27
|
try:
|
|
25
28
|
second_command = args[2]
|
|
26
29
|
except IndexError:
|
{rucio_clients-36.1.0 → rucio_clients-36.2.0}/lib/rucio/client/commands/bin_legacy/rucio_admin.py
RENAMED
|
@@ -418,7 +418,6 @@ def info_rse(args, client, logger, console, spinner):
|
|
|
418
418
|
if cli_config == 'rich':
|
|
419
419
|
table = generate_table(table_data, row_styles=['none'], col_alignments=['left', 'left'])
|
|
420
420
|
output.append(table)
|
|
421
|
-
table_data = []
|
|
422
421
|
else:
|
|
423
422
|
print('Protocols:')
|
|
424
423
|
print('==========')
|
|
@@ -430,6 +429,7 @@ def info_rse(args, client, logger, console, spinner):
|
|
|
430
429
|
else:
|
|
431
430
|
print(' ' + protocol['scheme'])
|
|
432
431
|
|
|
432
|
+
table_data = []
|
|
433
433
|
for item in sorted(protocol):
|
|
434
434
|
if cli_config == 'rich':
|
|
435
435
|
if item == 'domains':
|
|
@@ -447,10 +447,11 @@ def info_rse(args, client, logger, console, spinner):
|
|
|
447
447
|
else:
|
|
448
448
|
print(' ' + item + ': ' + str(protocol[item]))
|
|
449
449
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
450
|
+
if cli_config == 'rich':
|
|
451
|
+
table = generate_table(table_data, col_alignments=['left', 'left'], row_styles=['none'])
|
|
452
|
+
output.append(Padding.indent(table, 2))
|
|
453
453
|
|
|
454
|
+
if cli_config == 'rich':
|
|
454
455
|
header = ['SOURCE', 'USED', 'FILES', 'FREE', 'TOTAL', 'UPDATED AT']
|
|
455
456
|
key2id = {header[i].lower().replace(' ', '_'): i for i in range(len(header))}
|
|
456
457
|
table_data = []
|
|
@@ -17,10 +17,11 @@
|
|
|
17
17
|
import configparser
|
|
18
18
|
import json
|
|
19
19
|
import os
|
|
20
|
+
from functools import cache
|
|
20
21
|
from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union, overload
|
|
21
22
|
|
|
22
23
|
from rucio.common import exception
|
|
23
|
-
from rucio.common.exception import ConfigNotFound, DatabaseException
|
|
24
|
+
from rucio.common.exception import ConfigLoadingError, ConfigNotFound, DatabaseException
|
|
24
25
|
|
|
25
26
|
_T = TypeVar('_T')
|
|
26
27
|
_U = TypeVar('_U')
|
|
@@ -656,7 +657,6 @@ def __config_get_table(
|
|
|
656
657
|
:raises ConfigNotFound
|
|
657
658
|
:raises DatabaseException
|
|
658
659
|
"""
|
|
659
|
-
global __CONFIG
|
|
660
660
|
try:
|
|
661
661
|
from rucio.core.config import get as core_config_get
|
|
662
662
|
return core_config_get(section, option, default=default, session=session, use_cache=use_cache,
|
|
@@ -665,7 +665,7 @@ def __config_get_table(
|
|
|
665
665
|
if raise_exception and default is None:
|
|
666
666
|
raise err
|
|
667
667
|
if clean_cached:
|
|
668
|
-
|
|
668
|
+
clean_cached_config()
|
|
669
669
|
return default
|
|
670
670
|
|
|
671
671
|
|
|
@@ -753,21 +753,15 @@ def get_rse_credentials(path_to_credentials_file: Optional[Union[str, os.PathLik
|
|
|
753
753
|
return credentials
|
|
754
754
|
|
|
755
755
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
756
|
+
@cache
|
|
759
757
|
def get_config() -> configparser.ConfigParser:
|
|
760
758
|
"""Factory function for the configuration class. Returns the ConfigParser instance."""
|
|
761
|
-
|
|
762
|
-
if __CONFIG is None:
|
|
763
|
-
__CONFIG = Config()
|
|
764
|
-
return __CONFIG.parser
|
|
759
|
+
return Config().parser
|
|
765
760
|
|
|
766
761
|
|
|
767
762
|
def clean_cached_config() -> None:
|
|
768
763
|
"""Deletes the cached config singleton instance."""
|
|
769
|
-
|
|
770
|
-
__CONFIG = None
|
|
764
|
+
get_config.cache_clear()
|
|
771
765
|
|
|
772
766
|
|
|
773
767
|
class Config:
|
|
@@ -790,7 +784,4 @@ class Config:
|
|
|
790
784
|
'\n\t' + '\n\t'.join(configs))
|
|
791
785
|
|
|
792
786
|
if not self.parser.read(self.configfile) == [self.configfile]:
|
|
793
|
-
raise
|
|
794
|
-
'Could not load Rucio configuration file. '
|
|
795
|
-
'Rucio tried loading the following configuration file:'
|
|
796
|
-
'\n\t' + self.configfile)
|
|
787
|
+
raise ConfigLoadingError(self.configfile)
|
|
@@ -1167,3 +1167,18 @@ class ChecksumCalculationError(RucioException):
|
|
|
1167
1167
|
self.filepath = filepath
|
|
1168
1168
|
self._message = 'An error occurred while calculating the %s checksum of file %s.' % (self.algorithm_name, self.filepath)
|
|
1169
1169
|
self.error_code = 111
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
class ConfigLoadingError(RucioException):
|
|
1173
|
+
"""
|
|
1174
|
+
An error occurred while loading the configuration.
|
|
1175
|
+
"""
|
|
1176
|
+
def __init__(
|
|
1177
|
+
self,
|
|
1178
|
+
config_file: str,
|
|
1179
|
+
*args,
|
|
1180
|
+
**kwargs
|
|
1181
|
+
):
|
|
1182
|
+
super(ConfigLoadingError, self).__init__(*args, **kwargs)
|
|
1183
|
+
self._message = 'Could not load Rucio configuration file. Rucio tried loading the following configuration file:\n\t %s' % (config_file)
|
|
1184
|
+
self.error_code = 112
|
|
@@ -18,6 +18,7 @@ from typing import TYPE_CHECKING, Any, Optional
|
|
|
18
18
|
|
|
19
19
|
from rucio.common import config
|
|
20
20
|
from rucio.common.constants import RseAttr
|
|
21
|
+
from rucio.common.exception import ConfigNotFound
|
|
21
22
|
from rucio.common.plugins import PolicyPackageAlgorithms
|
|
22
23
|
|
|
23
24
|
if TYPE_CHECKING:
|
|
@@ -38,7 +39,7 @@ class RSEDeterministicScopeTranslation(PolicyPackageAlgorithms):
|
|
|
38
39
|
|
|
39
40
|
try:
|
|
40
41
|
algorithm_name = config.config_get('policy', self._algorithm_type)
|
|
41
|
-
except (NoOptionError, NoSectionError, RuntimeError):
|
|
42
|
+
except (ConfigNotFound, NoOptionError, NoSectionError, RuntimeError):
|
|
42
43
|
logger.debug("PFN2LFN: no algorithm specified in the config.")
|
|
43
44
|
if super()._supports(self._algorithm_type, vo):
|
|
44
45
|
algorithm_name = vo
|
|
@@ -244,7 +245,7 @@ class RSEDeterministicTranslation(PolicyPackageAlgorithms):
|
|
|
244
245
|
policy_module = None
|
|
245
246
|
try:
|
|
246
247
|
policy_module = config.config_get('policy', 'lfn2pfn_module')
|
|
247
|
-
except (NoOptionError, NoSectionError):
|
|
248
|
+
except (ConfigNotFound, NoOptionError, NoSectionError):
|
|
248
249
|
pass
|
|
249
250
|
if policy_module:
|
|
250
251
|
# TODO: The import of importlib is done like this due to a dependency issue with python 2.6 and incompatibility of the module with py3.x
|
|
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
|
|
|
4
4
|
'''
|
|
5
5
|
VERSION_INFO = {
|
|
6
6
|
'final': True,
|
|
7
|
-
'version': '36.
|
|
7
|
+
'version': '36.2.0',
|
|
8
8
|
'branch_nick': 'release-36',
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
9
|
+
'revision_id': 'e9fa6a872d7c83dbe41cd74932267cdc5289cfd3',
|
|
10
|
+
'revno': 13451
|
|
11
11
|
}
|
|
@@ -138,9 +138,6 @@ tests/test_did.py
|
|
|
138
138
|
tests/test_did_meta_plugins.py
|
|
139
139
|
tests/test_download.py
|
|
140
140
|
tests/test_dumper.py
|
|
141
|
-
tests/test_dumper_consistency.py
|
|
142
|
-
tests/test_dumper_data_model.py
|
|
143
|
-
tests/test_dumper_path_parsing.py
|
|
144
141
|
tests/test_filter_engine.py
|
|
145
142
|
tests/test_gateway_external_representation.py
|
|
146
143
|
tests/test_heartbeat.py
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from io import StringIO
|
|
16
|
+
|
|
17
|
+
from rucio.common import dumper
|
|
18
|
+
from rucio.tests.common import mock_open
|
|
19
|
+
|
|
20
|
+
from .mocks import gfal2
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_gfal_download_to_file():
|
|
24
|
+
gfal_file = StringIO()
|
|
25
|
+
local_file = StringIO()
|
|
26
|
+
gfal_file.write('content')
|
|
27
|
+
gfal_file.seek(0)
|
|
28
|
+
|
|
29
|
+
with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
|
|
30
|
+
dumper.gfal_download_to_file('srm://example.com/file', local_file)
|
|
31
|
+
|
|
32
|
+
local_file.seek(0)
|
|
33
|
+
assert local_file.read() == 'content'
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_gfal_download_creates_file_with_content():
|
|
37
|
+
gfal_file = StringIO()
|
|
38
|
+
local_file = StringIO()
|
|
39
|
+
gfal_file.write('content')
|
|
40
|
+
gfal_file.seek(0)
|
|
41
|
+
|
|
42
|
+
with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
|
|
43
|
+
with mock_open(dumper, local_file):
|
|
44
|
+
dumper.gfal_download('srm://example.com/file', 'filename')
|
|
45
|
+
|
|
46
|
+
local_file.seek(0)
|
|
47
|
+
assert local_file.read() == 'content'
|
|
@@ -24,7 +24,7 @@ import pytest
|
|
|
24
24
|
import requests
|
|
25
25
|
import stomp
|
|
26
26
|
|
|
27
|
-
from rucio.common.config import config_get, config_get_int
|
|
27
|
+
from rucio.common.config import config_get, config_get_int, config_get_list
|
|
28
28
|
from rucio.core.message import add_message, retrieve_messages, truncate_messages
|
|
29
29
|
from rucio.daemons.hermes import hermes
|
|
30
30
|
from rucio.tests.common import rse_name_generator, skip_missing_elasticsearch_influxdb_in_env
|
|
@@ -140,7 +140,7 @@ def test_hermes(core_config_mock, caches_mock):
|
|
|
140
140
|
add_message(
|
|
141
141
|
"email",
|
|
142
142
|
{
|
|
143
|
-
"to":
|
|
143
|
+
"to": config_get_list("messaging-hermes", "email_test"),
|
|
144
144
|
"subject": "Half-Life %i" % i,
|
|
145
145
|
"body": """
|
|
146
146
|
Good morning, and welcome to the Black Mesa Transit System.
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
# Copyright European Organization for Nuclear Research (CERN) since 2012
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
import bz2
|
|
16
|
-
import json
|
|
17
|
-
import os
|
|
18
|
-
import tempfile
|
|
19
|
-
from datetime import datetime
|
|
20
|
-
from io import StringIO
|
|
21
|
-
from unittest import mock
|
|
22
|
-
|
|
23
|
-
import pytest
|
|
24
|
-
import requests
|
|
25
|
-
|
|
26
|
-
from rucio.common import config, dumper
|
|
27
|
-
from rucio.tests.common import make_temp_file, mock_open
|
|
28
|
-
|
|
29
|
-
from .mocks import gfal2
|
|
30
|
-
|
|
31
|
-
DATE_SECONDS = "2015-03-10 14:00:35"
|
|
32
|
-
DATE_TENTHS = "2015-03-10T14:00:35.5"
|
|
33
|
-
DATE_MILLISECONDS = "2015-03-10T14:00:35.5"
|
|
34
|
-
RSEPROTOCOL = {
|
|
35
|
-
"hostname": "example.com",
|
|
36
|
-
"scheme": "root",
|
|
37
|
-
"port": 1094,
|
|
38
|
-
"prefix": "//atlasdatadisk/rucio/",
|
|
39
|
-
"domains": {
|
|
40
|
-
"wan": {
|
|
41
|
-
"read": 1,
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class MockResponse:
|
|
48
|
-
def __init__(self, json_data, status_code):
|
|
49
|
-
self.json_data = json_data
|
|
50
|
-
self.status_code = status_code
|
|
51
|
-
self.text = json.dumps(json_data)
|
|
52
|
-
|
|
53
|
-
def json(self):
|
|
54
|
-
return self.json_data
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def test_http_download_failed_exception_with_no_semantic_errors():
|
|
58
|
-
with pytest.raises(dumper.HTTPDownloadFailed):
|
|
59
|
-
raise dumper.HTTPDownloadFailed('some message', 500)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def test_error_ends_the_program():
|
|
63
|
-
with pytest.raises(SystemExit):
|
|
64
|
-
dumper.error('message', 2)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def test_cacert_config_returns_a_string():
|
|
68
|
-
assert isinstance(dumper.cacert_config(config, '.'), str)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@mock.patch('rucio.common.config.config_get')
|
|
72
|
-
def test_cacert_config_returns_false_if_no_cert_configured(mock_get):
|
|
73
|
-
mock_get.return_value = ''
|
|
74
|
-
assert not dumper.cacert_config(config, '.')
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def test_smart_open_for_text_file():
|
|
78
|
-
tmp = make_temp_file('/tmp', 'abcdef')
|
|
79
|
-
assert hasattr(dumper.smart_open(tmp), 'read') # check if object is file - python2/3 compatibility
|
|
80
|
-
os.unlink(tmp)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def test_smart_open_for_bz2_file():
|
|
84
|
-
fd, path = tempfile.mkstemp()
|
|
85
|
-
comp = bz2.BZ2Compressor()
|
|
86
|
-
with os.fdopen(fd, 'wb') as f:
|
|
87
|
-
f.write(comp.compress(b'abcdef'))
|
|
88
|
-
f.write(comp.flush())
|
|
89
|
-
assert not isinstance(dumper.smart_open(path), bz2.BZ2File)
|
|
90
|
-
os.unlink(path)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def test_temp_file_with_final_name_creates_a_tmp_file_and_then_removes_it():
|
|
94
|
-
final_name = tempfile.mktemp()
|
|
95
|
-
with dumper.temp_file('/tmp', final_name) as (_, tmp_path):
|
|
96
|
-
tmp_path = os.path.join('/tmp', tmp_path)
|
|
97
|
-
assert os.path.exists(tmp_path)
|
|
98
|
-
assert not os.path.exists(final_name)
|
|
99
|
-
|
|
100
|
-
assert os.path.exists(final_name)
|
|
101
|
-
assert not os.path.exists(tmp_path)
|
|
102
|
-
os.unlink(final_name)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def test_temp_file_with_final_name_creates_a_tmp_file_and_keeps_it():
|
|
106
|
-
with dumper.temp_file('/tmp') as (_, tmp_path):
|
|
107
|
-
tmp_path = os.path.join('/tmp', tmp_path)
|
|
108
|
-
assert os.path.exists(tmp_path)
|
|
109
|
-
|
|
110
|
-
assert os.path.exists(tmp_path)
|
|
111
|
-
os.unlink(tmp_path)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def test_temp_file_cleanup_on_exception():
|
|
115
|
-
try:
|
|
116
|
-
with dumper.temp_file('/tmp') as (_, tmp_path):
|
|
117
|
-
tmp_path = os.path.join('/tmp', tmp_path)
|
|
118
|
-
raise Exception
|
|
119
|
-
except:
|
|
120
|
-
pass
|
|
121
|
-
finally:
|
|
122
|
-
assert not os.path.exists(tmp_path)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def test_temp_file_cleanup_on_exception_with_final_name():
|
|
126
|
-
final_name = tempfile.mktemp()
|
|
127
|
-
try:
|
|
128
|
-
with dumper.temp_file('/tmp', final_name) as (_, tmp_path):
|
|
129
|
-
tmp_path = os.path.join('/tmp', tmp_path)
|
|
130
|
-
raise Exception
|
|
131
|
-
except:
|
|
132
|
-
pass
|
|
133
|
-
finally:
|
|
134
|
-
assert not os.path.exists(tmp_path)
|
|
135
|
-
assert not os.path.exists(final_name)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def test_to_date_format():
|
|
139
|
-
assert isinstance(dumper.to_datetime(DATE_SECONDS), datetime)
|
|
140
|
-
assert isinstance(dumper.to_datetime(DATE_TENTHS), datetime)
|
|
141
|
-
assert isinstance(dumper.to_datetime(DATE_MILLISECONDS), datetime)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
@mock.patch('rucio.common.dumper.ddmendpoint_preferred_protocol')
|
|
145
|
-
def test_ddmendpoint_url_builds_url_from_ddmendpoint_preferred_protocol(mock_get):
|
|
146
|
-
mock_get.return_value = RSEPROTOCOL
|
|
147
|
-
assert dumper.ddmendpoint_url('SOMEENDPOINT') == 'root://example.com:1094//atlasdatadisk/'
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
@mock.patch('rucio.common.dumper.ddmendpoint_preferred_protocol')
|
|
151
|
-
def test_ddmendpoint_url_fails_on_unexistent_entry(mock_get):
|
|
152
|
-
mock_get.side_effect = StopIteration()
|
|
153
|
-
with pytest.raises(StopIteration):
|
|
154
|
-
dumper.ddmendpoint_url('SOMEENDPOINT')
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
@mock.patch('requests.get')
|
|
158
|
-
def test_http_download_to_file_without_session_uses_requests_get(mock_get):
|
|
159
|
-
response = requests.Response()
|
|
160
|
-
response.status_code = 200
|
|
161
|
-
response.iter_content = lambda _: ['content']
|
|
162
|
-
mock_get.return_value = response
|
|
163
|
-
stringio = StringIO()
|
|
164
|
-
|
|
165
|
-
dumper.http_download_to_file('http://example.com', stringio)
|
|
166
|
-
|
|
167
|
-
stringio.seek(0)
|
|
168
|
-
assert stringio.read() == 'content'
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
def test_http_download_to_file_with_session():
|
|
172
|
-
response = requests.Response()
|
|
173
|
-
response.status_code = 200
|
|
174
|
-
response.iter_content = lambda _: ['content']
|
|
175
|
-
|
|
176
|
-
stringio = StringIO()
|
|
177
|
-
session = requests.Session()
|
|
178
|
-
session.get = lambda _: response
|
|
179
|
-
|
|
180
|
-
dumper.http_download_to_file('http://example.com', stringio, session)
|
|
181
|
-
stringio.seek(0)
|
|
182
|
-
assert stringio.read() == 'content'
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def test_http_download_to_file_throws_exception_on_error():
|
|
186
|
-
response = requests.Response()
|
|
187
|
-
response.status_code = 404
|
|
188
|
-
response.iter_content = lambda _: ['content']
|
|
189
|
-
|
|
190
|
-
stringio = StringIO()
|
|
191
|
-
session = requests.Session()
|
|
192
|
-
session.get = lambda _: response
|
|
193
|
-
|
|
194
|
-
with pytest.raises(dumper.HTTPDownloadFailed):
|
|
195
|
-
dumper.http_download_to_file('http://example.com', stringio, session)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
@mock.patch('requests.get')
|
|
199
|
-
def test_http_download_creates_file_with_content(mock_get):
|
|
200
|
-
response = requests.Response()
|
|
201
|
-
response.status_code = 200
|
|
202
|
-
response.iter_content = lambda _: ['abc']
|
|
203
|
-
stringio = StringIO()
|
|
204
|
-
mock_get.return_value = response
|
|
205
|
-
|
|
206
|
-
with mock_open(dumper, stringio):
|
|
207
|
-
dumper.http_download('http://example.com', 'filename')
|
|
208
|
-
|
|
209
|
-
stringio.seek(0)
|
|
210
|
-
assert stringio.read() == 'abc'
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def test_gfal_download_to_file():
|
|
214
|
-
gfal_file = StringIO()
|
|
215
|
-
local_file = StringIO()
|
|
216
|
-
gfal_file.write('content')
|
|
217
|
-
gfal_file.seek(0)
|
|
218
|
-
|
|
219
|
-
with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
|
|
220
|
-
dumper.gfal_download_to_file('srm://example.com/file', local_file)
|
|
221
|
-
|
|
222
|
-
local_file.seek(0)
|
|
223
|
-
assert local_file.read() == 'content'
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def test_gfal_download_creates_file_with_content():
|
|
227
|
-
gfal_file = StringIO()
|
|
228
|
-
local_file = StringIO()
|
|
229
|
-
gfal_file.write('content')
|
|
230
|
-
gfal_file.seek(0)
|
|
231
|
-
|
|
232
|
-
with gfal2.mocked_gfal2(dumper, files={'srm://example.com/file': gfal_file}):
|
|
233
|
-
with mock_open(dumper, local_file):
|
|
234
|
-
dumper.gfal_download('srm://example.com/file', 'filename')
|
|
235
|
-
|
|
236
|
-
local_file.seek(0)
|
|
237
|
-
assert local_file.read() == 'content'
|