9#include "nuitka/prelude.h"
10#include "nuitka/unfreezing.h"
13static PyObject *metadata_values_dict = NULL;
16void setDistributionsMetadata(PyThreadState *tstate, PyObject *metadata_values) {
17 metadata_values_dict = MAKE_DICT_EMPTY(tstate);
20 int res = PyDict_MergeFromSeq2(metadata_values_dict, metadata_values, 1);
23 NUITKA_CANNOT_GET_HERE(
"Failed to setup distributions metadata");
30bool Nuitka_DistributionNext(Py_ssize_t *pos, PyObject **distribution_name_ptr) {
32 return Nuitka_DictNext(metadata_values_dict, pos, distribution_name_ptr, &value);
35PyObject *Nuitka_Distribution_New(PyThreadState *tstate, PyObject *name) {
38 static PyObject *nuitka_distribution_type = NULL;
39 static PyObject *importlib_metadata_distribution = NULL;
42 if (nuitka_distribution_type == NULL) {
43 static char const *nuitka_distribution_code =
"\n\
45if sys.version_info >= (3, 8):\n\
46 from importlib.metadata import Distribution,distribution\n\
48 from importlib_metadata import Distribution,distribution\n\
49class nuitka_distribution(Distribution):\n\
50 def __init__(self, path, metadata, entry_points):\n\
51 self._path = path; self.metadata_data = metadata\n\
52 self.entry_points_data = entry_points\n\
53 def read_text(self, filename):\n\
54 if filename == 'METADATA':\n\
55 return self.metadata_data\n\
56 elif filename == 'entry_points.txt':\n\
57 return self.entry_points_data\n\
58 def locate_file(self, path):\n\
59 return os.path.join(self._path, path)\n\
62 PyObject *nuitka_distribution_code_object = Py_CompileString(nuitka_distribution_code,
"<exec>", Py_file_input);
63 CHECK_OBJECT(nuitka_distribution_code_object);
67 PyImport_ExecCodeModule((char *)"nuitka_distribution_patch", nuitka_distribution_code_object);
70 nuitka_distribution_type = PyObject_GetAttrString(module,
"nuitka_distribution");
71 CHECK_OBJECT(nuitka_distribution_type);
73 importlib_metadata_distribution = PyObject_GetAttrString(module,
"distribution");
74 CHECK_OBJECT(importlib_metadata_distribution);
77 NUITKA_MAY_BE_UNUSED
bool bool_res = Nuitka_DelModuleString(tstate,
"nuitka_distribution_patch");
78 assert(bool_res !=
false);
85 PyObject *metadata_value_item = DICT_GET_ITEM0(tstate, metadata_values_dict, name);
86 if (metadata_value_item == NULL) {
87 PyObject *result = CALL_FUNCTION_WITH_SINGLE_ARG(tstate, importlib_metadata_distribution, name);
91 PyObject *package_name = PyTuple_GET_ITEM(metadata_value_item, 0);
92 PyObject *metadata = PyTuple_GET_ITEM(metadata_value_item, 1);
93 PyObject *entry_points = PyTuple_GET_ITEM(metadata_value_item, 2);
97 if (unlikely(entry == NULL)) {
98 SET_CURRENT_EXCEPTION_TYPE0_FORMAT1(PyExc_RuntimeError,
99 "cannot locate package '%s' associated with metadata",
100 Nuitka_String_AsString(package_name));
105 PyObject *args[3] = {getModuleDirectory(tstate, entry), metadata, entry_points};
106 PyObject *result = CALL_FUNCTION_WITH_ARGS3(tstate, nuitka_distribution_type, args);
107 CHECK_OBJECT(result);
Definition unfreezing.h:31