Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
2b9a128
Add tests first
isc-dchui Mar 26, 2026
4ea4593
First pass implementation of package-database
isc-dchui Mar 30, 2026
a8ee336
First pass on installing database-packaged module
isc-dchui Mar 31, 2026
19d9bd2
Bug fixing and test improvement
isc-dchui Apr 1, 2026
dc9e7e6
Handle non-compiled files and test files with some bug fixes and tests
isc-dchui Apr 2, 2026
f428f77
All tests pass now
isc-dchui Apr 7, 2026
04a04ae
Refactor
isc-dchui Apr 8, 2026
6505e8a
Fix python requirements.txt gap, add some tests, and minor refactoring
isc-dchui Apr 8, 2026
019d82d
Cleanup after new tests
isc-dchui Apr 8, 2026
4a9462c
Fix gap with invoke timing
isc-dchui Aug 13, 2026
ac9ff24
Refactor tests to carefully reuse namespace for performance gains
isc-dchui Apr 9, 2026
0dfd807
Minor refactor and remove test timing
isc-dchui Apr 10, 2026
2ee14f6
Properly handle update steps during database packaging/installing
isc-dchui Apr 13, 2026
bc71741
Add publish-database command for publishing a database-packaged modul…
isc-dchui Apr 13, 2026
18ff483
Add changelog and merge two tests into one
isc-dchui Apr 13, 2026
bcb541a
Readd comment
isc-dchui Apr 13, 2026
7d83e90
Adjust GitHub CI phase steps timing
isc-dchui Jul 6, 2026
32e680e
Combine python tests into one
isc-dchui Apr 14, 2026
792ae11
Add source vs database-packaged module filtering in ORAS with OCI tag…
isc-dchui Apr 20, 2026
b231290
Address review comments
isc-dchui May 26, 2026
07f8a93
Reorganize methods
isc-dchui May 26, 2026
d0d2cce
Update to new version of IPM
isc-dchui Jul 6, 2026
07617be
Add check for mirrored databases
isc-dchui Jun 1, 2026
23662d7
Address review comments
isc-dchui Aug 13, 2026
cdb392d
Address review comments and move db swap to Reload
isc-dchui Aug 5, 2026
0862f57
Refactor and fix small bugs
isc-dchui Aug 6, 2026
853eb75
DB packaging will now check for existing modules before swapping data…
isc-dchui Aug 13, 2026
a8733ae
Improve handling of db-packaging updates re. dependencies
isc-dchui Aug 7, 2026
d609c07
Fix small issues and comments
isc-dchui Aug 10, 2026
2ee73a6
Improve test performance
isc-dchui Aug 10, 2026
27f185a
Fix I4H ensemble testing issue and extend generated resources grabbin…
isc-dchui Aug 11, 2026
6a07664
Handle database-packaged installation dependencies properly
isc-dchui Aug 13, 2026
e654cba
Patch some holes and fix a few small issues
isc-dchui Aug 13, 2026
1044121
Fix I4H tests (again)
isc-dchui Aug 14, 2026
c13492b
Try fixing test again
isc-dchui Aug 14, 2026
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
4 changes: 2 additions & 2 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
echo number=${VERSION} >> $GITHUB_OUTPUT

build:
timeout-minutes: 45
timeout-minutes: 60
Comment thread
isc-dchui marked this conversation as resolved.
needs:
- prepare
strategy:
Expand Down Expand Up @@ -77,7 +77,7 @@ jobs:
tags: zpm
build-args: BASE=${{ steps.image.outputs.name }}
- name: Run temporary registry
timeout-minutes: 15
timeout-minutes: 5
run: |
docker network create zpm
docker build -f tests/registry/Dockerfile -t registry-image .
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added
- #1117: Add `sync` command for incremental loading of changed files in dev-mode modules. Detects modified files since last sync using SHA-1 hash and recompiles only what is stale. Supports `-delete` for processing removed files and `-test` for running changed test-phase unit tests.
- #986: Database packaging: new `package-database` and `publish-database` commands create an IRIS.DAT-based package that installs via swapping of the routines database rather than compilation of source files. Pass `-dev` to include test resources (`Scope="test"` or `Scope="verify"`) in the package, which are excluded by default.

## [0.10.9] - 2026-08-05

Expand Down
15 changes: 13 additions & 2 deletions src/cls/IPM/DataType/PhaseName.cls
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,18 @@ Parameter MAXLEN As INTEGER = 50;
/// separated list (where the delimiter is the first character) of logical values.
/// If a non-null value is present, then the attribute is restricted to values
/// in the list, and the validation code simply checks to see if the value is in the list.
/// Should be kept in sync with %IPM.Lifecycle.Base.Phases
Parameter VALUELIST = ",Clean,Initialize,Reload,*,Validate,ExportData,Compile,Activate,Document,MakeDeployed,Test,Package,Verify,Publish,Configure,Unconfigure,ApplyUpdateSteps,Sync";
///
/// Canonical lifecycle phase ordering. Phases execute in this order during a complete
/// lifecycle run (e.g., load with isComplete=1). Each phase name corresponds to a
/// %<PhaseName> method on %IPM.Lifecycle.Base and its subclasses.
///
/// The "*" entry is not a real phase — it is a module-object refresh checkpoint.
/// When ExecutePhases (in %IPM.Storage.Module) encounters "*", it kills and reopens
/// the module and lifecycle objects from storage, picking up any changes made by
/// earlier phases (e.g., module.xml modifications during Reload). No lifecycle method
/// is called for "*", and no resource processor hooks or <Invoke> elements target it.
///
/// Should be kept in sync with %IPM.Lifecycle.Base.PHASES.
Parameter VALUELIST = ",Clean,Initialize,Reload,*,Validate,ExportData,Compile,Activate,Document,MakeDeployed,Test,Package,Verify,Publish,Configure,Unconfigure,ApplyUpdateSteps";

}
21 changes: 15 additions & 6 deletions src/cls/IPM/Lifecycle/Base.cls
Original file line number Diff line number Diff line change
Expand Up @@ -1404,9 +1404,11 @@ Method ExportPythonDependencies(
$$$ThrowOnError(..InstallOrDownloadPythonRequirements(root, .pParams, 1))
set wheelsDir = ##class(%File).NormalizeDirectory("wheels", module.Root)
if '##class(%File).DirectoryExists(wheelsDir) {
// ExportPythonDependencies called on base module + dependencies so don't want to error if one of
// the modules doesn't have a wheels directory since that might actually be the case for the module
write !, "WARNING: No wheels directory for this module: "_wheelsDir_" not found"
// A module without Python requirements legitimately has no wheels directory, so this is only worth warning about
// when requirements.txt exists but the download produced nothing.
if ##class(%File).Exists(##class(%File).NormalizeFilename("requirements.txt", root)) {
write !, "WARNING: No wheels directory for this module: "_wheelsDir_" not found"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

in the case that requirements.txt does exist but there is no wheelsDir, should this do more than log a warning (i.e. error out?)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

There might be other reasons why wheelsDir doesn't exist so I figured I'd leave that warn instead of throw pattern alone

}
quit
}
set stmt = ##class(%SQL.Statement).%New()
Expand Down Expand Up @@ -1620,7 +1622,13 @@ Method %Publish(ByRef pParams) As %Status
quit
}
set tModule.VersionString = ..Module.VersionString
if (..Module.Deployed) {
// Publish type comes from the running lifecycle, not the module's Packaging property.
// ..Module.Packaging records how the module was loaded (may be stale); the PACKAGING
// parameter is fixed per lifecycle class and reflects how it's being published now.
if ($parameter($this, "PACKAGING") = "database") {
set tModule.IPMPackaging = "database"
set tModule.PlatformVersion = $system.Version.GetMajor() _ "." _ $system.Version.GetMinor()
} elseif (..Module.Deployed) {
set tModule.Deployed = 1
if $isobject(..Module.SystemRequirements) {
set tModule.PlatformVersion = ..Module.SystemRequirements.VersionString
Expand Down Expand Up @@ -2127,6 +2135,9 @@ Method ExportSingleModule(
}
}

/// Returns the lifecycle class whose Final PACKAGING parameter equals pPackaging.
/// pBaseClass is "" when no class claims that value. This is a valid outcome, since packaging values are
/// not constrained to those with a dedicated lifecycle class. Callers decide the fallback.
ClassMethod GetBaseClassForPackaging(
pPackaging As %String,
Output pBaseClass As %Dictionary.Classname) As %Status [ Final ]
Expand All @@ -2145,8 +2156,6 @@ ClassMethod GetBaseClassForPackaging(
set pBaseClass = tRes.%Get("BaseClass")
}
$$$ThrowOnError(tSC)

// TODO: Error if no results?
} catch e {
set pBaseClass = ""
set tSC = e.AsStatus()
Expand Down
Loading
Loading