CSBiology/DynamicObj
56.8
Adequate · 3 October 2026
2.4k
lines of production code
F#
primary language
2
measurements over time
What this system is
This system is a cross-platform F\# library that provides dynamic object handling with support for .NET, JavaScript, and Python. It offers both mutable and immutable variants of dynamic objects, enabling property reflection, deep copying, and structural equality across these targets. The project includes a modular build pipeline for packaging and releasing the library to NuGet, NPM, and PyPI.
Features
Add Fable-compatible PropertyHelper for dynamic object reflection
A new PropertyHelper class has been introduced in the DynamicObj module to facilitate reflection on dynamic objects. This implementation is specifically designed to be compatible with the Fable compiler, allowing the library to function correctly in JavaScript environments where standard .NET reflection APIs are unavailable. The class provides a unified interface for accessing property metadata and performing get/set operations, ensuring consistent behavior across both native .NET and Fable-compiled targets.
DynamicObj · high confidence
Introduce immutable DynamicObj variant and platform-specific transpilation support
The library now includes an ImmutableDynamicObj type that provides a read-only, map-backed counterpart to the mutable DynamicObj, featuring immutable update operations (add, remove, combineWith) and JSON serialization support. Additionally, the core DynamicObj implementation has been extended with Fable-compatible transpilation targets for JavaScript (FableJS.fs) and Python (FablePy.fs), enabling the library to function correctly when compiled to these platforms via conditional compilation directives.
src/DynamicObj · high confidence
Behavioural changes
DynamicObj 8.0.0: Breaking changes to dynamic property storage and Fable 5.1.0 upgrade
This release upgrades the Fable tooling and test dependencies to Fable 5.1.0, fable-library 5.1.0, and Fable.Pyxpecto 2.0.0. It introduces breaking changes to how dynamic members are stored: JavaScript and Python builds now use an internal \Properties\ dictionary instead of mirroring native object attributes, requiring users to use \SetProperty\, \TryGetDynamicPropertyHelper\, \GetPropertyHelpers\, or \GetProperties\ to interact with dynamic members. Additionally, it fixes dynamic-property enumeration to exclude compiler-generated backing fields, corrects Python deep copy for \ResizeArray\ values by handling native lists first, and aligns Python native \==\ and \hash()\ interop with \DynamicObj\ structural equality and hashing.
(repo-wide) · high confidence
Replaced legacy build scripts with a modular FAKE-based pipeline
The build system has been completely restructured from a single script into a modular FAKE-based pipeline (BasicTasks, Build, DocumentationTasks, Helpers, MessagePrompts, PackageTasks, ProjectInfo, ReleaseTasks, TestTasks). This new architecture introduces dedicated tasks for building documentation via fsdocs, packaging for .NET (NuGet), JavaScript (NPM), and Python (PyPI), and running tests across all three targets. It also adds support for pre-release versioning with configurable suffixes (alpha, beta, rc) and automated release workflows including git tagging and publishing.
build · high confidence
Test coverage
Expanded test coverage for DynamicObj deep copy, equality, and interop
Added comprehensive test suites for the DynamicObj library, including C\# interop tests verifying that inheritance and instance fields are preserved when using ImmutableDynamicObj. The F\# tests cover deep copying of primitives, arrays, and dictionaries (ensuring mutations to originals do not affect clones), structural equality and hash code consistency for nested objects, and the behavior of the combine operation on flat and nested DynamicObjs.
tests · high confidence
Dependencies
Initial dependency and project structure setup for DynamicObj
This change introduces the foundational build and dependency configuration for the DynamicObj library. It establishes .NET 8 as the target framework for the build tooling and test projects, while the core libraries target netstandard2.0. The setup includes F\# project files for the main DynamicObj and DynamicObj.Immutable modules, integrating Fable.Core 4.3.0 for JavaScript and Python transpilation compatibility. Additionally, it adds a Python configuration (pyproject.toml) referencing fable-library 5.1.0, a Node.js package.json with fable-library and Mocha, and test projects utilizing xUnit and Fable.Pyxpecto.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 55 → 57 (+1.5)
- Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.
Lenses
- Code Health 91 → 91 (+0.0)
- Architecture 52 → 61 (+9.6)
- Maturity 50 → 50 (+0.0)
- Readiness 54 → 54 (+0.0)
- Security 81 → 79 (-1.3)
Resolved (1)
- Off-boarding risk: anonymized user #1
New (2)
- High CVE: [GHSA redacted] (package-lock.json)
- Off-boarding risk: anonymized user #1
Architecture
- Containers 0 added · 0 removed · contexts 0 added · 1 removed · edges 0 added · 0 removed
Removed bounded contexts (1)
- DynamicObj
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
CSBiology/DynamicObj was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 6903bdacf74f5e43a758981dd01eae7f047f8e20 — the exact code this score is about.
- Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.