chapkit 2.0.0__tar.gz → 2.0.1__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.
Files changed (93) hide show
  1. {chapkit-2.0.0 → chapkit-2.0.1}/PKG-INFO +1 -1
  2. {chapkit-2.0.0 → chapkit-2.0.1}/pyproject.toml +1 -1
  3. {chapkit-2.0.0 → chapkit-2.0.1}/pyproject.toml.orig +1 -1
  4. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/manifest.json +1 -1
  5. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/service_builder.py +6 -1
  6. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/migrate.py +4 -4
  7. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/CHAPKIT_migrate.md.jinja2 +1 -1
  8. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/ml/router.py +5 -1
  9. {chapkit-2.0.0 → chapkit-2.0.1}/README.md +0 -0
  10. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/__init__.py +0 -0
  11. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/alembic/__init__.py +0 -0
  12. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/alembic/env.py +0 -0
  13. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/alembic/script.py.mako +0 -0
  14. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/alembic/versions/20251010_0927_4d869b5fb06e_initial_schema.py +0 -0
  15. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/alembic/versions/__init__.py +0 -0
  16. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/alembic_helpers.py +0 -0
  17. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/__init__.py +0 -0
  18. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/dist-B7bpuMSM.js +0 -0
  19. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/index-CQwQU2vo.js +0 -0
  20. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/index-HY9NoZeE.css +0 -0
  21. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/javascript-CppQSorr.js +0 -0
  22. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-cyrillic-ext-wght-normal-BCp_3N7R.woff2 +0 -0
  23. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-cyrillic-wght-normal-fOt7epNf.woff2 +0 -0
  24. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-greek-ext-wght-normal-Bgw4czJT.woff2 +0 -0
  25. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-greek-wght-normal-DlT9XTxE.woff2 +0 -0
  26. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-latin-ext-wght-normal-DYIxWhlt.woff2 +0 -0
  27. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-latin-wght-normal-ccAYIvAh.woff2 +0 -0
  28. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-math-wght-normal-4a3xuzGk.woff2 +0 -0
  29. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-symbols-wght-normal-B7iHSfaG.woff2 +0 -0
  30. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/roboto-vietnamese-wght-normal-_f1XEJpo.woff2 +0 -0
  31. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/vitesse-dark-BZCL-v6S.js +0 -0
  32. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/assets/vitesse-light-VbXTXTou.js +0 -0
  33. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/favicon.svg +0 -0
  34. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/icons.svg +0 -0
  35. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/apps/console/index.html +0 -0
  36. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/api/dependencies.py +0 -0
  37. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/artifact/__init__.py +0 -0
  38. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/artifact/manager.py +0 -0
  39. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/artifact/models.py +0 -0
  40. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/artifact/repository.py +0 -0
  41. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/artifact/router.py +0 -0
  42. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/artifact/schemas.py +0 -0
  43. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/__init__.py +0 -0
  44. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/__main__.py +0 -0
  45. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/artifact.py +0 -0
  46. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/cli.py +0 -0
  47. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/init.py +0 -0
  48. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/mlproject.py +0 -0
  49. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/requirements.py +0 -0
  50. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/run.py +0 -0
  51. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/.dockerignore +0 -0
  52. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/.gitignore +0 -0
  53. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/.python-version +0 -0
  54. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/Dockerfile.jinja2 +0 -0
  55. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/README.md.jinja2 +0 -0
  56. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/compose.yml.jinja2 +0 -0
  57. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/main.py.jinja2 +0 -0
  58. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/main_shell.py.jinja2 +0 -0
  59. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/Dockerfile_migrate.jinja2 +0 -0
  60. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/Makefile_migrate.jinja2 +0 -0
  61. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/README_migrate.md.jinja2 +0 -0
  62. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/dockerignore_migrate.jinja2 +0 -0
  63. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/gitignore_migrate.jinja2 +0 -0
  64. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/main_migrate.py.jinja2 +0 -0
  65. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/pyproject_migrate.toml.jinja2 +0 -0
  66. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/migrate/requirements_migrate.txt.jinja2 +0 -0
  67. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/publish-docker.yml.jinja2 +0 -0
  68. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/pyproject.toml.jinja2 +0 -0
  69. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/scripts/predict.R.jinja2 +0 -0
  70. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/scripts/predict_model.py.jinja2 +0 -0
  71. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/scripts/train.R.jinja2 +0 -0
  72. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/templates/scripts/train_model.py.jinja2 +0 -0
  73. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/test/__init__.py +0 -0
  74. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/test/command.py +0 -0
  75. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/test/runner.py +0 -0
  76. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/cli/test/utils.py +0 -0
  77. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/config/__init__.py +0 -0
  78. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/config/manager.py +0 -0
  79. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/config/models.py +0 -0
  80. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/config/repository.py +0 -0
  81. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/config/router.py +0 -0
  82. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/config/schemas.py +0 -0
  83. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/data/__init__.py +0 -0
  84. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/data/dataframe.py +0 -0
  85. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/data/generator.py +0 -0
  86. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/data/geo.py +0 -0
  87. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/ml/__init__.py +0 -0
  88. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/ml/manager.py +0 -0
  89. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/ml/runner.py +0 -0
  90. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/ml/schemas.py +0 -0
  91. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/py.typed +0 -0
  92. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/scheduler.py +0 -0
  93. {chapkit-2.0.0 → chapkit-2.0.1}/src/chapkit/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: chapkit
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: ML and data service modules built on servicekit - config, artifacts, and ML workflows
5
5
  Keywords: ml,machine-learning,data-science,artifacts,config,servicekit
6
6
  Author: Morten Hansen
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "chapkit"
3
- version = "2.0.0"
3
+ version = "2.0.1"
4
4
  description = "ML and data service modules built on servicekit - config, artifacts, and ML workflows"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "chapkit"
3
- version = "2.0.0"
3
+ version = "2.0.1"
4
4
  description = "ML and data service modules built on servicekit - config, artifacts, and ML workflows"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Morten Hansen", email = "morten@dhis2.org" }]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "Chapkit Console",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "prefix": "/",
5
5
  "description": "Default web console for exploring and operating a chapkit service",
6
6
  "author": "Chapkit Team",
@@ -63,10 +63,15 @@ class AssessedStatus(StrEnum):
63
63
 
64
64
 
65
65
  class PeriodType(StrEnum):
66
- """Supported period types for ML services."""
66
+ """Supported period types for ML services.
67
+
68
+ `any` declares that the model accepts both weekly and monthly data; chap-core
69
+ then skips its period-type check and dispatches whatever the dataset holds.
70
+ """
67
71
 
68
72
  weekly = "weekly"
69
73
  monthly = "monthly"
74
+ any = "any"
70
75
 
71
76
 
72
77
  class ModelMetadata(BaseModel):
@@ -679,16 +679,16 @@ def detect_base_image(
679
679
 
680
680
 
681
681
  _VALID_ASSESSED_STATUS = {"gray", "red", "orange", "yellow", "green"}
682
- _VALID_PERIOD_TYPES = {"weekly", "monthly"}
682
+ _VALID_PERIOD_TYPES = {"weekly", "monthly", "any"}
683
683
 
684
684
 
685
685
  def build_service_info_context(mlproject: MLProject) -> dict[str, Any]:
686
686
  """Build the ModelMetadata + capability-constraints block for MLServiceInfo.
687
687
 
688
688
  Handles the MLproject -> chapkit vocabulary mismatches:
689
- - MLproject `supported_period_type: any` becomes `monthly` (chapkit's
690
- PeriodType only has weekly/monthly); otherwise the declared value
691
- passes through if recognised, else `monthly`.
689
+ - MLproject `supported_period_type` passes through when it is one of
690
+ chapkit's PeriodType values (weekly/monthly/any); anything else, or an
691
+ absent value, becomes `monthly`.
692
692
  - `author_assessed_status` is validated against chapkit's AssessedStatus
693
693
  enum; unknown values fall back to None.
694
694
  - URL-typed fields (organization_logo_url, repository_url,
@@ -179,7 +179,7 @@ Your runtime deps (`[project.dependencies]`) have been auto-merged into the new
179
179
 
180
180
  ### [`MLServiceInfo`](https://dhis2-chap.github.io/chapkit/guides/ml-workflows/#mlserviceinfo-fields) — who you are
181
181
 
182
- The service's public identity and contract: `id`, `display_name`, `description`, [`model_metadata`](https://dhis2-chap.github.io/chapkit/guides/ml-workflows/#modelmetadata-fields), [`period_type`](https://dhis2-chap.github.io/chapkit/guides/ml-workflows/#mlserviceinfo-fields) (`monthly` / `weekly`), [`required_covariates`](#covariates). This is what chap-core reads via `/api/v1/info` when it decides whether to dispatch a dataset to your model.
182
+ The service's public identity and contract: `id`, `display_name`, `description`, [`model_metadata`](https://dhis2-chap.github.io/chapkit/guides/ml-workflows/#modelmetadata-fields), [`period_type`](https://dhis2-chap.github.io/chapkit/guides/ml-workflows/#mlserviceinfo-fields) (`monthly` / `weekly` / `any`), [`required_covariates`](#covariates). This is what chap-core reads via `/api/v1/info` when it decides whether to dispatch a dataset to your model.
183
183
 
184
184
  ### [`ModelMetadata.author_assessed_status`](https://dhis2-chap.github.io/chapkit/guides/ml-workflows/#modelmetadata-fields) — traffic-light maturity
185
185
 
@@ -100,7 +100,11 @@ class MLRouter(Router):
100
100
  return DataFrame.model_validate(frame).with_schema(required_covariates=required_covariates).model_dump()
101
101
 
102
102
  requires_geo = bool(sample_metadata.get("requires_geo", False))
103
- resolved_period = period_type or sample_metadata.get("period_type") or "monthly"
103
+ # A service declaring `any` accepts both formats; generate monthly rows for it.
104
+ declared_period = sample_metadata.get("period_type")
105
+ if declared_period not in ("monthly", "weekly"):
106
+ declared_period = None
107
+ resolved_period = period_type or declared_period or "monthly"
104
108
  want_geo = requires_geo if include_geo is None else include_geo
105
109
  geo = generator.generate_geo_data(num_features=num_locations, geo_type=geo_type) if want_geo else None
106
110
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes