ipymini 0.1.0__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 (225) hide show
  1. ipymini-0.1.0/.github/workflows/release.yml +22 -0
  2. ipymini-0.1.0/.gitignore +157 -0
  3. ipymini-0.1.0/.uv-cache/.gitignore +1 -0
  4. ipymini-0.1.0/.uv-cache/.lock +0 -0
  5. ipymini-0.1.0/.uv-cache/CACHEDIR.TAG +1 -0
  6. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/__about__.py +1 -0
  7. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/__init__.py +0 -0
  8. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/__main__.py +6 -0
  9. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/bridge/__init__.py +0 -0
  10. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/bridge/app.py +111 -0
  11. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/build.py +144 -0
  12. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/__init__.py +0 -0
  13. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/app.py +20 -0
  14. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/binary.py +202 -0
  15. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/config.py +864 -0
  16. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/constants.py +43 -0
  17. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/custom.py +54 -0
  18. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/__init__.py +0 -0
  19. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/custom.py +41 -0
  20. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/plugin/__init__.py +0 -0
  21. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/plugin/hooks.py +15 -0
  22. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/plugin/interface.py +148 -0
  23. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/hooks/version.py +71 -0
  24. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/macos.py +58 -0
  25. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/plugin/__init__.py +0 -0
  26. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/plugin/hooks.py +18 -0
  27. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/plugin/interface.py +443 -0
  28. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/sdist.py +357 -0
  29. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/utils.py +128 -0
  30. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/builders/wheel.py +870 -0
  31. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/__init__.py +28 -0
  32. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/dep/__init__.py +37 -0
  33. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/dep/core.py +132 -0
  34. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/metadata/__init__.py +58 -0
  35. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/cli/version/__init__.py +51 -0
  36. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/dep/__init__.py +0 -0
  37. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/dep/core.py +1 -0
  38. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/licenses/__init__.py +0 -0
  39. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/licenses/supported.py +1 -0
  40. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/__init__.py +0 -0
  41. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/core.py +1621 -0
  42. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/custom.py +41 -0
  43. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/plugin/__init__.py +0 -0
  44. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/plugin/hooks.py +14 -0
  45. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/plugin/interface.py +66 -0
  46. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/spec.py +600 -0
  47. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/metadata/utils.py +66 -0
  48. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/ouroboros.py +52 -0
  49. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/__init__.py +3 -0
  50. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/exceptions.py +2 -0
  51. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/manager.py +114 -0
  52. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/specs.py +23 -0
  53. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/plugin/utils.py +48 -0
  54. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/py.typed +0 -0
  55. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/__init__.py +0 -0
  56. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/constants.py +6 -0
  57. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/context.py +173 -0
  58. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/utils/fs.py +26 -0
  59. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/__init__.py +0 -0
  60. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/core.py +58 -0
  61. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/__init__.py +0 -0
  62. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/plugin/__init__.py +0 -0
  63. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/plugin/hooks.py +14 -0
  64. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/plugin/interface.py +85 -0
  65. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/scheme/standard.py +98 -0
  66. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/__init__.py +0 -0
  67. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/code.py +64 -0
  68. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/env.py +29 -0
  69. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/plugin/__init__.py +0 -0
  70. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/plugin/hooks.py +16 -0
  71. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/plugin/interface.py +69 -0
  72. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling/version/source/regex.py +29 -0
  73. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/METADATA +79 -0
  74. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/RECORD +73 -0
  75. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/WHEEL +4 -0
  76. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/entry_points.txt +2 -0
  77. ipymini-0.1.0/.uv-cache/archive-v0/16ofwWrEnGGP3F17D6qGf/hatchling-1.28.0.dist-info/licenses/LICENSE.txt +9 -0
  78. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers/__init__.py +921 -0
  79. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers/__main__.py +10 -0
  80. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers/py.typed +0 -0
  81. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/METADATA +82 -0
  82. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/RECORD +9 -0
  83. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/WHEEL +5 -0
  84. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/entry_points.txt +2 -0
  85. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/licenses/LICENSE +201 -0
  86. ipymini-0.1.0/.uv-cache/archive-v0/K-S8NUiK9yyhA82ubu6m8/trove_classifiers-2026.1.14.14.dist-info/top_level.txt +1 -0
  87. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/__init__.py +30 -0
  88. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_callers.py +169 -0
  89. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_hooks.py +714 -0
  90. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_manager.py +523 -0
  91. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_result.py +107 -0
  92. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_tracing.py +72 -0
  93. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_version.py +21 -0
  94. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/_warnings.py +27 -0
  95. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy/py.typed +0 -0
  96. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/METADATA +152 -0
  97. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/RECORD +14 -0
  98. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/WHEEL +5 -0
  99. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/licenses/LICENSE +21 -0
  100. ipymini-0.1.0/.uv-cache/archive-v0/gNnu39COJs5EE4d_7Rdb6/pluggy-1.6.0.dist-info/top_level.txt +1 -0
  101. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/__init__.py +15 -0
  102. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_elffile.py +108 -0
  103. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_manylinux.py +262 -0
  104. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_musllinux.py +85 -0
  105. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_parser.py +365 -0
  106. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_structures.py +69 -0
  107. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/_tokenizer.py +193 -0
  108. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/licenses/__init__.py +147 -0
  109. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/licenses/_spdx.py +799 -0
  110. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/markers.py +388 -0
  111. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/metadata.py +978 -0
  112. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/py.typed +0 -0
  113. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/pylock.py +635 -0
  114. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/requirements.py +86 -0
  115. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/specifiers.py +1068 -0
  116. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/tags.py +651 -0
  117. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/utils.py +158 -0
  118. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging/version.py +792 -0
  119. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/METADATA +107 -0
  120. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/RECORD +24 -0
  121. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/WHEEL +4 -0
  122. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/licenses/LICENSE +3 -0
  123. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/licenses/LICENSE.APACHE +177 -0
  124. ipymini-0.1.0/.uv-cache/archive-v0/tm-OU3HoeMLGY9oc_9qb_/packaging-26.0.dist-info/licenses/LICENSE.BSD +23 -0
  125. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/__init__.py +68 -0
  126. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/__init__.py +4 -0
  127. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/_utils.py +45 -0
  128. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/agg.py +104 -0
  129. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/__init__.py +0 -0
  130. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/_base.py +78 -0
  131. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/base.py +24 -0
  132. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/gitignore.py +245 -0
  133. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/hyperscan/pathspec.py +251 -0
  134. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/__init__.py +0 -0
  135. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/_base.py +81 -0
  136. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/base.py +23 -0
  137. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/gitignore.py +179 -0
  138. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/re2/pathspec.py +187 -0
  139. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/simple/__init__.py +0 -0
  140. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/simple/gitignore.py +104 -0
  141. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_backends/simple/pathspec.py +76 -0
  142. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_meta.py +66 -0
  143. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_typing.py +64 -0
  144. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/_version.py +5 -0
  145. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/backend.py +40 -0
  146. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/gitignore.py +165 -0
  147. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/pathspec.py +460 -0
  148. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/pattern.py +241 -0
  149. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/__init__.py +12 -0
  150. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/__init__.py +17 -0
  151. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/base.py +176 -0
  152. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/basic.py +317 -0
  153. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitignore/spec.py +335 -0
  154. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/patterns/gitwildmatch.py +52 -0
  155. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/py.typed +1 -0
  156. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec/util.py +847 -0
  157. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/METADATA +348 -0
  158. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/RECORD +36 -0
  159. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/WHEEL +4 -0
  160. ipymini-0.1.0/.uv-cache/archive-v0/x4hO2gYKgeRPhNTEZLw0v/pathspec-1.0.3.dist-info/licenses/LICENSE +373 -0
  161. ipymini-0.1.0/.uv-cache/interpreter-v4/690e8bc5fc3a5e7e/ccf55d6a6a96f032.msgpack +0 -0
  162. ipymini-0.1.0/.uv-cache/interpreter-v4/690e8bc5fc3a5e7e/ee97c511db354a81.msgpack +0 -0
  163. ipymini-0.1.0/.uv-cache/sdists-v9/.git +0 -0
  164. ipymini-0.1.0/.uv-cache/sdists-v9/.gitignore +0 -0
  165. ipymini-0.1.0/.uv-cache/simple-v18/pypi/hatchling.rkyv +0 -0
  166. ipymini-0.1.0/.uv-cache/simple-v18/pypi/packaging.rkyv +0 -0
  167. ipymini-0.1.0/.uv-cache/simple-v18/pypi/pathspec.rkyv +0 -0
  168. ipymini-0.1.0/.uv-cache/simple-v18/pypi/pluggy.rkyv +0 -0
  169. ipymini-0.1.0/.uv-cache/simple-v18/pypi/trove-classifiers.rkyv +0 -0
  170. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/hatchling/1.28.0-py3-none-any.http +0 -0
  171. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/hatchling/1.28.0-py3-none-any.msgpack +0 -0
  172. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/packaging/26.0-py3-none-any.http +0 -0
  173. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/packaging/26.0-py3-none-any.msgpack +0 -0
  174. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pathspec/1.0.3-py3-none-any.http +0 -0
  175. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pathspec/1.0.3-py3-none-any.msgpack +0 -0
  176. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pluggy/1.6.0-py3-none-any.http +0 -0
  177. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/pluggy/1.6.0-py3-none-any.msgpack +0 -0
  178. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/trove-classifiers/2026.1.14.14-py3-none-any.http +0 -0
  179. ipymini-0.1.0/.uv-cache/wheels-v5/pypi/trove-classifiers/2026.1.14.14-py3-none-any.msgpack +0 -0
  180. ipymini-0.1.0/DEVLOG.md +65 -0
  181. ipymini-0.1.0/PKG-INFO +265 -0
  182. ipymini-0.1.0/README.md +238 -0
  183. ipymini-0.1.0/ipymini/__init__.py +8 -0
  184. ipymini-0.1.0/ipymini/__main__.py +55 -0
  185. ipymini-0.1.0/ipymini/bridge.py +925 -0
  186. ipymini-0.1.0/ipymini/comms.py +69 -0
  187. ipymini-0.1.0/ipymini/kernel.py +783 -0
  188. ipymini-0.1.0/ipymini/murmur2.py +32 -0
  189. ipymini-0.1.0/ipymini_bridge.py +4 -0
  190. ipymini-0.1.0/pyproject.toml +48 -0
  191. ipymini-0.1.0/pytest.ini +7 -0
  192. ipymini-0.1.0/pytests/__init__.py +0 -0
  193. ipymini-0.1.0/pytests/conftest.py +4 -0
  194. ipymini-0.1.0/pytests/kernel_utils.py +206 -0
  195. ipymini-0.1.0/pytests/test_debugger_suite.py +183 -0
  196. ipymini-0.1.0/pytests/test_gateway_interrupt.py +67 -0
  197. ipymini-0.1.0/pytests/test_ipython_startup_integration.py +35 -0
  198. ipymini-0.1.0/pytests/test_kernel_asyncio.py +45 -0
  199. ipymini-0.1.0/pytests/test_kernel_basic.py +10 -0
  200. ipymini-0.1.0/pytests/test_kernel_comm_buffers.py +60 -0
  201. ipymini-0.1.0/pytests/test_kernel_completion.py +29 -0
  202. ipymini-0.1.0/pytests/test_kernel_completion_config.py +38 -0
  203. ipymini-0.1.0/pytests/test_kernel_connect.py +17 -0
  204. ipymini-0.1.0/pytests/test_kernel_debug.py +12 -0
  205. ipymini-0.1.0/pytests/test_kernel_display.py +40 -0
  206. ipymini-0.1.0/pytests/test_kernel_e2e.py +132 -0
  207. ipymini-0.1.0/pytests/test_kernel_execute.py +107 -0
  208. ipymini-0.1.0/pytests/test_kernel_heartbeat.py +17 -0
  209. ipymini-0.1.0/pytests/test_kernel_history_inspect.py +46 -0
  210. ipymini-0.1.0/pytests/test_kernel_info_fields.py +16 -0
  211. ipymini-0.1.0/pytests/test_kernel_input.py +96 -0
  212. ipymini-0.1.0/pytests/test_kernel_interrupt.py +39 -0
  213. ipymini-0.1.0/pytests/test_kernel_iopub.py +84 -0
  214. ipymini-0.1.0/pytests/test_kernel_minimal_behaviors.py +107 -0
  215. ipymini-0.1.0/pytests/test_kernel_outputs.py +63 -0
  216. ipymini-0.1.0/pytests/test_kernel_streams.py +19 -0
  217. ipymini-0.1.0/pytests/test_kernel_subshells.py +377 -0
  218. ipymini-0.1.0/pytests/test_kernelspec.py +27 -0
  219. ipymini-0.1.0/pytests/test_message_headers.py +37 -0
  220. ipymini-0.1.0/pytests/test_murmur2.py +18 -0
  221. ipymini-0.1.0/pytests/test_streams.py +37 -0
  222. ipymini-0.1.0/share/jupyter/kernels/ipymini/kernel.json +6 -0
  223. ipymini-0.1.0/tools/pr.sh +15 -0
  224. ipymini-0.1.0/tools/release.sh +20 -0
  225. ipymini-0.1.0/tools/run_file_suites.sh +11 -0
@@ -0,0 +1,22 @@
1
+ name: Release
2
+ on:
3
+ push:
4
+ tags: ["v*"]
5
+
6
+ jobs:
7
+ pypi:
8
+ runs-on: ubuntu-latest
9
+ permissions:
10
+ id-token: write
11
+ contents: write
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.12"
17
+ - run: pip install hatch
18
+ - run: hatch build
19
+ - uses: pypa/gh-action-pypi-publish@release/v1
20
+ - run: gh release create ${{ github.ref_name }} --generate-notes
21
+ env:
22
+ GH_TOKEN: ${{ github.token }}
@@ -0,0 +1,157 @@
1
+ EVENTLOOP.md
2
+ meta/
3
+ REVIEW.md
4
+ _docs
5
+ DAP.md
6
+ DEBUG.md
7
+ SUBSHELL.md
8
+ links/
9
+ gateway.py
10
+ style.md
11
+ Untitled*.ipynb
12
+
13
+ _proc/
14
+ sidebar.yml
15
+ Gemfile.lock
16
+ token
17
+ _docs/
18
+ conda/
19
+ .last_checked
20
+ .gitconfig
21
+ *.bak
22
+ *.log
23
+ *~
24
+ ~*
25
+ _tmp*
26
+ tmp*
27
+ tags
28
+
29
+ # Byte-compiled / optimized / DLL files
30
+ __pycache__/
31
+ *.py[cod]
32
+ *$py.class
33
+
34
+ # C extensions
35
+ *.so
36
+
37
+ # Distribution / packaging
38
+ .Python
39
+ env/
40
+ build/
41
+ develop-eggs/
42
+ dist/
43
+ downloads/
44
+ eggs/
45
+ .eggs/
46
+ lib/
47
+ lib64/
48
+ parts/
49
+ sdist/
50
+ var/
51
+ wheels/
52
+ *.egg-info/
53
+ .installed.cfg
54
+ *.egg
55
+
56
+ # PyInstaller
57
+ # Usually these files are written by a python script from a template
58
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
59
+ *.manifest
60
+ *.spec
61
+
62
+ # Installer logs
63
+ pip-log.txt
64
+ pip-delete-this-directory.txt
65
+
66
+ # Unit test / coverage reports
67
+ htmlcov/
68
+ .tox/
69
+ .coverage
70
+ .coverage.*
71
+ .cache
72
+ nosetests.xml
73
+ coverage.xml
74
+ *.cover
75
+ .hypothesis/
76
+
77
+ # Translations
78
+ *.mo
79
+ *.pot
80
+
81
+ # Django stuff:
82
+ *.log
83
+ local_settings.py
84
+
85
+ # Flask stuff:
86
+ instance/
87
+ .webassets-cache
88
+
89
+ # Scrapy stuff:
90
+ .scrapy
91
+
92
+ # Sphinx documentation
93
+ docs/_build/
94
+
95
+ # PyBuilder
96
+ target/
97
+
98
+ # Jupyter Notebook
99
+ .ipynb_checkpoints
100
+
101
+ # pyenv
102
+ .python-version
103
+
104
+ # celery beat schedule file
105
+ celerybeat-schedule
106
+
107
+ # SageMath parsed files
108
+ *.sage.py
109
+
110
+ # dotenv
111
+ .env
112
+
113
+ # virtualenv
114
+ .venv
115
+ venv/
116
+ ENV/
117
+
118
+ # Spyder project settings
119
+ .spyderproject
120
+ .spyproject
121
+
122
+ # Rope project settings
123
+ .ropeproject
124
+
125
+ # mkdocs documentation
126
+ /site
127
+
128
+ # mypy
129
+ .mypy_cache/
130
+
131
+ .vscode
132
+ *.swp
133
+
134
+ # osx generated files
135
+ .DS_Store
136
+ .DS_Store?
137
+ .Trashes
138
+ ehthumbs.db
139
+ Thumbs.db
140
+ .idea
141
+
142
+ # pytest
143
+ .pytest_cache
144
+
145
+ # tools/trust-doc-nbs
146
+ docs_src/.last_checked
147
+
148
+ # symlinks to fastai
149
+ docs_src/fastai
150
+ tools/fastai
151
+
152
+ # link checker
153
+ checklink/cookies.txt
154
+
155
+ # .gitconfig is now autogenerated
156
+ .gitconfig
157
+
@@ -0,0 +1 @@
1
+ *
File without changes
@@ -0,0 +1 @@
1
+ Signature: 8a477f597d28d172789f06886806bc55
@@ -0,0 +1,6 @@
1
+ import sys
2
+
3
+ if __name__ == "__main__":
4
+ from hatchling.cli import hatchling
5
+
6
+ sys.exit(hatchling())
@@ -0,0 +1,111 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import sys
5
+ from typing import Any
6
+
7
+
8
+ class Application:
9
+ """
10
+ The way output is displayed can be [configured](../config/hatch.md#terminal) by users.
11
+
12
+ !!! important
13
+ Never import this directly; Hatch judiciously decides if a type of plugin requires
14
+ the capabilities herein and will grant access via an attribute.
15
+ """
16
+
17
+ def __init__(self) -> None:
18
+ self.__verbosity = int(os.environ.get("HATCH_VERBOSE", "0")) - int(os.environ.get("HATCH_QUIET", "0"))
19
+
20
+ @property
21
+ def verbosity(self) -> int:
22
+ """
23
+ The verbosity level of the application, with 0 as the default.
24
+ """
25
+ return self.__verbosity
26
+
27
+ @staticmethod
28
+ def display(message: str = "", **kwargs: Any) -> None: # noqa: ARG004
29
+ # Do not document
30
+ _display(message, always=True)
31
+
32
+ def display_info(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
33
+ """
34
+ Meant to be used for messages conveying basic information.
35
+ """
36
+ if self.__verbosity >= 0:
37
+ _display(message)
38
+
39
+ def display_waiting(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
40
+ """
41
+ Meant to be used for messages shown before potentially time consuming operations.
42
+ """
43
+ if self.__verbosity >= 0:
44
+ _display(message)
45
+
46
+ def display_success(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
47
+ """
48
+ Meant to be used for messages indicating some positive outcome.
49
+ """
50
+ if self.__verbosity >= 0:
51
+ _display(message)
52
+
53
+ def display_warning(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
54
+ """
55
+ Meant to be used for messages conveying important information.
56
+ """
57
+ if self.__verbosity >= -1:
58
+ _display(message)
59
+
60
+ def display_error(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
61
+ """
62
+ Meant to be used for messages indicating some unrecoverable error.
63
+ """
64
+ if self.__verbosity >= -2: # noqa: PLR2004
65
+ _display(message)
66
+
67
+ def display_debug(self, message: str = "", level: int = 1, **kwargs: Any) -> None: # noqa: ARG002
68
+ """
69
+ Meant to be used for messages that are not useful for most user experiences.
70
+ The `level` option must be between 1 and 3 (inclusive).
71
+ """
72
+ if not 1 <= level <= 3: # noqa: PLR2004
73
+ error_message = "Debug output can only have verbosity levels between 1 and 3 (inclusive)"
74
+ raise ValueError(error_message)
75
+
76
+ if self.__verbosity >= level:
77
+ _display(message)
78
+
79
+ def display_mini_header(self, message: str = "", **kwargs: Any) -> None: # noqa: ARG002
80
+ if self.__verbosity >= 0:
81
+ _display(f"[{message}]")
82
+
83
+ def abort(self, message: str = "", code: int = 1, **kwargs: Any) -> None: # noqa: ARG002
84
+ """
85
+ Terminate the program with the given return code.
86
+ """
87
+ if message and self.__verbosity >= -2: # noqa: PLR2004
88
+ _display(message)
89
+
90
+ sys.exit(code)
91
+
92
+ def get_safe_application(self) -> SafeApplication:
93
+ return SafeApplication(self)
94
+
95
+
96
+ class SafeApplication:
97
+ def __init__(self, app: Application) -> None:
98
+ self.abort = app.abort
99
+ self.verbosity = app.verbosity
100
+ self.display = app.display
101
+ self.display_info = app.display_info
102
+ self.display_error = app.display_error
103
+ self.display_success = app.display_success
104
+ self.display_waiting = app.display_waiting
105
+ self.display_warning = app.display_warning
106
+ self.display_debug = app.display_debug
107
+ self.display_mini_header = app.display_mini_header
108
+
109
+
110
+ def _display(message: str, *, always: bool = False) -> None:
111
+ print(message, file=None if always else sys.stderr)
@@ -0,0 +1,144 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from typing import Any
5
+
6
+ __all__ = [
7
+ "build_editable",
8
+ "build_sdist",
9
+ "build_wheel",
10
+ "get_requires_for_build_editable",
11
+ "get_requires_for_build_sdist",
12
+ "get_requires_for_build_wheel",
13
+ ]
14
+ __all__ += ["__all__"]
15
+
16
+
17
+ def get_requires_for_build_sdist(config_settings: dict[str, Any] | None = None) -> list[str]: # noqa: ARG001
18
+ """
19
+ https://peps.python.org/pep-0517/#get-requires-for-build-sdist
20
+ """
21
+ from hatchling.builders.sdist import SdistBuilder
22
+
23
+ builder = SdistBuilder(os.getcwd())
24
+ return builder.config.dependencies
25
+
26
+
27
+ def build_sdist(sdist_directory: str, config_settings: dict[str, Any] | None = None) -> str: # noqa: ARG001
28
+ """
29
+ https://peps.python.org/pep-0517/#build-sdist
30
+ """
31
+ from hatchling.builders.sdist import SdistBuilder
32
+
33
+ builder = SdistBuilder(os.getcwd())
34
+ return os.path.basename(next(builder.build(directory=sdist_directory, versions=["standard"])))
35
+
36
+
37
+ def get_requires_for_build_wheel(config_settings: dict[str, Any] | None = None) -> list[str]: # noqa: ARG001
38
+ """
39
+ https://peps.python.org/pep-0517/#get-requires-for-build-wheel
40
+ """
41
+ from hatchling.builders.wheel import WheelBuilder
42
+
43
+ builder = WheelBuilder(os.getcwd())
44
+ return builder.config.dependencies
45
+
46
+
47
+ def build_wheel(
48
+ wheel_directory: str,
49
+ config_settings: dict[str, Any] | None = None, # noqa: ARG001
50
+ metadata_directory: str | None = None, # noqa: ARG001
51
+ ) -> str:
52
+ """
53
+ https://peps.python.org/pep-0517/#build-wheel
54
+ """
55
+ from hatchling.builders.wheel import WheelBuilder
56
+
57
+ builder = WheelBuilder(os.getcwd())
58
+ return os.path.basename(next(builder.build(directory=wheel_directory, versions=["standard"])))
59
+
60
+
61
+ def get_requires_for_build_editable(config_settings: dict[str, Any] | None = None) -> list[str]: # noqa: ARG001
62
+ """
63
+ https://peps.python.org/pep-0660/#get-requires-for-build-editable
64
+ """
65
+ from hatchling.builders.constants import EDITABLES_REQUIREMENT
66
+ from hatchling.builders.wheel import WheelBuilder
67
+
68
+ builder = WheelBuilder(os.getcwd())
69
+ return [*builder.config.dependencies, EDITABLES_REQUIREMENT]
70
+
71
+
72
+ def build_editable(
73
+ wheel_directory: str,
74
+ config_settings: dict[str, Any] | None = None, # noqa: ARG001
75
+ metadata_directory: str | None = None, # noqa: ARG001
76
+ ) -> str:
77
+ """
78
+ https://peps.python.org/pep-0660/#build-editable
79
+ """
80
+ from hatchling.builders.wheel import WheelBuilder
81
+
82
+ builder = WheelBuilder(os.getcwd())
83
+ return os.path.basename(next(builder.build(directory=wheel_directory, versions=["editable"])))
84
+
85
+
86
+ # Any builder that has build-time hooks like Hatchling and setuptools cannot technically keep PEP 517's identical
87
+ # metadata promise e.g. C extensions would require different tags in the `WHEEL` file. Therefore, we consider the
88
+ # methods as mostly being for non-frontend tools like tox and dependency updaters. So Hatchling only writes the
89
+ # `METADATA` file to the metadata directory and continues to ignore that directory itself.
90
+ #
91
+ # An issue we encounter by supporting this metadata-only access is that for installations with pip the required
92
+ # dependencies of the project are read at this stage. This means that build hooks that add to the `dependencies`
93
+ # build data or modify the built wheel have no effect on what dependencies are or are not installed.
94
+ #
95
+ # There are legitimate use cases in which this is required, so we only define these when no pip build is detected.
96
+ # See: https://github.com/pypa/pip/blob/22.2.2/src/pip/_internal/operations/build/build_tracker.py#L41-L51
97
+ # Example use case: https://github.com/pypa/hatch/issues/532
98
+ if "PIP_BUILD_TRACKER" not in os.environ:
99
+ __all__ += ["prepare_metadata_for_build_editable", "prepare_metadata_for_build_wheel"]
100
+
101
+ def prepare_metadata_for_build_wheel(
102
+ metadata_directory: str,
103
+ config_settings: dict[str, Any] | None = None, # noqa: ARG001
104
+ ) -> str:
105
+ """
106
+ https://peps.python.org/pep-0517/#prepare-metadata-for-build-wheel
107
+ """
108
+ from hatchling.builders.wheel import WheelBuilder
109
+
110
+ builder = WheelBuilder(os.getcwd())
111
+
112
+ directory = os.path.join(metadata_directory, f"{builder.artifact_project_id}.dist-info")
113
+ if not os.path.isdir(directory):
114
+ os.mkdir(directory)
115
+
116
+ with open(os.path.join(directory, "METADATA"), "w", encoding="utf-8") as f:
117
+ f.write(builder.config.core_metadata_constructor(builder.metadata))
118
+
119
+ return os.path.basename(directory)
120
+
121
+ def prepare_metadata_for_build_editable(
122
+ metadata_directory: str,
123
+ config_settings: dict[str, Any] | None = None, # noqa: ARG001
124
+ ) -> str:
125
+ """
126
+ https://peps.python.org/pep-0660/#prepare-metadata-for-build-editable
127
+ """
128
+ from hatchling.builders.constants import EDITABLES_REQUIREMENT
129
+ from hatchling.builders.wheel import WheelBuilder
130
+
131
+ builder = WheelBuilder(os.getcwd())
132
+
133
+ directory = os.path.join(metadata_directory, f"{builder.artifact_project_id}.dist-info")
134
+ if not os.path.isdir(directory):
135
+ os.mkdir(directory)
136
+
137
+ extra_dependencies = []
138
+ if not builder.config.dev_mode_dirs and builder.config.dev_mode_exact:
139
+ extra_dependencies.append(EDITABLES_REQUIREMENT)
140
+
141
+ with open(os.path.join(directory, "METADATA"), "w", encoding="utf-8") as f:
142
+ f.write(builder.config.core_metadata_constructor(builder.metadata, extra_dependencies=extra_dependencies))
143
+
144
+ return os.path.basename(directory)
@@ -0,0 +1,20 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from hatchling.builders.binary import BinaryBuilder
6
+
7
+
8
+ class AppBuilder(BinaryBuilder):
9
+ PLUGIN_NAME = "app"
10
+
11
+ def build_bootstrap(
12
+ self,
13
+ directory: str,
14
+ **build_data: Any,
15
+ ) -> str:
16
+ self.app.display_warning(
17
+ "The `app` build target is deprecated and will be removed in a future release. "
18
+ "Use the `binary` build target instead."
19
+ )
20
+ return super().build_bootstrap(directory, **build_data)
@@ -0,0 +1,202 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import sys
5
+ from typing import TYPE_CHECKING, Any
6
+
7
+ from hatchling.builders.config import BuilderConfig
8
+ from hatchling.builders.plugin.interface import BuilderInterface
9
+
10
+ if TYPE_CHECKING:
11
+ from collections.abc import Callable
12
+
13
+
14
+ class BinaryBuilderConfig(BuilderConfig):
15
+ SUPPORTED_VERSIONS = ("3.12", "3.11", "3.10", "3.9", "3.8", "3.7")
16
+
17
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
18
+ super().__init__(*args, **kwargs)
19
+
20
+ self.__scripts: list[str] | None = None
21
+ self.__python_version: str | None = None
22
+ self.__pyapp_version: str | None = None
23
+
24
+ @property
25
+ def scripts(self) -> list[str]:
26
+ if self.__scripts is None:
27
+ known_scripts = self.builder.metadata.core.scripts
28
+ scripts = self.target_config.get("scripts", [])
29
+
30
+ if not isinstance(scripts, list):
31
+ message = f"Field `tool.hatch.build.targets.{self.plugin_name}.scripts` must be an array"
32
+ raise TypeError(message)
33
+
34
+ for i, script in enumerate(scripts, 1):
35
+ if not isinstance(script, str):
36
+ message = (
37
+ f"Script #{i} of field `tool.hatch.build.targets.{self.plugin_name}.scripts` must be a string"
38
+ )
39
+ raise TypeError(message)
40
+
41
+ if script not in known_scripts:
42
+ message = f"Unknown script in field `tool.hatch.build.targets.{self.plugin_name}.scripts`: {script}"
43
+ raise ValueError(message)
44
+
45
+ self.__scripts = sorted(set(scripts)) if scripts else list(known_scripts)
46
+
47
+ return self.__scripts
48
+
49
+ @property
50
+ def python_version(self) -> str:
51
+ if self.__python_version is None:
52
+ python_version = self.target_config.get("python-version", "")
53
+
54
+ if not isinstance(python_version, str):
55
+ message = f"Field `tool.hatch.build.targets.{self.plugin_name}.python-version` must be a string"
56
+ raise TypeError(message)
57
+
58
+ if not python_version and "PYAPP_DISTRIBUTION_SOURCE" not in os.environ:
59
+ for supported_version in self.SUPPORTED_VERSIONS:
60
+ if self.builder.metadata.core.python_constraint.contains(supported_version):
61
+ python_version = supported_version
62
+ break
63
+ else:
64
+ message = "Field `project.requires-python` is incompatible with the known distributions"
65
+ raise ValueError(message)
66
+
67
+ self.__python_version = python_version
68
+
69
+ return self.__python_version
70
+
71
+ @property
72
+ def pyapp_version(self) -> str:
73
+ if self.__pyapp_version is None:
74
+ pyapp_version = self.target_config.get("pyapp-version", "")
75
+
76
+ if not isinstance(pyapp_version, str):
77
+ message = f"Field `tool.hatch.build.targets.{self.plugin_name}.pyapp-version` must be a string"
78
+ raise TypeError(message)
79
+
80
+ self.__pyapp_version = pyapp_version
81
+
82
+ return self.__pyapp_version
83
+
84
+
85
+ class BinaryBuilder(BuilderInterface):
86
+ """
87
+ Build binaries
88
+ """
89
+
90
+ PLUGIN_NAME = "binary"
91
+
92
+ def get_version_api(self) -> dict[str, Callable]:
93
+ return {"bootstrap": self.build_bootstrap}
94
+
95
+ def get_default_versions(self) -> list[str]: # noqa: PLR6301
96
+ return ["bootstrap"]
97
+
98
+ def clean(
99
+ self,
100
+ directory: str,
101
+ versions: list[str], # noqa: ARG002
102
+ ) -> None:
103
+ import shutil
104
+
105
+ app_dir = os.path.join(directory, self.PLUGIN_NAME)
106
+ if os.path.isdir(app_dir):
107
+ shutil.rmtree(app_dir)
108
+
109
+ def build_bootstrap(
110
+ self,
111
+ directory: str,
112
+ **build_data: Any, # noqa: ARG002
113
+ ) -> str:
114
+ import shutil
115
+ import tempfile
116
+
117
+ cargo_path = os.environ.get("CARGO", "")
118
+ if not cargo_path:
119
+ if not shutil.which("cargo"):
120
+ message = "Executable `cargo` could not be found on PATH"
121
+ raise OSError(message)
122
+
123
+ cargo_path = "cargo"
124
+
125
+ app_dir = os.path.join(directory, self.PLUGIN_NAME)
126
+ if not os.path.isdir(app_dir):
127
+ os.makedirs(app_dir)
128
+
129
+ on_windows = sys.platform == "win32"
130
+ base_env = dict(os.environ)
131
+ base_env["PYAPP_PROJECT_NAME"] = self.metadata.name
132
+ base_env["PYAPP_PROJECT_VERSION"] = self.metadata.version
133
+
134
+ if self.config.python_version:
135
+ base_env["PYAPP_PYTHON_VERSION"] = self.config.python_version
136
+
137
+ # https://doc.rust-lang.org/cargo/reference/config.html#buildtarget
138
+ build_target = os.environ.get("CARGO_BUILD_TARGET", "")
139
+
140
+ # This will determine whether we install from crates.io or build locally and is currently required for
141
+ # cross compilation: https://github.com/cross-rs/cross/issues/1215
142
+ repo_path = os.environ.get("PYAPP_REPO", "")
143
+
144
+ with tempfile.TemporaryDirectory() as temp_dir:
145
+ exe_name = "pyapp.exe" if on_windows else "pyapp"
146
+ if repo_path:
147
+ context_dir = repo_path
148
+ target_dir = os.path.join(temp_dir, "build")
149
+ if build_target:
150
+ temp_exe_path = os.path.join(target_dir, build_target, "release", exe_name)
151
+ else:
152
+ temp_exe_path = os.path.join(target_dir, "release", exe_name)
153
+ install_command = [cargo_path, "build", "--release", "--target-dir", target_dir]
154
+ else:
155
+ context_dir = temp_dir
156
+ temp_exe_path = os.path.join(temp_dir, "bin", exe_name)
157
+ install_command = [cargo_path, "install", "pyapp", "--force", "--root", temp_dir]
158
+ if self.config.pyapp_version:
159
+ install_command.extend(["--version", self.config.pyapp_version])
160
+
161
+ if self.config.scripts:
162
+ for script in self.config.scripts:
163
+ env = dict(base_env)
164
+ env["PYAPP_EXEC_SPEC"] = self.metadata.core.scripts[script]
165
+
166
+ self.cargo_build(install_command, cwd=context_dir, env=env)
167
+
168
+ exe_stem = (
169
+ f"{script}-{self.metadata.version}-{build_target}"
170
+ if build_target
171
+ else f"{script}-{self.metadata.version}"
172
+ )
173
+ exe_path = os.path.join(app_dir, f"{exe_stem}.exe" if on_windows else exe_stem)
174
+ shutil.move(temp_exe_path, exe_path)
175
+ else:
176
+ self.cargo_build(install_command, cwd=context_dir, env=base_env)
177
+
178
+ exe_stem = (
179
+ f"{self.metadata.name}-{self.metadata.version}-{build_target}"
180
+ if build_target
181
+ else f"{self.metadata.name}-{self.metadata.version}"
182
+ )
183
+ exe_path = os.path.join(app_dir, f"{exe_stem}.exe" if on_windows else exe_stem)
184
+ shutil.move(temp_exe_path, exe_path)
185
+
186
+ return app_dir
187
+
188
+ def cargo_build(self, *args: Any, **kwargs: Any) -> None:
189
+ import subprocess
190
+
191
+ if self.app.verbosity < 0:
192
+ kwargs["stdout"] = subprocess.PIPE
193
+ kwargs["stderr"] = subprocess.STDOUT
194
+
195
+ process = subprocess.run(*args, **kwargs) # noqa: PLW1510
196
+ if process.returncode:
197
+ message = f"Compilation failed (code {process.returncode})"
198
+ raise OSError(message)
199
+
200
+ @classmethod
201
+ def get_config_class(cls) -> type[BinaryBuilderConfig]:
202
+ return BinaryBuilderConfig