awsebcli 3.26__tar.gz → 3.27__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.
- {awsebcli-3.26 → awsebcli-3.27}/CHANGES.rst +5 -0
- {awsebcli-3.26/awsebcli.egg-info → awsebcli-3.27}/PKG-INFO +35 -5
- {awsebcli-3.26 → awsebcli-3.27/awsebcli.egg-info}/PKG-INFO +35 -5
- {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/SOURCES.txt +3 -1
- {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/entry_points.txt +0 -1
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/__init__.py +1 -1
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/logs.py +23 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/commonops.py +2 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/logsops.py +37 -4
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/statics.py +1 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/strings.py +11 -0
- awsebcli-3.27/tests/test_dependencies_mismatch.py +145 -0
- awsebcli-3.27/tests/test_help_texts.py +1767 -0
- {awsebcli-3.26 → awsebcli-3.27}/LICENSE.txt +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/MANIFEST.in +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/README.rst +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/dependency_links.txt +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/requires.txt +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/awsebcli.egg-info/top_level.txt +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/bin/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/event.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/exceptions.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/overrides.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/screen.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/bundled/asciimatics/utilities.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/abstractcontainer.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/commands.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/compat.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/compose.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/container_viewmodel.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/container_config.json +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/glassfish-runtime-4.0-jdk7 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/glassfish-runtime-4.1-jdk8 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/glassfish-runtime-5.0-al +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/golang-runtime-1.3 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/golang-runtime-1.4 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerfiles/python3-runtime +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/containerops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/dockerrun.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/envvarcollector.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/factory.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/fshandler.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/generic_container.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/log.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/multicontainer.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/pathconfig.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/preconfigured_container.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/containers/utils.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/abort.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/appversion.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/clone.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/codesource.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/config.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/console.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/create.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/deploy.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/events.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/health.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/initialize.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/lifecycle.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/list.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/local.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/add_virtual_dir_read_access.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/arr_configuration_importer_script.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/arr_msi_installer.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/default_web_site_port_reassignment_template.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/ebdeploy_utils.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/modify_firewall_config.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/noop.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/reinstate_iisstart_htm_default_document.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/site_installer_template.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/site_removal_template.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/site_restart_template.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/migrate_scripts/windows_proxy_feature_enabler.ps1 +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/open.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/create.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/delete.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/events.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/initialize.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/list.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/logs.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/status.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/platform/use.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/printenv.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/restore.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/scale.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/setenv.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/ssh.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/status.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/swap.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/tags.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/terminate.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/upgrade.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/controllers/use.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/abstractcontroller.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/base.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebcore.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebglobals.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebpcore.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/ebrun.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/fileoperations.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/hooks.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/core/io.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/appversion.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/data_poller.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/environments.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/help.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/screen.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/specialtables.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/table.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/term.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/display/traditional.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cleanupversions.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchfiles/cwl-activity-logs-v1.config +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchfiles/cwl-setup-v1.config +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchfiles/eb-logs-v1.config +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/cloudwatchsetup.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/controller.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/convertdockerrun.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/download.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/quicklink.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/labs/setupssl.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/aws.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/botocoredata/elasticbeanstalk/2010-12-01/paginators-1.json +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/botocoredata/elasticbeanstalk/2010-12-01/service-2.json +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/botopatch.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/cloudformation.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/cloudwatch.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/codebuild.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/codecommit.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/ec2.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/elasticbeanstalk.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/elb.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/elbv2.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/heuristics.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/iam.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/kms.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/s3.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/sns.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/lib/utils.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/api_filters.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/application.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/buildconfiguration.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/cfn_stack.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/conversionconfiguration.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/environment.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/environmentsettings.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/event.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/exceptions.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/lifecycleconfiguration.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/log_stream.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/platform.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/region.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/requests.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/solutionstack.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/sourcecontrol.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/objects/tier.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/abortops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/appversionops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/buildspecops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/cloneops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/composeops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/configops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/consoleops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/createops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/deployops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/envvarops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/eventsops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/gitops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/healthops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/initializeops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/lifecycleops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/listops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/localops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/openops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/platform_branch_ops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/platform_version_ops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/platformops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/restoreops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/saved_configs.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/scaleops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/shared_lb_ops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/solution_stack_ops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/spotops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/sshops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/statusops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/swapops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/tagops/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/tagops/taglist.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/tagops/tagops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/terminateops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/upgradeops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/operations/useops.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/__init__.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/ebcli/resources/regex.py +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/requirements.txt +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/setup.cfg +0 -0
- {awsebcli-3.26 → awsebcli-3.27}/setup.py +0 -0
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: awsebcli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.27
|
|
4
4
|
Summary: Command Line Interface for AWS EB.
|
|
5
5
|
Home-page: http://aws.amazon.com/elasticbeanstalk/
|
|
6
6
|
Author: AWS Elastic Beanstalk
|
|
7
7
|
Author-email: aws-eb-cli@amazon.com
|
|
8
8
|
License: Apache License 2.0
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
10
|
Classifier: Intended Audience :: Developers
|
|
12
11
|
Classifier: Intended Audience :: System Administrators
|
|
@@ -20,6 +19,34 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
21
|
License-File: LICENSE.txt
|
|
22
|
+
Requires-Dist: botocore<2,>=1.35.0
|
|
23
|
+
Requires-Dist: cement==2.10.14
|
|
24
|
+
Requires-Dist: colorama<0.5,>=0.4.6
|
|
25
|
+
Requires-Dist: pathspec==0.12.1
|
|
26
|
+
Requires-Dist: python-dateutil<3.0.0,>=2.1
|
|
27
|
+
Requires-Dist: requests<3,>=2.31
|
|
28
|
+
Requires-Dist: setuptools>=20.0
|
|
29
|
+
Requires-Dist: semantic_version<2.11,>=2.10.0
|
|
30
|
+
Requires-Dist: termcolor<3,>=2.4.0
|
|
31
|
+
Requires-Dist: wcwidth<0.3,>=0.2.13
|
|
32
|
+
Requires-Dist: PyYAML<6.1,>=5.3.1
|
|
33
|
+
Requires-Dist: urllib3<2,>=1.26.5
|
|
34
|
+
Requires-Dist: packaging<25.0,>=24.2
|
|
35
|
+
Requires-Dist: blessed>=1.20.0
|
|
36
|
+
Requires-Dist: fabric==3.2.2
|
|
37
|
+
Requires-Dist: pythonnet<4,>=3.0.5; platform_system == "Windows"
|
|
38
|
+
Requires-Dist: pypiwin32==219; sys_platform == "win32" and python_version < "3.6"
|
|
39
|
+
Requires-Dist: pypiwin32==223; sys_platform == "win32" and python_version >= "3.6"
|
|
40
|
+
Dynamic: author
|
|
41
|
+
Dynamic: author-email
|
|
42
|
+
Dynamic: classifier
|
|
43
|
+
Dynamic: description
|
|
44
|
+
Dynamic: home-page
|
|
45
|
+
Dynamic: license
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
Dynamic: provides-extra
|
|
48
|
+
Dynamic: requires-dist
|
|
49
|
+
Dynamic: summary
|
|
23
50
|
|
|
24
51
|
======
|
|
25
52
|
EB CLI
|
|
@@ -99,6 +126,11 @@ in the *AWS Elastic Beanstalk Developer Guide*.
|
|
|
99
126
|
|
|
100
127
|
Changelog
|
|
101
128
|
=========
|
|
129
|
+
--------------------
|
|
130
|
+
3.27 (2026-03-16)
|
|
131
|
+
--------------------
|
|
132
|
+
- Added `--analyze` flag to `eb logs` command for AI-powered log analysis
|
|
133
|
+
|
|
102
134
|
--------------------
|
|
103
135
|
3.26 (2026-01-07)
|
|
104
136
|
--------------------
|
|
@@ -964,5 +996,3 @@ Changelog
|
|
|
964
996
|
- Default database username changed from admin to ebroot
|
|
965
997
|
- Trim application version description if it is too long
|
|
966
998
|
- Application version no longer includes git hash
|
|
967
|
-
|
|
968
|
-
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: awsebcli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.27
|
|
4
4
|
Summary: Command Line Interface for AWS EB.
|
|
5
5
|
Home-page: http://aws.amazon.com/elasticbeanstalk/
|
|
6
6
|
Author: AWS Elastic Beanstalk
|
|
7
7
|
Author-email: aws-eb-cli@amazon.com
|
|
8
8
|
License: Apache License 2.0
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
10
|
Classifier: Intended Audience :: Developers
|
|
12
11
|
Classifier: Intended Audience :: System Administrators
|
|
@@ -20,6 +19,34 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
21
|
License-File: LICENSE.txt
|
|
22
|
+
Requires-Dist: botocore<2,>=1.35.0
|
|
23
|
+
Requires-Dist: cement==2.10.14
|
|
24
|
+
Requires-Dist: colorama<0.5,>=0.4.6
|
|
25
|
+
Requires-Dist: pathspec==0.12.1
|
|
26
|
+
Requires-Dist: python-dateutil<3.0.0,>=2.1
|
|
27
|
+
Requires-Dist: requests<3,>=2.31
|
|
28
|
+
Requires-Dist: setuptools>=20.0
|
|
29
|
+
Requires-Dist: semantic_version<2.11,>=2.10.0
|
|
30
|
+
Requires-Dist: termcolor<3,>=2.4.0
|
|
31
|
+
Requires-Dist: wcwidth<0.3,>=0.2.13
|
|
32
|
+
Requires-Dist: PyYAML<6.1,>=5.3.1
|
|
33
|
+
Requires-Dist: urllib3<2,>=1.26.5
|
|
34
|
+
Requires-Dist: packaging<25.0,>=24.2
|
|
35
|
+
Requires-Dist: blessed>=1.20.0
|
|
36
|
+
Requires-Dist: fabric==3.2.2
|
|
37
|
+
Requires-Dist: pythonnet<4,>=3.0.5; platform_system == "Windows"
|
|
38
|
+
Requires-Dist: pypiwin32==219; sys_platform == "win32" and python_version < "3.6"
|
|
39
|
+
Requires-Dist: pypiwin32==223; sys_platform == "win32" and python_version >= "3.6"
|
|
40
|
+
Dynamic: author
|
|
41
|
+
Dynamic: author-email
|
|
42
|
+
Dynamic: classifier
|
|
43
|
+
Dynamic: description
|
|
44
|
+
Dynamic: home-page
|
|
45
|
+
Dynamic: license
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
Dynamic: provides-extra
|
|
48
|
+
Dynamic: requires-dist
|
|
49
|
+
Dynamic: summary
|
|
23
50
|
|
|
24
51
|
======
|
|
25
52
|
EB CLI
|
|
@@ -99,6 +126,11 @@ in the *AWS Elastic Beanstalk Developer Guide*.
|
|
|
99
126
|
|
|
100
127
|
Changelog
|
|
101
128
|
=========
|
|
129
|
+
--------------------
|
|
130
|
+
3.27 (2026-03-16)
|
|
131
|
+
--------------------
|
|
132
|
+
- Added `--analyze` flag to `eb logs` command for AI-powered log analysis
|
|
133
|
+
|
|
102
134
|
--------------------
|
|
103
135
|
3.26 (2026-01-07)
|
|
104
136
|
--------------------
|
|
@@ -964,5 +996,3 @@ Changelog
|
|
|
964
996
|
- Default database username changed from admin to ebroot
|
|
965
997
|
- Trim application version description if it is too long
|
|
966
998
|
- Application version no longer includes git hash
|
|
967
|
-
|
|
968
|
-
|
|
@@ -33,6 +33,8 @@ class LogsController(AbstractBaseController):
|
|
|
33
33
|
action='store_true', help=flag_text['logs.all'])),
|
|
34
34
|
(['-z', '--zip'], dict(
|
|
35
35
|
action='store_true', help=flag_text['logs.zip'])),
|
|
36
|
+
(['-ai', '--analyze'], dict(action='store_true',
|
|
37
|
+
help=flag_text['logs.analyze'])),
|
|
36
38
|
(['-i', '--instance'], dict(help=flag_text['logs.instance'])),
|
|
37
39
|
(['-g', '--log-group'], dict(help=flag_text['logs.log-group'])),
|
|
38
40
|
(['-cw', '--cloudwatch-logs'], dict(help=flag_text['logs.cloudwatch_logs'], nargs='?',
|
|
@@ -51,6 +53,7 @@ class LogsController(AbstractBaseController):
|
|
|
51
53
|
self.instance = self.app.pargs.instance
|
|
52
54
|
self.all = self.app.pargs.all
|
|
53
55
|
self.zip = self.app.pargs.zip
|
|
56
|
+
self.analyze = self.app.pargs.analyze
|
|
54
57
|
self.cloudwatch_logs = self.app.pargs.cloudwatch_logs
|
|
55
58
|
self.cloudwatch_log_source = self.app.pargs.cloudwatch_log_source
|
|
56
59
|
self.stream = self.app.pargs.stream
|
|
@@ -61,6 +64,8 @@ class LogsController(AbstractBaseController):
|
|
|
61
64
|
self.__modify_log_streaming()
|
|
62
65
|
elif self.stream:
|
|
63
66
|
self.__stream_cloudwatch_logs()
|
|
67
|
+
elif self.analyze:
|
|
68
|
+
self.__analyze_logs()
|
|
64
69
|
else:
|
|
65
70
|
self.__get_logs()
|
|
66
71
|
|
|
@@ -144,6 +149,18 @@ class LogsController(AbstractBaseController):
|
|
|
144
149
|
if self.cloudwatch_logs and self.zip:
|
|
145
150
|
raise InvalidOptionsError(strings['logs.cloudwatch_logs_argument_and_zip_argument'])
|
|
146
151
|
|
|
152
|
+
if self.analyze and self.instance:
|
|
153
|
+
raise InvalidOptionsError(strings['logs.analyze_argument_and_instance_argument'])
|
|
154
|
+
|
|
155
|
+
if self.analyze and self.all:
|
|
156
|
+
raise InvalidOptionsError(strings['logs.analyze_argument_and_all_argument'])
|
|
157
|
+
|
|
158
|
+
if self.analyze and self.zip:
|
|
159
|
+
raise InvalidOptionsError(strings['logs.analyze_argument_and_zip_argument'])
|
|
160
|
+
|
|
161
|
+
if self.analyze and self.log_group:
|
|
162
|
+
raise InvalidOptionsError(strings['logs.analyze_argument_and_log_group_argument'])
|
|
163
|
+
|
|
147
164
|
if self.cloudwatch_log_source and self.cloudwatch_log_source not in [
|
|
148
165
|
logs_operations_constants.LOG_SOURCES.ALL_LOG_SOURCES,
|
|
149
166
|
logs_operations_constants.LOG_SOURCES.INSTANCE_LOG_SOURCE,
|
|
@@ -184,3 +201,9 @@ class LogsController(AbstractBaseController):
|
|
|
184
201
|
raise InvalidOptionsError(strings['logs.environment_health_log_streaming_disabled'].format(self.env_name))
|
|
185
202
|
|
|
186
203
|
logsops.stream_instance_logs_from_cloudwatch(log_group=self.__normalized_log_group_name())
|
|
204
|
+
|
|
205
|
+
def __analyze_logs(self):
|
|
206
|
+
logsops.retrieve_beanstalk_logs(
|
|
207
|
+
self.env_name,
|
|
208
|
+
logs_operations_constants.INFORMATION_FORMAT.ANALYZE,
|
|
209
|
+
)
|
|
@@ -303,6 +303,8 @@ def _is_success_event(message, log_events=False):
|
|
|
303
303
|
return True
|
|
304
304
|
if responses['logs.successbundle'] in message:
|
|
305
305
|
return True
|
|
306
|
+
if responses['logs.successanalyze'] in message:
|
|
307
|
+
return True
|
|
306
308
|
if responses['tags.tag_update_successful'] in message:
|
|
307
309
|
return True
|
|
308
310
|
if message.startswith(responses['event.platformdeletesuccess']):
|
|
@@ -330,24 +330,47 @@ def get_instance_log_url_mappings(env_name, info_type):
|
|
|
330
330
|
return instance_id_list
|
|
331
331
|
|
|
332
332
|
|
|
333
|
+
def _get_latest_instance_log_url_mappings(env_name, info_type):
|
|
334
|
+
result = elasticbeanstalk.retrieve_environment_info(env_name, info_type)
|
|
335
|
+
|
|
336
|
+
instance_id_list = dict()
|
|
337
|
+
instance_timestamps = dict()
|
|
338
|
+
|
|
339
|
+
for log in result['EnvironmentInfo']:
|
|
340
|
+
instance_id = log['Ec2InstanceId']
|
|
341
|
+
url = log['Message']
|
|
342
|
+
timestamp = log.get('SampleTimestamp')
|
|
343
|
+
|
|
344
|
+
if instance_id not in instance_id_list or timestamp > instance_timestamps[instance_id]:
|
|
345
|
+
instance_id_list[instance_id] = url
|
|
346
|
+
instance_timestamps[instance_id] = timestamp
|
|
347
|
+
|
|
348
|
+
return instance_id_list
|
|
349
|
+
|
|
350
|
+
|
|
333
351
|
def get_logs(env_name, info_type, do_zip=False, instance_id=None):
|
|
334
352
|
"""
|
|
335
353
|
Obtains the set of logs from ElasticBeanstalk for the environment `env_name` from ElasticBeanstalk
|
|
336
354
|
(and not CloudWatch) for the environment, `env_name` and determines whether to tail it or bundle/zip
|
|
337
355
|
it.
|
|
338
356
|
:param env_name: An Elastic Beanstalk environment name
|
|
339
|
-
:param info_type: The type of information to request. Possible values: tail, bundle
|
|
357
|
+
:param info_type: The type of information to request. Possible values: tail, bundle, analyze
|
|
340
358
|
:param do_zip: Whether the information retrieved should be zipped; works only with info_type 'bundle'
|
|
341
359
|
:param instance_id: The specific EC2 instance associated with `env_name` whose log information to retrieve
|
|
342
360
|
:return: None
|
|
343
361
|
"""
|
|
344
|
-
|
|
362
|
+
if info_type == logs_operations_constants.INFORMATION_FORMAT.ANALYZE:
|
|
363
|
+
instance_id_list = _get_latest_instance_log_url_mappings(env_name, info_type)
|
|
364
|
+
else:
|
|
365
|
+
instance_id_list = get_instance_log_url_mappings(env_name, info_type)
|
|
345
366
|
|
|
346
367
|
if instance_id:
|
|
347
368
|
instance_id_list = _updated_instance_id_list(instance_id_list, instance_id)
|
|
348
369
|
|
|
349
370
|
if info_type == logs_operations_constants.INFORMATION_FORMAT.BUNDLE:
|
|
350
371
|
_handle_bundle_logs(instance_id_list, do_zip)
|
|
372
|
+
elif info_type == logs_operations_constants.INFORMATION_FORMAT.ANALYZE:
|
|
373
|
+
_handle_analyze_logs(instance_id_list)
|
|
351
374
|
else:
|
|
352
375
|
_handle_tail_logs(instance_id_list)
|
|
353
376
|
|
|
@@ -473,7 +496,7 @@ def retrieve_beanstalk_logs(env_name, info_type, do_zip=False, instance_id=None)
|
|
|
473
496
|
"""
|
|
474
497
|
Obtains the set of logs from ElasticBeanstalk for the environment `env_name`.
|
|
475
498
|
:param env_name: An Elastic Beanstalk environment name
|
|
476
|
-
:param info_type: The type of information to request. Possible values: tail, bundle
|
|
499
|
+
:param info_type: The type of information to request. Possible values: tail, bundle, analyze
|
|
477
500
|
:param do_zip: Whether the information retrieved should be zipped; works only with info_type 'bundle'
|
|
478
501
|
:param instance_id: The specific EC2 instance associated with `env_name` whose log information to retrieve
|
|
479
502
|
:return: None
|
|
@@ -481,7 +504,11 @@ def retrieve_beanstalk_logs(env_name, info_type, do_zip=False, instance_id=None)
|
|
|
481
504
|
result = elasticbeanstalk.request_environment_info(env_name, info_type)
|
|
482
505
|
|
|
483
506
|
request_id = result['ResponseMetadata']['RequestId']
|
|
484
|
-
|
|
507
|
+
|
|
508
|
+
if info_type == logs_operations_constants.INFORMATION_FORMAT.ANALYZE:
|
|
509
|
+
io.echo(prompts['logs.analyzing'])
|
|
510
|
+
else:
|
|
511
|
+
io.echo(prompts['logs.retrieving'])
|
|
485
512
|
|
|
486
513
|
commonops.wait_for_success_events(
|
|
487
514
|
request_id,
|
|
@@ -898,6 +925,12 @@ def _handle_tail_logs(instance_id_list):
|
|
|
898
925
|
io.echo_with_pager(os.linesep.join(data))
|
|
899
926
|
|
|
900
927
|
|
|
928
|
+
def _handle_analyze_logs(instance_id_list):
|
|
929
|
+
for instance_id, url in iteritems(instance_id_list):
|
|
930
|
+
log_result = utils.get_data_from_url(url)
|
|
931
|
+
io.echo(utils.decode_bytes(log_result))
|
|
932
|
+
|
|
933
|
+
|
|
901
934
|
def _instance_log_streaming_option_setting(disable=False):
|
|
902
935
|
return elasticbeanstalk.create_option_setting(
|
|
903
936
|
namespaces.CLOUDWATCH_LOGS,
|
|
@@ -384,6 +384,14 @@ To get started enter "eb platform init". Then enter "eb platform create".""",
|
|
|
384
384
|
'logs.cloudwatch_logs_argument_and_zip_argument':
|
|
385
385
|
'You can\'t use the "--zip" option when setting log streaming. This is an '
|
|
386
386
|
'output option for log retrieval commands.',
|
|
387
|
+
'logs.analyze_argument_and_instance_argument':
|
|
388
|
+
'You can\'t use the "--instance" option with the "--analyze" option.',
|
|
389
|
+
'logs.analyze_argument_and_all_argument':
|
|
390
|
+
'You can\'t use the "--all" option with the "--analyze" option.',
|
|
391
|
+
'logs.analyze_argument_and_zip_argument':
|
|
392
|
+
'You can\'t use the "--zip" option with the "--analyze" option.',
|
|
393
|
+
'logs.analyze_argument_and_log_group_argument':
|
|
394
|
+
'You can\'t use the "--log-group" option with the "--analyze" option.',
|
|
387
395
|
'logs.health_and_instance_argument':
|
|
388
396
|
'You can\'t use the "--instance" option when retrieving environment-health '
|
|
389
397
|
'logs. The scope for these logs is the entire environment.',
|
|
@@ -619,6 +627,7 @@ prompts = {
|
|
|
619
627
|
'vpc.elbpublic': 'Do you want the load balancer to be public? (Select no for internal)',
|
|
620
628
|
'vpc.dbsubnets': 'Enter a comma-separated list of database subnets',
|
|
621
629
|
'logs.retrieving': 'Retrieving logs...',
|
|
630
|
+
'logs.analyzing': 'Analyzing environment...',
|
|
622
631
|
'swap.envprompt': 'Select the environment with which you want to swap CNAMEs.',
|
|
623
632
|
'abort.envprompt': 'Select the environment you want to stop updating.',
|
|
624
633
|
'clone.latest': 'There is a newer version of the platform used by the environment '
|
|
@@ -853,6 +862,7 @@ flag_text = {
|
|
|
853
862
|
|
|
854
863
|
'logs.all': 'retrieve all logs',
|
|
855
864
|
'logs.zip': 'retrieve all logs as .zip',
|
|
865
|
+
'logs.analyze': 'AI-powered analysis of logs, events, and environment health',
|
|
856
866
|
'logs.instance': 'retrieve logs only for this instance',
|
|
857
867
|
'logs.log-group': 'retrieve logs only for this log group',
|
|
858
868
|
'logs.stream': 'enable/disable log streaming to CloudWatch Logs',
|
|
@@ -1052,6 +1062,7 @@ responses = {
|
|
|
1052
1062
|
'logs.pulled': 'Pulled logs for environment instances.',
|
|
1053
1063
|
'logs.successtail': 'Successfully finished tailing',
|
|
1054
1064
|
'logs.successbundle': 'Successfully finished bundling',
|
|
1065
|
+
'logs.successanalyze': 'AI analysis request has completed.',
|
|
1055
1066
|
'logs.fail': 'Failed to pull logs for environment instances.',
|
|
1056
1067
|
'env.terminated': 'terminateEnvironment completed successfully.',
|
|
1057
1068
|
'env.invalidstate': 'Environment named {env-name} is in an invalid state for this operation. '
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
from pip._internal.operations.check import (
|
|
17
|
+
check_package_set,
|
|
18
|
+
create_package_set_from_installed,
|
|
19
|
+
)
|
|
20
|
+
except ImportError:
|
|
21
|
+
raise RuntimeError('You need pip==21.1 to check for dependency incompatibilities.')
|
|
22
|
+
|
|
23
|
+
from ebcli.core import io
|
|
24
|
+
|
|
25
|
+
_indent = ' '
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def color_red(message):
|
|
29
|
+
io.echo(io.bold(io.color('red', message)))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def color_green(message):
|
|
33
|
+
io.echo(io.bold(io.color('green', message)))
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def collect_package_requirements_by_requirement_name(req_name, package_set):
|
|
37
|
+
required_by = dict()
|
|
38
|
+
for pkg_name, package in package_set.items():
|
|
39
|
+
for req in package.dependencies:
|
|
40
|
+
if req.name.lower() == req_name.lower():
|
|
41
|
+
required_by[pkg_name] = req.specifier
|
|
42
|
+
|
|
43
|
+
return required_by
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def collect_package_set():
|
|
47
|
+
package_set = create_package_set_from_installed()[0]
|
|
48
|
+
|
|
49
|
+
return package_set
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def check_for_missing_requirements_and_dependency_incompatibilities():
|
|
53
|
+
try:
|
|
54
|
+
package_set = collect_package_set()
|
|
55
|
+
missing, conflicting = check_package_set(package_set)
|
|
56
|
+
|
|
57
|
+
io.echo('- Checking for missing requirements ... ')
|
|
58
|
+
if missing:
|
|
59
|
+
color_red('{}Found unmet dependencies'.format(_indent * 1))
|
|
60
|
+
missing_description = describe_missing_results(missing, package_set)
|
|
61
|
+
color_red(missing_description)
|
|
62
|
+
else:
|
|
63
|
+
color_green('{}OK!'.format(_indent * 2))
|
|
64
|
+
|
|
65
|
+
io.echo('- Checking for dependency incompatibilities ... ')
|
|
66
|
+
if conflicting:
|
|
67
|
+
color_red('{}Found dependency incompatibilities'.format(_indent * 1))
|
|
68
|
+
conflicting_description = describe_conflicting_results(conflicting, package_set)
|
|
69
|
+
color_red(conflicting_description)
|
|
70
|
+
else:
|
|
71
|
+
color_green('{}OK!'.format(_indent * 1))
|
|
72
|
+
|
|
73
|
+
if missing or conflicting:
|
|
74
|
+
exit(1)
|
|
75
|
+
except Exception as e:
|
|
76
|
+
raise RuntimeError(
|
|
77
|
+
' Something went wrong while attempting to find missing and/or incompatible dependencies. '
|
|
78
|
+
'The following exception was raised: \n {}'.format(str(e))
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def describe_conflicting_results(conflicting, package_set):
|
|
83
|
+
conflicting_reqs = dict()
|
|
84
|
+
description = '{}Confliciting dependencies:\n'.format(_indent * 2)
|
|
85
|
+
|
|
86
|
+
for pkg_name in conflicting:
|
|
87
|
+
for result in conflicting[pkg_name]:
|
|
88
|
+
|
|
89
|
+
req_name = result[0]
|
|
90
|
+
req_version = result[1]
|
|
91
|
+
req = result[2]
|
|
92
|
+
|
|
93
|
+
if not req_name in conflicting_reqs:
|
|
94
|
+
conflicting_reqs[req_name] = {
|
|
95
|
+
'required_by': collect_package_requirements_by_requirement_name(req_name, package_set),
|
|
96
|
+
'package_details': package_set[req_name]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for req_name, req in conflicting_reqs.items():
|
|
100
|
+
req_version = req['package_details'].version
|
|
101
|
+
description += '{}{}:\n'.format(_indent * 3, req_name)
|
|
102
|
+
description += '{}Installed version: {}\n'.format(_indent * 4, req_version)
|
|
103
|
+
description += '{}Required by:\n'.format(_indent * 4)
|
|
104
|
+
for pkg_name, specifier in req['required_by'].items():
|
|
105
|
+
is_conflict = not specifier.contains(req_version, prereleases=True)
|
|
106
|
+
description += '{}{} {} ({}: {}) {}\n'.format(
|
|
107
|
+
_indent * 5,
|
|
108
|
+
pkg_name,
|
|
109
|
+
package_set[pkg_name].version,
|
|
110
|
+
req_name,
|
|
111
|
+
specifier,
|
|
112
|
+
'[CONFLICT]' if is_conflict else ''
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return description
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def describe_missing_results(missing, package_set):
|
|
119
|
+
missing_reqs = dict()
|
|
120
|
+
description = '{}Missing dependencies:\n'.format(_indent * 2)
|
|
121
|
+
|
|
122
|
+
for pkg_name in missing:
|
|
123
|
+
for result in missing[pkg_name]:
|
|
124
|
+
|
|
125
|
+
req_name = result[0]
|
|
126
|
+
|
|
127
|
+
if not req_name in missing_reqs:
|
|
128
|
+
missing_reqs[req_name] = collect_package_requirements_by_requirement_name(req_name, package_set)
|
|
129
|
+
|
|
130
|
+
for req_name, required_by in missing_reqs.items():
|
|
131
|
+
description += '{}{}:\n'.format(_indent * 3, req_name)
|
|
132
|
+
description += '{}Required by:\n'.format(_indent * 4)
|
|
133
|
+
for pkg_name, specifier in required_by.items():
|
|
134
|
+
description += '{}{} {} ({}: {})\n'.format(
|
|
135
|
+
_indent * 5,
|
|
136
|
+
pkg_name,
|
|
137
|
+
package_set[pkg_name].version,
|
|
138
|
+
req_name,
|
|
139
|
+
specifier,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
return description
|
|
143
|
+
|
|
144
|
+
io.echo('Checking for dependency mismatches ...')
|
|
145
|
+
check_for_missing_requirements_and_dependency_incompatibilities()
|