Mercurial > hg
annotate tests/test-extensions-wrapfunction.py @ 41566:eb7ce452e0fb
branchmap: updating triggers a write
Rather than separate updating and writing, create a subclass that doesn't write
on update. This minimises chances we forget to write out updates somewhere.
This also makes refactoring and improving the branchmap functionality easier.
Differential Revision: https://phab.mercurial-scm.org/D5636
author | Martijn Pieters <mj@octobus.net> |
---|---|
date | Mon, 21 Jan 2019 16:37:23 +0000 |
parents | ac865f020b99 |
children | 2372284d9457 |
rev | line source |
---|---|
29765
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
1 from __future__ import absolute_import, print_function |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
2 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
3 from mercurial import extensions |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
4 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
5 def genwrapper(x): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
6 def f(orig, *args, **kwds): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
7 return [x] + orig(*args, **kwds) |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
8 f.x = x |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
9 return f |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
10 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
11 def getid(wrapper): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
12 return getattr(wrapper, 'x', '-') |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
13 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
14 wrappers = [genwrapper(i) for i in range(5)] |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
15 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
16 class dummyclass(object): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
17 def getstack(self): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
18 return ['orig'] |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
19 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
20 dummy = dummyclass() |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
21 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
22 def batchwrap(wrappers): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
23 for w in wrappers: |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
24 extensions.wrapfunction(dummy, 'getstack', w) |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
25 print('wrap %d: %s' % (getid(w), dummy.getstack())) |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
26 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
27 def batchunwrap(wrappers): |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
28 for w in wrappers: |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
29 result = None |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
30 try: |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
31 result = extensions.unwrapfunction(dummy, 'getstack', w) |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
32 msg = str(dummy.getstack()) |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
33 except (ValueError, IndexError) as e: |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
34 msg = e.__class__.__name__ |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
35 print('unwrap %s: %s: %s' % (getid(w), getid(result), msg)) |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
36 |
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
37 batchwrap(wrappers + [wrappers[0]]) |
37938
ac865f020b99
tests: port test-extensions-wrapfunction to Python 3
Augie Fackler <augie@google.com>
parents:
34128
diff
changeset
|
38 batchunwrap([(wrappers[i] if i is not None and i >= 0 else None) |
29765
19578bb84731
extensions: add unwrapfunction to undo wrapfunction
Jun Wu <quark@fb.com>
parents:
diff
changeset
|
39 for i in [3, None, 0, 4, 0, 2, 1, None]]) |
34014
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
40 |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
41 wrap0 = extensions.wrappedfunction(dummy, 'getstack', wrappers[0]) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
42 wrap1 = extensions.wrappedfunction(dummy, 'getstack', wrappers[1]) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
43 |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
44 # Use them in a different order from how they were created to check that |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
45 # the wrapping happens in __enter__, not in __init__ |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
46 print('context manager', dummy.getstack()) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
47 with wrap1: |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
48 print('context manager', dummy.getstack()) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
49 with wrap0: |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
50 print('context manager', dummy.getstack()) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
51 # Bad programmer forgets to unwrap the function, but the context |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
52 # managers still unwrap their wrappings. |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
53 extensions.wrapfunction(dummy, 'getstack', wrappers[2]) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
54 print('context manager', dummy.getstack()) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
55 print('context manager', dummy.getstack()) |
47e52f079a57
extensions: add wrappedfunction() context manager
Martin von Zweigbergk <martinvonz@google.com>
parents:
29765
diff
changeset
|
56 print('context manager', dummy.getstack()) |
34128
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
57 |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
58 # Wrap callable object which has no __name__ |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
59 class callableobj(object): |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
60 def __call__(self): |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
61 return ['orig'] |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
62 dummy.cobj = callableobj() |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
63 extensions.wrapfunction(dummy, 'cobj', wrappers[0]) |
82bd4c5a81e5
extensions: fix wrapcommand/function of class instance
Yuya Nishihara <yuya@tcha.org>
parents:
34014
diff
changeset
|
64 print('wrap callable object', dummy.cobj()) |