Skip to content

Commit

Permalink
make release-tag: Merge branch 'main' into stable
Browse files Browse the repository at this point in the history
  • Loading branch information
amontanez24 committed Oct 12, 2023
2 parents 8cef6e9 + c93e464 commit 337ad5f
Show file tree
Hide file tree
Showing 16 changed files with 285 additions and 118 deletions.
6 changes: 3 additions & 3 deletions CONTRIBUTING.rst
Original file line number Diff line number Diff line change
Expand Up @@ -166,16 +166,16 @@ Release Workflow
The process of releasing a new version involves several steps combining both ``git`` and
``bumpversion`` which, briefly:

1. Merge what is in ``master`` branch into ``stable`` branch.
1. Merge what is in ``main`` branch into ``stable`` branch.
2. Update the version in ``setup.cfg``, ``copulas/__init__.py`` and ``HISTORY.md`` files.
3. Create a new TAG pointing at the correspoding commit in ``stable`` branch.
4. Merge the new commit from ``stable`` into ``master``.
4. Merge the new commit from ``stable`` into ``main``.
5. Update the version in ``setup.cfg`` and ``copulas/__init__.py`` to open the next
development interation.

**Note:** Before starting the process, make sure that ``HISTORY.md`` has a section titled
**Unreleased** with the list of changes that will be included in the new version, and that
these changes are committed and available in ``master`` branch.
these changes are committed and available in ``main`` branch.
Normally this is just a list of the Pull Requests that have been merged since the latest version.

Once this is done, run of the following commands:
Expand Down
13 changes: 13 additions & 0 deletions HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# History

## v0.9.2 - 2023-10-12

This release removes a warning that was being raised when univariate distributions failed to fit and logs the message instead.

### New Features

* When Copulas univariate fit fails, produce a log instead of a warning - Issue [#359](https://github.com/sdv-dev/Copulas/issues/359) by @R-Palazzo

### Maintenance

* Switch default branch from master to main - Issue [#360](https://github.com/sdv-dev/Copulas/issues/360) by @amontanez24
* Update add-on detection for Copulas - Issue [#362](https://github.com/sdv-dev/Copulas/issues/362) by @pvk-developer

## v0.9.1 - 2023-08-10

This release fixes problems with the documentation site and drops support for Python 3.7.
Expand Down
4 changes: 2 additions & 2 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,12 @@ make install

If you intend to modify the source code or contribute to the project you will need to
install it from the source using the `make install-develop` command. In this case, we
recommend you to branch from `master` first:
recommend you to branch from `main` first:

```bash
git clone [email protected]:sdv-dev/Copulas
cd Copulas
git checkout master
git checkout main
git checkout -b <your-branch-name>
make install-develp
```
Expand Down
34 changes: 17 additions & 17 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -177,14 +177,14 @@ publish-test: dist publish-confirm ## package and upload a release on TestPyPI
publish: dist publish-confirm ## package and upload a release
twine upload dist/*

.PHONY: git-merge-master-stable
git-merge-master-stable: ## Merge master into stable
.PHONY: git-merge-main-stable
git-merge-main-stable: ## Merge main into stable
git checkout stable || git checkout -b stable
git merge --no-ff master -m"make release-tag: Merge branch 'master' into stable"
git merge --no-ff main -m"make release-tag: Merge branch 'main' into stable"

.PHONY: git-merge-stable-master
git-merge-stable-master: ## Merge stable into master
git checkout master
.PHONY: git-merge-stable-main
git-merge-stable-main: ## Merge stable into main
git checkout main
git merge stable

.PHONY: git-push
Expand Down Expand Up @@ -218,7 +218,7 @@ bumpversion-major: ## Bump the version the next major skipping the release
.PHONY: bumpversion-revert
bumpversion-revert: ## Undo a previous bumpversion-release
git tag --delete $(shell git tag --points-at HEAD)
git checkout master
git checkout main
git branch -D stable

CLEAN_DIR := $(shell git status --short | grep -v ??)
Expand All @@ -232,10 +232,10 @@ ifneq ($(CLEAN_DIR),)
$(error There are uncommitted changes)
endif

.PHONY: check-master
check-master: ## Check if we are in master branch
ifneq ($(CURRENT_BRANCH),master)
$(error Please make the release from master branch\n)
.PHONY: check-main
check-main: ## Check if we are in main branch
ifneq ($(CURRENT_BRANCH),main)
$(error Please make the release from main branch\n)
endif

.PHONY: check-candidate
Expand All @@ -251,18 +251,18 @@ ifeq ($(CHANGELOG_LINES),0)
endif

.PHONY: check-release
check-release: check-clean check-candidate check-master check-history ## Check if the release can be made
check-release: check-clean check-candidate check-main check-history ## Check if the release can be made
@echo "A new release can be made"

.PHONY: release
release: check-release git-merge-master-stable bumpversion-release git-push-tags-stable \
publish git-merge-stable-master bumpversion-patch git-push
release: check-release git-merge-main-stable bumpversion-release git-push-tags-stable \
publish git-merge-stable-main bumpversion-patch git-push

.PHONY: release-test
release-test: check-release git-merge-master-stable bumpversion-release bumpversion-revert
release-test: check-release git-merge-main-stable bumpversion-release bumpversion-revert

.PHONY: release-candidate
release-candidate: check-master publish bumpversion-candidate git-push
release-candidate: check-main publish bumpversion-candidate git-push

.PHONY: release-candidate-test
release-candidate-test: check-clean check-master publish-test
release-candidate-test: check-clean check-main publish-test
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
[![PyPi Shield](https://img.shields.io/pypi/v/copulas.svg)](https://pypi.python.org/pypi/copulas)
[![Downloads](https://pepy.tech/badge/copulas)](https://pepy.tech/project/copulas)
[![Unit Tests](https://github.com/sdv-dev/Copulas/actions/workflows/unit.yml/badge.svg)](https://github.com/sdv-dev/Copulas/actions/workflows/unit.yml)
[![Coverage Status](https://codecov.io/gh/sdv-dev/Copulas/branch/master/graph/badge.svg)](https://codecov.io/gh/sdv-dev/Copulas)
[![Coverage Status](https://codecov.io/gh/sdv-dev/Copulas/branch/main/graph/badge.svg)](https://codecov.io/gh/sdv-dev/Copulas)
[![Slack](https://img.shields.io/badge/Community-Slack-blue?style=plastic&logo=slack)](https://bit.ly/sdv-slack-invite)

<br/>
<p align="center" style="text-align:center">
<a href="https://github.com/sdv-dev/Copulas">
<img width=40% src="https://github.com/sdv-dev/SDV/blob/master/docs/images/Copulas-DataCebo.png?raw=true"></img>
<img width=40% src="https://github.com/sdv-dev/SDV/blob/stable/docs/images/Copulas-DataCebo.png?raw=true"></img>
</a>
</p>

Expand Down Expand Up @@ -110,7 +110,7 @@ Thank you to our team of contributors who have built and maintained the library


<div align="center">
<a href="https://datacebo.com"><img align="center" width=40% src="https://github.com/sdv-dev/SDV/blob/master/docs/images/DataCebo.png"></img></a>
<a href="https://datacebo.com"><img align="center" width=40% src="https://github.com/sdv-dev/SDV/blob/stable/docs/images/DataCebo.png"></img></a>
</div>
<br/>
<br/>
Expand Down
4 changes: 2 additions & 2 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Clone the project and install the development requirements before start the rele
```bash
git clone https://github.com/sdv-dev/Copulas.git
cd Copulas
git checkout master
git checkout main
make install-develop
```

Expand Down Expand Up @@ -183,7 +183,7 @@ Clone the project and install the development requirements. Alternatively, with
```bash
git clone https://github.com/sdv-dev/SDV
cd SDV
git checkout master
git checkout main
make install-develop
```

Expand Down
78 changes: 73 additions & 5 deletions copulas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@

__author__ = 'DataCebo, Inc.'
__email__ = '[email protected]'
__version__ = '0.9.1'
__version__ = '0.9.2.dev1'

import contextlib
import importlib
import sys
import warnings
from copy import deepcopy
from operator import attrgetter

import numpy as np
import pandas as pd

from copulas._addons import _find_addons

_find_addons(group='copulas_modules', parent_globals=globals())
from pkg_resources import iter_entry_points

EPSILON = np.finfo(np.float32).eps

Expand Down Expand Up @@ -262,3 +262,71 @@ def decorated(self, X, *args, **kwargs):
return function(self, X, *args, **kwargs)

return decorated


def _get_addon_target(addon_path_name):
"""Find the target object for the add-on.
Args:
addon_path_name (str):
The add-on's name. The add-on's name should be the full path of valid Python
identifiers (i.e. importable.module:object.attr).
Returns:
tuple:
* object:
The base module or object the add-on should be added to.
* str:
The name the add-on should be added to under the module or object.
"""
module_path, _, object_path = addon_path_name.partition(':')
module_path = module_path.split('.')

if module_path[0] != __name__:
msg = f"expected base module to be '{__name__}', found '{module_path[0]}'"
raise AttributeError(msg)

target_base = sys.modules[__name__]
for submodule in module_path[1:-1]:
target_base = getattr(target_base, submodule)

addon_name = module_path[-1]
if object_path:
if len(module_path) > 1 and not hasattr(target_base, module_path[-1]):
msg = f"cannot add '{object_path}' to unknown submodule '{'.'.join(module_path)}'"
raise AttributeError(msg)

if len(module_path) > 1:
target_base = getattr(target_base, module_path[-1])

split_object = object_path.split('.')
addon_name = split_object[-1]

if len(split_object) > 1:
target_base = attrgetter('.'.join(split_object[:-1]))(target_base)

return target_base, addon_name


def _find_addons():
"""Find and load all copulas add-ons."""
group = 'copulas_modules'
for entry_point in iter_entry_points(group=group):
try:
addon = entry_point.load()
except Exception: # pylint: disable=broad-exception-caught
msg = f'Failed to load "{entry_point.name}" from "{entry_point.module_name}".'
warnings.warn(msg)
continue

try:
addon_target, addon_name = _get_addon_target(entry_point.name)
except AttributeError as error:
msg = f"Failed to set '{entry_point.name}': {error}."
warnings.warn(msg)
continue

setattr(addon_target, addon_name, addon)


_find_addons()
26 changes: 0 additions & 26 deletions copulas/_addons.py

This file was deleted.

5 changes: 2 additions & 3 deletions copulas/multivariate/gaussian.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import logging
import sys
import warnings

import numpy as np
import pandas as pd
Expand Down Expand Up @@ -112,11 +111,11 @@ def fit(self, X):
try:
univariate.fit(column)
except BaseException:
warning_message = (
log_message = (
f'Unable to fit to a {distribution} distribution for column {column_name}. '
'Using a Gaussian distribution instead.'
)
warnings.warn(warning_message)
LOGGER.info(log_message)
univariate = GaussianUnivariate()
univariate.fit(column)

Expand Down
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
'display_github': True,
'github_user': user,
'github_repo': project,
'github_version': 'master',
'github_version': 'main',
'conf_py_path': '/docs/',
}

Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.9.1
current_version = 0.9.2.dev1
commit = True
tag = True
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z]+)(?P<candidate>\d+))?
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,6 @@
test_suite='tests',
tests_require=tests_require,
url='https://github.com/sdv-dev/Copulas',
version='0.9.1',
version='0.9.2.dev1',
zip_safe=False,
)
11 changes: 7 additions & 4 deletions tests/end-to-end/multivariate/test_gaussian.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,8 @@ def test_save_load(self):


@patch('copulas.univariate.truncated_gaussian.TruncatedGaussian._fit')
@patch('copulas.multivariate.gaussian.warnings')
def test_broken_distribution(warnings_mock, truncated_mock):
@patch('copulas.multivariate.gaussian.LOGGER')
def test_broken_distribution(logger_mock, truncated_mock):
"""Fit should use a gaussian if the passed distribution crashes."""
# Setup
truncated_mock.side_effect = ValueError()
Expand All @@ -194,11 +194,14 @@ def test_broken_distribution(warnings_mock, truncated_mock):
samples = model.sample()

# Asserts
expected_warnings_msg = (
expected_logging_msg = (
'Unable to fit to a copulas.univariate.truncated_gaussian.TruncatedGaussian '
'distribution for column y. Using a Gaussian distribution instead.'
)
warnings_mock.warn.assert_called_once_with(expected_warnings_msg)
calls = logger_mock.info.call_args_list
assert calls[0].args[0] == 'Fitting %s'
assert calls[1].args[0] == expected_logging_msg
assert len(calls) == 2

expected_model = GaussianMultivariate(
distribution={'y': 'copulas.univariate.truncated_gaussian.TruncatedGaussian'}
Expand Down
11 changes: 7 additions & 4 deletions tests/unit/multivariate/test_gaussian.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,8 +273,8 @@ def test_fit_numpy_array(self):
assert (copula.correlation == expected_correlation).all().all()

@patch('copulas.univariate.truncated_gaussian.TruncatedGaussian._fit')
@patch('copulas.multivariate.gaussian.warnings')
def test_fit_broken_distribution(self, warnings_mock, truncated_mock):
@patch('copulas.multivariate.gaussian.LOGGER')
def test_fit_broken_distribution(self, logger_mock, truncated_mock):
"""Fit should use a gaussian if the passed distribution crashes."""
# Setup
truncated_mock.side_effect = ValueError()
Expand All @@ -287,11 +287,14 @@ def test_fit_broken_distribution(self, warnings_mock, truncated_mock):
copula.fit(data)

# Check
expected_warnings_msg = (
expected_logging_msg = (
'Unable to fit to a copulas.univariate.truncated_gaussian.TruncatedGaussian '
'distribution for column column1. Using a Gaussian distribution instead.'
)
warnings_mock.warn.assert_called_once_with(expected_warnings_msg)
calls = logger_mock.info.call_args_list
assert calls[0].args[0] == 'Fitting %s'
assert calls[1].args[0] == expected_logging_msg
assert len(calls) == 2

assert len(copula.univariates) == 1
assert isinstance(copula.univariates[0], GaussianUnivariate)
Expand Down
Loading

0 comments on commit 337ad5f

Please sign in to comment.