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.
Files changed (313) hide show
  1. {ducpy-4.0.2 → ducpy-4.0.3}/Cargo.lock +1 -1
  2. {ducpy-4.0.2 → ducpy-4.0.3}/PKG-INFO +2 -1
  3. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducpy/crate/Cargo.toml +1 -1
  4. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/__init__.py +34 -4
  5. ducpy-4.0.3/src/ducpy/search/search_build123d.py +570 -0
  6. ducpy-4.0.3/src/ducpy/search/search_charter_issues.py +661 -0
  7. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_models.py +32 -7
  8. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/serialize.py +23 -8
  9. {ducpy-4.0.2 → ducpy-4.0.3}/Cargo.toml +0 -0
  10. {ducpy-4.0.2 → ducpy-4.0.3}/LICENSE +0 -0
  11. {ducpy-4.0.2 → ducpy-4.0.3}/README.md +0 -0
  12. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducpy/crate/src/lib.rs +0 -0
  13. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/Cargo.toml +0 -0
  14. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/LICENSE +0 -0
  15. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/README.md +0 -0
  16. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/build.rs +0 -0
  17. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/LICENSE +0 -0
  18. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/README.md +0 -0
  19. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/README.md +0 -0
  20. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/developer-guide/README.md +0 -0
  21. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/extending/README.md +0 -0
  22. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/recipes/ci-configurations/README.md +0 -0
  23. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/recipes/git-hosted-services/README.md +0 -0
  24. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/recipes/release-workflow/README.md +0 -0
  25. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/support/README.md +0 -0
  26. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/docs/usage/README.md +0 -0
  27. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/error/LICENSE +0 -0
  28. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/error/README.md +0 -0
  29. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/LICENSE +0 -0
  30. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/github/README.md +0 -0
  31. {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
  32. {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
  33. {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
  34. {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
  35. {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
  36. {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
  37. {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
  38. {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
  39. {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
  40. {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
  41. {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
  42. {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
  43. {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
  44. {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
  45. {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
  46. {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
  47. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/LICENSE +0 -0
  48. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/npm/README.md +0 -0
  49. {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
  50. {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
  51. {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
  52. {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
  53. {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
  54. {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
  55. {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
  56. {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
  57. {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
  58. {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
  59. {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
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {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
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {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
  160. {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
  161. {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
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {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
  182. {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
  183. {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
  184. {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
  185. {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
  186. {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
  187. {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
  188. {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
  189. {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
  190. {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
  191. {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
  192. {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
  193. {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
  194. {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
  195. {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
  196. {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
  197. {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
  198. {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
  199. {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
  200. {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
  201. {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
  202. {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
  203. {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
  204. {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
  205. {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
  206. {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
  207. {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
  208. {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
  209. {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
  210. {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
  211. {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
  212. {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
  213. {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
  214. {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
  215. {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
  216. {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
  217. {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
  218. {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
  219. {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
  220. {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
  221. {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
  222. {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
  223. {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
  224. {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
  225. {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
  226. {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
  227. {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
  228. {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
  229. {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
  230. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/@semantic-release/release-notes-generator/LICENSE +0 -0
  231. {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
  232. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/debug/LICENSE +0 -0
  233. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/debug/README.md +0 -0
  234. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/env-ci/LICENSE +0 -0
  235. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/env-ci/README.md +0 -0
  236. {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
  237. {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
  238. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/hosted-git-info/LICENSE +0 -0
  239. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/hosted-git-info/README.md +0 -0
  240. {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
  241. {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
  242. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/semver/LICENSE +0 -0
  243. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/semver/README.md +0 -0
  244. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/LICENSE +0 -0
  245. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/README.md +0 -0
  246. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/node_modules/semantic-release/node_modules/yargs/node_modules/cliui/README.md +0 -0
  247. {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
  248. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/duc.sql +0 -0
  249. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000000_to_3000001.sql +0 -0
  250. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000001_to_3000002.sql +0 -0
  251. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000002_to_3000003.sql +0 -0
  252. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000003_to_3000004.sql +0 -0
  253. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000004_to_3000005.sql +0 -0
  254. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000005_to_3000006.sql +0 -0
  255. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000006_to_3000007.sql +0 -0
  256. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000007_to_3000008.sql +0 -0
  257. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000008_to_3000009.sql +0 -0
  258. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/migrations/3000009_to_4000000.sql +0 -0
  259. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/search.sql +0 -0
  260. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/schema/version_control.sql +0 -0
  261. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/document.rs +0 -0
  262. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/meta.rs +0 -0
  263. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/mod.rs +0 -0
  264. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/version_control.rs +0 -0
  265. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/api/version_control_tests.rs +0 -0
  266. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/bootstrap.rs +0 -0
  267. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/bootstrap_tests.rs +0 -0
  268. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/mod.rs +0 -0
  269. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/native.rs +0 -0
  270. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/db/wasm.rs +0 -0
  271. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/external_file_chunks.rs +0 -0
  272. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/lib.rs +0 -0
  273. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/parse.rs +0 -0
  274. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/serde_utils.rs +0 -0
  275. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/serialize.rs +0 -0
  276. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/session.rs +0 -0
  277. {ducpy-4.0.2 → ducpy-4.0.3}/packages/ducrs/src/types.rs +0 -0
  278. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/Cargo.lock +0 -0
  279. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/Cargo.toml +0 -0
  280. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/LICENSE +0 -0
  281. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/README.md +0 -0
  282. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/src/lib.rs +0 -0
  283. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/src/relaxed_idb.rs +0 -0
  284. {ducpy-4.0.2 → ducpy-4.0.3}/patches/sqlite-wasm-vfs/src/sahpool.rs +0 -0
  285. {ducpy-4.0.2 → ducpy-4.0.3}/pyproject.toml +1 -1
  286. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/__init__.py +0 -0
  287. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/__init__.py +0 -0
  288. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/block_instance_builder.py +0 -0
  289. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/block_utils.py +0 -0
  290. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/element_builders.py +0 -0
  291. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/mutate_builder.py +0 -0
  292. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/sql_builder.py +0 -0
  293. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/state_builders.py +0 -0
  294. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/builders/style_builders.py +0 -0
  295. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/classes/DataStateClass.py +0 -0
  296. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/classes/ElementsClass.py +0 -0
  297. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/classes/__init__.py +0 -0
  298. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/enums.py +0 -0
  299. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/parse.py +0 -0
  300. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/_model_files.py +0 -0
  301. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/image_ocr.py +0 -0
  302. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_elements.py +0 -0
  303. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_external_files.py +0 -0
  304. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_ezdxf.py +0 -0
  305. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_ifc.py +0 -0
  306. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/search/search_pdf.py +0 -0
  307. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/__init__.py +0 -0
  308. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/constants.py +0 -0
  309. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/convert.py +0 -0
  310. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/io.py +0 -0
  311. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/mutate_utils.py +0 -0
  312. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy/utils/rand_utils.py +0 -0
  313. {ducpy-4.0.2 → ducpy-4.0.3}/src/ducpy_native/__init__.py +0 -0
@@ -475,7 +475,7 @@ dependencies = [
475
475
 
476
476
  [[package]]
477
477
  name = "ducpy-native"
478
- version = "4.0.2"
478
+ version = "4.0.3"
479
479
  dependencies = [
480
480
  "duc",
481
481
  "pyo3",
@@ -1,7 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ducpy
3
- Version: 4.0.2
3
+ Version: 4.0.3
4
4
  Classifier: License :: OSI Approved :: MIT License
5
+ Requires-Dist: build123d>=0.10.0
5
6
  Requires-Dist: certifi>=2025.1.31
6
7
  Requires-Dist: nanoid>=2.0.0
7
8
  Requires-Dist: pypdf>=5.3.1
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ducpy-native"
3
- version = "4.0.2"
3
+ version = "4.0.3"
4
4
  edition = "2021"
5
5
  description = "Python native extension for the duc file format (used by ducpy)"
6
6
  publish = false
@@ -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))