ceres-engine 0.41.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ceres_engine-0.41.0/.cargo/config.toml +41 -0
- ceres_engine-0.41.0/LICENSE +21 -0
- ceres_engine-0.41.0/PKG-INFO +122 -0
- ceres_engine-0.41.0/ceres/__init__.py +232 -0
- ceres_engine-0.41.0/ceres/__internal__/__init__.py +0 -0
- ceres_engine-0.41.0/ceres/__internal__/app/__init__.py +5 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/__init__.py +6 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/components.py +550 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/engine.py +115 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/permissions.py +200 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/settings.py +52 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/workspace_edits.py +137 -0
- ceres_engine-0.41.0/ceres/__internal__/app/handlers/workspaces.py +384 -0
- ceres_engine-0.41.0/ceres/__internal__/app/host.py +372 -0
- ceres_engine-0.41.0/ceres/__internal__/app/operations.py +842 -0
- ceres_engine-0.41.0/ceres/__internal__/app/shared.py +269 -0
- ceres_engine-0.41.0/ceres/__internal__/auth.py +118 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/__init__.py +0 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/__main__.py +17 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/main.py +459 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/shared.py +551 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/subcommands/__init__.py +0 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/subcommands/database.py +272 -0
- ceres_engine-0.41.0/ceres/__internal__/cli/subcommands/generate.py +56 -0
- ceres_engine-0.41.0/ceres/__internal__/core.pyi +1293 -0
- ceres_engine-0.41.0/ceres/__internal__/database/__init__.py +0 -0
- ceres_engine-0.41.0/ceres/__internal__/database/errors.py +72 -0
- ceres_engine-0.41.0/ceres/__internal__/database/writer.py +238 -0
- ceres_engine-0.41.0/ceres/__internal__/entity.py +1494 -0
- ceres_engine-0.41.0/ceres/__internal__/filter.py +42 -0
- ceres_engine-0.41.0/ceres/__internal__/interop.py +152 -0
- ceres_engine-0.41.0/ceres/__internal__/lazy.py +288 -0
- ceres_engine-0.41.0/ceres/__internal__/manager.py +203 -0
- ceres_engine-0.41.0/ceres/__internal__/project.py +98 -0
- ceres_engine-0.41.0/ceres/__internal__/protocols.py +48 -0
- ceres_engine-0.41.0/ceres/__internal__/record.py +173 -0
- ceres_engine-0.41.0/ceres/__internal__/server.py +169 -0
- ceres_engine-0.41.0/ceres/__internal__/templates/__init__.py +5 -0
- ceres_engine-0.41.0/ceres/__internal__/templates/html-email-dispatch.jinja +50 -0
- ceres_engine-0.41.0/ceres/__internal__/templates/html-email-style.jinja +89 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/__init__.py +0 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/algorithms.py +58 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/caching.py +216 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/case.py +84 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/classes.py +214 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/collections.py +296 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/exceptions.py +13 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/functions.py +89 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/platforms.py +19 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/randomize.py +13 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/text.py +28 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/typing.py +759 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/undefined.py +27 -0
- ceres_engine-0.41.0/ceres/__internal__/utilities/validation.py +176 -0
- ceres_engine-0.41.0/ceres/__internal__/workspace_redaction.py +206 -0
- ceres_engine-0.41.0/ceres/__main__.py +48 -0
- ceres_engine-0.41.0/ceres/access.py +304 -0
- ceres_engine-0.41.0/ceres/address.py +463 -0
- ceres_engine-0.41.0/ceres/alert.py +321 -0
- ceres_engine-0.41.0/ceres/channel.py +339 -0
- ceres_engine-0.41.0/ceres/component.py +2724 -0
- ceres_engine-0.41.0/ceres/concurrency.py +352 -0
- ceres_engine-0.41.0/ceres/config.py +1224 -0
- ceres_engine-0.41.0/ceres/connection/__init__.py +626 -0
- ceres_engine-0.41.0/ceres/connection/buffer.py +479 -0
- ceres_engine-0.41.0/ceres/connection/source.py +216 -0
- ceres_engine-0.41.0/ceres/connection/splitter.py +155 -0
- ceres_engine-0.41.0/ceres/connectivity.py +22 -0
- ceres_engine-0.41.0/ceres/constants.py +10 -0
- ceres_engine-0.41.0/ceres/data/__init__.py +242 -0
- ceres_engine-0.41.0/ceres/data/binary.py +1219 -0
- ceres_engine-0.41.0/ceres/data/converters.py +704 -0
- ceres_engine-0.41.0/ceres/data/object.py +1986 -0
- ceres_engine-0.41.0/ceres/data/types.py +518 -0
- ceres_engine-0.41.0/ceres/data/uuid.py +59 -0
- ceres_engine-0.41.0/ceres/database/__init__.py +18 -0
- ceres_engine-0.41.0/ceres/database/database.py +801 -0
- ceres_engine-0.41.0/ceres/database/enums.py +16 -0
- ceres_engine-0.41.0/ceres/database/migrations/0001-init.postgres.sql +180 -0
- ceres_engine-0.41.0/ceres/database/migrations/0001-init.sqlite.sql +168 -0
- ceres_engine-0.41.0/ceres/database/migrations/0002-remove-user-roles.postgres.sql +30 -0
- ceres_engine-0.41.0/ceres/database/migrations/0002-remove-user-roles.sqlite.sql +64 -0
- ceres_engine-0.41.0/ceres/database/migrations/0003-component-forest.postgres.sql +22 -0
- ceres_engine-0.41.0/ceres/database/migrations/0003-component-forest.sqlite.sql +54 -0
- ceres_engine-0.41.0/ceres/database/migrations/0004-workspace-scope.sql +1 -0
- ceres_engine-0.41.0/ceres/database/migrations/0005-workspace-owner.postgres.sql +4 -0
- ceres_engine-0.41.0/ceres/database/migrations/0005-workspace-owner.sqlite.sql +2 -0
- ceres_engine-0.41.0/ceres/database/migrations/0006-workspace-placement.postgres.sql +3 -0
- ceres_engine-0.41.0/ceres/database/migrations/0006-workspace-placement.sqlite.sql +39 -0
- ceres_engine-0.41.0/ceres/database/migrations/0007-remove-workspace-memberships.postgres.sql +5 -0
- ceres_engine-0.41.0/ceres/database/migrations/0007-remove-workspace-memberships.sqlite.sql +25 -0
- ceres_engine-0.41.0/ceres/database/migrations/0008-collate-text-by-code-point.postgres.sql +51 -0
- ceres_engine-0.41.0/ceres/database/migrations/__init__.py +117 -0
- ceres_engine-0.41.0/ceres/directory.py +365 -0
- ceres_engine-0.41.0/ceres/dispatcher.py +268 -0
- ceres_engine-0.41.0/ceres/engine.py +889 -0
- ceres_engine-0.41.0/ceres/entity.py +265 -0
- ceres_engine-0.41.0/ceres/error.py +639 -0
- ceres_engine-0.41.0/ceres/event.py +1186 -0
- ceres_engine-0.41.0/ceres/group.py +327 -0
- ceres_engine-0.41.0/ceres/item.py +56 -0
- ceres_engine-0.41.0/ceres/job.py +227 -0
- ceres_engine-0.41.0/ceres/level.py +78 -0
- ceres_engine-0.41.0/ceres/loaded.py +157 -0
- ceres_engine-0.41.0/ceres/logs.py +489 -0
- ceres_engine-0.41.0/ceres/message.py +302 -0
- ceres_engine-0.41.0/ceres/node.py +389 -0
- ceres_engine-0.41.0/ceres/notifier.py +112 -0
- ceres_engine-0.41.0/ceres/particle.py +1172 -0
- ceres_engine-0.41.0/ceres/paths.py +65 -0
- ceres_engine-0.41.0/ceres/permission.py +377 -0
- ceres_engine-0.41.0/ceres/pruner.py +184 -0
- ceres_engine-0.41.0/ceres/py.typed +0 -0
- ceres_engine-0.41.0/ceres/record.py +62 -0
- ceres_engine-0.41.0/ceres/reference.py +618 -0
- ceres_engine-0.41.0/ceres/rtsp.py +432 -0
- ceres_engine-0.41.0/ceres/schedule.py +593 -0
- ceres_engine-0.41.0/ceres/server.py +337 -0
- ceres_engine-0.41.0/ceres/setting.py +191 -0
- ceres_engine-0.41.0/ceres/sieves.py +266 -0
- ceres_engine-0.41.0/ceres/static/console/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-BepdiOnY.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-4ZhHFPot.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-CNa4tw4G.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-CHKg1YId.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-yBxCyPWP.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-3fZ6d7DD.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/index-Do1oUNgW.js +66 -0
- ceres_engine-0.41.0/ceres/static/console/assets/index-DykqzvO_.css +5 -0
- ceres_engine-0.41.0/ceres/static/console/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
- ceres_engine-0.41.0/ceres/static/console/assets/roboto-mono-CBzSzcxG.ttf +0 -0
- ceres_engine-0.41.0/ceres/static/console/favicon.ico +0 -0
- ceres_engine-0.41.0/ceres/static/console/favicon.png +0 -0
- ceres_engine-0.41.0/ceres/static/console/favicon.svg +1 -0
- ceres_engine-0.41.0/ceres/static/console/index.html +3 -0
- ceres_engine-0.41.0/ceres/statistics.py +179 -0
- ceres_engine-0.41.0/ceres/status.py +34 -0
- ceres_engine-0.41.0/ceres/tasklet.py +214 -0
- ceres_engine-0.41.0/ceres/timing.py +228 -0
- ceres_engine-0.41.0/ceres/user.py +254 -0
- ceres_engine-0.41.0/ceres/variable.py +354 -0
- ceres_engine-0.41.0/ceres/version.py +28 -0
- ceres_engine-0.41.0/ceres/workspace.py +372 -0
- ceres_engine-0.41.0/ceres.__internal__.core.data/scripts/.keep +0 -0
- ceres_engine-0.41.0/docs/README.md +89 -0
- ceres_engine-0.41.0/pyproject.toml +194 -0
- ceres_engine-0.41.0/rust/Cargo.lock +5885 -0
- ceres_engine-0.41.0/rust/Cargo.toml +30 -0
- ceres_engine-0.41.0/rust/ceres-cli/Cargo.toml +51 -0
- ceres_engine-0.41.0/rust/ceres-cli/build.rs +37 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/cli.rs +174 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/client.rs +186 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/console.rs +82 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/dump.rs +1463 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/engine.rs +159 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/entities.rs +298 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/follow.rs +121 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/mod.rs +11 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/offline.rs +184 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/records.rs +266 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/service.rs +73 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/commands/surface.rs +751 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/error.rs +66 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/highlight.rs +238 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/main.rs +203 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/output.rs +272 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/project.rs +138 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/reference.rs +78 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/runtime.rs +102 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/selector.rs +106 -0
- ceres_engine-0.41.0/rust/ceres-cli/src/service.rs +534 -0
- ceres_engine-0.41.0/rust/ceres-cli/tests/commands.rs +923 -0
- ceres_engine-0.41.0/rust/ceres-config/Cargo.toml +19 -0
- ceres_engine-0.41.0/rust/ceres-config/src/database.rs +631 -0
- ceres_engine-0.41.0/rust/ceres-config/src/error.rs +108 -0
- ceres_engine-0.41.0/rust/ceres-config/src/lib.rs +37 -0
- ceres_engine-0.41.0/rust/ceres-config/src/logging.rs +241 -0
- ceres_engine-0.41.0/rust/ceres-config/src/meta.rs +167 -0
- ceres_engine-0.41.0/rust/ceres-config/src/server.rs +473 -0
- ceres_engine-0.41.0/rust/ceres-config/src/types.rs +178 -0
- ceres_engine-0.41.0/rust/ceres-config/src/values.rs +450 -0
- ceres_engine-0.41.0/rust/ceres-core/Cargo.toml +49 -0
- ceres_engine-0.41.0/rust/ceres-core/build.rs +44 -0
- ceres_engine-0.41.0/rust/ceres-core/src/binary.rs +491 -0
- ceres_engine-0.41.0/rust/ceres-core/src/connection.rs +245 -0
- ceres_engine-0.41.0/rust/ceres-core/src/database.rs +265 -0
- ceres_engine-0.41.0/rust/ceres-core/src/entities.rs +290 -0
- ceres_engine-0.41.0/rust/ceres-core/src/filters.rs +279 -0
- ceres_engine-0.41.0/rust/ceres-core/src/interop.rs +249 -0
- ceres_engine-0.41.0/rust/ceres-core/src/lib.rs +204 -0
- ceres_engine-0.41.0/rust/ceres-core/src/logging.rs +207 -0
- ceres_engine-0.41.0/rust/ceres-core/src/server.rs +531 -0
- ceres_engine-0.41.0/rust/ceres-core/src/store.rs +319 -0
- ceres_engine-0.41.0/rust/ceres-core/src/writer.rs +292 -0
- ceres_engine-0.41.0/rust/ceres-database/Cargo.toml +59 -0
- ceres_engine-0.41.0/rust/ceres-database/src/assign.rs +446 -0
- ceres_engine-0.41.0/rust/ceres-database/src/backend.rs +762 -0
- ceres_engine-0.41.0/rust/ceres-database/src/credentials.rs +485 -0
- ceres_engine-0.41.0/rust/ceres-database/src/dynamic.rs +295 -0
- ceres_engine-0.41.0/rust/ceres-database/src/entities.rs +368 -0
- ceres_engine-0.41.0/rust/ceres-database/src/filter.rs +3711 -0
- ceres_engine-0.41.0/rust/ceres-database/src/lib.rs +39 -0
- ceres_engine-0.41.0/rust/ceres-database/src/load.rs +698 -0
- ceres_engine-0.41.0/rust/ceres-database/src/records.rs +447 -0
- ceres_engine-0.41.0/rust/ceres-database/src/selector.rs +410 -0
- ceres_engine-0.41.0/rust/ceres-database/src/store.rs +1195 -0
- ceres_engine-0.41.0/rust/ceres-database/src/turso.rs +1165 -0
- ceres_engine-0.41.0/rust/ceres-database/src/writer.rs +537 -0
- ceres_engine-0.41.0/rust/ceres-entities/Cargo.toml +22 -0
- ceres_engine-0.41.0/rust/ceres-entities/src/address.rs +106 -0
- ceres_engine-0.41.0/rust/ceres-entities/src/entities.rs +380 -0
- ceres_engine-0.41.0/rust/ceres-entities/src/filterable.rs +160 -0
- ceres_engine-0.41.0/rust/ceres-entities/src/lib.rs +34 -0
- ceres_engine-0.41.0/rust/ceres-entities/src/records.rs +715 -0
- ceres_engine-0.41.0/rust/ceres-entities/src/timestamp.rs +49 -0
- ceres_engine-0.41.0/rust/ceres-macros/Cargo.toml +18 -0
- ceres_engine-0.41.0/rust/ceres-macros/src/filterable.rs +296 -0
- ceres_engine-0.41.0/rust/ceres-macros/src/kebab.rs +35 -0
- ceres_engine-0.41.0/rust/ceres-macros/src/lib.rs +92 -0
- ceres_engine-0.41.0/rust/ceres-macros/src/python_config.rs +486 -0
- ceres_engine-0.41.0/rust/ceres-server/Cargo.toml +66 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/auth.rs +214 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/config.rs +49 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/dispatch.rs +396 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/mod.rs +81 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/records.rs +155 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/schema.rs +148 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/served.rs +250 -0
- ceres_engine-0.41.0/rust/ceres-server/src/api/streams.rs +182 -0
- ceres_engine-0.41.0/rust/ceres-server/src/app.rs +365 -0
- ceres_engine-0.41.0/rust/ceres-server/src/auth.rs +344 -0
- ceres_engine-0.41.0/rust/ceres-server/src/body.rs +144 -0
- ceres_engine-0.41.0/rust/ceres-server/src/cookie.rs +87 -0
- ceres_engine-0.41.0/rust/ceres-server/src/error.rs +156 -0
- ceres_engine-0.41.0/rust/ceres-server/src/host.rs +252 -0
- ceres_engine-0.41.0/rust/ceres-server/src/layers.rs +283 -0
- ceres_engine-0.41.0/rust/ceres-server/src/lib.rs +904 -0
- ceres_engine-0.41.0/rust/ceres-server/src/scrub.rs +60 -0
- ceres_engine-0.41.0/rust/ceres-server/src/serve.rs +150 -0
- ceres_engine-0.41.0/rust/ceres-server/src/tls.rs +214 -0
- ceres_engine-0.41.0/rust-toolchain.toml +9 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# This file sits at the repository root rather than beside the workspace, because cargo looks
|
|
2
|
+
# for it by walking up from the directory it was invoked in. Builds start from both places,
|
|
3
|
+
# the root when maturin builds the extension module and `rust/` for everything else, and only
|
|
4
|
+
# a root copy is found from both.
|
|
5
|
+
|
|
6
|
+
# Build artifacts stay inside the workspace's target/, the only directory `cargo clean`,
|
|
7
|
+
# .gitignore, and CI's cache all cover. The path resolves against this file's directory, so
|
|
8
|
+
# it names `rust/` rather than landing beside it.
|
|
9
|
+
[build]
|
|
10
|
+
build-dir = "rust/target/build"
|
|
11
|
+
|
|
12
|
+
# The parallel rustc frontend, which the pinned nightly provides. This sits under a `cfg`
|
|
13
|
+
# rather than under `[build]`, because `build.rustflags` is dropped entirely wherever a
|
|
14
|
+
# `target` block sets its own, while `cfg` and triple blocks combine.
|
|
15
|
+
[target.'cfg(all())']
|
|
16
|
+
rustflags = ["-Zthreads=4"]
|
|
17
|
+
|
|
18
|
+
# Compile the extension module and regenerate its Python type stubs in one step. `make fix`
|
|
19
|
+
# and `make build` run this too, and CI fails when committed stubs drift.
|
|
20
|
+
[alias]
|
|
21
|
+
stubs = "build -p ceres-stubs"
|
|
22
|
+
|
|
23
|
+
# Artifact dependencies, which `ceres-core` uses to build the native CLI binary alongside
|
|
24
|
+
# the extension module and stage it into the wheel. Unstable, which the pinned nightly in
|
|
25
|
+
# rust-toolchain.toml accounts for.
|
|
26
|
+
[unstable]
|
|
27
|
+
bindeps = true
|
|
28
|
+
|
|
29
|
+
# The bundled SQLite compiles with math functions, which the subsampling SQL's `floor`
|
|
30
|
+
# needs. CPython's own SQLite ships them, so the native engine has to match.
|
|
31
|
+
[env]
|
|
32
|
+
LIBSQLITE3_FLAGS = "-DSQLITE_ENABLE_MATH_FUNCTIONS"
|
|
33
|
+
|
|
34
|
+
# Python extension modules leave interpreter symbols unresolved until import time, so the
|
|
35
|
+
# linker has to be told to allow that. Maturin does not pass these itself, and without them
|
|
36
|
+
# the extension fails to link on macOS with "symbol(s) not found for architecture arm64".
|
|
37
|
+
[target.aarch64-apple-darwin]
|
|
38
|
+
rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
|
|
39
|
+
|
|
40
|
+
[target.x86_64-apple-darwin]
|
|
41
|
+
rustflags = ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Applied Physics Laboratory - University of Washington
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ceres-engine
|
|
3
|
+
Version: 0.41.0
|
|
4
|
+
Requires-Dist: aiosmtplib>=5.1,<6
|
|
5
|
+
Requires-Dist: anyio>=4.13,<5
|
|
6
|
+
Requires-Dist: apscheduler>=3.11.2,<4
|
|
7
|
+
Requires-Dist: asgiref>=3.11.1,<4
|
|
8
|
+
Requires-Dist: jinja2>=3.1,<4
|
|
9
|
+
Requires-Dist: mistune>=3.2,<4
|
|
10
|
+
Requires-Dist: objsize>=0.8.0
|
|
11
|
+
Requires-Dist: pydantic-extra-types>=2.11,<3
|
|
12
|
+
Requires-Dist: pydantic-settings>=2.13.1,<3
|
|
13
|
+
Requires-Dist: pydantic>=2.12.5,<3
|
|
14
|
+
Requires-Dist: pyjwt>=2.11,<3
|
|
15
|
+
Requires-Dist: pyyaml>=6,<7
|
|
16
|
+
Requires-Dist: rich>=14.3.2,<15
|
|
17
|
+
Requires-Dist: setproctitle>=1.3.7,<2
|
|
18
|
+
Requires-Dist: typing-extensions>=4.15.0
|
|
19
|
+
Requires-Dist: uuid-utils>=0.14.1
|
|
20
|
+
Requires-Dist: uvloop>=0.22.1 ; platform_system == 'Darwin' or platform_system == 'Linux'
|
|
21
|
+
Requires-Dist: watchfiles>=1.1.1,<2
|
|
22
|
+
Requires-Dist: starlette>=1,<2
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Summary: A Python framework for data collection, monitoring and device control.
|
|
25
|
+
Author-email: Jake Ploskey <jploskey@uw.edu>
|
|
26
|
+
License-Expression: MIT
|
|
27
|
+
Requires-Python: >=3.14
|
|
28
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
29
|
+
Project-URL: Changelog, https://github.com/OOI-RCA-APL/ceres/blob/main/CHANGELOG.md
|
|
30
|
+
Project-URL: Documentation, https://ooi-rca-apl.github.io/ceres/
|
|
31
|
+
Project-URL: Source, https://github.com/OOI-RCA-APL/ceres
|
|
32
|
+
|
|
33
|
+
# Ceres
|
|
34
|
+
|
|
35
|
+
<!-- coverage:badge -->
|
|
36
|
+

|
|
37
|
+

|
|
38
|
+
<!-- /coverage:badge -->
|
|
39
|
+
|
|
40
|
+
Ceres is a Python framework for building data collection, monitoring, and device control systems. It takes ideas from service management tools like Docker and SystemD, scales them down, and applies them to Python objects called _components_.
|
|
41
|
+
|
|
42
|
+
Components are async Python classes that run concurrently, communicate through events, and persist their state in a database. They can connect to remote instruments over TCP, parse incoming data into structured records, emit alerts, and be managed through a CLI or web console.
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
## Where Ceres Is Used
|
|
47
|
+
|
|
48
|
+
Ceres was built at the University of Washington Applied Physics Laboratory (APL) to power instrument drivers for the [Ocean Observatories Initiative (OOI)](https://oceanobservatories.org/) Regional Cabled Array (RCA). Ceres runs on Linux, macOS, and Windows. In its current production deployment, it runs on physical Linux servers connected to oceanographic instruments (acoustic current profilers, pressure gauges, pH sensors, etc.), collecting and processing real-time data streams over TCP.
|
|
49
|
+
|
|
50
|
+
That said, Ceres is a general-purpose framework. It can manage any collection of async Python components that need lifecycle control, event handling, scheduling, and persistence.
|
|
51
|
+
|
|
52
|
+
## Quick Example
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
from ceres import Component, routine, sleep
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class Counter(Component):
|
|
59
|
+
initial: int
|
|
60
|
+
delta: int = 1
|
|
61
|
+
|
|
62
|
+
@routine
|
|
63
|
+
async def count(self) -> None:
|
|
64
|
+
count = self.initial
|
|
65
|
+
while True:
|
|
66
|
+
self.system.log.info(count)
|
|
67
|
+
await sleep(1)
|
|
68
|
+
count += self.delta
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
# ceres.yaml
|
|
73
|
+
database:
|
|
74
|
+
type: sqlite
|
|
75
|
+
path: ./database.sqlite
|
|
76
|
+
|
|
77
|
+
components:
|
|
78
|
+
- name: counter-a
|
|
79
|
+
class: counter.Counter
|
|
80
|
+
arguments:
|
|
81
|
+
initial: 5
|
|
82
|
+
- name: counter-b
|
|
83
|
+
class: counter.Counter
|
|
84
|
+
arguments:
|
|
85
|
+
initial: 100
|
|
86
|
+
delta: -5
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
ceres run all # Run both components in the foreground.
|
|
91
|
+
ceres service start # Or run as a background service.
|
|
92
|
+
ceres status # Check engine and component states.
|
|
93
|
+
ceres start all # Start all components.
|
|
94
|
+
ceres enable all # Auto-start components on engine startup.
|
|
95
|
+
ceres service stop # Stop the background service.
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Documentation
|
|
99
|
+
|
|
100
|
+
The documentation is published at
|
|
101
|
+
[ooi-rca-apl.github.io/ceres](https://ooi-rca-apl.github.io/ceres/).
|
|
102
|
+
|
|
103
|
+
Start here:
|
|
104
|
+
|
|
105
|
+
- [Installing](https://ooi-rca-apl.github.io/ceres/installing/): Install Ceres and set up a project.
|
|
106
|
+
- [Getting Started](https://ooi-rca-apl.github.io/ceres/getting-started/): Build your first Ceres project from scratch.
|
|
107
|
+
- [Components](https://ooi-rca-apl.github.io/ceres/components/): The core abstraction, routines, events, records.
|
|
108
|
+
- [Connections](https://ooi-rca-apl.github.io/ceres/connections/): Connect to remote instruments and parse data.
|
|
109
|
+
- [Writing a Driver](https://ooi-rca-apl.github.io/ceres/writing-a-driver/): Build an instrument driver end to end.
|
|
110
|
+
- [Deployment](https://ooi-rca-apl.github.io/ceres/deployment/): Run Ceres as a production service.
|
|
111
|
+
|
|
112
|
+
Reference, generated from the code and checked in CI:
|
|
113
|
+
|
|
114
|
+
- [Configuration](https://ooi-rca-apl.github.io/ceres/reference/configuration/): Every `ceres.yaml` key.
|
|
115
|
+
- [CLI](https://ooi-rca-apl.github.io/ceres/reference/cli/): Every command and option.
|
|
116
|
+
- [HTTP API](https://ooi-rca-apl.github.io/ceres/reference/http-api/): Every route the engine serves.
|
|
117
|
+
- [Python API](https://ooi-rca-apl.github.io/ceres/reference/python-api/): Every name `ceres` exports.
|
|
118
|
+
|
|
119
|
+
Contributing:
|
|
120
|
+
|
|
121
|
+
- [Development](https://ooi-rca-apl.github.io/ceres/development/): Set up a dev environment and contribute to Ceres.
|
|
122
|
+
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
__all__ = [
|
|
2
|
+
# .cli
|
|
3
|
+
"main",
|
|
4
|
+
# .address
|
|
5
|
+
"Address",
|
|
6
|
+
"AddressSelector",
|
|
7
|
+
"DynamicAddress",
|
|
8
|
+
# .alert
|
|
9
|
+
"Alert",
|
|
10
|
+
# .channel
|
|
11
|
+
"Channel",
|
|
12
|
+
"ChannelReader",
|
|
13
|
+
"OutputChannel",
|
|
14
|
+
# .concurrency
|
|
15
|
+
"cancel",
|
|
16
|
+
"concurrently",
|
|
17
|
+
"sleep",
|
|
18
|
+
"spawn",
|
|
19
|
+
# .component
|
|
20
|
+
"Bound",
|
|
21
|
+
"Component",
|
|
22
|
+
"ComponentAccessLevel",
|
|
23
|
+
"ComponentSystem",
|
|
24
|
+
"Output",
|
|
25
|
+
"FileOutput",
|
|
26
|
+
"ProcedureType",
|
|
27
|
+
"StreamingOutput",
|
|
28
|
+
"action",
|
|
29
|
+
"listener",
|
|
30
|
+
"query",
|
|
31
|
+
"routine",
|
|
32
|
+
"sieve",
|
|
33
|
+
# .config
|
|
34
|
+
"Config",
|
|
35
|
+
"ConfigCheckType",
|
|
36
|
+
# .connection
|
|
37
|
+
"Buffer",
|
|
38
|
+
"Chunk",
|
|
39
|
+
"Connection",
|
|
40
|
+
"ConnectionException",
|
|
41
|
+
"ConnectionField",
|
|
42
|
+
"ConnectionInactive",
|
|
43
|
+
"ConnectionLost",
|
|
44
|
+
"SplitByChunk",
|
|
45
|
+
"SplitByDelay",
|
|
46
|
+
"SplitByLine",
|
|
47
|
+
"SplitByRegex",
|
|
48
|
+
"Splitter",
|
|
49
|
+
"TCPSource",
|
|
50
|
+
"UNIXSocketSource",
|
|
51
|
+
"Unsplit",
|
|
52
|
+
# .connectivity
|
|
53
|
+
"Connectivity",
|
|
54
|
+
# .data
|
|
55
|
+
"DataObject",
|
|
56
|
+
# .database
|
|
57
|
+
"Database",
|
|
58
|
+
"DatabaseType",
|
|
59
|
+
# .directory
|
|
60
|
+
"Directory",
|
|
61
|
+
# .dispatcher
|
|
62
|
+
"Dispatch",
|
|
63
|
+
"DispatchWriter",
|
|
64
|
+
"Dispatcher",
|
|
65
|
+
"HTMLDispatchWriter",
|
|
66
|
+
# .engine
|
|
67
|
+
"Engine",
|
|
68
|
+
# .entity
|
|
69
|
+
"Entity",
|
|
70
|
+
"EntityType",
|
|
71
|
+
# .event
|
|
72
|
+
"Event",
|
|
73
|
+
"StandardEvent",
|
|
74
|
+
# .group
|
|
75
|
+
"Group",
|
|
76
|
+
"GroupMembership",
|
|
77
|
+
# .item
|
|
78
|
+
"Item",
|
|
79
|
+
"ItemType",
|
|
80
|
+
# .level
|
|
81
|
+
"Level",
|
|
82
|
+
# .loaded
|
|
83
|
+
"Loaded",
|
|
84
|
+
"Loader",
|
|
85
|
+
# .logs
|
|
86
|
+
"LogEntry",
|
|
87
|
+
# .message
|
|
88
|
+
"Message",
|
|
89
|
+
"MessageData",
|
|
90
|
+
"MessageDirection",
|
|
91
|
+
# .notifier
|
|
92
|
+
"Notification",
|
|
93
|
+
"Notifier",
|
|
94
|
+
"SMTPNotifier",
|
|
95
|
+
# .particle
|
|
96
|
+
"BinaryParticle",
|
|
97
|
+
"BinaryRegexParticle",
|
|
98
|
+
"DynamicParticleData",
|
|
99
|
+
"ParseableParticle",
|
|
100
|
+
"ParseFailed",
|
|
101
|
+
"Particle",
|
|
102
|
+
"ParticleData",
|
|
103
|
+
"RegexParticle",
|
|
104
|
+
"GroupedRegexParticle",
|
|
105
|
+
# .permission
|
|
106
|
+
"GroupPermission",
|
|
107
|
+
"PermissionTargetType",
|
|
108
|
+
"UserPermission",
|
|
109
|
+
# .record
|
|
110
|
+
"Record",
|
|
111
|
+
"RecordType",
|
|
112
|
+
# .reference
|
|
113
|
+
"Ref",
|
|
114
|
+
"Reference",
|
|
115
|
+
"unref",
|
|
116
|
+
# .schedule
|
|
117
|
+
"Schedule",
|
|
118
|
+
"ScheduleType",
|
|
119
|
+
# .server
|
|
120
|
+
"Client",
|
|
121
|
+
"Server",
|
|
122
|
+
"TCPClient",
|
|
123
|
+
"TCPServer",
|
|
124
|
+
"UNIXSocketClient",
|
|
125
|
+
"UNIXSocketServer",
|
|
126
|
+
# .setting
|
|
127
|
+
"Setting",
|
|
128
|
+
# .sieve
|
|
129
|
+
"Sieve",
|
|
130
|
+
# .statistics
|
|
131
|
+
"Statistics",
|
|
132
|
+
# .status
|
|
133
|
+
"Status",
|
|
134
|
+
# .timing
|
|
135
|
+
"utc",
|
|
136
|
+
# .user
|
|
137
|
+
"User",
|
|
138
|
+
# .variable
|
|
139
|
+
"Variable",
|
|
140
|
+
# .version
|
|
141
|
+
"__version__",
|
|
142
|
+
"Workspace",
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
from ceres.__internal__.lazy import __lazy_imports__
|
|
146
|
+
|
|
147
|
+
with __lazy_imports__(__name__, export=True):
|
|
148
|
+
from ceres.__internal__.cli.main import main
|
|
149
|
+
from ceres.address import Address, AddressSelector, DynamicAddress
|
|
150
|
+
from ceres.alert import Alert
|
|
151
|
+
from ceres.channel import Channel, ChannelReader, OutputChannel
|
|
152
|
+
from ceres.component import (
|
|
153
|
+
Bound,
|
|
154
|
+
Component,
|
|
155
|
+
ComponentAccessLevel,
|
|
156
|
+
ComponentSystem,
|
|
157
|
+
FileOutput,
|
|
158
|
+
Output,
|
|
159
|
+
ProcedureType,
|
|
160
|
+
StreamingOutput,
|
|
161
|
+
action,
|
|
162
|
+
listener,
|
|
163
|
+
query,
|
|
164
|
+
routine,
|
|
165
|
+
sieve,
|
|
166
|
+
)
|
|
167
|
+
from ceres.concurrency import cancel, concurrently, sleep, spawn
|
|
168
|
+
from ceres.config import Config, ConfigCheckType
|
|
169
|
+
from ceres.connection import (
|
|
170
|
+
Buffer,
|
|
171
|
+
Chunk,
|
|
172
|
+
Connection,
|
|
173
|
+
ConnectionException,
|
|
174
|
+
ConnectionField,
|
|
175
|
+
ConnectionInactive,
|
|
176
|
+
ConnectionLost,
|
|
177
|
+
SplitByChunk,
|
|
178
|
+
SplitByDelay,
|
|
179
|
+
SplitByLine,
|
|
180
|
+
SplitByRegex,
|
|
181
|
+
Splitter,
|
|
182
|
+
TCPSource,
|
|
183
|
+
UNIXSocketSource,
|
|
184
|
+
Unsplit,
|
|
185
|
+
)
|
|
186
|
+
from ceres.connectivity import Connectivity
|
|
187
|
+
from ceres.data import DataObject
|
|
188
|
+
from ceres.database import Database, DatabaseType
|
|
189
|
+
from ceres.directory import Directory
|
|
190
|
+
from ceres.dispatcher import Dispatch, Dispatcher, DispatchWriter, HTMLDispatchWriter
|
|
191
|
+
from ceres.engine import Engine
|
|
192
|
+
from ceres.entity import Entity, EntityType
|
|
193
|
+
from ceres.event import Event, StandardEvent
|
|
194
|
+
from ceres.group import Group, GroupMembership
|
|
195
|
+
from ceres.item import Item, ItemType
|
|
196
|
+
from ceres.level import Level
|
|
197
|
+
from ceres.loaded import Loaded, Loader
|
|
198
|
+
from ceres.logs import LogEntry
|
|
199
|
+
from ceres.message import Message, MessageData, MessageDirection
|
|
200
|
+
from ceres.notifier import Notification, Notifier, SMTPNotifier
|
|
201
|
+
from ceres.particle import (
|
|
202
|
+
BinaryParticle,
|
|
203
|
+
BinaryRegexParticle,
|
|
204
|
+
DynamicParticleData,
|
|
205
|
+
GroupedRegexParticle,
|
|
206
|
+
ParseableParticle,
|
|
207
|
+
ParseFailed,
|
|
208
|
+
Particle,
|
|
209
|
+
ParticleData,
|
|
210
|
+
RegexParticle,
|
|
211
|
+
)
|
|
212
|
+
from ceres.permission import GroupPermission, PermissionTargetType, UserPermission
|
|
213
|
+
from ceres.record import Record, RecordType
|
|
214
|
+
from ceres.reference import Ref, Reference, unref
|
|
215
|
+
from ceres.schedule import Schedule, ScheduleType
|
|
216
|
+
from ceres.server import (
|
|
217
|
+
Client,
|
|
218
|
+
Server,
|
|
219
|
+
TCPClient,
|
|
220
|
+
TCPServer,
|
|
221
|
+
UNIXSocketClient,
|
|
222
|
+
UNIXSocketServer,
|
|
223
|
+
)
|
|
224
|
+
from ceres.setting import Setting
|
|
225
|
+
from ceres.sieves import Sieve
|
|
226
|
+
from ceres.statistics import Statistics
|
|
227
|
+
from ceres.status import Status
|
|
228
|
+
from ceres.timing import utc
|
|
229
|
+
from ceres.user import User
|
|
230
|
+
from ceres.variable import Variable
|
|
231
|
+
from ceres.version import __version__
|
|
232
|
+
from ceres.workspace import Workspace
|
|
File without changes
|