Merge lp:~cjwatson/storm/reference-set-getitem into lp:storm

Proposed by Colin Watson
Status: Merged
Merged at revision: 544
Proposed branch: lp:~cjwatson/storm/reference-set-getitem
Merge into: lp:storm
Diff against target: 103 lines (+64/-0)
3 files modified
NEWS (+1/-0)
storm/references.py (+3/-0)
storm/tests/store/base.py (+60/-0)
To merge this branch: bzr merge lp:~cjwatson/storm/reference-set-getitem
Reviewer Review Type Date Requested Status
Ioana Lasc (community) Approve
Storm Developers Pending
Review via email: mp+380683@code.launchpad.net

Commit message

Implement __getitem__ on bound ReferenceSets.

Description of the change

It's useful to be able to do [index] and [start:end] on bound ReferenceSets just as you can with ordinary ResultSets, and supporting this is just a matter of passing through the __getitem__ method.

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) wrote :

Nicely done!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'NEWS'
2--- NEWS 2020-02-10 15:30:23 +0000
3+++ NEWS 2020-03-13 17:22:24 +0000
4@@ -8,6 +8,7 @@
5 This helps to avoid confusion in tracers, since they run before parameter
6 substitution: for example, sqlparse parses "expr+%s" as "expr", "+%", "s"
7 rather than "expr", "+", "%s".
8+- Implement __getitem__ on bound ReferenceSets.
9
10 Bug fixes
11 ---------
12
13=== modified file 'storm/references.py'
14--- storm/references.py 2019-09-17 09:35:10 +0000
15+++ storm/references.py 2020-03-13 17:22:24 +0000
16@@ -293,6 +293,9 @@
17 def __iter__(self):
18 return self.find().__iter__()
19
20+ def __getitem__(self, index):
21+ return self.find().__getitem__(index)
22+
23 def __contains__(self, item):
24 return item in self.find()
25
26
27=== modified file 'storm/tests/store/base.py'
28--- storm/tests/store/base.py 2020-02-10 15:30:23 +0000
29+++ storm/tests/store/base.py 2020-03-13 17:22:24 +0000
30@@ -3912,6 +3912,37 @@
31 (200, 20, "Title 200"),
32 ])
33
34+ def test_reference_set_getitem(self):
35+ self.add_reference_set_bar_400()
36+
37+ foo = self.store.get(FooRefSetOrderID, 20)
38+
39+ self.assertEqual(foo.bars[0].id, 200)
40+ self.assertEqual(foo.bars[1].id, 400)
41+ self.assertRaises(IndexError, foo.bars.__getitem__, 2)
42+
43+ items = []
44+ for bar in foo.bars[:1]:
45+ items.append((bar.id, bar.foo_id, bar.title))
46+ self.assertEqual(items, [
47+ (200, 20, "Title 200"),
48+ ])
49+
50+ del items[:]
51+ for bar in foo.bars[1:]:
52+ items.append((bar.id, bar.foo_id, bar.title))
53+ self.assertEqual(items, [
54+ (400, 20, "Title 100"),
55+ ])
56+
57+ del items[:]
58+ for bar in foo.bars[:2]:
59+ items.append((bar.id, bar.foo_id, bar.title))
60+ self.assertEqual(items, [
61+ (200, 20, "Title 200"),
62+ (400, 20, "Title 100"),
63+ ])
64+
65 def test_reference_set_first_last(self):
66 self.add_reference_set_bar_400()
67
68@@ -4241,6 +4272,35 @@
69 (200, "Title 200"),
70 ])
71
72+ def test_indirect_reference_set_getitem(self):
73+ foo = self.store.get(FooIndRefSetOrderID, 20)
74+
75+ self.assertEqual(foo.bars[0].id, 100)
76+ self.assertEqual(foo.bars[1].id, 200)
77+ self.assertRaises(IndexError, foo.bars.__getitem__, 2)
78+
79+ items = []
80+ for bar in foo.bars[:1]:
81+ items.append((bar.id, bar.title))
82+ self.assertEqual(items, [
83+ (100, "Title 300"),
84+ ])
85+
86+ del items[:]
87+ for bar in foo.bars[1:]:
88+ items.append((bar.id, bar.title))
89+ self.assertEqual(items, [
90+ (200, "Title 200"),
91+ ])
92+
93+ del items[:]
94+ for bar in foo.bars[:2]:
95+ items.append((bar.id, bar.title))
96+ self.assertEqual(items, [
97+ (100, "Title 300"),
98+ (200, "Title 200"),
99+ ])
100+
101 def test_indirect_reference_set_first_last(self):
102 foo = self.store.get(FooIndRefSetOrderID, 20)
103 self.assertEqual(foo.bars.first().id, 100)

Subscribers

People subscribed via source and target branches

to status/vote changes: