##// END OF EJS Templates
Backport PR #10813: Adding iteration to ProgressBar to make it a more useful utility
Matthias Bussonnier -
Show More
@@ -775,6 +775,19 b' class ProgressBar(DisplayObject):'
775 775 self._progress = value
776 776 self.update()
777 777
778 def __iter__(self):
779 self.display()
780 self._progress = -1 # First iteration is 0
781 return self
782
783 def __next__(self):
784 """Returns current value and increments display by one."""
785 self.progress += 1
786 if self.progress < self.total:
787 return self.progress
788 else:
789 raise StopIteration()
790
778 791 class JSON(DisplayObject):
779 792 """JSON expects a JSON-able dict or list
780 793
@@ -10,6 +10,7 b' import nose.tools as nt'
10 10
11 11 from IPython.core import display
12 12 from IPython.core.getipython import get_ipython
13 from IPython.utils.io import capture_output
13 14 from IPython.utils.tempdir import NamedFileInTemporaryDirectory
14 15 from IPython import paths as ipath
15 16 from IPython.testing.tools import AssertPrints, AssertNotPrints
@@ -167,11 +168,19 b' def test_displayobject_repr():'
167 168
168 169 def test_progress():
169 170 p = display.ProgressBar(10)
170 nt.assert_true('0/10' in repr(p))
171 nt.assert_in('0/10',repr(p))
171 172 p.html_width = '100%'
172 173 p.progress = 5
173 174 nt.assert_equal(p._repr_html_(), "<progress style='width:100%' max='10' value='5'></progress>")
174 175
176 def test_progress_iter():
177 with capture_output(display=False) as captured:
178 for i in display.ProgressBar(5):
179 out = captured.stdout
180 nt.assert_in('{0}/5'.format(i), out)
181 out = captured.stdout
182 nt.assert_in('5/5', out)
183
175 184 def test_json():
176 185 d = {'a': 5}
177 186 lis = [d]
@@ -21,10 +21,8 b''
21 21 },
22 22 {
23 23 "cell_type": "code",
24 "execution_count": 10,
25 "metadata": {
26 "collapsed": true
27 },
24 "execution_count": 1,
25 "metadata": {},
28 26 "outputs": [],
29 27 "source": [
30 28 "from IPython.display import display, update_display"
@@ -32,7 +30,7 b''
32 30 },
33 31 {
34 32 "cell_type": "code",
35 "execution_count": 13,
33 "execution_count": 2,
36 34 "metadata": {},
37 35 "outputs": [
38 36 {
@@ -50,7 +48,7 b''
50 48 "<DisplayHandle display_id=update-me>"
51 49 ]
52 50 },
53 "execution_count": 13,
51 "execution_count": 2,
54 52 "metadata": {},
55 53 "output_type": "execute_result"
56 54 }
@@ -70,7 +68,7 b''
70 68 },
71 69 {
72 70 "cell_type": "code",
73 "execution_count": 14,
71 "execution_count": 3,
74 72 "metadata": {},
75 73 "outputs": [
76 74 {
@@ -97,10 +95,8 b''
97 95 },
98 96 {
99 97 "cell_type": "code",
100 "execution_count": 15,
101 "metadata": {
102 "collapsed": true
103 },
98 "execution_count": 4,
99 "metadata": {},
104 100 "outputs": [],
105 101 "source": [
106 102 "handle.update('z')"
@@ -116,7 +112,7 b''
116 112 },
117 113 {
118 114 "cell_type": "code",
119 "execution_count": 16,
115 "execution_count": 5,
120 116 "metadata": {},
121 117 "outputs": [
122 118 {
@@ -131,10 +127,10 b''
131 127 {
132 128 "data": {
133 129 "text/plain": [
134 "<DisplayHandle display_id=07fc47b2ef652ccb70addeee3eb0981a>"
130 "<DisplayHandle display_id=118a56127f42348f8893440da7181c57>"
135 131 ]
136 132 },
137 "execution_count": 16,
133 "execution_count": 5,
138 134 "metadata": {},
139 135 "output_type": "execute_result"
140 136 }
@@ -154,7 +150,7 b''
154 150 },
155 151 {
156 152 "cell_type": "code",
157 "execution_count": 17,
153 "execution_count": 6,
158 154 "metadata": {},
159 155 "outputs": [
160 156 {
@@ -173,7 +169,7 b''
173 169 },
174 170 {
175 171 "cell_type": "code",
176 "execution_count": 18,
172 "execution_count": 7,
177 173 "metadata": {},
178 174 "outputs": [
179 175 {
@@ -200,10 +196,8 b''
200 196 },
201 197 {
202 198 "cell_type": "code",
203 "execution_count": 19,
204 "metadata": {
205 "collapsed": true
206 },
199 "execution_count": 8,
200 "metadata": {},
207 201 "outputs": [],
208 202 "source": [
209 203 "update_display('z', display_id='here')"
@@ -222,16 +216,16 b''
222 216 },
223 217 {
224 218 "cell_type": "code",
225 "execution_count": 14,
219 "execution_count": 9,
226 220 "metadata": {},
227 221 "outputs": [
228 222 {
229 223 "data": {
230 224 "text/html": [
231 "<progress style='width:100%' max='10' value='10'></progress>"
225 "<progress style='width:60ex' max='10' value='10'></progress>"
232 226 ],
233 227 "text/plain": [
234 "<IPython.core.display.ProgressBar object>"
228 "[============================================================] 10/10"
235 229 ]
236 230 },
237 231 "metadata": {},
@@ -254,16 +248,16 b''
254 248 },
255 249 {
256 250 "cell_type": "code",
257 "execution_count": 15,
251 "execution_count": 10,
258 252 "metadata": {},
259 253 "outputs": [
260 254 {
261 255 "data": {
262 256 "text/html": [
263 "<progress style='width:100%' max='10' value='10'></progress>"
257 "<progress style='width:60ex' max='10' value='10'></progress>"
264 258 ],
265 259 "text/plain": [
266 "<IPython.core.display.ProgressBar object>"
260 "[============================================================] 10/10"
267 261 ]
268 262 },
269 263 "metadata": {},
@@ -285,6 +279,36 b''
285 279 "cell_type": "markdown",
286 280 "metadata": {},
287 281 "source": [
282 "The ProgressBar also has an update built into iteration:"
283 ]
284 },
285 {
286 "cell_type": "code",
287 "execution_count": 11,
288 "metadata": {},
289 "outputs": [
290 {
291 "data": {
292 "text/html": [
293 "<progress style='width:60ex' max='10' value='10'></progress>"
294 ],
295 "text/plain": [
296 "[============================================================] 10/10"
297 ]
298 },
299 "metadata": {},
300 "output_type": "display_data"
301 }
302 ],
303 "source": [
304 "for i in ProgressBar(10):\n",
305 " time.sleep(0.25)"
306 ]
307 },
308 {
309 "cell_type": "markdown",
310 "metadata": {},
311 "source": [
288 312 "We would encourage any updatable-display objects that track their own display_ids to follow-suit with `.display()` and `.update()` or `.update_display()` methods."
289 313 ]
290 314 }
General Comments 0
You need to be logged in to leave comments. Login now