def test_resource_set_in_memory_bytecode(self): resource = OxidizedResource() resource.in_memory_bytecode = b"b0" resource.in_memory_bytecode_opt1 = b"b1" resource.in_memory_bytecode_opt2 = b"b2" self.assertEqual(resource.in_memory_bytecode, b"b0") self.assertEqual(resource.in_memory_bytecode_opt1, b"b1") self.assertEqual(resource.in_memory_bytecode_opt2, b"b2") resource.in_memory_bytecode = None self.assertIsNone(resource.in_memory_bytecode) resource.in_memory_bytecode_opt1 = None self.assertIsNone(resource.in_memory_bytecode_opt1) resource.in_memory_bytecode_opt2 = None self.assertIsNone(resource.in_memory_bytecode_opt2) with self.assertRaises(TypeError): del resource.in_memory_bytecode with self.assertRaises(TypeError): del resource.in_memory_bytecode_opt1 with self.assertRaises(TypeError): del resource.in_memory_bytecode_opt2 with self.assertRaises(TypeError): resource.in_memory_bytecode = True with self.assertRaises(TypeError): resource.in_memory_bytecode_opt1 = "foo" with self.assertRaises(TypeError): resource.in_memory_bytecode_opt2 = False
def test_serialize_simple(self): f = OxidizedFinder() m = OxidizedResource() m.name = "my_module" m.flavor = "module" m.in_memory_source = b"import io" f.add_resource(m) m = OxidizedResource() m.name = "module_b" m.flavor = "module" m.in_memory_bytecode = b"dummy bytecode" f.add_resource(m) serialized = f.serialize_indexed_resources() self.assertIsInstance(serialized, bytes) f2 = OxidizedFinder(resources_data=serialized) modules = { r.name: r for r in f2.indexed_resources() if r.flavor == "module" } self.assertEqual(len(modules), 2) self.assertIn("my_module", modules) self.assertIn("module_b", modules) self.assertEqual(modules["my_module"].in_memory_source, b"import io") self.assertEqual(modules["module_b"].in_memory_bytecode, b"dummy bytecode")
def test_add_resource_module(self): f = OxidizedFinder() resource = OxidizedResource() resource.name = "my_module" resource.flavor = "module" source = b"print('hello from my_module')" code = compile(source, "my_module.py", "exec") bytecode = marshal.dumps(code) resource.in_memory_source = source resource.in_memory_bytecode = bytecode f.add_resource(resource) resources = [r for r in f.indexed_resources() if r.name == "my_module"] self.assertEqual(len(resources), 1) spec = f.find_spec("my_module", None) self.assertIsInstance(spec, importlib.machinery.ModuleSpec) self.assertEqual(spec.name, "my_module") self.assertIsNone(spec.loader_state) self.assertIsNone(spec.submodule_search_locations) self.assertEqual(f.get_source("my_module"), source.decode("utf-8")) self.assertEqual(f.get_code("my_module"), code)
def make_finder(*modules: Tuple[str, str, bool]) -> OxidizedFinder: """Create an ``OxidizedFinder`` with modules defined by ``modules``. ``modules`` must be tuples of the form (name, source_code, is_package). """ mpf = OxidizedFinder() for module_name, source, is_pkg in modules: # See example in OxidizedFinder.add_resource resource = OxidizedResource() resource.is_module = True resource.name = module_name resource.is_package = is_pkg resource.in_memory_source = source.encode("utf-8") resource.in_memory_bytecode = marshal.dumps( compile(source, module_name, "exec")) mpf.add_resource(resource) return mpf