ducpy 4.0.2__tar.gz → 4.0.3__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.
- {ducpy-4.0.2 → ducpy-4.0.3}/Cargo.lock +1 -1
- {ducpy-4.0.2 → ducpy-4.0.3}/PKG-INFO +2 -1
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducpy/crate/Cargo.toml +1 -1
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/__init__.py +34 -4
- ducpy-4.0.3/src/ducpy/search/search_build123d.py +570 -0
- ducpy-4.0.3/src/ducpy/search/search_charter_issues.py +661 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_models.py +32 -7
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/serialize.py +23 -8
- {ducpy-4.0.2 → ducpy-4.0.3}/Cargo.toml +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducpy/crate/src/lib.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/Cargo.toml +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/build.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/developer-guide/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/extending/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/recipes/ci-configurations/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/recipes/git-hosted-services/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/recipes/release-workflow/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/support/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/usage/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/error/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/error/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/@octokit/plugin-paginate-rest/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/@octokit/plugin-paginate-rest/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/http-proxy-agent/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/http-proxy-agent/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/http-proxy-agent/node_modules/agent-base/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/http-proxy-agent/node_modules/agent-base/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/http-proxy-agent/node_modules/debug/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/http-proxy-agent/node_modules/debug/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/https-proxy-agent/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/https-proxy-agent/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/https-proxy-agent/node_modules/agent-base/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/https-proxy-agent/node_modules/agent-base/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/https-proxy-agent/node_modules/debug/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/https-proxy-agent/node_modules/debug/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/tinyglobby/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/node_modules/tinyglobby/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/fs-minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/string-locale-compare/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/arborist/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/config/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/config/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/fs/lib/cp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/git/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/installed-package-contents/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/installed-package-contents/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/metavuln-calculator/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/name-from-folder/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/node-gyp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/package-json/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/promise-spawn/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/query/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/redact/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/run-script/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@pkgjs/parseargs/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/protobuf-specs/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@sigstore/tuf/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tufjs/canonical-json/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/abbrev/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/agent-base/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/aproba/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/archy/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/bin-links/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/brace-expansion/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cacache/node_modules/mkdirp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cacache/node_modules/tar/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/chownr/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/ci-info/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cidr-regex/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cmd-shim/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-convert/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-name/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/common-ancestor-path/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cross-spawn/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cross-spawn/node_modules/which/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cross-spawn/node_modules/which/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/cssesc/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/debug/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/diff/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/encoding/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/exponential-backoff/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/foreground-child/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs-minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/glob/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/glob/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/graceful-fs/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/hosted-git-info/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/http-cache-semantics/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/http-proxy-agent/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/https-proxy-agent/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/iconv-lite/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/ignore-walk/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/ini/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/ip-address/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-cidr/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/isexe/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/jsbn/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/json-stringify-nice/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/jsonparse/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/just-diff/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/just-diff-apply/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmaccess/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmaccess/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmdiff/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmdiff/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmexec/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmexec/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmfund/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmfund/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmhook/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmorg/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmorg/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpack/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpack/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpublish/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpublish/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmsearch/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmsearch/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmteam/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmteam/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmversion/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmversion/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/lru-cache/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/make-fetch-happen/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minimatch/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-collect/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-fetch/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-flush/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-flush/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-pipeline/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/minizlib/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/mkdirp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/mute-stream/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/gyp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/gyp/docs/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/tar/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/nopt/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/nopt/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/normalize-package-data/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-audit-report/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-bundled/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-install-checks/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-normalize-package-bin/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-package-arg/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-packlist/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-user-validate/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/pacote/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/pacote/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/proc-log/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/proggy/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-all-reject-late/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-call-limit/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-retry/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/promzard/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/qrcode-terminal/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/qrcode-terminal/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/read/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-cmd-shim/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json-fast/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/safer-buffer/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/sigstore/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/smart-buffer/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks-proxy-agent/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-expression-parse/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/sprintf-js/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/node_modules/fs-minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/node_modules/minizlib/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/text-table/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tinyglobby/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/treeverse/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tuf-js/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/unique-filename/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/unique-slug/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/util-deprecate/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-license/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-name/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/walk-up-path/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/which/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/which/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/which/node_modules/isexe/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/npm/node_modules/yallist/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/node_modules/hosted-git-info/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/node_modules/hosted-git-info/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/node_modules/hosted-git-info/node_modules/lru-cache/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/node_modules/hosted-git-info/node_modules/lru-cache/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/node_modules/semver/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/node_modules/read-pkg/node_modules/normalize-package-data/node_modules/semver/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/debug/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/debug/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/env-ci/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/env-ci/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/env-ci/node_modules/execa/node_modules/human-signals/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/env-ci/node_modules/execa/node_modules/human-signals/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/hosted-git-info/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/hosted-git-info/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/hosted-git-info/node_modules/lru-cache/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/hosted-git-info/node_modules/lru-cache/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/semver/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/semver/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/node_modules/cliui/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/node_modules/yargs-parser/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/duc.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000000_to_3000001.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000001_to_3000002.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000002_to_3000003.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000003_to_3000004.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000004_to_3000005.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000005_to_3000006.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000006_to_3000007.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000007_to_3000008.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000008_to_3000009.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000009_to_4000000.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/search.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/version_control.sql +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/document.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/meta.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/mod.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/version_control.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/version_control_tests.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/bootstrap.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/bootstrap_tests.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/mod.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/native.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/wasm.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/external_file_chunks.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/lib.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/parse.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/serde_utils.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/serialize.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/session.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/types.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/Cargo.lock +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/Cargo.toml +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/LICENSE +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/README.md +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/src/lib.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/src/relaxed_idb.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/src/sahpool.rs +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/pyproject.toml +1 -1
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/__init__.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/__init__.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/block_instance_builder.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/block_utils.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/element_builders.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/mutate_builder.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/sql_builder.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/state_builders.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/style_builders.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/classes/DataStateClass.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/classes/ElementsClass.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/classes/__init__.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/enums.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/parse.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/_model_files.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/image_ocr.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_elements.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_external_files.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_ezdxf.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_ifc.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_pdf.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/__init__.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/constants.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/convert.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/io.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/mutate_utils.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/rand_utils.py +0 -0
- {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy_native/__init__.py +0 -0
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
"""Search helpers for DUC SQLite databases."""
|
|
2
2
|
|
|
3
|
+
from .search_build123d import (
|
|
4
|
+
Build123dText,
|
|
5
|
+
Build123dTextItem,
|
|
6
|
+
extract_build123d_path_text,
|
|
7
|
+
extract_build123d_shape_text,
|
|
8
|
+
extract_build123d_text,
|
|
9
|
+
extract_model_build123d_text,
|
|
10
|
+
)
|
|
11
|
+
from .search_charter_issues import (
|
|
12
|
+
DucCharterIssueSearchResponse,
|
|
13
|
+
DucCharterIssueSearchResult,
|
|
14
|
+
DucCharterSearchResult,
|
|
15
|
+
DucIssueSearchResult,
|
|
16
|
+
search_duc_charter,
|
|
17
|
+
search_duc_charter_and_issues,
|
|
18
|
+
search_duc_issues,
|
|
19
|
+
)
|
|
3
20
|
from .search_elements import (
|
|
4
21
|
DucElementSearchResult,
|
|
5
22
|
DucFileSearchResult,
|
|
@@ -34,12 +51,18 @@ from .search_models import (
|
|
|
34
51
|
)
|
|
35
52
|
|
|
36
53
|
__all__ = [
|
|
54
|
+
"DWGDXF_WASM_PATH_ENV",
|
|
55
|
+
"DWGDXF_WASM_URL",
|
|
56
|
+
"Build123dText",
|
|
57
|
+
"Build123dTextItem",
|
|
58
|
+
"DucCharterIssueSearchResponse",
|
|
59
|
+
"DucCharterIssueSearchResult",
|
|
60
|
+
"DucCharterSearchResult",
|
|
37
61
|
"DucElementSearchResult",
|
|
38
62
|
"DucFileSearchResult",
|
|
63
|
+
"DucIssueSearchResult",
|
|
39
64
|
"DucSearchResponse",
|
|
40
65
|
"DucSearchResult",
|
|
41
|
-
"DWGDXF_WASM_PATH_ENV",
|
|
42
|
-
"DWGDXF_WASM_URL",
|
|
43
66
|
"DwgConversionNotAvailable",
|
|
44
67
|
"DxfText",
|
|
45
68
|
"DxfTextItem",
|
|
@@ -50,12 +73,19 @@ __all__ = [
|
|
|
50
73
|
"ModelEngine",
|
|
51
74
|
"convert_dwg_to_dxf",
|
|
52
75
|
"detect_model_engine",
|
|
76
|
+
"extract_build123d_path_text",
|
|
77
|
+
"extract_build123d_shape_text",
|
|
78
|
+
"extract_build123d_text",
|
|
53
79
|
"extract_dxf_text",
|
|
54
|
-
"extract_model_dxf_text",
|
|
55
|
-
"search_duc_elements",
|
|
56
80
|
"extract_ifc_file_text",
|
|
57
81
|
"extract_ifc_path_text",
|
|
58
82
|
"extract_ifc_text",
|
|
83
|
+
"extract_model_build123d_text",
|
|
84
|
+
"extract_model_dxf_text",
|
|
59
85
|
"extract_model_ifc_text",
|
|
86
|
+
"search_duc_charter",
|
|
87
|
+
"search_duc_charter_and_issues",
|
|
88
|
+
"search_duc_elements",
|
|
89
|
+
"search_duc_issues",
|
|
60
90
|
"search_duc_models",
|
|
61
91
|
]
|
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
"""Semantic text extraction for build123d model elements.
|
|
2
|
+
|
|
3
|
+
Only metadata materialized into a CAD model is indexed: shape/assembly labels,
|
|
4
|
+
materials, joints, viewer names, STEP product metadata, and ASCII STL solid
|
|
5
|
+
names. Python source, raw STEP syntax, geometry, coordinates, and binary STL
|
|
6
|
+
headers are deliberately excluded.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import builtins
|
|
12
|
+
import contextlib
|
|
13
|
+
import io
|
|
14
|
+
import logging
|
|
15
|
+
import os
|
|
16
|
+
import re
|
|
17
|
+
import struct
|
|
18
|
+
import tempfile
|
|
19
|
+
import threading
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Iterator, Sequence
|
|
23
|
+
|
|
24
|
+
from ._model_files import stream_active_external_file_to_path
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"Build123dText",
|
|
30
|
+
"Build123dTextItem",
|
|
31
|
+
"build123d_available",
|
|
32
|
+
"extract_build123d_path_text",
|
|
33
|
+
"extract_build123d_shape_text",
|
|
34
|
+
"extract_build123d_text",
|
|
35
|
+
"extract_model_build123d_text",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
_EXECUTION_LOCK = threading.RLock()
|
|
39
|
+
_MAX_GRAPH_DEPTH = 64
|
|
40
|
+
_MAX_GRAPH_NODES = 10_000
|
|
41
|
+
_MAX_CAPTURED_SHAPES = 10_000
|
|
42
|
+
_MAX_ITEMS = 2_000
|
|
43
|
+
_MAX_TEXT_LENGTH = 512
|
|
44
|
+
_MAX_STL_NAME_LENGTH = 256
|
|
45
|
+
|
|
46
|
+
_GENERIC_VALUES = {
|
|
47
|
+
"",
|
|
48
|
+
"NONE",
|
|
49
|
+
"NULL",
|
|
50
|
+
"UNKNOWN",
|
|
51
|
+
"UNSPECIFIED",
|
|
52
|
+
"UNDEFINED",
|
|
53
|
+
"DEFAULT",
|
|
54
|
+
"SHAPE",
|
|
55
|
+
"SOLID",
|
|
56
|
+
"COMPOUND",
|
|
57
|
+
"PART",
|
|
58
|
+
"ASSEMBLY",
|
|
59
|
+
"PRODUCT",
|
|
60
|
+
"VERSION",
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass(frozen=True, slots=True)
|
|
65
|
+
class Build123dTextItem:
|
|
66
|
+
"""One semantic text value extracted from a build123d-backed model."""
|
|
67
|
+
|
|
68
|
+
text: str
|
|
69
|
+
kind: str
|
|
70
|
+
owner: str | None = None
|
|
71
|
+
field: str | None = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass(frozen=True, slots=True)
|
|
75
|
+
class Build123dText:
|
|
76
|
+
"""Searchable text extracted from one or more build123d-backed models."""
|
|
77
|
+
|
|
78
|
+
items: tuple[Build123dTextItem, ...] = ()
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def text(self) -> str:
|
|
82
|
+
return "\n".join(item.text for item in self.items)
|
|
83
|
+
|
|
84
|
+
def texts_by_kind(self, kind: str) -> list[str]:
|
|
85
|
+
return [item.text for item in self.items if item.kind == kind]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def build123d_available() -> bool:
|
|
89
|
+
"""Return whether build123d can be imported."""
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
import build123d # noqa: F401
|
|
93
|
+
except Exception as exc: # pragma: no cover - environment dependent
|
|
94
|
+
logger.debug("build123d is unavailable: %s", exc)
|
|
95
|
+
return False
|
|
96
|
+
return True
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _clean(value: Any) -> str:
|
|
100
|
+
if not isinstance(value, str):
|
|
101
|
+
return ""
|
|
102
|
+
cleaned = " ".join(value.split())
|
|
103
|
+
if not cleaned or len(cleaned) > _MAX_TEXT_LENGTH:
|
|
104
|
+
return ""
|
|
105
|
+
if any(ord(char) < 32 for char in cleaned):
|
|
106
|
+
return ""
|
|
107
|
+
return cleaned
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _is_meaningful(value: str, *, reject_generic: bool = False) -> bool:
|
|
111
|
+
if not value:
|
|
112
|
+
return False
|
|
113
|
+
folded = value.casefold()
|
|
114
|
+
if reject_generic and value.upper() in _GENERIC_VALUES:
|
|
115
|
+
return False
|
|
116
|
+
if folded in {item.casefold() for item in _GENERIC_VALUES}:
|
|
117
|
+
return False
|
|
118
|
+
if value.isdecimal():
|
|
119
|
+
return False
|
|
120
|
+
if re.fullmatch(r"[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}", value):
|
|
121
|
+
return False
|
|
122
|
+
return True
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _dedupe(items: Sequence[Build123dTextItem]) -> tuple[Build123dTextItem, ...]:
|
|
126
|
+
seen: set[tuple[str, str, str | None, str | None]] = set()
|
|
127
|
+
result: list[Build123dTextItem] = []
|
|
128
|
+
for item in items:
|
|
129
|
+
text = _clean(item.text)
|
|
130
|
+
if not text:
|
|
131
|
+
continue
|
|
132
|
+
key = (item.kind, text.casefold(), item.owner, item.field)
|
|
133
|
+
if key in seen:
|
|
134
|
+
continue
|
|
135
|
+
seen.add(key)
|
|
136
|
+
result.append(Build123dTextItem(text, item.kind, item.owner, item.field))
|
|
137
|
+
if len(result) >= _MAX_ITEMS:
|
|
138
|
+
break
|
|
139
|
+
return tuple(result)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _iter_shape_text(
|
|
143
|
+
roots: Sequence[Any],
|
|
144
|
+
*,
|
|
145
|
+
max_depth: int = _MAX_GRAPH_DEPTH,
|
|
146
|
+
max_nodes: int = _MAX_GRAPH_NODES,
|
|
147
|
+
) -> Iterator[Build123dTextItem]:
|
|
148
|
+
"""Walk only build123d's explicit ``children`` assembly relationship."""
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
from build123d import Shape
|
|
152
|
+
except Exception:
|
|
153
|
+
return
|
|
154
|
+
|
|
155
|
+
visited: set[int] = set()
|
|
156
|
+
stack: list[tuple[Any, int]] = [(root, 0) for root in reversed(list(roots))]
|
|
157
|
+
while stack and len(visited) < max_nodes:
|
|
158
|
+
shape, depth = stack.pop()
|
|
159
|
+
if not isinstance(shape, Shape):
|
|
160
|
+
continue
|
|
161
|
+
identity = id(shape)
|
|
162
|
+
if identity in visited:
|
|
163
|
+
continue
|
|
164
|
+
visited.add(identity)
|
|
165
|
+
|
|
166
|
+
label = _clean(getattr(shape, "label", ""))
|
|
167
|
+
owner = label or None
|
|
168
|
+
if _is_meaningful(label):
|
|
169
|
+
yield Build123dTextItem(label, "label", owner=owner, field="label")
|
|
170
|
+
|
|
171
|
+
material = _clean(getattr(shape, "material", ""))
|
|
172
|
+
if _is_meaningful(material):
|
|
173
|
+
yield Build123dTextItem(material, "material", owner=owner, field="material")
|
|
174
|
+
|
|
175
|
+
joints = getattr(shape, "joints", None)
|
|
176
|
+
if isinstance(joints, dict):
|
|
177
|
+
for joint_key, joint in joints.items():
|
|
178
|
+
key_text = _clean(joint_key)
|
|
179
|
+
if _is_meaningful(key_text):
|
|
180
|
+
yield Build123dTextItem(key_text, "joint", owner=owner, field="key")
|
|
181
|
+
joint_label = _clean(getattr(joint, "label", ""))
|
|
182
|
+
if _is_meaningful(joint_label) and joint_label.casefold() != key_text.casefold():
|
|
183
|
+
yield Build123dTextItem(
|
|
184
|
+
joint_label, "joint", owner=owner, field="label"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
if depth >= max_depth:
|
|
188
|
+
continue
|
|
189
|
+
children = getattr(shape, "children", None)
|
|
190
|
+
if isinstance(children, (list, tuple)):
|
|
191
|
+
for child in reversed(children):
|
|
192
|
+
stack.append((child, depth + 1))
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def extract_build123d_shape_text(
|
|
196
|
+
shape: Any | Sequence[Any],
|
|
197
|
+
*,
|
|
198
|
+
viewer_names: Sequence[str] = (),
|
|
199
|
+
) -> Build123dText:
|
|
200
|
+
"""Extract labels/materials/joints from loaded shapes and viewer names."""
|
|
201
|
+
|
|
202
|
+
roots = list(shape) if isinstance(shape, (list, tuple)) else [shape]
|
|
203
|
+
items = list(_iter_shape_text(roots))
|
|
204
|
+
for name in viewer_names:
|
|
205
|
+
text = _clean(name)
|
|
206
|
+
if _is_meaningful(text):
|
|
207
|
+
items.append(Build123dTextItem(text, "viewer_name", field="names"))
|
|
208
|
+
return Build123dText(_dedupe(items))
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _step_entity_spec(entity_type: str) -> tuple[str, tuple[str, ...]] | None:
|
|
212
|
+
"""Map an exact semantic STEP entity family to approved scalar fields."""
|
|
213
|
+
|
|
214
|
+
if entity_type == "StepBasic_Product":
|
|
215
|
+
return "step_product_name", ("Name", "Description")
|
|
216
|
+
if entity_type.startswith("StepBasic_ProductDefinition"):
|
|
217
|
+
return "step_product_description", ("Description",)
|
|
218
|
+
if entity_type == "StepBasic_ProductRelatedProductCategory":
|
|
219
|
+
return "step_classification", ("Name", "Description")
|
|
220
|
+
if entity_type == "StepRepr_ProductDefinitionShape":
|
|
221
|
+
return "step_product_description", ("Name", "Description")
|
|
222
|
+
if entity_type.startswith("StepBasic_Document"):
|
|
223
|
+
return "step_document", ("Name", "Description", "Kind", "Purpose")
|
|
224
|
+
if "Material" in entity_type:
|
|
225
|
+
return "step_material", ("Name", "Description")
|
|
226
|
+
if "Classification" in entity_type:
|
|
227
|
+
return "step_classification", ("Name", "Description", "Purpose")
|
|
228
|
+
if entity_type == "StepBasic_Organization":
|
|
229
|
+
return "step_party", ("Name", "Description")
|
|
230
|
+
if entity_type == "StepBasic_Person":
|
|
231
|
+
return "step_party", ("GivenName", "Surname")
|
|
232
|
+
if entity_type.endswith("Role"):
|
|
233
|
+
return "step_role", ("Name",)
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _ocp_scalar(value: Any) -> str:
|
|
238
|
+
if value is None:
|
|
239
|
+
return ""
|
|
240
|
+
for method_name in ("ToCString", "ToExtString"):
|
|
241
|
+
method = getattr(value, method_name, None)
|
|
242
|
+
if callable(method):
|
|
243
|
+
try:
|
|
244
|
+
return _clean(str(method()))
|
|
245
|
+
except Exception:
|
|
246
|
+
return ""
|
|
247
|
+
return _clean(value if isinstance(value, str) else "")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _iter_step_semantic_text(path: str | Path) -> Iterator[Build123dTextItem]:
|
|
251
|
+
"""Read approved STEP entity fields through Open Cascade, never source text."""
|
|
252
|
+
|
|
253
|
+
try:
|
|
254
|
+
from OCP.IFSelect import IFSelect_ReturnStatus
|
|
255
|
+
from OCP.STEPControl import STEPControl_Reader
|
|
256
|
+
|
|
257
|
+
reader = STEPControl_Reader()
|
|
258
|
+
if reader.ReadFile(os.fspath(path)) != IFSelect_ReturnStatus.IFSelect_RetDone:
|
|
259
|
+
return
|
|
260
|
+
model = reader.StepModel()
|
|
261
|
+
except Exception as exc:
|
|
262
|
+
logger.debug("Could not open STEP metadata for search: %s", exc)
|
|
263
|
+
return
|
|
264
|
+
|
|
265
|
+
yielded = 0
|
|
266
|
+
for index in range(1, model.NbEntities() + 1):
|
|
267
|
+
if yielded >= _MAX_ITEMS:
|
|
268
|
+
break
|
|
269
|
+
try:
|
|
270
|
+
entity = model.Value(index)
|
|
271
|
+
entity_type = type(entity).__name__
|
|
272
|
+
except Exception:
|
|
273
|
+
continue
|
|
274
|
+
spec = _step_entity_spec(entity_type)
|
|
275
|
+
if spec is None:
|
|
276
|
+
continue
|
|
277
|
+
kind, fields = spec
|
|
278
|
+
for field in fields:
|
|
279
|
+
getter = getattr(entity, field, None)
|
|
280
|
+
if not callable(getter):
|
|
281
|
+
continue
|
|
282
|
+
try:
|
|
283
|
+
text = _ocp_scalar(getter())
|
|
284
|
+
except Exception:
|
|
285
|
+
continue
|
|
286
|
+
if not _is_meaningful(text, reject_generic=True):
|
|
287
|
+
continue
|
|
288
|
+
yield Build123dTextItem(text, kind, owner=entity_type, field=field)
|
|
289
|
+
yielded += 1
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _extract_step_path_text(path: str | Path) -> Build123dText:
|
|
293
|
+
try:
|
|
294
|
+
from build123d import import_step
|
|
295
|
+
|
|
296
|
+
shape = import_step(path)
|
|
297
|
+
except Exception as exc:
|
|
298
|
+
logger.debug("Failed to import STEP for search: %s", exc)
|
|
299
|
+
return Build123dText()
|
|
300
|
+
|
|
301
|
+
items: list[Build123dTextItem] = []
|
|
302
|
+
for item in extract_build123d_shape_text(shape).items:
|
|
303
|
+
text = item.text.replace("_", " ") if item.kind == "label" else item.text
|
|
304
|
+
if item.kind == "label" and not _is_meaningful(text, reject_generic=True):
|
|
305
|
+
continue
|
|
306
|
+
kind = "step_label" if item.kind == "label" else item.kind
|
|
307
|
+
items.append(Build123dTextItem(text, kind, item.owner, item.field))
|
|
308
|
+
items.extend(_iter_step_semantic_text(path))
|
|
309
|
+
return Build123dText(_dedupe(items))
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def _is_binary_stl(path: str | Path) -> bool:
|
|
313
|
+
try:
|
|
314
|
+
size = Path(path).stat().st_size
|
|
315
|
+
if size < 84:
|
|
316
|
+
return False
|
|
317
|
+
with Path(path).open("rb") as source:
|
|
318
|
+
header = source.read(84)
|
|
319
|
+
triangle_count = struct.unpack_from("<I", header, 80)[0]
|
|
320
|
+
return triangle_count <= (size - 84) // 50 and 84 + 50 * triangle_count == size
|
|
321
|
+
except (OSError, struct.error):
|
|
322
|
+
return False
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _ascii_stl_name(path: str | Path) -> str:
|
|
326
|
+
if _is_binary_stl(path):
|
|
327
|
+
return ""
|
|
328
|
+
try:
|
|
329
|
+
file_path = Path(path)
|
|
330
|
+
size = file_path.stat().st_size
|
|
331
|
+
with file_path.open("rb") as source:
|
|
332
|
+
opening = source.read(min(size, 4096))
|
|
333
|
+
source.seek(max(0, size - 4096))
|
|
334
|
+
ending = source.read(4096)
|
|
335
|
+
opening_text = opening.decode("utf-8-sig", errors="strict")
|
|
336
|
+
ending_text = ending.decode("utf-8", errors="strict")
|
|
337
|
+
except (OSError, UnicodeDecodeError):
|
|
338
|
+
return ""
|
|
339
|
+
|
|
340
|
+
match = re.match(r"^\s*solid(?:[ \t]+([^\r\n]*))?\s*(?:\r?\n|$)", opening_text, re.I)
|
|
341
|
+
if match is None or "facet" not in opening_text.casefold():
|
|
342
|
+
return ""
|
|
343
|
+
if re.search(r"(?:^|\r?\n)\s*endsolid(?:[ \t]+[^\r\n]*)?\s*$", ending_text, re.I) is None:
|
|
344
|
+
return ""
|
|
345
|
+
name = _clean(match.group(1) or "")
|
|
346
|
+
if len(name) > _MAX_STL_NAME_LENGTH:
|
|
347
|
+
return ""
|
|
348
|
+
return name if _is_meaningful(name, reject_generic=True) else ""
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def _extract_stl_path_text(path: str | Path) -> Build123dText:
|
|
352
|
+
try:
|
|
353
|
+
from build123d import import_stl
|
|
354
|
+
|
|
355
|
+
import_stl(path)
|
|
356
|
+
except Exception as exc:
|
|
357
|
+
logger.debug("Failed to import STL for search: %s", exc)
|
|
358
|
+
return Build123dText()
|
|
359
|
+
name = _ascii_stl_name(path)
|
|
360
|
+
if not name:
|
|
361
|
+
return Build123dText()
|
|
362
|
+
return Build123dText((Build123dTextItem(name, "stl_solid", field="solid"),))
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def extract_build123d_path_text(
|
|
366
|
+
path: str | Path,
|
|
367
|
+
model_type: str | None = None,
|
|
368
|
+
) -> Build123dText:
|
|
369
|
+
"""Extract semantic text from a STEP/STP or STL path."""
|
|
370
|
+
|
|
371
|
+
if not build123d_available():
|
|
372
|
+
return Build123dText()
|
|
373
|
+
normalized_type = (model_type or Path(path).suffix.lstrip(".")).strip().lower()
|
|
374
|
+
if normalized_type in {"step", "stp"}:
|
|
375
|
+
return _extract_step_path_text(path)
|
|
376
|
+
if normalized_type == "stl":
|
|
377
|
+
return _extract_stl_path_text(path)
|
|
378
|
+
try:
|
|
379
|
+
with Path(path).open("rb") as source:
|
|
380
|
+
prefix = source.read(128).lstrip(b"\xef\xbb\xbf \t\r\n").upper()
|
|
381
|
+
except OSError:
|
|
382
|
+
return Build123dText()
|
|
383
|
+
if prefix.startswith(b"ISO-10303-21;"):
|
|
384
|
+
return _extract_step_path_text(path)
|
|
385
|
+
return _extract_stl_path_text(path)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def extract_build123d_text(data: bytes, model_type: str) -> Build123dText:
|
|
389
|
+
"""Extract semantic build123d-backed text from in-memory file data."""
|
|
390
|
+
|
|
391
|
+
if not data:
|
|
392
|
+
return Build123dText()
|
|
393
|
+
suffix = ".step" if model_type.lower() in {"step", "stp"} else ".stl"
|
|
394
|
+
with tempfile.NamedTemporaryFile(prefix="ducpy-build123d-", suffix=suffix) as target:
|
|
395
|
+
target.write(data)
|
|
396
|
+
target.flush()
|
|
397
|
+
return extract_build123d_path_text(target.name, model_type)
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def _capture_shape_values(
|
|
401
|
+
value: Any,
|
|
402
|
+
shape_type: type[Any],
|
|
403
|
+
captured: list[Any],
|
|
404
|
+
seen: set[int],
|
|
405
|
+
*,
|
|
406
|
+
depth: int = 0,
|
|
407
|
+
) -> None:
|
|
408
|
+
if depth > 4 or len(captured) >= _MAX_CAPTURED_SHAPES:
|
|
409
|
+
return
|
|
410
|
+
identity = id(value)
|
|
411
|
+
if identity in seen:
|
|
412
|
+
return
|
|
413
|
+
seen.add(identity)
|
|
414
|
+
if isinstance(value, shape_type):
|
|
415
|
+
captured.append(value)
|
|
416
|
+
return
|
|
417
|
+
if isinstance(value, dict):
|
|
418
|
+
values = value.values()
|
|
419
|
+
elif isinstance(value, (list, tuple, set, frozenset)):
|
|
420
|
+
values = value
|
|
421
|
+
else:
|
|
422
|
+
return
|
|
423
|
+
for nested in values:
|
|
424
|
+
_capture_shape_values(nested, shape_type, captured, seen, depth=depth + 1)
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def _viewer_names(value: Any) -> list[str]:
|
|
428
|
+
if isinstance(value, str):
|
|
429
|
+
return [value]
|
|
430
|
+
if isinstance(value, (list, tuple)):
|
|
431
|
+
return [item for item in value if isinstance(item, str)]
|
|
432
|
+
return []
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def _run_and_capture_build123d(
|
|
436
|
+
code: str,
|
|
437
|
+
duc_source: str | Path,
|
|
438
|
+
file_ids: list[str],
|
|
439
|
+
model_type: str,
|
|
440
|
+
) -> tuple[list[Any], list[str]]:
|
|
441
|
+
"""Execute trusted Python while capturing build123d model metadata roots."""
|
|
442
|
+
|
|
443
|
+
import build123d
|
|
444
|
+
from build123d import Shape
|
|
445
|
+
|
|
446
|
+
captured: list[Any] = []
|
|
447
|
+
names: list[str] = []
|
|
448
|
+
suffix = ".stl" if model_type == "stl" else ".step"
|
|
449
|
+
|
|
450
|
+
with _EXECUTION_LOCK, tempfile.TemporaryDirectory(prefix="ducpy-build123d-") as tmpdir:
|
|
451
|
+
resolved: dict[str, str] = {}
|
|
452
|
+
for index, file_id in enumerate(file_ids):
|
|
453
|
+
target = Path(tmpdir) / f"model-file-{index}{suffix}"
|
|
454
|
+
if stream_active_external_file_to_path(duc_source, file_id, target) > 0:
|
|
455
|
+
resolved[file_id] = str(target)
|
|
456
|
+
|
|
457
|
+
def resolve_external_file(file_id: str) -> str:
|
|
458
|
+
key = str(file_id)
|
|
459
|
+
if key in resolved:
|
|
460
|
+
return resolved[key]
|
|
461
|
+
raise FileNotFoundError(f"External file '{key}' not found for model search.")
|
|
462
|
+
|
|
463
|
+
original_shape_init = Shape.__init__
|
|
464
|
+
seen_viewer_values: set[int] = set()
|
|
465
|
+
|
|
466
|
+
def init_and_capture(shape: Any, *args: Any, **kwargs: Any) -> None:
|
|
467
|
+
original_shape_init(shape, *args, **kwargs)
|
|
468
|
+
if len(captured) < _MAX_CAPTURED_SHAPES:
|
|
469
|
+
captured.append(shape)
|
|
470
|
+
|
|
471
|
+
viewer_module = None
|
|
472
|
+
viewer_originals: dict[str, Any] = {}
|
|
473
|
+
try:
|
|
474
|
+
import ocp_vscode as viewer_module # type: ignore[no-redef]
|
|
475
|
+
except Exception:
|
|
476
|
+
viewer_module = None
|
|
477
|
+
|
|
478
|
+
def viewer_capture(*args: Any, **kwargs: Any) -> None:
|
|
479
|
+
before = len(captured)
|
|
480
|
+
for value in args:
|
|
481
|
+
_capture_shape_values(value, Shape, captured, seen_viewer_values)
|
|
482
|
+
if len(captured) > before:
|
|
483
|
+
names.extend(_viewer_names(kwargs.get("names")))
|
|
484
|
+
|
|
485
|
+
previous_resolver = getattr(builtins, "resolve_external_file", None)
|
|
486
|
+
had_resolver = hasattr(builtins, "resolve_external_file")
|
|
487
|
+
previous_cwd = os.getcwd()
|
|
488
|
+
globals_dict: dict[str, Any] = {
|
|
489
|
+
"__name__": "__main__",
|
|
490
|
+
"external_files": {
|
|
491
|
+
file_id: {"id": file_id, "path": path}
|
|
492
|
+
for file_id, path in resolved.items()
|
|
493
|
+
},
|
|
494
|
+
"resolve_external_file": resolve_external_file,
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
try:
|
|
498
|
+
Shape.__init__ = init_and_capture
|
|
499
|
+
if viewer_module is not None:
|
|
500
|
+
for function_name in ("show", "show_object", "show_all"):
|
|
501
|
+
original = getattr(viewer_module, function_name, None)
|
|
502
|
+
if callable(original):
|
|
503
|
+
viewer_originals[function_name] = original
|
|
504
|
+
setattr(viewer_module, function_name, viewer_capture)
|
|
505
|
+
builtins.resolve_external_file = resolve_external_file
|
|
506
|
+
os.chdir(tmpdir)
|
|
507
|
+
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
|
508
|
+
exec(compile(code, "<ducpy-build123d-model>", "exec"), globals_dict)
|
|
509
|
+
except Exception as exc:
|
|
510
|
+
logger.debug("Embedded build123d code did not run cleanly: %s", exc)
|
|
511
|
+
finally:
|
|
512
|
+
seen_globals: set[int] = set()
|
|
513
|
+
for value in globals_dict.values():
|
|
514
|
+
_capture_shape_values(value, Shape, captured, seen_globals)
|
|
515
|
+
os.chdir(previous_cwd)
|
|
516
|
+
Shape.__init__ = original_shape_init
|
|
517
|
+
if viewer_module is not None:
|
|
518
|
+
for function_name, original in viewer_originals.items():
|
|
519
|
+
setattr(viewer_module, function_name, original)
|
|
520
|
+
if had_resolver:
|
|
521
|
+
builtins.resolve_external_file = previous_resolver
|
|
522
|
+
elif hasattr(builtins, "resolve_external_file"):
|
|
523
|
+
delattr(builtins, "resolve_external_file")
|
|
524
|
+
|
|
525
|
+
unique: list[Any] = []
|
|
526
|
+
seen_shapes: set[int] = set()
|
|
527
|
+
for shape in captured:
|
|
528
|
+
if id(shape) in seen_shapes:
|
|
529
|
+
continue
|
|
530
|
+
seen_shapes.add(id(shape))
|
|
531
|
+
unique.append(shape)
|
|
532
|
+
return unique, names
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def extract_model_build123d_text(
|
|
536
|
+
duc_source: str | Path,
|
|
537
|
+
element: dict[str, Any],
|
|
538
|
+
*,
|
|
539
|
+
run_code: bool = False,
|
|
540
|
+
) -> Build123dText:
|
|
541
|
+
"""Extract semantic text from a DUC build123d model element.
|
|
542
|
+
|
|
543
|
+
``run_code=True`` executes arbitrary embedded Python in-process and must only
|
|
544
|
+
be used for trusted DUC files. Source code and execution output are never
|
|
545
|
+
indexed.
|
|
546
|
+
"""
|
|
547
|
+
|
|
548
|
+
if not build123d_available():
|
|
549
|
+
return Build123dText()
|
|
550
|
+
model_type = (element.get("model_type") or "python").strip().lower()
|
|
551
|
+
code = element.get("code")
|
|
552
|
+
file_ids = [str(file_id) for file_id in (element.get("file_ids") or []) if file_id]
|
|
553
|
+
|
|
554
|
+
if run_code and model_type == "python" and isinstance(code, str) and "build123d" in code:
|
|
555
|
+
shapes, names = _run_and_capture_build123d(code, duc_source, file_ids, model_type)
|
|
556
|
+
result = extract_build123d_shape_text(shapes, viewer_names=names)
|
|
557
|
+
if result.items:
|
|
558
|
+
return result
|
|
559
|
+
logger.debug("Code execution captured no searchable build123d metadata")
|
|
560
|
+
|
|
561
|
+
items: list[Build123dTextItem] = []
|
|
562
|
+
with tempfile.TemporaryDirectory(prefix="ducpy-build123d-") as tmpdir:
|
|
563
|
+
for index, file_id in enumerate(file_ids):
|
|
564
|
+
suffix = ".stl" if model_type == "stl" else ".step"
|
|
565
|
+
target = Path(tmpdir) / f"model-file-{index}{suffix}"
|
|
566
|
+
if stream_active_external_file_to_path(duc_source, file_id, target) <= 0:
|
|
567
|
+
continue
|
|
568
|
+
effective_type = model_type if model_type != "python" else None
|
|
569
|
+
items.extend(extract_build123d_path_text(target, effective_type).items)
|
|
570
|
+
return Build123dText(_dedupe(items))
|