Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release/1.12.3 #706

Merged
merged 13 commits into from
Feb 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/check-master.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
conda info
conda config --show
conda list --show-channel-urls
echo ::set-output name=exit_status::success
echo "exit_status=success" >> "$GITHUB_OUTPUT"

- name: Check with pycodestyle
if: ${{ always() && steps.conda_environment_information.outputs.exit_status == 'success' }}
Expand Down Expand Up @@ -93,7 +93,7 @@ jobs:
fail-fast: false
matrix:
os: [ macos-latest, ubuntu-latest, windows-latest ]
python-version: [ '3.8', '3.9', '3.10', '3.11' ]
python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12' ]

steps:
# most of these steps might be anchored to corresponding ones in the "lint_code" job
Expand Down
18 changes: 17 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,23 @@

We [keep a changelog.](http://keepachangelog.com/)

## 1.12.2
## 1.12.3 - 2024-02-22

### Tickets closed

* AC-207 - Accessing entry_points by index no longer supported in Python 3.12
* AC-208 - Fix uploads of existing packages

### Pull requests merged

* [PR 708](https://github.com/Anaconda-Platform/anaconda-client/pull/708) - AC-208: fix uploads of existing packages
* [PR 705](https://github.com/Anaconda-Platform/anaconda-client/pull/705) - AC-207: add importlib.metadata python3.12 compatibility
* [PR 701](https://github.com/Anaconda-Platform/anaconda-client/pull/701) - Restore default user config search path on Linux
* [PR 700](https://github.com/Anaconda-Platform/anaconda-client/pull/700) - ci: Use GITHUB_OUTPUT envvar instead of set-output command
* [PR 698](https://github.com/Anaconda-Platform/anaconda-client/pull/698) - AC-197: python 3.12 support
* [PR 696](https://github.com/Anaconda-Platform/anaconda-client/pull/696) - Make arch and platform inside index.json optional

## 1.12.2 - 2023-11-16

### Tickets closed

Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ help:

init:
@if [ -z "$${CONDA_SHLVL:+x}" ]; then echo "Conda is not installed." && exit 1; fi
@conda create -y -n anaconda_client python=3.8 --file requirements.txt --file requirements-extra.txt
@conda create -y -n anaconda_client python=3.12 --file requirements.txt --file requirements-extra.txt
@conda run -n anaconda_client pip install -r requirements-dev.txt
@echo "\n\nConda environment has been created. To activate run \"conda activate anaconda_client\"."

Expand Down
2 changes: 1 addition & 1 deletion binstar_client/__about__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@

__all__ = ['__version__']

__version__ = '1.12.2'
__version__ = '1.12.3'
127 changes: 64 additions & 63 deletions binstar_client/commands/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,11 @@ def upload_package(self, filename: str, package_meta: detect.Meta) -> bool:
meta.release_attrs['summary'] = self.arguments.summary
if self.arguments.description is not None:
meta.release_attrs['description'] = self.arguments.description
if (meta.package_type is PackageType.CONDA) and (not self.arguments.keep_basename):
meta.rebuild_basename()

if not self._check_file(meta):
return False

logger.info('Creating package "%s"', meta.name)
package: PackageCacheRecord = self.get_package(meta)
Expand All @@ -531,9 +536,6 @@ def upload_package(self, filename: str, package_meta: detect.Meta) -> bool:
logger.info('Creating release "%s"', meta.version)
self.get_release(meta)

if (meta.package_type is PackageType.CONDA) and (not self.arguments.keep_basename):
meta.rebuild_basename()

logger.info('Uploading file "%s/%s/%s/%s"', self.username, meta.name, meta.version, meta.file_attrs['basename'])
return self._upload_file(meta)

Expand All @@ -543,72 +545,71 @@ def upload_project(self, filename: str) -> bool:
self.uploaded_projects.append(uploaded_project)
return True

def _upload_file(self, meta: PackageMeta) -> bool:
"""Perform upload of a file after its metadata and related package and release are prepared."""
def _check_file(self, meta: PackageMeta) -> bool:
""""""
basename: str = meta.file_attrs['basename']
package_type: typing.Union[PackageType, str] = meta.file_attrs.pop('binstar_package_type', meta.package_type)
try:
self.api.distribution(self.username, meta.name, meta.version, basename)
except errors.NotFound:
return True

step: int
for step in range(2):
try:
stream: typing.BinaryIO
with open(meta.filename, 'rb') as stream:
result: typing.Mapping[str, typing.Any] = self.api.upload(
self.username,
meta.name,
meta.version,
basename,
stream,
package_type,
self.arguments.description,
dependencies=meta.file_attrs.get('dependencies'),
attrs=meta.file_attrs['attrs'],
channels=self.arguments.labels,
)
if self.arguments.mode == 'skip':
logger.info('Distribution already exists. Skipping upload.\n')
return False

self.uploaded_packages.append({
'package_type': meta.package_type,
'username': self.username,
'name': meta.name,
'version': meta.version,
'basename': basename,
'url': result.get('url', f'https://anaconda.org/{self.username}/{meta.name}'),
})
self.__package_cache[meta.package_key].update(meta.package_type)
self.__release_cache[meta.release_key].update()
logger.info('Upload complete\n')
if self.arguments.mode == 'force':
logger.warning('Distribution "%s" already exists. Removing.', basename)
self.api.remove_dist(self.username, meta.name, meta.version, basename)
return True

if self.arguments.mode == 'interactive':
if bool_input(f'Distribution "{basename}" already exists. Would you like to replace it?'):
self.api.remove_dist(self.username, meta.name, meta.version, basename)
return True
logger.info('Not replacing distribution "%s"', basename)
return False

except errors.Conflict:
if step:
raise

if self.arguments.mode == 'skip':
logger.info('Distribution already exists. Skipping upload.\n')
return False

if self.arguments.mode == 'force':
logger.warning('Distribution "%s" already exists. Removing.', basename)
self.api.remove_dist(self.username, meta.name, meta.version, basename)
continue

if self.arguments.mode == 'interactive':
if bool_input(f'Distribution "{basename}" already exists. Would you like to replace it?'):
self.api.remove_dist(self.username, meta.name, meta.version, basename)
continue
logger.info('Not replacing distribution "%s"', basename)
return False

logger.info(
(
'Distribution already exists. ' # pylint: disable=implicit-str-concat
'Please use the -i/--interactive or --force or --skip options or `anaconda remove %s/%s/%s/%s`'
),
self.username, meta.name, meta.version, basename,
)
raise
logger.info(
(
'Distribution already exists. ' # pylint: disable=implicit-str-concat
'Please use the -i/--interactive or --force or --skip options or `anaconda remove %s/%s/%s/%s`'
),
self.username, meta.name, meta.version, basename,
)
raise errors.Conflict(f'file {basename} already exists for package {meta.name} version {meta.version}', 409)

return False
def _upload_file(self, meta: PackageMeta) -> bool:
"""Perform upload of a file after its metadata and related package and release are prepared."""
basename: str = meta.file_attrs['basename']
package_type: typing.Union[PackageType, str] = meta.file_attrs.pop('binstar_package_type', meta.package_type)

stream: typing.BinaryIO
with open(meta.filename, 'rb') as stream:
result: typing.Mapping[str, typing.Any] = self.api.upload(
self.username,
meta.name,
meta.version,
basename,
stream,
package_type,
self.arguments.description,
dependencies=meta.file_attrs.get('dependencies'),
attrs=meta.file_attrs['attrs'],
channels=self.arguments.labels,
)

self.uploaded_packages.append({
'package_type': meta.package_type,
'username': self.username,
'name': meta.name,
'version': meta.version,
'basename': basename,
'url': result.get('url', f'https://anaconda.org/{self.username}/{meta.name}'),
})
self.__package_cache[meta.package_key].update(meta.package_type)
self.__release_cache[meta.release_key].update()
logger.info('Upload complete\n')
return True

@staticmethod
def detect_package_meta(filename: str, package_type: typing.Optional[PackageType] = None) -> detect.Meta:
Expand Down
6 changes: 4 additions & 2 deletions binstar_client/inspect_package/conda.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,10 @@ def _load(filename, default=None):
icon_b64 = data_uri_from(icon_path)

subdir = get_subdir(index)
machine = index['arch']
operatingsystem = os_map.get(index['platform'], index['platform'])
machine = index.get('arch', None)
platform = index.get('platform', None)

operatingsystem = os_map.get(platform, platform)

package_data = {
'name': index.pop('name'),
Expand Down
2 changes: 1 addition & 1 deletion binstar_client/scripts/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ def _load_main_plugin() -> typing.Optional[typing.Callable[[], typing.Any]]:
# e.g. in pyproject.toml, where my_plugin_library.cli.main is the callable entrypoint function
# [project.entry-points."anaconda_cli.main"]
# anaconda = "my_plugin_library.cli:main"
return plugin_mains[0].load()
return tuple(plugin_mains)[0].load()
return None


Expand Down
4 changes: 4 additions & 0 deletions binstar_client/utils/appdirs.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ def __init__(self, root_path):
def user_data_dir(self):
return os.path.join(self.root_path, 'data')

@property
def user_config_dir(self):
return os.path.join(self.root_path, 'data')

@property
def site_data_dir(self):
return os.path.join(self.root_path, 'data')
Expand Down
6 changes: 3 additions & 3 deletions binstar_client/utils/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

if 'BINSTAR_CONFIG_DIR' in os.environ:
dirs = EnvAppDirs(os.environ['BINSTAR_CONFIG_DIR'])
USER_CONFIG = os.path.join(dirs.user_data_dir, 'config.yaml')
USER_CONFIG = os.path.join(dirs.user_config_dir, 'config.yaml')
else:
dirs = PlatformDirs('binstar', 'ContinuumIO') # type: ignore
USER_CONFIG = os.path.join(os.path.expanduser('~'), '.continuum', 'anaconda-client', 'config.yaml')
Expand Down Expand Up @@ -109,7 +109,7 @@ def _missing_(cls, value: typing.Any) -> PackageType:
dirs.site_data_dir,
'/etc/anaconda-client/',
'$CONDA_ROOT/etc/anaconda-client/',
dirs.user_data_dir,
dirs.user_config_dir,
'~/.continuum/anaconda-client/',
'$CONDA_PREFIX/etc/anaconda-client/',
)
Expand Down Expand Up @@ -180,7 +180,7 @@ def get_binstar(args=None, cls=None):


TOKEN_DIRS = [
dirs.user_data_dir,
dirs.user_config_dir,
os.path.join(os.path.dirname(USER_CONFIG), 'tokens'),
]
TOKEN_DIR = TOKEN_DIRS[-1]
Expand Down
Loading
Loading