Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 0 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ on:
- 'README.md' # check markdown is valid
- 'MANIFEST.in' # check packaging
- 'pyproject.toml' # check build config
- 'setup.cfg' # check deps and project config
- '.gitignore'
- '.github/workflows/build.yml'

Expand Down
1 change: 0 additions & 1 deletion .github/workflows/test_conda-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ on:
- 'conda-environment.yml'
- '.github/workflows/test_conda-build.yml'
- 'pyproject.toml'
- 'setup.cfg'
schedule:
- cron: '17 22 * * 6' # Every Saturday at 22:17
workflow_dispatch:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ MANIFEST
cylc_flow.egg-info
.eggs

# uv environments
uv.lock

# virtualenv
venv

Expand Down
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ requests_).
- Paul Earnshaw
- Christopher Bennett
- Ryan Boult
- Mike Taves
<!-- end-shortlog -->

(All contributors are identifiable with email addresses in the git version
Expand Down
2 changes: 1 addition & 1 deletion cylc/flow/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class PluginError(CylcError):

Args:
entry_point:
The plugin entry point as defined in setup.cfg
The plugin entry point as defined in pyproject.toml
(e.g. 'cylc.main_loop')
plugin_name:
Name of the plugin
Expand Down
2 changes: 1 addition & 1 deletion cylc/flow/main_loop/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ async def my_startup_coroutine(schd, state):
^^^^^^^^

For examples see the built-in plugins in the :py:mod:`cylc.flow.main_loop`
module which are registered in the Cylc Flow ``setup.cfg`` file.
module which are registered in the Cylc Flow ``pyproject.toml`` file.

Coroutines
^^^^^^^^^^
Expand Down
215 changes: 215 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,218 @@
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "cylc-flow"
authors = [
{name = "Hilary Oliver", email = "hilary.j.oliver@gmail.com"},

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

change: email scraped from .mailmap file.

@hjoliver, preferences?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The @gmail.com address appears to be @hjoliver 's primary email contact in .mailmap. Two related notes: email is optional, so it can be removed; and multiple authors and maintainers can be specified. (The decade old setup.py format only allowed one author and one maintainer).

]
description = "A workflow engine for cycling systems"
readme = "README.md"
Comment thread
oliver-sanders marked this conversation as resolved.
requires-python = ">=3.12"
keywords = [
"cycling-workflows",
"hpc",
"job-scheduler",
"metascheduler",
"workflow-automation",
"workflow-engine",
"workflow-management",
"scheduling",
]
license = "GPL-3.0-or-later"
Comment thread
mwtoews marked this conversation as resolved.
license-files = ["COPYING", "CONTRIBUTING.md"]
Comment thread
mwtoews marked this conversation as resolved.
classifiers = [
"Environment :: Console",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"Intended Audience :: Science/Research",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: Implementation :: CPython",
"Topic :: Scientific/Engineering :: Atmospheric Science",
]
dependencies = [
"ansimarkup>=1.0.0",
"colorama>=0.4,<1",
"graphql-core>=3.2,<3.3",
"graphene>=3.4.0,<3.5",
# Note: can't pin jinja2 any higher than this until we give up on Cylc 7 back-compat
"jinja2==3.0.*",
"metomi-isodatetime>=1!3.0.0,<1!3.2.0",
# Constrain protobuf version for compatible Scheduler-UIS comms across hosts
"packaging",
"protobuf>=5,<8",
"psutil>=5.6.0",
"pyzmq>=22",
# NOTE: exclude two urwid versions that were not compatible with Tui
"urwid>=2.2,!=2.6.2,!=2.6.3,<4",
]
dynamic = ["version"]

[project.optional-dependencies]
graph = [
"pillow",
]
main_loop-log_data_store = [
"pympler",
"matplotlib",
]
main_loop-log_main_loop = [
"matplotlib",
]
main_loop-log_memory = [
"pympler",
"matplotlib",
]
main_loop-log_db = [
"sqlparse",
]
report-timings = [
"pandas==2.*",
"matplotlib",
]
tests = [
"aiosmtpd",
"async_generator",
"bandit>=1.7.0",
"coverage>=7.9.0",
"flake8-broken-line>=0.3.0",
"flake8-bugbear>=21.0.0",
"flake8-builtins>=1.5.0",
"flake8-comprehensions>=3.5.0",
"flake8-debugger>=4.0.0",
"flake8-implicit-str-concat>=0.4",
"flake8-mutable>=1.2.0",
"flake8-simplify>=0.14.0; python_version<'3.14'",
"flake8-type-checking",
"flake8>=3.0.0",
"mypy>=0.910",
# https://github.com/pytest-dev/pytest-asyncio/issues/706
"pytest-asyncio>=0.21.2,!=0.23.*",
"pytest-cov>=2.8.0",
"pytest-xdist>=2",
"pytest-mock>=3.7",
"pytest>=6",
"testfixtures>=6.11.0",
"towncrier>=24.7.0",
# Type annotation stubs
# http://mypy-lang.blogspot.com/2021/05/the-upcoming-switch-to-modular-typeshed.html
"types-Jinja2>=0.1.3",
"types-protobuf>=0.1.10,!=5.29.1.20250402",
]
tutorials = [
"h5py",
"requests",
]
all = ["cylc-flow[graph,main_loop-log_data_store,main_loop-log_db,main_loop-log_main_loop,main_loop-log_memory,tests,tutorials,report-timings]"]

[project.scripts]
# top level shell commands
clyc = "cylc.flow.scripts.cylc:main"
cylc = "cylc.flow.scripts.cylc:main"

[project.entry-points."cylc.command"]
# cylc subcommands
broadcast = "cylc.flow.scripts.broadcast:main"
cat-log = "cylc.flow.scripts.cat_log:main"
check-versions = "cylc.flow.scripts.check_versions:main"
clean = "cylc.flow.scripts.clean:main"
client = "cylc.flow.scripts.client:main"
completion-server = "cylc.flow.scripts.completion_server:main"
config = "cylc.flow.scripts.config:main"
cycle-point = "cylc.flow.scripts.cycle_point:main"
diff = "cylc.flow.scripts.diff:main"
dump = "cylc.flow.scripts.dump:main"
ext-trigger = "cylc.flow.scripts.ext_trigger:main"
get-resources = "cylc.flow.scripts.get_resources:main"
function-run = "cylc.flow.scripts.function_run:main"
get-workflow-contact = "cylc.flow.scripts.get_workflow_contact:main"
get-workflow-version = "cylc.flow.scripts.get_workflow_version:main"
graph = "cylc.flow.scripts.graph:main"
hold = "cylc.flow.scripts.hold:main"
install = "cylc.flow.scripts.install:main"
jobs-kill = "cylc.flow.scripts.jobs_kill:main"
jobs-poll = "cylc.flow.scripts.jobs_poll:main"
jobs-submit = "cylc.flow.scripts.jobs_submit:main"
kill = "cylc.flow.scripts.kill:main"
lint = "cylc.flow.scripts.lint:main"
list = "cylc.flow.scripts.list:main"
message = "cylc.flow.scripts.message:main"
pause = "cylc.flow.scripts.pause:main"
ping = "cylc.flow.scripts.ping:main"
play = "cylc.flow.scripts.play:main"
poll = "cylc.flow.scripts.poll:main"
psutils = "cylc.flow.scripts.psutil:main"
reinstall = "cylc.flow.scripts.reinstall:main"
release = "cylc.flow.scripts.release:main"
reload = "cylc.flow.scripts.reload:main"
remote-init = "cylc.flow.scripts.remote_init:main"
remote-tidy = "cylc.flow.scripts.remote_tidy:main"
remove = "cylc.flow.scripts.remove:main"
report-timings = "cylc.flow.scripts.report_timings:main" # report-timings
scan = "cylc.flow.scripts.scan:cli"
show = "cylc.flow.scripts.show:main"
set = "cylc.flow.scripts.set:main"
stop = "cylc.flow.scripts.stop:main"
subscribe = "cylc.flow.scripts.subscribe:main"
verbosity = "cylc.flow.scripts.verbosity:main"
workflow-state = "cylc.flow.scripts.workflow_state:main"
tui = "cylc.flow.scripts.tui:main"
trigger = "cylc.flow.scripts.trigger:main"
validate = "cylc.flow.scripts.validate:main"
view = "cylc.flow.scripts.view:main"
vip = "cylc.flow.scripts.validate_install_play:main"
vr = "cylc.flow.scripts.validate_reinstall:main"

[project.entry-points."cylc.main_loop"]
# async functions to run within the scheduler main loop
health_check = "cylc.flow.main_loop.health_check"
auto_restart = "cylc.flow.main_loop.auto_restart"
log_data_store = "cylc.flow.main_loop.log_data_store" # main_loop-log_data_store
log_db = "cylc.flow.main_loop.log_db" # main_loop-log_db
log_main_loop = "cylc.flow.main_loop.log_main_loop" # main_loop-log_main_loop
log_memory = "cylc.flow.main_loop.log_memory" # main_loop-log_memory
reset_bad_hosts = "cylc.flow.main_loop.reset_bad_hosts"
log_tracemalloc = "cylc.flow.main_loop.log_tracemalloc"

# NOTE: all entry points should be listed here even if Cylc Flow does not
# provide any implementations, to make entry point scraping easier
[project.entry-points."cylc.pre_configure"]

[project.entry-points."cylc.post_install"]
log_vc_info = "cylc.flow.install_plugins.log_vc_info:main"

[project.entry-points."cylc.xtriggers"]
# NOTE: Built-in xtrigger modules
# - must contain a function (the xtrigger) with the same name as the module
# - and may contain a "validate" function to check arguments
echo = "cylc.flow.xtriggers.echo"
wall_clock = "cylc.flow.xtriggers.wall_clock"
workflow_state = "cylc.flow.xtriggers.workflow_state"
suite_state = "cylc.flow.xtriggers.suite_state"
xrandom = "cylc.flow.xtriggers.xrandom"

[project.urls]
Home = "https://cylc.org/"
Documentation = "https://cylc.github.io/cylc-doc/"
Source = "https://github.com/cylc/cylc-flow"
Tracker = "https://github.com/cylc/cylc-flow/issues"

[tool.setuptools]
include-package-data = true

[tool.setuptools.dynamic]
version = {attr = "cylc.flow.__version__"}

[tool.setuptools.packages.find]
include = ["cylc", "cylc.*"]
namespaces = false

Comment thread
oliver-sanders marked this conversation as resolved.
[tool.towncrier]
directory = "changes.d"
name = "Cylc"
Expand Down
Loading
Loading