Show More
|
1 | NO CONTENT: new file 100644 |
@@ -0,0 +1,56 b'' | |||
|
1 | # adapted from jaraco.collections 3.9 | |
|
2 | ||
|
3 | import collections | |
|
4 | ||
|
5 | ||
|
6 | class Projection(collections.abc.Mapping): | |
|
7 | """ | |
|
8 | Project a set of keys over a mapping | |
|
9 | ||
|
10 | >>> sample = {'a': 1, 'b': 2, 'c': 3} | |
|
11 | >>> prj = Projection(['a', 'c', 'd'], sample) | |
|
12 | >>> prj == {'a': 1, 'c': 3} | |
|
13 | True | |
|
14 | ||
|
15 | Keys should only appear if they were specified and exist in the space. | |
|
16 | ||
|
17 | >>> sorted(list(prj.keys())) | |
|
18 | ['a', 'c'] | |
|
19 | ||
|
20 | Attempting to access a key not in the projection | |
|
21 | results in a KeyError. | |
|
22 | ||
|
23 | >>> prj['b'] | |
|
24 | Traceback (most recent call last): | |
|
25 | ... | |
|
26 | KeyError: 'b' | |
|
27 | ||
|
28 | Use the projection to update another dict. | |
|
29 | ||
|
30 | >>> target = {'a': 2, 'b': 2} | |
|
31 | >>> target.update(prj) | |
|
32 | >>> target == {'a': 1, 'b': 2, 'c': 3} | |
|
33 | True | |
|
34 | ||
|
35 | Also note that Projection keeps a reference to the original dict, so | |
|
36 | if you modify the original dict, that could modify the Projection. | |
|
37 | ||
|
38 | >>> del sample['a'] | |
|
39 | >>> dict(prj) | |
|
40 | {'c': 3} | |
|
41 | """ | |
|
42 | ||
|
43 | def __init__(self, keys, space): | |
|
44 | self._keys = tuple(keys) | |
|
45 | self._space = space | |
|
46 | ||
|
47 | def __getitem__(self, key): | |
|
48 | if key not in self._keys: | |
|
49 | raise KeyError(key) | |
|
50 | return self._space[key] | |
|
51 | ||
|
52 | def __iter__(self): | |
|
53 | return iter(set(self._keys).intersection(self._space)) | |
|
54 | ||
|
55 | def __len__(self): | |
|
56 | return len(tuple(iter(self))) |
@@ -44,6 +44,7 b' allowsymbolimports = (' | |||
|
44 | 44 | # third-party imports should be directly imported |
|
45 | 45 | 'mercurial.thirdparty', |
|
46 | 46 | 'mercurial.thirdparty.attr', |
|
47 | 'mercurial.thirdparty.jaraco.collections', | |
|
47 | 48 | 'mercurial.thirdparty.zope', |
|
48 | 49 | 'mercurial.thirdparty.zope.interface', |
|
49 | 50 | 'typing', |
@@ -24,6 +24,7 b' from mercurial.node import (' | |||
|
24 | 24 | wdirrev, |
|
25 | 25 | ) |
|
26 | 26 | from mercurial.pycompat import open |
|
27 | from mercurial.thirdparty.jaraco.collections import Projection | |
|
27 | 28 | from mercurial import ( |
|
28 | 29 | bookmarks, |
|
29 | 30 | cmdutil, |
@@ -52,6 +53,7 b' from mercurial import (' | |||
|
52 | 53 | util, |
|
53 | 54 | ) |
|
54 | 55 | |
|
56 | ||
|
55 | 57 | # The following constants are used throughout the rebase module. The ordering of |
|
56 | 58 | # their values must be maintained. |
|
57 | 59 | |
@@ -93,19 +95,8 b' def retained_extras():' | |||
|
93 | 95 | yield b'intermediate-source' |
|
94 | 96 | |
|
95 | 97 | |
|
96 | def _project(orig, names): | |
|
97 | """Project a subset of names from orig.""" | |
|
98 | names_saved = tuple(names) | |
|
99 | values = (orig.get(name, None) for name in names_saved) | |
|
100 | return { | |
|
101 | name: value | |
|
102 | for name, value in zip(names_saved, values) | |
|
103 | if value is not None | |
|
104 | } | |
|
105 | ||
|
106 | ||
|
107 | 98 | def _save_extras(ctx, extra): |
|
108 |
extra.update( |
|
|
99 | extra.update(Projection(retained_extras(), ctx.extra())) | |
|
109 | 100 | |
|
110 | 101 | |
|
111 | 102 | def _savebranch(ctx, extra): |
@@ -1302,6 +1302,7 b' packages = [' | |||
|
1302 | 1302 | 'mercurial.templates', |
|
1303 | 1303 | 'mercurial.thirdparty', |
|
1304 | 1304 | 'mercurial.thirdparty.attr', |
|
1305 | 'mercurial.thirdparty.jaraco', | |
|
1305 | 1306 | 'mercurial.thirdparty.zope', |
|
1306 | 1307 | 'mercurial.thirdparty.zope.interface', |
|
1307 | 1308 | 'mercurial.upgrade_utils', |
General Comments 0
You need to be logged in to leave comments.
Login now