From c1646cf5e286028b8e74cc08265947269da5bfaf Mon Sep 17 00:00:00 2001 From: Samuel Maurer Date: Wed, 16 Sep 2026 15:50:56 -0700 Subject: [PATCH 1/2] Version 1.9rc1 Set the version to 1.9rc1 and consolidate the changelog into the v1.9 entry, with pull request references and credits, as the release candidate for a dry run of the automated publishing workflow. Documentation pass: update the Sphinx version and copyright footer, convert the Python 2 print statements in the iteration example to current syntax, replace links that were dead or only worked through redirects, note the Python 3.10 floor on the installation page, and fix two typos. Indent a wrapped line in the 2017 changelog entry so the file renders as reStructuredText without warnings. --- HISTORY.rst | 53 ++++++++++++++++++++++++++++--------------- docs/source/conf.py | 6 ++--- docs/source/core.rst | 20 ++++++++-------- docs/source/index.rst | 18 +++++++-------- orca/__init__.py | 2 +- 5 files changed, 58 insertions(+), 41 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index eccbd4a..e573143 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,24 +1,41 @@ -Next release -============ +v1.9rc1 +======= -* Require Python 3.10 or newer. -* Support pandas 2 and 3, NumPy 2, and current PyTables, with minimum - versions of pandas 1.5, NumPy 1.21, PyTables 3.8, and PyToolz 0.12. -* Behavior change under pandas 3: with ``copy_col=False``, pandas's +2026/09/16 + +Release candidate for v1.9, the first release since v1.8 in October 2022. +It restores compatibility with current versions of Python, Pandas, and +NumPy, modernizes the packaging and continuous integration, and fixes two +long-standing issues. + +* Requires Python 3.10 or later, and is tested on Python 3.10 through 3.14 + with NumPy 1.21 through 2.x, Pandas 1.5 through 3.x, PyTables 3.8+, and + PyToolz 0.12+. Drops support for Python 2 and for Python 3.9 and earlier + (#62). +* Behavior change under Pandas 3: with ``copy_col=False``, Pandas's mandatory copy-on-write means that modifying a column returned from a table no longer writes through to the table's underlying DataFrame. - Use ``update_col`` or ``update_col_from_series`` to change table values. -* Modernize Python packaging and continuous integration: tests run on - Linux, macOS, and Windows, and every pull request also builds and - installs the package and builds the documentation. -* Automate publishing to PyPI from GitHub releases using Trusted - Publishing, and document the contribution and release process. -* ``to_frame(columns)`` now returns columns in the order requested, - whether they are local or registered columns (previously the order - of registered columns varied from call to call), and - ``merge_tables(columns=...)`` resolves columns in the order given. + Use ``update_col`` or ``update_col_from_series`` to change table values + (#62). +* ``to_frame(columns)`` returns columns in the order requested, whether + they are local or registered columns; since v1.4 the order of registered + columns had varied from call to call. ``merge_tables(columns=...)`` + likewise resolves columns in the order given (#57, #68). * ``broadcast`` accepts lists of column names for ``cast_on`` and - ``onto_on``, for merges on multiple columns, as ``pandas.merge`` does. + ``onto_on``, for merges on multiple columns, as ``pandas.merge`` does + (#37, #68). +* Moves package metadata to ``pyproject.toml`` and removes ``setup.py`` + (#62). +* Replaces the 2022 GitHub Actions workflows with continuous integration + that tests the minimum and current dependency versions on Linux, macOS, + and Windows, checks code quality, validates the built distributions, and + builds the documentation with warnings as errors (#62, #66). Releases are + built, verified, and published to PyPI by a GitHub Actions workflow using + Trusted Publishing (#67). +* ``main`` is now the integration branch; ``dev`` is retired (#62). +* Documents the project's scope and status in the README (#64). +* Thanks to Paul Waddell for the compatibility, packaging, and CI work, and + to Jeff Doyle for the multi-column broadcast report. v1.8 ==== @@ -67,7 +84,7 @@ v1.4.0 ====== * Modify `merge_tables` behavior in case of identical column names in multiple -tables + tables * Add `cast` option to `update_col_from_series` to handle type mismatches * Updated logic for outputting HDF5 files * Add file compression to `run` and `write_tables` diff --git a/docs/source/conf.py b/docs/source/conf.py index 61d4974..5469b1b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -51,16 +51,16 @@ # General information about the project. project = 'Orca' -copyright = '2022, UrbanSim Inc' +copyright = '2014-2026, UrbanSim Inc.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '1.8' +version = '1.9' # The full version, including alpha/beta/rc tags. -release = '1.8' +release = '1.9rc1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/core.rst b/docs/source/core.rst index 1043488..f2abedb 100644 --- a/docs/source/core.rst +++ b/docs/source/core.rst @@ -113,7 +113,7 @@ to register those relationships:: orca.broadcast(cast='c', onto='d', cast_index=True, onto_on='c_id') The syntax is similar to that of the -`pandas merge function `__, +`pandas merge function `__, and indeed ``merge`` is used behind the scenes. Once the broadcasts are defined, use the :py:func:`~orca.orca.merge_tables` function to get a @@ -153,7 +153,7 @@ going into the merge so you can limit which columns end up in the final table. they are in the ``columns=`` list.) .. note:: :py:func:`~orca.orca.merge_tables` calls - `pandas.merge `__ + `pandas.merge `__ with ``how='inner'``, meaning that only items that appear in both tables are kept in the merged table. @@ -435,7 +435,7 @@ You start pipelines by calling the :py:func:`~orca.orca.run` function and listing which steps you want to run. Calling :py:func:`~orca.orca.run` with just a list of steps, as in the above example, will run through the steps once. -To run the pipeline over some a sequence, provide those values as a sequence +To run the pipeline over a sequence, provide those values as a sequence to :py:func:`~orca.orca.run` using the ``iter_vars`` argument. The ``iter_var`` injectable stores the current value from the ``iter_vars`` argument to :py:func:`~orca.orca.run` function. @@ -447,8 +447,8 @@ stored in that order. In [77]: @orca.step() ....: def print_year(iter_var,iter_step): - ....: print '*** the iteration value is {} ***'.format(iter_var) - ....: print '*** step number {0} is named {1} ***'.format(iter_step.step_num, iter_step.step_name) + ....: print('*** the iteration value is {} ***'.format(iter_var)) + ....: print('*** step number {0} is named {1} ***'.format(iter_step.step_num, iter_step.step_name)) ....: In [78]: orca.run(['print_year'], iter_vars=range(2010, 2015)) @@ -570,7 +570,7 @@ Archiving Data An option to the :py:func:`~orca.orca.run` function is to have it save table data at set intervals. Tables (and only tables) are saved as DataFrames_ to an HDF5 file via pandas' -`HDFStore `__ +`HDFStore `__ feature. If Orca is running only one loop the tables are stored under their registered names. If it is running multiple iterations the tables are stored under names like ``'/'``. @@ -590,7 +590,7 @@ the names of registered variables in order to inject variables when evaluating functions. For that reason, it's important that variables be registered with names that are also -`valid Python variables `__. +`valid Python variables `__. Variable Expressions ~~~~~~~~~~~~~~~~~~~~ @@ -712,6 +712,6 @@ API Docs .. automodule:: orca.orca :members: -.. _DataFrame: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe -.. _DataFrames: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe -.. _Series: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#series +.. _DataFrame: https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe +.. _DataFrames: https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe +.. _Series: https://pandas.pydata.org/docs/user_guide/dsintro.html#series diff --git a/docs/source/index.rst b/docs/source/index.rst index c3b91ef..627f10f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -20,7 +20,7 @@ over a set of input data. Goals ~~~~~ -Orca has explit goals of flexibility, transparency, lazy execution, +Orca has explicit goals of flexibility, transparency, lazy execution, and encouraging good practices. Those goals are achieved by: * Flexibility @@ -49,7 +49,7 @@ via decorators. Orca calls these functions by matching their arguments to other registered data. (This format is heavily inspired by -`pytest's fixtures `__.) +`pytest's fixtures `__.) The main components of a pipeline include: * Steps @@ -119,7 +119,7 @@ Orca offers some conveniences for streamlining the construction of pipelines: Installation ------------ -Orca requires Pandas, PyTables, and PyToolz, which will be installed automatically if they are not already present in your Python environment. +Orca requires Python 3.10 or later, and depends on Pandas, PyTables, and PyToolz, which will be installed automatically if they are not already present in your Python environment. You can install Orca with pip:: @@ -135,7 +135,7 @@ Links ----- * `GitHub `__ -* `PyPi `__ +* `PyPI `__ Contents -------- @@ -154,8 +154,8 @@ Indices and tables * :ref:`modindex` * :ref:`search` -.. _Pandas: http://pandas.pydata.org/ -.. _UrbanSim: http://udst.github.io/urbansim/ -.. _DataFrame: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe -.. _DataFrames: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe -.. _Series: http://pandas.pydata.org/pandas-docs/stable/dsintro.html#series +.. _Pandas: https://pandas.pydata.org/ +.. _UrbanSim: https://udst.github.io/urbansim/ +.. _DataFrame: https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe +.. _DataFrames: https://pandas.pydata.org/docs/user_guide/dsintro.html#dataframe +.. _Series: https://pandas.pydata.org/docs/user_guide/dsintro.html#series diff --git a/orca/__init__.py b/orca/__init__.py index 09b880c..e0e2b38 100644 --- a/orca/__init__.py +++ b/orca/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.9.dev3" +__version__ = "1.9rc1" from .orca import * From ec01cfb39b199fff4108d16bdad59895fa4eb434 Mon Sep 17 00:00:00 2001 From: Samuel Maurer Date: Wed, 16 Sep 2026 16:20:54 -0700 Subject: [PATCH 2/2] Align the copyright notices in the license, source headers, and docs footer as 2014-2026, UrbanSim Inc. --- LICENSE.txt | 2 +- orca/orca.py | 2 +- orca/tests/__init__.py | 2 +- orca/tests/test_mergetables.py | 2 +- orca/tests/test_orca.py | 2 +- orca/utils/__init__.py | 2 +- orca/utils/logutil.py | 2 +- orca/utils/testing.py | 2 +- orca/utils/tests/__init__.py | 2 +- orca/utils/tests/test_testing.py | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index fdcd6d0..812cb80 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2022, UrbanSim Inc. All rights reserved. +Copyright (c) 2014-2026, UrbanSim Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/orca/orca.py b/orca/orca.py index 27fbc14..f250e7f 100644 --- a/orca/orca.py +++ b/orca/orca.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. import logging diff --git a/orca/tests/__init__.py b/orca/tests/__init__.py index 8935024..808e0d9 100644 --- a/orca/tests/__init__.py +++ b/orca/tests/__init__.py @@ -1,3 +1,3 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. diff --git a/orca/tests/test_mergetables.py b/orca/tests/test_mergetables.py index 3ab680b..38f6fe2 100644 --- a/orca/tests/test_mergetables.py +++ b/orca/tests/test_mergetables.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. import pandas as pd diff --git a/orca/tests/test_orca.py b/orca/tests/test_orca.py index 8ebdf58..708f18f 100644 --- a/orca/tests/test_orca.py +++ b/orca/tests/test_orca.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. import os diff --git a/orca/utils/__init__.py b/orca/utils/__init__.py index f5f690b..49224df 100644 --- a/orca/utils/__init__.py +++ b/orca/utils/__init__.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. from .utils import * diff --git a/orca/utils/logutil.py b/orca/utils/logutil.py index 5771288..df73dc2 100644 --- a/orca/utils/logutil.py +++ b/orca/utils/logutil.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. import contextlib diff --git a/orca/utils/testing.py b/orca/utils/testing.py index b0d665b..66bcfc1 100644 --- a/orca/utils/testing.py +++ b/orca/utils/testing.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. """ diff --git a/orca/utils/tests/__init__.py b/orca/utils/tests/__init__.py index 8935024..808e0d9 100644 --- a/orca/utils/tests/__init__.py +++ b/orca/utils/tests/__init__.py @@ -1,3 +1,3 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. diff --git a/orca/utils/tests/test_testing.py b/orca/utils/tests/test_testing.py index b34263f..2b5f3b0 100644 --- a/orca/utils/tests/test_testing.py +++ b/orca/utils/tests/test_testing.py @@ -1,5 +1,5 @@ # Orca -# Copyright (C) 2022 UrbanSim Inc. +# Copyright (C) 2014-2026 UrbanSim Inc. # See full license in LICENSE. import pandas as pd