Skip to content

Commit

Permalink
Merge pull request #706 from Anaconda-Platform/release/1.12.3
Browse files Browse the repository at this point in the history
Release/1.12.3
  • Loading branch information
vshevchenko-anaconda authored Feb 26, 2024
2 parents d9849e3 + efc1e34 commit f2d1601
Show file tree
Hide file tree
Showing 10 changed files with 203 additions and 172 deletions.
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

0 comments on commit f2d1601

Please sign in to comment.