Skip to content

Commit

Permalink
Add Python 3.12 to officially supported versions and test it in CI (#139
Browse files Browse the repository at this point in the history
)

* add python 3.12 to officially supported versions and test it in CI

* explicit setuptools install in test.yml

* split release.yml workflow out from test.yml

* fix release wf name

* remove PR and push triggers from release.yml

* refactor CrystalGraphConverter._create_graph_fast
  • Loading branch information
janosh authored Mar 11, 2024
1 parent 6a5d96a commit 6f35990
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 97 deletions.
85 changes: 85 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
name: Release

on:
release:
types: [published]
workflow_dispatch:
inputs:
task:
type: choice
options: [release, test-release]
default: test-release
description: Release to PyPI or TestPyPI.

jobs:
tests:
# run test.yml first to ensure that the test suite is passing
uses: ./.github/workflows/test.yml

build_source_dist:
name: Build source distribution
needs: tests
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v4

- uses: actions/setup-python@v5
name: Install Python
with:
python-version: "3.10"

- name: Build source distribution
run: |
pip install build
python -m build --sdist
- uses: actions/upload-artifact@v3
with:
path: dist/*.tar.gz

build_wheels:
name: Build wheels for Python ${{ matrix.python-version }} on ${{ matrix.os }}
needs: tests
strategy:
matrix:
os: [ubuntu-latest, macos-14, windows-latest]
python-version: ["39", "310", "311", "312"]
runs-on: ${{ matrix.os }}
steps:
- name: Check out repo
uses: actions/checkout@v4

- name: Build wheels
uses: pypa/[email protected]
env:
CIBW_BUILD: cp${{ matrix.python-version }}-*
CIBW_ARCHS_MACOS: universal2

- name: Save artifact
uses: actions/upload-artifact@v3
with:
path: wheelhouse

release:
name: Release wheels and source distribution to PyPI
needs: [build_wheels, build_source_dist]
runs-on: ubuntu-latest
permissions:
# For pypi trusted publishing
id-token: write
steps:
- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: artifact
path: dist

- name: Publish to PyPi or TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
skip-existing: true
verbose: true
# set the repository URL to the test PyPI repository if the task is 'test-release'
# else empty string defaults to production PyPI
repository-url: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.task == 'test-release' && 'https://test.pypi.org/legacy/' || '' }}
90 changes: 9 additions & 81 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,16 @@ on:
push:
branches: [main]
pull_request:
release:
types: [published]
workflow_dispatch:
inputs:
task:
type: choice
options: [tests, release, test-release]
default: tests
description: Run tests, release to PyPI, or release to TestPyPI.
workflow_call:

jobs:
tests:
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest, macos-14, windows-latest]
python-version: ["3.10", "3.12"]
runs-on: ${{ matrix.os }}

steps:
Expand All @@ -29,7 +23,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
python-version: ${{ matrix.python-version }}
cache: pip
cache-dependency-path: pyproject.toml

Expand All @@ -38,15 +32,17 @@ jobs:

- name: Install dependencies
run: |
uv pip install cython --system
# install ase from main branch until FrechetCellFilter is released
# TODO remove uv pip install git+https://gitlab.com/ase/ase
uv pip install cython setuptools --system
python setup.py build_ext --inplace
uv pip install -e .[test] --system
# TODO remove next line installing ase from main branch when FrechetCellFilter is released
uv pip install --upgrade 'ase@git+https://gitlab.com/ase/ase' --system
- name: Run Tests
run: pytest --capture=no --cov --cov-report=xml .
run: pytest --capture=no --cov --cov-report=xml
env:
CHGNET_DEVICE: cpu

Expand All @@ -56,71 +52,3 @@ jobs:
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
coverage-reports: coverage.xml

build_source_dist:
name: Build source distribution
needs: tests
runs-on: ubuntu-latest
if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.task == 'release')
steps:
- name: Check out repo
uses: actions/checkout@v4

- uses: actions/setup-python@v5
name: Install Python
with:
python-version: "3.10"

- name: Build source distribution
run: |
pip install build
python -m build --sdist
- uses: actions/upload-artifact@v3
with:
path: dist/*.tar.gz

build_wheels:
name: Build wheels for Python ${{ matrix.python-version }} on ${{ matrix.os }}
needs: tests
if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.task == 'release')
strategy:
matrix:
os: [ubuntu-latest, macos-14, windows-latest]
python-version: ["39", "310", "311"]
runs-on: ${{ matrix.os }}
steps:
- name: Check out repo
uses: actions/checkout@v4

- name: Build wheels
uses: pypa/[email protected]
env:
CIBW_BUILD: cp${{ matrix.python-version }}-*
CIBW_ARCHS_MACOS: universal2

- name: Save artifact
uses: actions/upload-artifact@v3
with:
path: wheelhouse

release:
name: Release wheels and source distribution to PyPI
needs: [build_wheels, build_source_dist]
runs-on: ubuntu-latest
permissions:
# For pypi trusted publishing
id-token: write
steps:
- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: artifact
path: dist

- name: Publish to PyPi or TestPyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
skip-existing: true
verbose: true
repository-url: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.task == 'test-release' && 'https://test.pypi.org/legacy/' || '' }}
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ default_install_hook_types: [pre-commit, commit-msg]

repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.0
rev: v0.3.2
hooks:
- id: ruff
args: [--fix]
Expand Down Expand Up @@ -46,7 +46,7 @@ repos:
- svelte

- repo: https://github.com/pre-commit/mirrors-eslint
rev: v9.0.0-beta.1
rev: v9.0.0-beta.2
hooks:
- id: eslint
types: [file]
Expand Down
20 changes: 7 additions & 13 deletions chgnet/graph/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,25 +250,19 @@ def _create_graph_fast(
distance = np.ascontiguousarray(distance)
gc_saved = gc.get_threshold()
gc.set_threshold(0)
(
nodes,
directed_edges_list,
undirected_edges_list,
undirected_edges,
) = make_graph(
nodes, dir_edges_list, undir_edges_list, undirected_edges = make_graph(
center_index, len(center_index), neighbor_index, image, distance, n_atoms
)
graph = Graph(nodes=nodes)
graph.directed_edges_list = directed_edges_list
graph.undirected_edges_list = undirected_edges_list
graph.directed_edges_list = dir_edges_list
graph.undirected_edges_list = undir_edges_list
graph.undirected_edges = undirected_edges
gc.set_threshold(gc_saved[0])

return graph

def set_isolated_atom_response(
self,
on_isolated_atoms: Literal["ignore", "warn", "error"],
self, on_isolated_atoms: Literal["ignore", "warn", "error"]
) -> None:
"""Set the graph converter's response to isolated atom graph
Args:
Expand All @@ -282,7 +276,7 @@ def set_isolated_atom_response(
self.on_isolated_atoms = on_isolated_atoms
return

def as_dict(self) -> dict[str, float]:
def as_dict(self) -> dict[str, str | float]:
"""Save the args of the graph converter."""
return {
"atom_graph_cutoff": self.atom_graph_cutoff,
Expand All @@ -291,6 +285,6 @@ def as_dict(self) -> dict[str, float]:
}

@classmethod
def from_dict(cls, dict) -> CrystalGraphConverter:
def from_dict(cls, dct: dict) -> CrystalGraphConverter:
"""Create converter from dictionary."""
return CrystalGraphConverter(**dict)
return CrystalGraphConverter(**dct)
2 changes: 1 addition & 1 deletion chgnet/model/dynamics.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
class CHGNetCalculator(Calculator):
"""CHGNet Calculator for ASE applications."""

implemented_properties = ("energy", "forces", "stress", "magmoms") # type: ignore
implemented_properties = ("energy", "forces", "stress", "magmoms")

def __init__(
self,
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ classifiers = [
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.9",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Scientific/Engineering :: Chemistry",
Expand Down

0 comments on commit 6f35990

Please sign in to comment.