diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-05-03 01:47:08 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-05-03 01:47:08 +0300 |
commit | d7da2dba07778fa3c0c7873b7c253bde48066e9c (patch) | |
tree | e03df2d1f0cda9842914a7c752b9b2893ce031c4 /py/modio.c | |
parent | 4c2fa83f2afa1dc9522755261c8a6969857a2031 (diff) | |
download | micropython-d7da2dba07778fa3c0c7873b7c253bde48066e9c.tar.gz micropython-d7da2dba07778fa3c0c7873b7c253bde48066e9c.zip |
py/modio: Implement uio.resource_stream(package, resource_path).
The with semantics of this function is close to
pkg_resources.resource_stream() function from setuptools, which
is the canonical way to access non-source files belonging to a package
(resources), regardless of what medium the package uses (e.g. individual
source files vs zip archive). In the case of MicroPython, this function
allows to access resources which are frozen into the executable, besides
accessing resources in the file system.
This is initial stage of the implementation, which actually doesn't
implement "package" part of the semantics, just accesses frozen resources
from "root", or filesystem resource - from current dir.
Diffstat (limited to 'py/modio.c')
-rw-r--r-- | py/modio.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/py/modio.c b/py/modio.c index d5da0b1db7..6bf5129e6a 100644 --- a/py/modio.c +++ b/py/modio.c @@ -30,6 +30,8 @@ #include "py/runtime.h" #include "py/builtin.h" #include "py/stream.h" +#include "py/objstringio.h" +#include "py/frozenmod.h" #if MICROPY_PY_IO @@ -129,11 +131,38 @@ STATIC const mp_obj_type_t bufwriter_type = { }; #endif // MICROPY_PY_IO_BUFFEREDWRITER +#if MICROPY_MODULE_FROZEN_STR +STATIC mp_obj_t resource_stream(mp_obj_t package_in, mp_obj_t path_in) { + if (package_in != mp_const_none) { + mp_not_implemented(""); + } + + size_t len; + const char *path = mp_obj_str_get_data(path_in, &len); + const char *data = mp_find_frozen_str(path, &len); + if (data != NULL) { + mp_obj_stringio_t *o = m_new_obj(mp_obj_stringio_t); + o->base.type = &mp_type_bytesio; + o->vstr = m_new_obj(vstr_t); + vstr_init_fixed_buf(o->vstr, len + 1, (char*)data); + o->vstr->len = len; + o->pos = 0; + return MP_OBJ_FROM_PTR(o); + } + + return mp_builtin_open(1, &path_in, (mp_map_t*)&mp_const_empty_map); +} +MP_DEFINE_CONST_FUN_OBJ_2(resource_stream_obj, resource_stream); +#endif + STATIC const mp_rom_map_elem_t mp_module_io_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uio) }, // Note: mp_builtin_open_obj should be defined by port, it's not // part of the core. { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&mp_builtin_open_obj) }, + #if MICROPY_PY_IO_RESOURCE_STREAM + { MP_ROM_QSTR(MP_QSTR_resource_stream), MP_ROM_PTR(&resource_stream_obj) }, + #endif #if MICROPY_PY_IO_FILEIO { MP_ROM_QSTR(MP_QSTR_FileIO), MP_ROM_PTR(&mp_type_fileio) }, #if MICROPY_CPYTHON_COMPAT |