[REM] utils: remove patch/unpatch

They are out of the scope for Owl.
This commit is contained in:
Géry Debongnie
2019-05-17 23:26:42 +02:00
parent c2c7997df3
commit bc7fe9023d
2 changed files with 1 additions and 112 deletions
-53
View File
@@ -8,8 +8,6 @@
* - loadTemplates * - loadTemplates
* - escape * - escape
* - debounce * - debounce
* - patch
* - unpatch
*/ */
export function whenReady(fn) { export function whenReady(fn) {
@@ -99,54 +97,3 @@ export function debounce(
} }
}; };
} }
export function patch(C: any, patchName: string, patch: any) {
const proto = C.prototype;
if (!proto.__patches) {
proto.__patches = {
origMethods: {},
patches: {},
current: []
};
}
if (proto.__patches.patches[patchName]) {
throw new Error(`Patch [${patchName}] already exists`);
}
proto.__patches.patches[patchName] = patch;
applyPatch(proto, patch);
proto.__patches.current.push(patchName);
function applyPatch(proto, patch) {
Object.keys(patch).forEach(function(methodName) {
const method = patch[methodName];
if (typeof method === "function") {
const original = proto[methodName];
if (!(methodName in proto.__patches.origMethods)) {
proto.__patches.origMethods[methodName] = original;
}
proto[methodName] = function(...args) {
this._super = original;
return method.call(this, ...args);
};
}
});
}
}
export function unpatch(C: any, patchName: string) {
const proto = C.prototype;
const patchInfo = proto.__patches;
delete proto.__patches;
// reset to original
for (let k in patchInfo.origMethods) {
proto[k] = patchInfo.origMethods[k];
}
// apply other patches
for (let name of patchInfo.current) {
if (name !== patchName) {
patch(C, name, patchInfo.patches[name]);
}
}
}
+1 -59
View File
@@ -1,9 +1,4 @@
import { import { escape, debounce } from "../src/utils";
escape,
debounce,
patch,
unpatch
} from "../src/utils";
describe("escape", () => { describe("escape", () => {
test("normal strings", () => { test("normal strings", () => {
@@ -33,56 +28,3 @@ describe("debounce", () => {
expect(n).toBe(1); expect(n).toBe(1);
}); });
}); });
describe("patch/unpatch", () => {
test("can monkey patch a class", () => {
class Test {
n = 1;
doSomething(): string {
return "hey";
}
}
patch(Test, "some_custo", {
doSomething(): string {
this.n = this.n + 1;
return this._super();
}
});
const t = new Test();
expect(t.n).toBe(1);
expect(t.doSomething()).toBe("hey");
expect(t.n).toBe(2);
});
test("cannot patch a class twice with same patch name", () => {
class Test {}
patch(Test, "some_custo", {});
expect(() => {
patch(Test, "some_custo", {});
}).toThrow();
});
test("can unpatch a class", () => {
class Test {
doSomething(): number {
return 1;
}
}
patch(Test, "some_custo", {
doSomething(): number {
return this._super() + 2;
}
});
const t = new Test();
expect(t.doSomething()).toBe(3);
unpatch(Test, "some_custo");
expect(t.doSomething()).toBe(1);
});
});