Merge lp:~ahayzen/ubuntu-weather-app/fix-1485262-ap-test-migrate-data into lp:ubuntu-weather-app

Proposed by Andrew Hayzen on 2015-08-18
Status: Merged
Approved by: Victor Thompson on 2015-08-27
Approved revision: 102
Merged at revision: 109
Proposed branch: lp:~ahayzen/ubuntu-weather-app/fix-1485262-ap-test-migrate-data
Merge into: lp:ubuntu-weather-app
Diff against target: 3752 lines (+3548/-26)
8 files modified
debian/changelog (+1/-0)
po/com.ubuntu.weather.pot (+18/-18)
tests/autopilot/ubuntu_weather_app/databases/for_migration.conf (+2/-0)
tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.ini (+6/-0)
tests/autopilot/ubuntu_weather_app/files/legacy/1.json (+1709/-0)
tests/autopilot/ubuntu_weather_app/files/legacy/2.json (+1710/-0)
tests/autopilot/ubuntu_weather_app/tests/__init__.py (+55/-8)
tests/autopilot/ubuntu_weather_app/tests/test_migration.py (+47/-0)
To merge this branch: bzr merge lp:~ahayzen/ubuntu-weather-app/fix-1485262-ap-test-migrate-data
Reviewer Review Type Date Requested Status
Victor Thompson 2015-08-18 Approve on 2015-08-27
Ubuntu Phone Apps Jenkins Bot continuous-integration Approve on 2015-08-27
Review via email: mp+268411@code.launchpad.net

Commit message

* Add autopilot tests which check that data is migrated correctly

Description of the change

* Add autopilot tests which check that data is migrated correctly

This has a copy of the two JSON files from the old autopilot tests and has a database generated by the old app with settings stored. I have created two tests, one that checks if the number of locations is correct and one that checks if the locations names are correct. Once the AP tests for settings [0] land I'll add tests to ensure the settings are migrated correctly as helpers will then exist.

0 - https://code.launchpad.net/~carla-sella/ubuntu-weather-app/switch-temp-units/+merge/267459

To post a comment you must log in.
Victor Thompson (vthompson) wrote :

Is this something that we should perhaps be doing in a unit test?

review: Needs Information
Andrew Hayzen (ahayzen) wrote :

From my understanding of QMLUnit tests, you can't add the scripting to do the mocking portion of the dbs/environment correctly to simulate an upgrade on startup, hence using autopilot.

Victor Thompson (vthompson) wrote :

2 inline comments so far--otherwise looks good.

On a side note, does this seem like a set of tests we'll want to keep around for a long time? In 6 months would it still be worthwhile to ensure that this migration is still working?

review: Needs Information
Victor Thompson (vthompson) wrote :

This lgtm now. Thanks!

review: Approve
Victor Thompson (vthompson) wrote :

Please fix the merge conflicts in the .pot file and the changelog when you get a chance. :)

101. By Andrew Hayzen on 2015-08-24

* Merge of trunk

102. By Andrew Hayzen on 2015-08-27

* Merge of trunk

Victor Thompson (vthompson) wrote :

lgtm!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/changelog'
2--- debian/changelog 2015-08-26 20:35:22 +0000
3+++ debian/changelog 2015-08-27 13:48:14 +0000
4@@ -40,6 +40,7 @@
5 * Fix for flaky test as get_location does not wait for location to be loaded (LP: #1485657)
6 * Split day delegate extra info into a separate component that is loaded on demand
7 * Use ListView per Location Pane so that scrolling vertically only affect the currently focused pane
8+ * Add autopilot tests which check that data is migrated correctly (LP: #1485262)
9
10 [ Carla Sella ]
11 * Create autopilot test which shows the day delegate (LP: #1452491)
12
13=== modified file 'po/com.ubuntu.weather.pot'
14--- po/com.ubuntu.weather.pot 2015-08-24 18:09:28 +0000
15+++ po/com.ubuntu.weather.pot 2015-08-27 13:48:14 +0000
16@@ -8,7 +8,7 @@
17 msgstr ""
18 "Project-Id-Version: ubuntu-weather-app\n"
19 "Report-Msgid-Bugs-To: \n"
20-"POT-Creation-Date: 2015-08-24 19:08+0100\n"
21+"POT-Creation-Date: 2015-08-27 14:46+0100\n"
22 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
23 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
24 "Language-Team: LANGUAGE <LL@li.org>\n"
25@@ -18,31 +18,31 @@
26 "Content-Transfer-Encoding: 8bit\n"
27 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
28
29-#: ../app/components/DayDelegateExtraInfo.qml:44
30+#: ../app/components/DayDelegateExtraInfo.qml:45
31 msgid "Chance of rain"
32 msgstr ""
33
34-#: ../app/components/DayDelegateExtraInfo.qml:51
35+#: ../app/components/DayDelegateExtraInfo.qml:52
36 msgid "Winds"
37 msgstr ""
38
39-#: ../app/components/DayDelegateExtraInfo.qml:59
40+#: ../app/components/DayDelegateExtraInfo.qml:60
41 msgid "UV Index"
42 msgstr ""
43
44-#: ../app/components/DayDelegateExtraInfo.qml:65
45+#: ../app/components/DayDelegateExtraInfo.qml:66
46 msgid "Pollen"
47 msgstr ""
48
49-#: ../app/components/DayDelegateExtraInfo.qml:72
50+#: ../app/components/DayDelegateExtraInfo.qml:73
51 msgid "Humidity"
52 msgstr ""
53
54-#: ../app/components/DayDelegateExtraInfo.qml:79
55+#: ../app/components/DayDelegateExtraInfo.qml:80
56 msgid "Sunrise"
57 msgstr ""
58
59-#: ../app/components/DayDelegateExtraInfo.qml:86
60+#: ../app/components/DayDelegateExtraInfo.qml:87
61 msgid "Sunset"
62 msgstr ""
63
64@@ -126,19 +126,19 @@
65 msgid "Settings"
66 msgstr ""
67
68-#: ../app/ui/SettingsPage.qml:32 ../app/ui/settings/UnitsPage.qml:24
69+#: ../app/ui/SettingsPage.qml:33 ../app/ui/settings/UnitsPage.qml:24
70 msgid "Units"
71 msgstr ""
72
73-#: ../app/ui/SettingsPage.qml:37 ../app/ui/settings/DataProviderPage.qml:25
74+#: ../app/ui/SettingsPage.qml:38 ../app/ui/settings/DataProviderPage.qml:25
75 msgid "Data Provider"
76 msgstr ""
77
78-#: ../app/ui/SettingsPage.qml:42 ../app/ui/settings/RefreshIntervalPage.qml:24
79+#: ../app/ui/SettingsPage.qml:43 ../app/ui/settings/RefreshIntervalPage.qml:24
80 msgid "Refresh Interval"
81 msgstr ""
82
83-#: ../app/ui/SettingsPage.qml:47 ../app/ui/settings/LocationPage.qml:24
84+#: ../app/ui/SettingsPage.qml:48 ../app/ui/settings/LocationPage.qml:24
85 msgid "Location"
86 msgstr ""
87
88@@ -168,36 +168,36 @@
89 #. TRANSLATORS: The strings are standard measurement units
90 #. of temperature in Celcius and are shown in the settings page.
91 #. Only the abbreviated form of Celcius should be used.
92-#: ../app/ui/settings/UnitsPage.qml:41 ../app/ui/settings/UnitsPage.qml:76
93+#: ../app/ui/settings/UnitsPage.qml:42 ../app/ui/settings/UnitsPage.qml:78
94 msgid "°C"
95 msgstr ""
96
97 #. TRANSLATORS: The strings are standard measurement units
98 #. of temperature in Fahrenheit and are shown in the settings page.
99 #. Only the abbreviated form of Fahrenheit should be used.
100-#: ../app/ui/settings/UnitsPage.qml:46 ../app/ui/settings/UnitsPage.qml:77
101+#: ../app/ui/settings/UnitsPage.qml:47 ../app/ui/settings/UnitsPage.qml:79
102 msgid "°F"
103 msgstr ""
104
105 #. TRANSLATORS: The strings are standard measurement units
106 #. of wind speed in kilometers per hour and are shown in the settings page.
107 #. Only the abbreviated form of kilometers per hour should be used.
108-#: ../app/ui/settings/UnitsPage.qml:57 ../app/ui/settings/UnitsPage.qml:96
109+#: ../app/ui/settings/UnitsPage.qml:58 ../app/ui/settings/UnitsPage.qml:99
110 msgid "kph"
111 msgstr ""
112
113 #. TRANSLATORS: The strings are standard measurement units
114 #. of wind speed in miles per hour and are shown in the settings page.
115 #. Only the abbreviated form of miles per hour should be used.
116-#: ../app/ui/settings/UnitsPage.qml:62 ../app/ui/settings/UnitsPage.qml:97
117+#: ../app/ui/settings/UnitsPage.qml:63 ../app/ui/settings/UnitsPage.qml:100
118 msgid "mph"
119 msgstr ""
120
121-#: ../app/ui/settings/UnitsPage.qml:75
122+#: ../app/ui/settings/UnitsPage.qml:77
123 msgid "Temperature"
124 msgstr ""
125
126-#: ../app/ui/settings/UnitsPage.qml:95
127+#: ../app/ui/settings/UnitsPage.qml:98
128 msgid "Wind Speed"
129 msgstr ""
130
131
132=== added file 'tests/autopilot/ubuntu_weather_app/databases/for_migration.conf'
133--- tests/autopilot/ubuntu_weather_app/databases/for_migration.conf 1970-01-01 00:00:00 +0000
134+++ tests/autopilot/ubuntu_weather_app/databases/for_migration.conf 2015-08-27 13:48:14 +0000
135@@ -0,0 +1,2 @@
136+[weatherSettings]
137+detectCurrentLocation=false
138
139=== added directory 'tests/autopilot/ubuntu_weather_app/databases/legacy'
140=== added file 'tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.ini'
141--- tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.ini 1970-01-01 00:00:00 +0000
142+++ tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.ini 2015-08-27 13:48:14 +0000
143@@ -0,0 +1,6 @@
144+[General]
145+Description=Default Ubuntu weather app
146+Driver=QSQLITE
147+EstimatedSize=100000
148+Name=com.ubuntu.weather
149+Version=0.3
150
151=== added file 'tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.sqlite'
152Binary files tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.sqlite 1970-01-01 00:00:00 +0000 and tests/autopilot/ubuntu_weather_app/databases/legacy/34e1e542f2f083ff18f537b07a380071.sqlite 2015-08-27 13:48:14 +0000 differ
153=== added directory 'tests/autopilot/ubuntu_weather_app/files/legacy'
154=== added file 'tests/autopilot/ubuntu_weather_app/files/legacy/1.json'
155--- tests/autopilot/ubuntu_weather_app/files/legacy/1.json 1970-01-01 00:00:00 +0000
156+++ tests/autopilot/ubuntu_weather_app/files/legacy/1.json 2015-08-27 13:48:14 +0000
157@@ -0,0 +1,1709 @@
158+{
159+ "location": {
160+ "coord": {
161+ "lon": "10.01534",
162+ "lat": "53.57532"
163+ },
164+ "timezone": {
165+ "gmtOffset": 1,
166+ "dstOffset": 2,
167+ "timeZoneId": "Europe/Berlin"
168+ },
169+ "areaLabel": "Hamburg, Germany",
170+ "population": 1739117,
171+ "adminName2": "",
172+ "name": "Hamburg",
173+ "country": "DE",
174+ "countryName": "Germany",
175+ "adminName1": "Hamburg",
176+ "adminName3": "",
177+ "services": {
178+ "weatherchannel": "GMXX0049",
179+ "geonames": 2911298
180+ }
181+ },
182+ "db": {
183+ "id": 1,
184+ "updated": "2014-03-15T14:41:54.459Z"
185+ },
186+ "format": 20140315,
187+ "data": [
188+ {
189+ "date": {
190+ "year": 2014,
191+ "month": 2,
192+ "date": 15,
193+ "hours": 18,
194+ "minutes": 59
195+ },
196+ "timestamp": 1394906400,
197+ "metric": {
198+ "tempMin": 6,
199+ "windSpeed": 32
200+ },
201+ "imperial": {
202+ "tempMin": 42.8,
203+ "tempMax": 42.8,
204+ "windSpeed": 19.472
205+ },
206+ "precipType": "rain",
207+ "propPrecip": 60,
208+ "pressure": null,
209+ "humidity": 90,
210+ "icon": "rain",
211+ "condition": "Showers / Wind",
212+ "windDeg": 279,
213+ "windDir": "W",
214+ "uv": 0,
215+ "hourly": [
216+ {
217+ "timestamp": 1394895600,
218+ "date": {
219+ "year": 2014,
220+ "month": 2,
221+ "date": 15,
222+ "hours": 16,
223+ "minutes": 0
224+ },
225+ "metric": {
226+ "temp": 8,
227+ "tempFeels": 4,
228+ "windSpeed": 32
229+ },
230+ "imperial": {
231+ "temp": 46.4,
232+ "tempFeels": 39.2,
233+ "windSpeed": 19.872
234+ },
235+ "precipType": "rain",
236+ "propPrecip": 10,
237+ "humidity": 71,
238+ "windDeg": 296,
239+ "windDir": "WNW",
240+ "icon": "overcast",
241+ "condition": "Partly Cloudy / Wind",
242+ "uv": 1
243+ },
244+ {
245+ "timestamp": 1394899200,
246+ "date": {
247+ "year": 2014,
248+ "month": 2,
249+ "date": 15,
250+ "hours": 17,
251+ "minutes": 0
252+ },
253+ "metric": {
254+ "temp": 7,
255+ "tempFeels": 3,
256+ "windSpeed": 32
257+ },
258+ "imperial": {
259+ "temp": 44.6,
260+ "tempFeels": 37.4,
261+ "windSpeed": 19.872
262+ },
263+ "precipType": "rain",
264+ "propPrecip": 10,
265+ "humidity": 77,
266+ "windDeg": 292,
267+ "windDir": "WNW",
268+ "icon": "overcast",
269+ "condition": "Partly Cloudy / Wind",
270+ "uv": 0
271+ },
272+ {
273+ "timestamp": 1394902800,
274+ "date": {
275+ "year": 2014,
276+ "month": 2,
277+ "date": 15,
278+ "hours": 18,
279+ "minutes": 0
280+ },
281+ "metric": {
282+ "temp": 7,
283+ "tempFeels": 3,
284+ "windSpeed": 27
285+ },
286+ "imperial": {
287+ "temp": 44.6,
288+ "tempFeels": 37.4,
289+ "windSpeed": 16.767
290+ },
291+ "precipType": "rain",
292+ "propPrecip": 20,
293+ "humidity": 80,
294+ "windDeg": 288,
295+ "windDir": "WNW",
296+ "icon": "overcast",
297+ "condition": "Cloudy",
298+ "uv": 0
299+ },
300+ {
301+ "timestamp": 1394906400,
302+ "date": {
303+ "year": 2014,
304+ "month": 2,
305+ "date": 15,
306+ "hours": 19,
307+ "minutes": 0
308+ },
309+ "metric": {
310+ "temp": 7,
311+ "tempFeels": 3,
312+ "windSpeed": 24
313+ },
314+ "imperial": {
315+ "temp": 44.6,
316+ "tempFeels": 37.4,
317+ "windSpeed": 14.904
318+ },
319+ "precipType": "rain",
320+ "propPrecip": 20,
321+ "humidity": 83,
322+ "windDeg": 283,
323+ "windDir": "WNW",
324+ "icon": "overcast",
325+ "condition": "Cloudy",
326+ "uv": 0
327+ },
328+ {
329+ "timestamp": 1394910000,
330+ "date": {
331+ "year": 2014,
332+ "month": 2,
333+ "date": 15,
334+ "hours": 20,
335+ "minutes": 0
336+ },
337+ "metric": {
338+ "temp": 7,
339+ "tempFeels": 3,
340+ "windSpeed": 24
341+ },
342+ "imperial": {
343+ "temp": 44.6,
344+ "tempFeels": 37.4,
345+ "windSpeed": 14.904
346+ },
347+ "precipType": "rain",
348+ "propPrecip": 20,
349+ "humidity": 86,
350+ "windDeg": 277,
351+ "windDir": "W",
352+ "icon": "overcast",
353+ "condition": "Cloudy",
354+ "uv": 0
355+ },
356+ {
357+ "timestamp": 1394913600,
358+ "date": {
359+ "year": 2014,
360+ "month": 2,
361+ "date": 15,
362+ "hours": 21,
363+ "minutes": 0
364+ },
365+ "metric": {
366+ "temp": 7,
367+ "tempFeels": 3,
368+ "windSpeed": 22
369+ },
370+ "imperial": {
371+ "temp": 44.6,
372+ "tempFeels": 37.4,
373+ "windSpeed": 13.661999999999999
374+ },
375+ "precipType": "rain",
376+ "propPrecip": 50,
377+ "humidity": 86,
378+ "windDeg": 271,
379+ "windDir": "W",
380+ "icon": "rain",
381+ "condition": "Light Rain",
382+ "uv": 0
383+ },
384+ {
385+ "timestamp": 1394917200,
386+ "date": {
387+ "year": 2014,
388+ "month": 2,
389+ "date": 15,
390+ "hours": 22,
391+ "minutes": 0
392+ },
393+ "metric": {
394+ "temp": 7,
395+ "tempFeels": 3,
396+ "windSpeed": 22
397+ },
398+ "imperial": {
399+ "temp": 44.6,
400+ "tempFeels": 37.4,
401+ "windSpeed": 13.661999999999999
402+ },
403+ "precipType": "rain",
404+ "propPrecip": 60,
405+ "humidity": 89,
406+ "windDeg": 268,
407+ "windDir": "W",
408+ "icon": "rain",
409+ "condition": "Light Rain",
410+ "uv": 0
411+ },
412+ {
413+ "timestamp": 1394920800,
414+ "date": {
415+ "year": 2014,
416+ "month": 2,
417+ "date": 15,
418+ "hours": 23,
419+ "minutes": 0
420+ },
421+ "metric": {
422+ "temp": 7,
423+ "tempFeels": 3,
424+ "windSpeed": 24
425+ },
426+ "imperial": {
427+ "temp": 44.6,
428+ "tempFeels": 37.4,
429+ "windSpeed": 14.904
430+ },
431+ "precipType": "rain",
432+ "propPrecip": 60,
433+ "humidity": 93,
434+ "windDeg": 268,
435+ "windDir": "W",
436+ "icon": "rain",
437+ "condition": "Light Rain",
438+ "uv": 0
439+ }
440+ ],
441+ "current": {
442+ "timestamp": "1394893200",
443+ "date": {
444+ "year": 2014,
445+ "month": 2,
446+ "date": 15,
447+ "hours": 18,
448+ "minutes": 59
449+ },
450+ "metric": {
451+ "temp": 8,
452+ "tempFeels": 4,
453+ "windSpeed": 38
454+ },
455+ "imperial": {
456+ "temp": 46.4,
457+ "tempFeels": 39.2,
458+ "windSpeed": 23.598
459+ },
460+ "precipType": null,
461+ "propPrecip": null,
462+ "humidity": 62,
463+ "pressure": "1012.87",
464+ "windDeg": 290,
465+ "windDir": "WNW",
466+ "icon": "cloud_sun",
467+ "condition": "Partly Cloudy",
468+ "uv": 1
469+ }
470+ },
471+ {
472+ "date": {
473+ "year": 2014,
474+ "month": 2,
475+ "date": 16,
476+ "hours": 18,
477+ "minutes": 59
478+ },
479+ "timestamp": 1394992800,
480+ "metric": {
481+ "tempMin": 7,
482+ "tempMax": 9,
483+ "windSpeed": 35
484+ },
485+ "imperial": {
486+ "tempMin": 44.6,
487+ "tempMax": 48.2,
488+ "windSpeed": 21.735
489+ },
490+ "precipType": "rain",
491+ "propPrecip": 40,
492+ "pressure": null,
493+ "humidity": 88,
494+ "icon": "rain",
495+ "condition": "Showers / Wind",
496+ "windDeg": 285,
497+ "windDir": "WNW",
498+ "uv": 1,
499+ "hourly": [
500+ {
501+ "timestamp": 1394924400,
502+ "date": {
503+ "year": 2014,
504+ "month": 2,
505+ "date": 16,
506+ "hours": 0,
507+ "minutes": 0
508+ },
509+ "metric": {
510+ "temp": 7,
511+ "tempFeels": 3,
512+ "windSpeed": 25
513+ },
514+ "imperial": {
515+ "temp": 44.6,
516+ "tempFeels": 37.4,
517+ "windSpeed": 15.525
518+ },
519+ "precipType": "rain",
520+ "propPrecip": 60,
521+ "humidity": 89,
522+ "windDeg": 271,
523+ "windDir": "W",
524+ "icon": "rain",
525+ "condition": "Showers",
526+ "uv": 0
527+ },
528+ {
529+ "timestamp": 1394928000,
530+ "date": {
531+ "year": 2014,
532+ "month": 2,
533+ "date": 16,
534+ "hours": 1,
535+ "minutes": 0
536+ },
537+ "metric": {
538+ "temp": 7,
539+ "tempFeels": 3,
540+ "windSpeed": 27
541+ },
542+ "imperial": {
543+ "temp": 44.6,
544+ "tempFeels": 37.4,
545+ "windSpeed": 16.767
546+ },
547+ "precipType": "rain",
548+ "propPrecip": 50,
549+ "humidity": 93,
550+ "windDeg": 275,
551+ "windDir": "W",
552+ "icon": "rain",
553+ "condition": "Showers",
554+ "uv": 0
555+ },
556+ {
557+ "timestamp": 1394931600,
558+ "date": {
559+ "year": 2014,
560+ "month": 2,
561+ "date": 16,
562+ "hours": 2,
563+ "minutes": 0
564+ },
565+ "metric": {
566+ "temp": 8,
567+ "tempFeels": 4,
568+ "windSpeed": 28
569+ },
570+ "imperial": {
571+ "temp": 46.4,
572+ "tempFeels": 39.2,
573+ "windSpeed": 17.387999999999998
574+ },
575+ "precipType": "rain",
576+ "propPrecip": 50,
577+ "humidity": 93,
578+ "windDeg": 280,
579+ "windDir": "W",
580+ "icon": "rain",
581+ "condition": "Showers",
582+ "uv": 0
583+ },
584+ {
585+ "timestamp": 1394935200,
586+ "date": {
587+ "year": 2014,
588+ "month": 2,
589+ "date": 16,
590+ "hours": 3,
591+ "minutes": 0
592+ },
593+ "metric": {
594+ "temp": 8,
595+ "tempFeels": 4,
596+ "windSpeed": 32
597+ },
598+ "imperial": {
599+ "temp": 46.4,
600+ "tempFeels": 39.2,
601+ "windSpeed": 19.872
602+ },
603+ "precipType": "rain",
604+ "propPrecip": 50,
605+ "humidity": 96,
606+ "windDeg": 285,
607+ "windDir": "WNW",
608+ "icon": "rain",
609+ "condition": "Showers / Wind",
610+ "uv": 0
611+ },
612+ {
613+ "timestamp": 1394938800,
614+ "date": {
615+ "year": 2014,
616+ "month": 2,
617+ "date": 16,
618+ "hours": 4,
619+ "minutes": 0
620+ },
621+ "metric": {
622+ "temp": 8,
623+ "tempFeels": 5,
624+ "windSpeed": 32
625+ },
626+ "imperial": {
627+ "temp": 46.4,
628+ "tempFeels": 41,
629+ "windSpeed": 19.872
630+ },
631+ "precipType": "rain",
632+ "propPrecip": 40,
633+ "humidity": 93,
634+ "windDeg": 288,
635+ "windDir": "WNW",
636+ "icon": "rain",
637+ "condition": "Showers / Wind",
638+ "uv": 0
639+ },
640+ {
641+ "timestamp": 1394942400,
642+ "date": {
643+ "year": 2014,
644+ "month": 2,
645+ "date": 16,
646+ "hours": 5,
647+ "minutes": 0
648+ },
649+ "metric": {
650+ "temp": 8,
651+ "tempFeels": 5,
652+ "windSpeed": 32
653+ },
654+ "imperial": {
655+ "temp": 46.4,
656+ "tempFeels": 41,
657+ "windSpeed": 19.872
658+ },
659+ "precipType": "rain",
660+ "propPrecip": 40,
661+ "humidity": 93,
662+ "windDeg": 289,
663+ "windDir": "WNW",
664+ "icon": "rain",
665+ "condition": "Showers / Wind",
666+ "uv": 0
667+ },
668+ {
669+ "timestamp": 1394946000,
670+ "date": {
671+ "year": 2014,
672+ "month": 2,
673+ "date": 16,
674+ "hours": 6,
675+ "minutes": 0
676+ },
677+ "metric": {
678+ "temp": 8,
679+ "tempFeels": 5,
680+ "windSpeed": 32
681+ },
682+ "imperial": {
683+ "temp": 46.4,
684+ "tempFeels": 41,
685+ "windSpeed": 19.872
686+ },
687+ "precipType": "rain",
688+ "propPrecip": 40,
689+ "humidity": 89,
690+ "windDeg": 289,
691+ "windDir": "WNW",
692+ "icon": "rain",
693+ "condition": "Few Showers / Wind",
694+ "uv": 0
695+ },
696+ {
697+ "timestamp": 1394949600,
698+ "date": {
699+ "year": 2014,
700+ "month": 2,
701+ "date": 16,
702+ "hours": 7,
703+ "minutes": 0
704+ },
705+ "metric": {
706+ "temp": 8,
707+ "tempFeels": 5,
708+ "windSpeed": 32
709+ },
710+ "imperial": {
711+ "temp": 46.4,
712+ "tempFeels": 41,
713+ "windSpeed": 19.872
714+ },
715+ "precipType": "rain",
716+ "propPrecip": 30,
717+ "humidity": 89,
718+ "windDeg": 288,
719+ "windDir": "WNW",
720+ "icon": "rain",
721+ "condition": "Few Showers / Wind",
722+ "uv": 0
723+ },
724+ {
725+ "timestamp": 1394953200,
726+ "date": {
727+ "year": 2014,
728+ "month": 2,
729+ "date": 16,
730+ "hours": 8,
731+ "minutes": 0
732+ },
733+ "metric": {
734+ "temp": 8,
735+ "tempFeels": 5,
736+ "windSpeed": 32
737+ },
738+ "imperial": {
739+ "temp": 46.4,
740+ "tempFeels": 41,
741+ "windSpeed": 19.872
742+ },
743+ "precipType": "rain",
744+ "propPrecip": 30,
745+ "humidity": 89,
746+ "windDeg": 286,
747+ "windDir": "WNW",
748+ "icon": "rain",
749+ "condition": "Few Showers / Wind",
750+ "uv": 0
751+ },
752+ {
753+ "timestamp": 1394956800,
754+ "date": {
755+ "year": 2014,
756+ "month": 2,
757+ "date": 16,
758+ "hours": 9,
759+ "minutes": 0
760+ },
761+ "metric": {
762+ "temp": 8,
763+ "tempFeels": 5,
764+ "windSpeed": 32
765+ },
766+ "imperial": {
767+ "temp": 46.4,
768+ "tempFeels": 41,
769+ "windSpeed": 19.872
770+ },
771+ "precipType": "rain",
772+ "propPrecip": 40,
773+ "humidity": 93,
774+ "windDeg": 285,
775+ "windDir": "WNW",
776+ "icon": "rain",
777+ "condition": "Showers / Wind",
778+ "uv": 0
779+ },
780+ {
781+ "timestamp": 1394960400,
782+ "date": {
783+ "year": 2014,
784+ "month": 2,
785+ "date": 16,
786+ "hours": 10,
787+ "minutes": 0
788+ },
789+ "metric": {
790+ "temp": 8,
791+ "tempFeels": 5,
792+ "windSpeed": 32
793+ },
794+ "imperial": {
795+ "temp": 46.4,
796+ "tempFeels": 41,
797+ "windSpeed": 19.872
798+ },
799+ "precipType": "rain",
800+ "propPrecip": 40,
801+ "humidity": 93,
802+ "windDeg": 284,
803+ "windDir": "WNW",
804+ "icon": "rain",
805+ "condition": "Showers / Wind",
806+ "uv": 0
807+ },
808+ {
809+ "timestamp": 1394964000,
810+ "date": {
811+ "year": 2014,
812+ "month": 2,
813+ "date": 16,
814+ "hours": 11,
815+ "minutes": 0
816+ },
817+ "metric": {
818+ "temp": 8,
819+ "tempFeels": 5,
820+ "windSpeed": 33
821+ },
822+ "imperial": {
823+ "temp": 46.4,
824+ "tempFeels": 41,
825+ "windSpeed": 20.493
826+ },
827+ "precipType": "rain",
828+ "propPrecip": 40,
829+ "humidity": 93,
830+ "windDeg": 285,
831+ "windDir": "WNW",
832+ "icon": "rain",
833+ "condition": "Showers / Wind",
834+ "uv": 1
835+ },
836+ {
837+ "timestamp": 1394967600,
838+ "date": {
839+ "year": 2014,
840+ "month": 2,
841+ "date": 16,
842+ "hours": 12,
843+ "minutes": 0
844+ },
845+ "metric": {
846+ "temp": 9,
847+ "tempFeels": 5,
848+ "windSpeed": 33
849+ },
850+ "imperial": {
851+ "temp": 48.2,
852+ "tempFeels": 41,
853+ "windSpeed": 20.493
854+ },
855+ "precipType": "rain",
856+ "propPrecip": 30,
857+ "humidity": 86,
858+ "windDeg": 286,
859+ "windDir": "WNW",
860+ "icon": "rain",
861+ "condition": "Few Showers / Wind",
862+ "uv": 1
863+ },
864+ {
865+ "timestamp": 1394971200,
866+ "date": {
867+ "year": 2014,
868+ "month": 2,
869+ "date": 16,
870+ "hours": 13,
871+ "minutes": 0
872+ },
873+ "metric": {
874+ "temp": 9,
875+ "tempFeels": 5,
876+ "windSpeed": 35
877+ },
878+ "imperial": {
879+ "temp": 48.2,
880+ "tempFeels": 41,
881+ "windSpeed": 21.735
882+ },
883+ "precipType": "rain",
884+ "propPrecip": 30,
885+ "humidity": 86,
886+ "windDeg": 286,
887+ "windDir": "WNW",
888+ "icon": "rain",
889+ "condition": "Few Showers / Wind",
890+ "uv": 1
891+ },
892+ {
893+ "timestamp": 1394974800,
894+ "date": {
895+ "year": 2014,
896+ "month": 2,
897+ "date": 16,
898+ "hours": 14,
899+ "minutes": 0
900+ },
901+ "metric": {
902+ "temp": 9,
903+ "tempFeels": 5,
904+ "windSpeed": 35
905+ },
906+ "imperial": {
907+ "temp": 48.2,
908+ "tempFeels": 41,
909+ "windSpeed": 21.735
910+ },
911+ "precipType": "rain",
912+ "propPrecip": 30,
913+ "humidity": 86,
914+ "windDeg": 285,
915+ "windDir": "WNW",
916+ "icon": "rain",
917+ "condition": "Few Showers / Wind",
918+ "uv": 0
919+ },
920+ {
921+ "timestamp": 1394978400,
922+ "date": {
923+ "year": 2014,
924+ "month": 2,
925+ "date": 16,
926+ "hours": 15,
927+ "minutes": 0
928+ },
929+ "metric": {
930+ "temp": 9,
931+ "tempFeels": 5,
932+ "windSpeed": 33
933+ },
934+ "imperial": {
935+ "temp": 48.2,
936+ "tempFeels": 41,
937+ "windSpeed": 20.493
938+ },
939+ "precipType": "rain",
940+ "propPrecip": 30,
941+ "humidity": 86,
942+ "windDeg": 283,
943+ "windDir": "WNW",
944+ "icon": "rain",
945+ "condition": "Few Showers / Wind",
946+ "uv": 0
947+ },
948+ {
949+ "timestamp": 1394982000,
950+ "date": {
951+ "year": 2014,
952+ "month": 2,
953+ "date": 16,
954+ "hours": 16,
955+ "minutes": 0
956+ },
957+ "metric": {
958+ "temp": 9,
959+ "tempFeels": 5,
960+ "windSpeed": 33
961+ },
962+ "imperial": {
963+ "temp": 48.2,
964+ "tempFeels": 41,
965+ "windSpeed": 20.493
966+ },
967+ "precipType": "rain",
968+ "propPrecip": 30,
969+ "humidity": 86,
970+ "windDeg": 281,
971+ "windDir": "W",
972+ "icon": "rain",
973+ "condition": "Few Showers / Wind",
974+ "uv": 0
975+ },
976+ {
977+ "timestamp": 1394985600,
978+ "date": {
979+ "year": 2014,
980+ "month": 2,
981+ "date": 16,
982+ "hours": 17,
983+ "minutes": 0
984+ },
985+ "metric": {
986+ "temp": 9,
987+ "tempFeels": 5,
988+ "windSpeed": 32
989+ },
990+ "imperial": {
991+ "temp": 48.2,
992+ "tempFeels": 41,
993+ "windSpeed": 19.872
994+ },
995+ "precipType": "rain",
996+ "propPrecip": 30,
997+ "humidity": 86,
998+ "windDeg": 281,
999+ "windDir": "W",
1000+ "icon": "rain",
1001+ "condition": "Few Showers / Wind",
1002+ "uv": 0
1003+ },
1004+ {
1005+ "timestamp": 1394989200,
1006+ "date": {
1007+ "year": 2014,
1008+ "month": 2,
1009+ "date": 16,
1010+ "hours": 18,
1011+ "minutes": 0
1012+ },
1013+ "metric": {
1014+ "temp": 8,
1015+ "tempFeels": 5,
1016+ "windSpeed": 28
1017+ },
1018+ "imperial": {
1019+ "temp": 46.4,
1020+ "tempFeels": 41,
1021+ "windSpeed": 17.387999999999998
1022+ },
1023+ "precipType": "rain",
1024+ "propPrecip": 20,
1025+ "humidity": 86,
1026+ "windDeg": 281,
1027+ "windDir": "W",
1028+ "icon": "overcast",
1029+ "condition": "Cloudy",
1030+ "uv": 0
1031+ },
1032+ {
1033+ "timestamp": 1394992800,
1034+ "date": {
1035+ "year": 2014,
1036+ "month": 2,
1037+ "date": 16,
1038+ "hours": 19,
1039+ "minutes": 0
1040+ },
1041+ "metric": {
1042+ "temp": 8,
1043+ "tempFeels": 5,
1044+ "windSpeed": 27
1045+ },
1046+ "imperial": {
1047+ "temp": 46.4,
1048+ "tempFeels": 41,
1049+ "windSpeed": 16.767
1050+ },
1051+ "precipType": "rain",
1052+ "propPrecip": 20,
1053+ "humidity": 86,
1054+ "windDeg": 281,
1055+ "windDir": "W",
1056+ "icon": "overcast",
1057+ "condition": "Cloudy",
1058+ "uv": 0
1059+ },
1060+ {
1061+ "timestamp": 1394996400,
1062+ "date": {
1063+ "year": 2014,
1064+ "month": 2,
1065+ "date": 16,
1066+ "hours": 20,
1067+ "minutes": 0
1068+ },
1069+ "metric": {
1070+ "temp": 8,
1071+ "tempFeels": 5,
1072+ "windSpeed": 25
1073+ },
1074+ "imperial": {
1075+ "temp": 46.4,
1076+ "tempFeels": 41,
1077+ "windSpeed": 15.525
1078+ },
1079+ "precipType": "rain",
1080+ "propPrecip": 20,
1081+ "humidity": 86,
1082+ "windDeg": 279,
1083+ "windDir": "W",
1084+ "icon": "overcast",
1085+ "condition": "Cloudy",
1086+ "uv": 0
1087+ },
1088+ {
1089+ "timestamp": 1395000000,
1090+ "date": {
1091+ "year": 2014,
1092+ "month": 2,
1093+ "date": 16,
1094+ "hours": 21,
1095+ "minutes": 0
1096+ },
1097+ "metric": {
1098+ "temp": 8,
1099+ "tempFeels": 5,
1100+ "windSpeed": 25
1101+ },
1102+ "imperial": {
1103+ "temp": 46.4,
1104+ "tempFeels": 41,
1105+ "windSpeed": 15.525
1106+ },
1107+ "precipType": "rain",
1108+ "propPrecip": 20,
1109+ "humidity": 86,
1110+ "windDeg": 276,
1111+ "windDir": "W",
1112+ "icon": "overcast",
1113+ "condition": "Cloudy",
1114+ "uv": 0
1115+ },
1116+ {
1117+ "timestamp": 1395003600,
1118+ "date": {
1119+ "year": 2014,
1120+ "month": 2,
1121+ "date": 16,
1122+ "hours": 22,
1123+ "minutes": 0
1124+ },
1125+ "metric": {
1126+ "temp": 8,
1127+ "tempFeels": 5,
1128+ "windSpeed": 24
1129+ },
1130+ "imperial": {
1131+ "temp": 46.4,
1132+ "tempFeels": 41,
1133+ "windSpeed": 14.904
1134+ },
1135+ "precipType": "rain",
1136+ "propPrecip": 20,
1137+ "humidity": 86,
1138+ "windDeg": 273,
1139+ "windDir": "W",
1140+ "icon": "overcast",
1141+ "condition": "Cloudy",
1142+ "uv": 0
1143+ },
1144+ {
1145+ "timestamp": 1395007200,
1146+ "date": {
1147+ "year": 2014,
1148+ "month": 2,
1149+ "date": 16,
1150+ "hours": 23,
1151+ "minutes": 0
1152+ },
1153+ "metric": {
1154+ "temp": 8,
1155+ "tempFeels": 5,
1156+ "windSpeed": 24
1157+ },
1158+ "imperial": {
1159+ "temp": 46.4,
1160+ "tempFeels": 41,
1161+ "windSpeed": 14.904
1162+ },
1163+ "precipType": "rain",
1164+ "propPrecip": 20,
1165+ "humidity": 86,
1166+ "windDeg": 272,
1167+ "windDir": "W",
1168+ "icon": "overcast",
1169+ "condition": "Cloudy",
1170+ "uv": 0
1171+ }
1172+ ]
1173+ },
1174+ {
1175+ "date": {
1176+ "year": 2014,
1177+ "month": 2,
1178+ "date": 17,
1179+ "hours": 18,
1180+ "minutes": 59
1181+ },
1182+ "timestamp": 1395079200,
1183+ "metric": {
1184+ "tempMin": 5,
1185+ "tempMax": 10,
1186+ "windSpeed": 32
1187+ },
1188+ "imperial": {
1189+ "tempMin": 41,
1190+ "tempMax": 50,
1191+ "windSpeed": 19.872
1192+ },
1193+ "precipType": "rain",
1194+ "propPrecip": 40,
1195+ "pressure": null,
1196+ "humidity": 78,
1197+ "icon": "scattered",
1198+ "condition": "AM Showers / Wind",
1199+ "windDeg": 277,
1200+ "windDir": "W",
1201+ "uv": 1,
1202+ "hourly": [
1203+ {
1204+ "timestamp": 1395010800,
1205+ "date": {
1206+ "year": 2014,
1207+ "month": 2,
1208+ "date": 17,
1209+ "hours": 0,
1210+ "minutes": 0
1211+ },
1212+ "metric": {
1213+ "temp": 8,
1214+ "tempFeels": 5,
1215+ "windSpeed": 24
1216+ },
1217+ "imperial": {
1218+ "temp": 46.4,
1219+ "tempFeels": 41,
1220+ "windSpeed": 14.904
1221+ },
1222+ "precipType": "rain",
1223+ "propPrecip": 20,
1224+ "humidity": 89,
1225+ "windDeg": 272,
1226+ "windDir": "W",
1227+ "icon": "overcast",
1228+ "condition": "Cloudy",
1229+ "uv": 0
1230+ },
1231+ {
1232+ "timestamp": 1395014400,
1233+ "date": {
1234+ "year": 2014,
1235+ "month": 2,
1236+ "date": 17,
1237+ "hours": 1,
1238+ "minutes": 0
1239+ },
1240+ "metric": {
1241+ "temp": 8,
1242+ "tempFeels": 5,
1243+ "windSpeed": 24
1244+ },
1245+ "imperial": {
1246+ "temp": 46.4,
1247+ "tempFeels": 41,
1248+ "windSpeed": 14.904
1249+ },
1250+ "precipType": "rain",
1251+ "propPrecip": 20,
1252+ "humidity": 89,
1253+ "windDeg": 273,
1254+ "windDir": "W",
1255+ "icon": "overcast",
1256+ "condition": "Cloudy",
1257+ "uv": 0
1258+ },
1259+ {
1260+ "timestamp": 1395018000,
1261+ "date": {
1262+ "year": 2014,
1263+ "month": 2,
1264+ "date": 17,
1265+ "hours": 2,
1266+ "minutes": 0
1267+ },
1268+ "metric": {
1269+ "temp": 8,
1270+ "tempFeels": 5,
1271+ "windSpeed": 24
1272+ },
1273+ "imperial": {
1274+ "temp": 46.4,
1275+ "tempFeels": 41,
1276+ "windSpeed": 14.904
1277+ },
1278+ "precipType": "rain",
1279+ "propPrecip": 20,
1280+ "humidity": 89,
1281+ "windDeg": 274,
1282+ "windDir": "W",
1283+ "icon": "overcast",
1284+ "condition": "Cloudy",
1285+ "uv": 0
1286+ },
1287+ {
1288+ "timestamp": 1395021600,
1289+ "date": {
1290+ "year": 2014,
1291+ "month": 2,
1292+ "date": 17,
1293+ "hours": 3,
1294+ "minutes": 0
1295+ },
1296+ "metric": {
1297+ "temp": 8,
1298+ "tempFeels": 5,
1299+ "windSpeed": 24
1300+ },
1301+ "imperial": {
1302+ "temp": 46.4,
1303+ "tempFeels": 41,
1304+ "windSpeed": 14.904
1305+ },
1306+ "precipType": "rain",
1307+ "propPrecip": 20,
1308+ "humidity": 89,
1309+ "windDeg": 274,
1310+ "windDir": "W",
1311+ "icon": "overcast",
1312+ "condition": "Cloudy",
1313+ "uv": 0
1314+ },
1315+ {
1316+ "timestamp": 1395025200,
1317+ "date": {
1318+ "year": 2014,
1319+ "month": 2,
1320+ "date": 17,
1321+ "hours": 4,
1322+ "minutes": 0
1323+ },
1324+ "metric": {
1325+ "temp": 8,
1326+ "tempFeels": 5,
1327+ "windSpeed": 24
1328+ },
1329+ "imperial": {
1330+ "temp": 46.4,
1331+ "tempFeels": 41,
1332+ "windSpeed": 14.904
1333+ },
1334+ "precipType": "rain",
1335+ "propPrecip": 20,
1336+ "humidity": 89,
1337+ "windDeg": 274,
1338+ "windDir": "W",
1339+ "icon": "overcast",
1340+ "condition": "Cloudy",
1341+ "uv": 0
1342+ },
1343+ {
1344+ "timestamp": 1395028800,
1345+ "date": {
1346+ "year": 2014,
1347+ "month": 2,
1348+ "date": 17,
1349+ "hours": 5,
1350+ "minutes": 0
1351+ },
1352+ "metric": {
1353+ "temp": 8,
1354+ "tempFeels": 5,
1355+ "windSpeed": 24
1356+ },
1357+ "imperial": {
1358+ "temp": 46.4,
1359+ "tempFeels": 41,
1360+ "windSpeed": 14.904
1361+ },
1362+ "precipType": "rain",
1363+ "propPrecip": 20,
1364+ "humidity": 89,
1365+ "windDeg": 274,
1366+ "windDir": "W",
1367+ "icon": "overcast",
1368+ "condition": "Cloudy",
1369+ "uv": 0
1370+ },
1371+ {
1372+ "timestamp": 1395032400,
1373+ "date": {
1374+ "year": 2014,
1375+ "month": 2,
1376+ "date": 17,
1377+ "hours": 6,
1378+ "minutes": 0
1379+ },
1380+ "metric": {
1381+ "temp": 8,
1382+ "tempFeels": 5,
1383+ "windSpeed": 25
1384+ },
1385+ "imperial": {
1386+ "temp": 46.4,
1387+ "tempFeels": 41,
1388+ "windSpeed": 15.525
1389+ },
1390+ "precipType": "rain",
1391+ "propPrecip": 10,
1392+ "humidity": 86,
1393+ "windDeg": 273,
1394+ "windDir": "W",
1395+ "icon": "overcast",
1396+ "condition": "Cloudy",
1397+ "uv": 0
1398+ },
1399+ {
1400+ "timestamp": 1395036000,
1401+ "date": {
1402+ "year": 2014,
1403+ "month": 2,
1404+ "date": 17,
1405+ "hours": 7,
1406+ "minutes": 0
1407+ },
1408+ "metric": {
1409+ "temp": 8,
1410+ "tempFeels": 5,
1411+ "windSpeed": 25
1412+ },
1413+ "imperial": {
1414+ "temp": 46.4,
1415+ "tempFeels": 41,
1416+ "windSpeed": 15.525
1417+ },
1418+ "precipType": "rain",
1419+ "propPrecip": 10,
1420+ "humidity": 86,
1421+ "windDeg": 273,
1422+ "windDir": "W",
1423+ "icon": "overcast",
1424+ "condition": "Cloudy",
1425+ "uv": 0
1426+ },
1427+ {
1428+ "timestamp": 1395039600,
1429+ "date": {
1430+ "year": 2014,
1431+ "month": 2,
1432+ "date": 17,
1433+ "hours": 8,
1434+ "minutes": 0
1435+ },
1436+ "metric": {
1437+ "temp": 8,
1438+ "tempFeels": 4,
1439+ "windSpeed": 27
1440+ },
1441+ "imperial": {
1442+ "temp": 46.4,
1443+ "tempFeels": 39.2,
1444+ "windSpeed": 16.767
1445+ },
1446+ "precipType": "rain",
1447+ "propPrecip": 20,
1448+ "humidity": 86,
1449+ "windDeg": 274,
1450+ "windDir": "W",
1451+ "icon": "overcast",
1452+ "condition": "Cloudy",
1453+ "uv": 0
1454+ },
1455+ {
1456+ "timestamp": 1395043200,
1457+ "date": {
1458+ "year": 2014,
1459+ "month": 2,
1460+ "date": 17,
1461+ "hours": 9,
1462+ "minutes": 0
1463+ },
1464+ "metric": {
1465+ "temp": 8,
1466+ "tempFeels": 4,
1467+ "windSpeed": 27
1468+ },
1469+ "imperial": {
1470+ "temp": 46.4,
1471+ "tempFeels": 39.2,
1472+ "windSpeed": 16.767
1473+ },
1474+ "precipType": "rain",
1475+ "propPrecip": 40,
1476+ "humidity": 86,
1477+ "windDeg": 275,
1478+ "windDir": "W",
1479+ "icon": "rain",
1480+ "condition": "Showers",
1481+ "uv": 0
1482+ },
1483+ {
1484+ "timestamp": 1395046800,
1485+ "date": {
1486+ "year": 2014,
1487+ "month": 2,
1488+ "date": 17,
1489+ "hours": 10,
1490+ "minutes": 0
1491+ },
1492+ "metric": {
1493+ "temp": 8,
1494+ "tempFeels": 5,
1495+ "windSpeed": 28
1496+ },
1497+ "imperial": {
1498+ "temp": 46.4,
1499+ "tempFeels": 41,
1500+ "windSpeed": 17.387999999999998
1501+ },
1502+ "precipType": "rain",
1503+ "propPrecip": 40,
1504+ "humidity": 83,
1505+ "windDeg": 276,
1506+ "windDir": "W",
1507+ "icon": "rain",
1508+ "condition": "Showers",
1509+ "uv": 1
1510+ },
1511+ {
1512+ "timestamp": 1395050400,
1513+ "date": {
1514+ "year": 2014,
1515+ "month": 2,
1516+ "date": 17,
1517+ "hours": 11,
1518+ "minutes": 0
1519+ },
1520+ "metric": {
1521+ "temp": 9,
1522+ "tempFeels": 5,
1523+ "windSpeed": 30
1524+ },
1525+ "imperial": {
1526+ "temp": 48.2,
1527+ "tempFeels": 41,
1528+ "windSpeed": 18.63
1529+ },
1530+ "precipType": "rain",
1531+ "propPrecip": 40,
1532+ "humidity": 77,
1533+ "windDeg": 277,
1534+ "windDir": "W",
1535+ "icon": "rain",
1536+ "condition": "Showers",
1537+ "uv": 1
1538+ },
1539+ {
1540+ "timestamp": 1395054000,
1541+ "date": {
1542+ "year": 2014,
1543+ "month": 2,
1544+ "date": 17,
1545+ "hours": 12,
1546+ "minutes": 0
1547+ },
1548+ "metric": {
1549+ "temp": 10,
1550+ "tempFeels": 6,
1551+ "windSpeed": 32
1552+ },
1553+ "imperial": {
1554+ "temp": 50,
1555+ "tempFeels": 42.8,
1556+ "windSpeed": 19.872
1557+ },
1558+ "precipType": "rain",
1559+ "propPrecip": 20,
1560+ "humidity": 74,
1561+ "windDeg": 278,
1562+ "windDir": "W",
1563+ "icon": "overcast",
1564+ "condition": "Cloudy / Wind",
1565+ "uv": 1
1566+ },
1567+ {
1568+ "timestamp": 1395057600,
1569+ "date": {
1570+ "year": 2014,
1571+ "month": 2,
1572+ "date": 17,
1573+ "hours": 13,
1574+ "minutes": 0
1575+ },
1576+ "metric": {
1577+ "temp": 10,
1578+ "tempFeels": 6,
1579+ "windSpeed": 32
1580+ },
1581+ "imperial": {
1582+ "temp": 50,
1583+ "tempFeels": 42.8,
1584+ "windSpeed": 19.872
1585+ },
1586+ "precipType": "rain",
1587+ "propPrecip": 20,
1588+ "humidity": 71,
1589+ "windDeg": 279,
1590+ "windDir": "W",
1591+ "icon": "overcast",
1592+ "condition": "Cloudy / Wind",
1593+ "uv": 1
1594+ },
1595+ {
1596+ "timestamp": 1395061200,
1597+ "date": {
1598+ "year": 2014,
1599+ "month": 2,
1600+ "date": 17,
1601+ "hours": 14,
1602+ "minutes": 0
1603+ },
1604+ "metric": {
1605+ "temp": 10,
1606+ "tempFeels": 6,
1607+ "windSpeed": 32
1608+ },
1609+ "imperial": {
1610+ "temp": 50,
1611+ "tempFeels": 42.8,
1612+ "windSpeed": 19.872
1613+ },
1614+ "precipType": "rain",
1615+ "propPrecip": 20,
1616+ "humidity": 71,
1617+ "windDeg": 279,
1618+ "windDir": "W",
1619+ "icon": "overcast",
1620+ "condition": "Cloudy / Wind",
1621+ "uv": 1
1622+ },
1623+ {
1624+ "timestamp": 1395064800,
1625+ "date": {
1626+ "year": 2014,
1627+ "month": 2,
1628+ "date": 17,
1629+ "hours": 15,
1630+ "minutes": 0
1631+ },
1632+ "metric": {
1633+ "temp": 10,
1634+ "tempFeels": 6,
1635+ "windSpeed": 30
1636+ },
1637+ "imperial": {
1638+ "temp": 50,
1639+ "tempFeels": 42.8,
1640+ "windSpeed": 18.63
1641+ },
1642+ "precipType": "rain",
1643+ "propPrecip": 20,
1644+ "humidity": 71,
1645+ "windDeg": 279,
1646+ "windDir": "W",
1647+ "icon": "overcast",
1648+ "condition": "Cloudy",
1649+ "uv": 1
1650+ }
1651+ ]
1652+ },
1653+ {
1654+ "date": {
1655+ "year": 2014,
1656+ "month": 2,
1657+ "date": 18,
1658+ "hours": 18,
1659+ "minutes": 59
1660+ },
1661+ "timestamp": 1395165600,
1662+ "metric": {
1663+ "tempMin": 6,
1664+ "tempMax": 10,
1665+ "windSpeed": 22
1666+ },
1667+ "imperial": {
1668+ "tempMin": 42.8,
1669+ "tempMax": 50,
1670+ "windSpeed": 13.661999999999999
1671+ },
1672+ "precipType": "rain",
1673+ "propPrecip": 20,
1674+ "pressure": null,
1675+ "humidity": 79,
1676+ "icon": "overcast",
1677+ "condition": "Cloudy",
1678+ "windDeg": 260,
1679+ "windDir": "W",
1680+ "uv": 1,
1681+ "hourly": []
1682+ },
1683+ {
1684+ "date": {
1685+ "year": 2014,
1686+ "month": 2,
1687+ "date": 19,
1688+ "hours": 18,
1689+ "minutes": 59
1690+ },
1691+ "timestamp": 1395252000,
1692+ "metric": {
1693+ "tempMin": 5,
1694+ "tempMax": 8,
1695+ "windSpeed": 35
1696+ },
1697+ "imperial": {
1698+ "tempMin": 41,
1699+ "tempMax": 46.4,
1700+ "windSpeed": 21.735
1701+ },
1702+ "precipType": "rain",
1703+ "propPrecip": 60,
1704+ "pressure": null,
1705+ "humidity": 84,
1706+ "icon": "rain",
1707+ "condition": "Light Rain / Wind",
1708+ "windDeg": 272,
1709+ "windDir": "W",
1710+ "uv": 1,
1711+ "hourly": []
1712+ },
1713+ {
1714+ "date": {
1715+ "year": 2014,
1716+ "month": 2,
1717+ "date": 20,
1718+ "hours": 18,
1719+ "minutes": 59
1720+ },
1721+ "timestamp": 1395338400,
1722+ "metric": {
1723+ "tempMin": 6,
1724+ "tempMax": 13,
1725+ "windSpeed": 17
1726+ },
1727+ "imperial": {
1728+ "tempMin": 42.8,
1729+ "tempMax": 55.400000000000006,
1730+ "windSpeed": 10.557
1731+ },
1732+ "precipType": "rain",
1733+ "propPrecip": 0,
1734+ "pressure": null,
1735+ "humidity": 59,
1736+ "icon": "cloud_sun",
1737+ "condition": "Mostly Sunny",
1738+ "windDeg": 245,
1739+ "windDir": "WSW",
1740+ "uv": 2,
1741+ "hourly": []
1742+ },
1743+ {
1744+ "date": {
1745+ "year": 2014,
1746+ "month": 2,
1747+ "date": 21,
1748+ "hours": 18,
1749+ "minutes": 59
1750+ },
1751+ "timestamp": 1395424800,
1752+ "metric": {
1753+ "tempMin": 6,
1754+ "tempMax": 12,
1755+ "windSpeed": 20
1756+ },
1757+ "imperial": {
1758+ "tempMin": 42.8,
1759+ "tempMax": 53.6,
1760+ "windSpeed": 12.42
1761+ },
1762+ "precipType": "rain",
1763+ "propPrecip": 20,
1764+ "pressure": null,
1765+ "humidity": 45,
1766+ "icon": "cloud_sun",
1767+ "condition": "Partly Cloudy",
1768+ "windDeg": 186,
1769+ "windDir": "S",
1770+ "uv": 2,
1771+ "hourly": []
1772+ },
1773+ {
1774+ "date": {
1775+ "year": 2014,
1776+ "month": 2,
1777+ "date": 22,
1778+ "hours": 18,
1779+ "minutes": 59
1780+ },
1781+ "timestamp": 1395511200,
1782+ "metric": {
1783+ "tempMin": 5,
1784+ "tempMax": 13,
1785+ "windSpeed": 24
1786+ },
1787+ "imperial": {
1788+ "tempMin": 41,
1789+ "tempMax": 55.400000000000006,
1790+ "windSpeed": 14.904
1791+ },
1792+ "precipType": "rain",
1793+ "propPrecip": 10,
1794+ "pressure": null,
1795+ "humidity": 72,
1796+ "icon": "cloud_sun",
1797+ "condition": "Partly Cloudy",
1798+ "windDeg": 229,
1799+ "windDir": "SW",
1800+ "uv": 2,
1801+ "hourly": []
1802+ },
1803+ {
1804+ "date": {
1805+ "year": 2014,
1806+ "month": 2,
1807+ "date": 23,
1808+ "hours": 18,
1809+ "minutes": 59
1810+ },
1811+ "timestamp": 1395597600,
1812+ "metric": {
1813+ "tempMin": 3,
1814+ "tempMax": 11,
1815+ "windSpeed": 20
1816+ },
1817+ "imperial": {
1818+ "tempMin": 37.4,
1819+ "tempMax": 51.8,
1820+ "windSpeed": 12.42
1821+ },
1822+ "precipType": "rain",
1823+ "propPrecip": 40,
1824+ "pressure": null,
1825+ "humidity": 76,
1826+ "icon": "rain",
1827+ "condition": "Showers",
1828+ "windDeg": 241,
1829+ "windDir": "WSW",
1830+ "uv": 2,
1831+ "hourly": []
1832+ },
1833+ {
1834+ "date": {
1835+ "year": 2014,
1836+ "month": 2,
1837+ "date": 24,
1838+ "hours": 18,
1839+ "minutes": 59
1840+ },
1841+ "timestamp": 1395684000,
1842+ "metric": {
1843+ "tempMin": 3,
1844+ "tempMax": 11,
1845+ "windSpeed": 17
1846+ },
1847+ "imperial": {
1848+ "tempMin": 37.4,
1849+ "tempMax": 51.8,
1850+ "windSpeed": 10.557
1851+ },
1852+ "precipType": "rain",
1853+ "propPrecip": 20,
1854+ "pressure": null,
1855+ "humidity": 75,
1856+ "icon": "cloud_sun",
1857+ "condition": "Mostly Cloudy",
1858+ "windDeg": 245,
1859+ "windDir": "WSW",
1860+ "uv": 2,
1861+ "hourly": []
1862+ }
1863+ ],
1864+ "save": true,
1865+ "updated": 1394894538202
1866+}
1867
1868=== added file 'tests/autopilot/ubuntu_weather_app/files/legacy/2.json'
1869--- tests/autopilot/ubuntu_weather_app/files/legacy/2.json 1970-01-01 00:00:00 +0000
1870+++ tests/autopilot/ubuntu_weather_app/files/legacy/2.json 2015-08-27 13:48:14 +0000
1871@@ -0,0 +1,1710 @@
1872+{
1873+ "location": {
1874+ "coord": {
1875+ "lat": "51.50853",
1876+ "lon": "-0.12574"
1877+ },
1878+ "timezone": {
1879+ "dstOffset": 1,
1880+ "gmtOffset": 0,
1881+ "timeZoneId": "Europe/London"
1882+ },
1883+ "areaLabel": "England, Greater London, United Kingdom",
1884+ "population": 7556900,
1885+ "adminName2": "Greater London",
1886+ "name": "London",
1887+ "country": "GB",
1888+ "countryName": "United Kingdom",
1889+ "adminName1": "England",
1890+ "adminName3": "",
1891+ "services": {
1892+ "geonames": 2643743,
1893+ "weatherchannel": "UKXX0085"
1894+ },
1895+ "dbId": 0
1896+ },
1897+ "db": {
1898+ "id": 3,
1899+ "updated": "2014-03-15T14:43:17.704Z"
1900+ },
1901+ "format": 20140315,
1902+ "data": [
1903+ {
1904+ "date": {
1905+ "year": 2014,
1906+ "month": 2,
1907+ "date": 15,
1908+ "hours": 18,
1909+ "minutes": 59
1910+ },
1911+ "timestamp": 1394910000,
1912+ "metric": {
1913+ "tempMin": 8,
1914+ "tempMax": 17,
1915+ "windSpeed": 22
1916+ },
1917+ "imperial": {
1918+ "tempMin": 46.4,
1919+ "tempMax": 62.6,
1920+ "windSpeed": 13.661999999999999
1921+ },
1922+ "precipType": "rain",
1923+ "propPrecip": 0,
1924+ "pressure": null,
1925+ "humidity": 48,
1926+ "icon": "cloud_sun",
1927+ "condition": "Mostly Sunny",
1928+ "windDeg": 285,
1929+ "windDir": "WNW",
1930+ "uv": 2,
1931+ "hourly": [
1932+ {
1933+ "timestamp": 1394895600,
1934+ "date": {
1935+ "year": 2014,
1936+ "month": 2,
1937+ "date": 15,
1938+ "hours": 15,
1939+ "minutes": 0
1940+ },
1941+ "metric": {
1942+ "temp": 17,
1943+ "tempFeels": 17,
1944+ "windSpeed": 22
1945+ },
1946+ "imperial": {
1947+ "temp": 62.6,
1948+ "tempFeels": 62.6,
1949+ "windSpeed": 13.661999999999999
1950+ },
1951+ "precipType": "rain",
1952+ "propPrecip": null,
1953+ "humidity": 44,
1954+ "windDeg": 288,
1955+ "windDir": "WNW",
1956+ "icon": "cloud_sun",
1957+ "condition": "Mostly Sunny",
1958+ "uv": 1
1959+ },
1960+ {
1961+ "timestamp": 1394899200,
1962+ "date": {
1963+ "year": 2014,
1964+ "month": 2,
1965+ "date": 15,
1966+ "hours": 16,
1967+ "minutes": 0
1968+ },
1969+ "metric": {
1970+ "temp": 16,
1971+ "tempFeels": 16,
1972+ "windSpeed": 20
1973+ },
1974+ "imperial": {
1975+ "temp": 60.8,
1976+ "tempFeels": 60.8,
1977+ "windSpeed": 12.42
1978+ },
1979+ "precipType": "rain",
1980+ "propPrecip": null,
1981+ "humidity": 48,
1982+ "windDeg": 285,
1983+ "windDir": "WNW",
1984+ "icon": "cloud_sun",
1985+ "condition": "Mostly Sunny",
1986+ "uv": 0
1987+ },
1988+ {
1989+ "timestamp": 1394902800,
1990+ "date": {
1991+ "year": 2014,
1992+ "month": 2,
1993+ "date": 15,
1994+ "hours": 17,
1995+ "minutes": 0
1996+ },
1997+ "metric": {
1998+ "temp": 16,
1999+ "tempFeels": 16,
2000+ "windSpeed": 19
2001+ },
2002+ "imperial": {
2003+ "temp": 60.8,
2004+ "tempFeels": 60.8,
2005+ "windSpeed": 11.799
2006+ },
2007+ "precipType": "rain",
2008+ "propPrecip": null,
2009+ "humidity": 52,
2010+ "windDeg": 282,
2011+ "windDir": "WNW",
2012+ "icon": "cloud_sun",
2013+ "condition": "Mostly Sunny",
2014+ "uv": 0
2015+ },
2016+ {
2017+ "timestamp": 1394906400,
2018+ "date": {
2019+ "year": 2014,
2020+ "month": 2,
2021+ "date": 15,
2022+ "hours": 18,
2023+ "minutes": 0
2024+ },
2025+ "metric": {
2026+ "temp": 15,
2027+ "tempFeels": 14,
2028+ "windSpeed": 17
2029+ },
2030+ "imperial": {
2031+ "temp": 59,
2032+ "tempFeels": 57.2,
2033+ "windSpeed": 10.557
2034+ },
2035+ "precipType": "rain",
2036+ "propPrecip": null,
2037+ "humidity": 55,
2038+ "windDeg": 280,
2039+ "windDir": "W",
2040+ "icon": "cloud_sun",
2041+ "condition": "Mostly Sunny",
2042+ "uv": 0
2043+ },
2044+ {
2045+ "timestamp": 1394910000,
2046+ "date": {
2047+ "year": 2014,
2048+ "month": 2,
2049+ "date": 15,
2050+ "hours": 19,
2051+ "minutes": 0
2052+ },
2053+ "metric": {
2054+ "temp": 14,
2055+ "tempFeels": 13,
2056+ "windSpeed": 17
2057+ },
2058+ "imperial": {
2059+ "temp": 57.2,
2060+ "tempFeels": 55.400000000000006,
2061+ "windSpeed": 10.557
2062+ },
2063+ "precipType": "rain",
2064+ "propPrecip": null,
2065+ "humidity": 60,
2066+ "windDeg": 281,
2067+ "windDir": "W",
2068+ "icon": "cloud_moon",
2069+ "condition": "Mostly Clear",
2070+ "uv": 0
2071+ },
2072+ {
2073+ "timestamp": 1394913600,
2074+ "date": {
2075+ "year": 2014,
2076+ "month": 2,
2077+ "date": 15,
2078+ "hours": 20,
2079+ "minutes": 0
2080+ },
2081+ "metric": {
2082+ "temp": 12,
2083+ "tempFeels": 11,
2084+ "windSpeed": 16
2085+ },
2086+ "imperial": {
2087+ "temp": 53.6,
2088+ "tempFeels": 51.8,
2089+ "windSpeed": 9.936
2090+ },
2091+ "precipType": "rain",
2092+ "propPrecip": null,
2093+ "humidity": 66,
2094+ "windDeg": 283,
2095+ "windDir": "WNW",
2096+ "icon": "moon",
2097+ "condition": "Clear",
2098+ "uv": 0
2099+ },
2100+ {
2101+ "timestamp": 1394917200,
2102+ "date": {
2103+ "year": 2014,
2104+ "month": 2,
2105+ "date": 15,
2106+ "hours": 21,
2107+ "minutes": 0
2108+ },
2109+ "metric": {
2110+ "temp": 11,
2111+ "tempFeels": 10,
2112+ "windSpeed": 16
2113+ },
2114+ "imperial": {
2115+ "temp": 51.8,
2116+ "tempFeels": 50,
2117+ "windSpeed": 9.936
2118+ },
2119+ "precipType": "rain",
2120+ "propPrecip": null,
2121+ "humidity": 69,
2122+ "windDeg": 283,
2123+ "windDir": "WNW",
2124+ "icon": "moon",
2125+ "condition": "Clear",
2126+ "uv": 0
2127+ },
2128+ {
2129+ "timestamp": 1394920800,
2130+ "date": {
2131+ "year": 2014,
2132+ "month": 2,
2133+ "date": 15,
2134+ "hours": 22,
2135+ "minutes": 0
2136+ },
2137+ "metric": {
2138+ "temp": 10,
2139+ "tempFeels": 8,
2140+ "windSpeed": 16
2141+ },
2142+ "imperial": {
2143+ "temp": 50,
2144+ "tempFeels": 46.4,
2145+ "windSpeed": 9.936
2146+ },
2147+ "precipType": "rain",
2148+ "propPrecip": null,
2149+ "humidity": 74,
2150+ "windDeg": 280,
2151+ "windDir": "W",
2152+ "icon": "moon",
2153+ "condition": "Clear",
2154+ "uv": 0
2155+ },
2156+ {
2157+ "timestamp": 1394924400,
2158+ "date": {
2159+ "year": 2014,
2160+ "month": 2,
2161+ "date": 15,
2162+ "hours": 23,
2163+ "minutes": 0
2164+ },
2165+ "metric": {
2166+ "temp": 10,
2167+ "tempFeels": 8,
2168+ "windSpeed": 14
2169+ },
2170+ "imperial": {
2171+ "temp": 50,
2172+ "tempFeels": 46.4,
2173+ "windSpeed": 8.693999999999999
2174+ },
2175+ "precipType": "rain",
2176+ "propPrecip": null,
2177+ "humidity": 74,
2178+ "windDeg": 276,
2179+ "windDir": "W",
2180+ "icon": "moon",
2181+ "condition": "Clear",
2182+ "uv": 0
2183+ }
2184+ ],
2185+ "current": {
2186+ "timestamp": "1394893200",
2187+ "date": {
2188+ "year": 2014,
2189+ "month": 2,
2190+ "date": 15,
2191+ "hours": 18,
2192+ "minutes": 59
2193+ },
2194+ "metric": {
2195+ "temp": 17,
2196+ "tempFeels": 17,
2197+ "windSpeed": 22
2198+ },
2199+ "imperial": {
2200+ "temp": 62.6,
2201+ "tempFeels": 62.6,
2202+ "windSpeed": 13.661999999999999
2203+ },
2204+ "precipType": null,
2205+ "propPrecip": null,
2206+ "humidity": 37,
2207+ "pressure": "1025.06",
2208+ "windDeg": 280,
2209+ "windDir": "W",
2210+ "condition": "N/A",
2211+ "uv": 0
2212+ }
2213+ },
2214+ {
2215+ "date": {
2216+ "year": 2014,
2217+ "month": 2,
2218+ "date": 16,
2219+ "hours": 18,
2220+ "minutes": 59
2221+ },
2222+ "timestamp": 1394996400,
2223+ "metric": {
2224+ "tempMin": 6,
2225+ "tempMax": 17,
2226+ "windSpeed": 20
2227+ },
2228+ "imperial": {
2229+ "tempMin": 42.8,
2230+ "tempMax": 62.6,
2231+ "windSpeed": 12.42
2232+ },
2233+ "precipType": "rain",
2234+ "propPrecip": 0,
2235+ "pressure": null,
2236+ "humidity": 62,
2237+ "icon": "sun",
2238+ "condition": "Sunny",
2239+ "windDeg": 288,
2240+ "windDir": "WNW",
2241+ "uv": 2,
2242+ "hourly": [
2243+ {
2244+ "timestamp": 1394928000,
2245+ "date": {
2246+ "year": 2014,
2247+ "month": 2,
2248+ "date": 16,
2249+ "hours": 0,
2250+ "minutes": 0
2251+ },
2252+ "metric": {
2253+ "temp": 10,
2254+ "tempFeels": 7,
2255+ "windSpeed": 14
2256+ },
2257+ "imperial": {
2258+ "temp": 50,
2259+ "tempFeels": 44.6,
2260+ "windSpeed": 8.693999999999999
2261+ },
2262+ "precipType": "rain",
2263+ "propPrecip": null,
2264+ "humidity": 77,
2265+ "windDeg": 274,
2266+ "windDir": "W",
2267+ "icon": "moon",
2268+ "condition": "Clear",
2269+ "uv": 0
2270+ },
2271+ {
2272+ "timestamp": 1394931600,
2273+ "date": {
2274+ "year": 2014,
2275+ "month": 2,
2276+ "date": 16,
2277+ "hours": 1,
2278+ "minutes": 0
2279+ },
2280+ "metric": {
2281+ "temp": 10,
2282+ "tempFeels": 7,
2283+ "windSpeed": 14
2284+ },
2285+ "imperial": {
2286+ "temp": 50,
2287+ "tempFeels": 44.6,
2288+ "windSpeed": 8.693999999999999
2289+ },
2290+ "precipType": "rain",
2291+ "propPrecip": null,
2292+ "humidity": 77,
2293+ "windDeg": 276,
2294+ "windDir": "W",
2295+ "icon": "moon",
2296+ "condition": "Clear",
2297+ "uv": 0
2298+ },
2299+ {
2300+ "timestamp": 1394935200,
2301+ "date": {
2302+ "year": 2014,
2303+ "month": 2,
2304+ "date": 16,
2305+ "hours": 2,
2306+ "minutes": 0
2307+ },
2308+ "metric": {
2309+ "temp": 9,
2310+ "tempFeels": 7,
2311+ "windSpeed": 16
2312+ },
2313+ "imperial": {
2314+ "temp": 48.2,
2315+ "tempFeels": 44.6,
2316+ "windSpeed": 9.936
2317+ },
2318+ "precipType": "rain",
2319+ "propPrecip": null,
2320+ "humidity": 80,
2321+ "windDeg": 279,
2322+ "windDir": "W",
2323+ "icon": "cloud_moon",
2324+ "condition": "Partly Cloudy",
2325+ "uv": 0
2326+ },
2327+ {
2328+ "timestamp": 1394938800,
2329+ "date": {
2330+ "year": 2014,
2331+ "month": 2,
2332+ "date": 16,
2333+ "hours": 3,
2334+ "minutes": 0
2335+ },
2336+ "metric": {
2337+ "temp": 9,
2338+ "tempFeels": 7,
2339+ "windSpeed": 16
2340+ },
2341+ "imperial": {
2342+ "temp": 48.2,
2343+ "tempFeels": 44.6,
2344+ "windSpeed": 9.936
2345+ },
2346+ "precipType": "rain",
2347+ "propPrecip": null,
2348+ "humidity": 80,
2349+ "windDeg": 283,
2350+ "windDir": "WNW",
2351+ "icon": "cloud_moon",
2352+ "condition": "Partly Cloudy",
2353+ "uv": 0
2354+ },
2355+ {
2356+ "timestamp": 1394942400,
2357+ "date": {
2358+ "year": 2014,
2359+ "month": 2,
2360+ "date": 16,
2361+ "hours": 4,
2362+ "minutes": 0
2363+ },
2364+ "metric": {
2365+ "temp": 8,
2366+ "tempFeels": 6,
2367+ "windSpeed": 14
2368+ },
2369+ "imperial": {
2370+ "temp": 46.4,
2371+ "tempFeels": 42.8,
2372+ "windSpeed": 8.693999999999999
2373+ },
2374+ "precipType": "rain",
2375+ "propPrecip": null,
2376+ "humidity": 83,
2377+ "windDeg": 285,
2378+ "windDir": "WNW",
2379+ "icon": "cloud_moon",
2380+ "condition": "Partly Cloudy",
2381+ "uv": 0
2382+ },
2383+ {
2384+ "timestamp": 1394946000,
2385+ "date": {
2386+ "year": 2014,
2387+ "month": 2,
2388+ "date": 16,
2389+ "hours": 5,
2390+ "minutes": 0
2391+ },
2392+ "metric": {
2393+ "temp": 8,
2394+ "tempFeels": 6,
2395+ "windSpeed": 14
2396+ },
2397+ "imperial": {
2398+ "temp": 46.4,
2399+ "tempFeels": 42.8,
2400+ "windSpeed": 8.693999999999999
2401+ },
2402+ "precipType": "rain",
2403+ "propPrecip": null,
2404+ "humidity": 80,
2405+ "windDeg": 285,
2406+ "windDir": "WNW",
2407+ "icon": "moon",
2408+ "condition": "Clear",
2409+ "uv": 0
2410+ },
2411+ {
2412+ "timestamp": 1394949600,
2413+ "date": {
2414+ "year": 2014,
2415+ "month": 2,
2416+ "date": 16,
2417+ "hours": 6,
2418+ "minutes": 0
2419+ },
2420+ "metric": {
2421+ "temp": 8,
2422+ "tempFeels": 6,
2423+ "windSpeed": 12
2424+ },
2425+ "imperial": {
2426+ "temp": 46.4,
2427+ "tempFeels": 42.8,
2428+ "windSpeed": 7.452
2429+ },
2430+ "precipType": "rain",
2431+ "propPrecip": null,
2432+ "humidity": 80,
2433+ "windDeg": 285,
2434+ "windDir": "WNW",
2435+ "icon": "moon",
2436+ "condition": "Clear",
2437+ "uv": 0
2438+ },
2439+ {
2440+ "timestamp": 1394953200,
2441+ "date": {
2442+ "year": 2014,
2443+ "month": 2,
2444+ "date": 16,
2445+ "hours": 7,
2446+ "minutes": 0
2447+ },
2448+ "metric": {
2449+ "temp": 9,
2450+ "tempFeels": 7,
2451+ "windSpeed": 14
2452+ },
2453+ "imperial": {
2454+ "temp": 48.2,
2455+ "tempFeels": 44.6,
2456+ "windSpeed": 8.693999999999999
2457+ },
2458+ "precipType": "rain",
2459+ "propPrecip": null,
2460+ "humidity": 77,
2461+ "windDeg": 285,
2462+ "windDir": "WNW",
2463+ "icon": "sun",
2464+ "condition": "Sunny",
2465+ "uv": 0
2466+ },
2467+ {
2468+ "timestamp": 1394956800,
2469+ "date": {
2470+ "year": 2014,
2471+ "month": 2,
2472+ "date": 16,
2473+ "hours": 8,
2474+ "minutes": 0
2475+ },
2476+ "metric": {
2477+ "temp": 10,
2478+ "tempFeels": 7,
2479+ "windSpeed": 16
2480+ },
2481+ "imperial": {
2482+ "temp": 50,
2483+ "tempFeels": 44.6,
2484+ "windSpeed": 9.936
2485+ },
2486+ "precipType": "rain",
2487+ "propPrecip": null,
2488+ "humidity": 74,
2489+ "windDeg": 285,
2490+ "windDir": "WNW",
2491+ "icon": "sun",
2492+ "condition": "Sunny",
2493+ "uv": 0
2494+ },
2495+ {
2496+ "timestamp": 1394960400,
2497+ "date": {
2498+ "year": 2014,
2499+ "month": 2,
2500+ "date": 16,
2501+ "hours": 9,
2502+ "minutes": 0
2503+ },
2504+ "metric": {
2505+ "temp": 11,
2506+ "tempFeels": 8,
2507+ "windSpeed": 17
2508+ },
2509+ "imperial": {
2510+ "temp": 51.8,
2511+ "tempFeels": 46.4,
2512+ "windSpeed": 10.557
2513+ },
2514+ "precipType": "rain",
2515+ "propPrecip": null,
2516+ "humidity": 69,
2517+ "windDeg": 285,
2518+ "windDir": "WNW",
2519+ "icon": "sun",
2520+ "condition": "Sunny",
2521+ "uv": 1
2522+ },
2523+ {
2524+ "timestamp": 1394964000,
2525+ "date": {
2526+ "year": 2014,
2527+ "month": 2,
2528+ "date": 16,
2529+ "hours": 10,
2530+ "minutes": 0
2531+ },
2532+ "metric": {
2533+ "temp": 12,
2534+ "tempFeels": 10,
2535+ "windSpeed": 19
2536+ },
2537+ "imperial": {
2538+ "temp": 53.6,
2539+ "tempFeels": 50,
2540+ "windSpeed": 11.799
2541+ },
2542+ "precipType": "rain",
2543+ "propPrecip": null,
2544+ "humidity": 64,
2545+ "windDeg": 284,
2546+ "windDir": "WNW",
2547+ "icon": "sun",
2548+ "condition": "Sunny",
2549+ "uv": 2
2550+ },
2551+ {
2552+ "timestamp": 1394967600,
2553+ "date": {
2554+ "year": 2014,
2555+ "month": 2,
2556+ "date": 16,
2557+ "hours": 11,
2558+ "minutes": 0
2559+ },
2560+ "metric": {
2561+ "temp": 13,
2562+ "tempFeels": 11,
2563+ "windSpeed": 19
2564+ },
2565+ "imperial": {
2566+ "temp": 55.400000000000006,
2567+ "tempFeels": 51.8,
2568+ "windSpeed": 11.799
2569+ },
2570+ "precipType": "rain",
2571+ "propPrecip": null,
2572+ "humidity": 62,
2573+ "windDeg": 283,
2574+ "windDir": "WNW",
2575+ "icon": "sun",
2576+ "condition": "Sunny",
2577+ "uv": 2
2578+ },
2579+ {
2580+ "timestamp": 1394971200,
2581+ "date": {
2582+ "year": 2014,
2583+ "month": 2,
2584+ "date": 16,
2585+ "hours": 12,
2586+ "minutes": 0
2587+ },
2588+ "metric": {
2589+ "temp": 14,
2590+ "tempFeels": 12,
2591+ "windSpeed": 20
2592+ },
2593+ "imperial": {
2594+ "temp": 57.2,
2595+ "tempFeels": 53.6,
2596+ "windSpeed": 12.42
2597+ },
2598+ "precipType": "rain",
2599+ "propPrecip": null,
2600+ "humidity": 57,
2601+ "windDeg": 284,
2602+ "windDir": "WNW",
2603+ "icon": "sun",
2604+ "condition": "Sunny",
2605+ "uv": 2
2606+ },
2607+ {
2608+ "timestamp": 1394974800,
2609+ "date": {
2610+ "year": 2014,
2611+ "month": 2,
2612+ "date": 16,
2613+ "hours": 13,
2614+ "minutes": 0
2615+ },
2616+ "metric": {
2617+ "temp": 15,
2618+ "tempFeels": 13,
2619+ "windSpeed": 20
2620+ },
2621+ "imperial": {
2622+ "temp": 59,
2623+ "tempFeels": 55.400000000000006,
2624+ "windSpeed": 12.42
2625+ },
2626+ "precipType": "rain",
2627+ "propPrecip": null,
2628+ "humidity": 57,
2629+ "windDeg": 286,
2630+ "windDir": "WNW",
2631+ "icon": "sun",
2632+ "condition": "Sunny",
2633+ "uv": 2
2634+ },
2635+ {
2636+ "timestamp": 1394978400,
2637+ "date": {
2638+ "year": 2014,
2639+ "month": 2,
2640+ "date": 16,
2641+ "hours": 14,
2642+ "minutes": 0
2643+ },
2644+ "metric": {
2645+ "temp": 16,
2646+ "tempFeels": 16,
2647+ "windSpeed": 20
2648+ },
2649+ "imperial": {
2650+ "temp": 60.8,
2651+ "tempFeels": 60.8,
2652+ "windSpeed": 12.42
2653+ },
2654+ "precipType": "rain",
2655+ "propPrecip": null,
2656+ "humidity": 54,
2657+ "windDeg": 289,
2658+ "windDir": "WNW",
2659+ "icon": "sun",
2660+ "condition": "Sunny",
2661+ "uv": 2
2662+ },
2663+ {
2664+ "timestamp": 1394982000,
2665+ "date": {
2666+ "year": 2014,
2667+ "month": 2,
2668+ "date": 16,
2669+ "hours": 15,
2670+ "minutes": 0
2671+ },
2672+ "metric": {
2673+ "temp": 16,
2674+ "tempFeels": 16,
2675+ "windSpeed": 20
2676+ },
2677+ "imperial": {
2678+ "temp": 60.8,
2679+ "tempFeels": 60.8,
2680+ "windSpeed": 12.42
2681+ },
2682+ "precipType": "rain",
2683+ "propPrecip": null,
2684+ "humidity": 56,
2685+ "windDeg": 291,
2686+ "windDir": "WNW",
2687+ "icon": "sun",
2688+ "condition": "Sunny",
2689+ "uv": 1
2690+ },
2691+ {
2692+ "timestamp": 1394985600,
2693+ "date": {
2694+ "year": 2014,
2695+ "month": 2,
2696+ "date": 16,
2697+ "hours": 16,
2698+ "minutes": 0
2699+ },
2700+ "metric": {
2701+ "temp": 16,
2702+ "tempFeels": 16,
2703+ "windSpeed": 19
2704+ },
2705+ "imperial": {
2706+ "temp": 60.8,
2707+ "tempFeels": 60.8,
2708+ "windSpeed": 11.799
2709+ },
2710+ "precipType": "rain",
2711+ "propPrecip": null,
2712+ "humidity": 58,
2713+ "windDeg": 291,
2714+ "windDir": "WNW",
2715+ "icon": "sun",
2716+ "condition": "Sunny",
2717+ "uv": 0
2718+ },
2719+ {
2720+ "timestamp": 1394989200,
2721+ "date": {
2722+ "year": 2014,
2723+ "month": 2,
2724+ "date": 16,
2725+ "hours": 17,
2726+ "minutes": 0
2727+ },
2728+ "metric": {
2729+ "temp": 15,
2730+ "tempFeels": 14,
2731+ "windSpeed": 16
2732+ },
2733+ "imperial": {
2734+ "temp": 59,
2735+ "tempFeels": 57.2,
2736+ "windSpeed": 9.936
2737+ },
2738+ "precipType": "rain",
2739+ "propPrecip": null,
2740+ "humidity": 60,
2741+ "windDeg": 289,
2742+ "windDir": "WNW",
2743+ "icon": "sun",
2744+ "condition": "Sunny",
2745+ "uv": 0
2746+ },
2747+ {
2748+ "timestamp": 1394992800,
2749+ "date": {
2750+ "year": 2014,
2751+ "month": 2,
2752+ "date": 16,
2753+ "hours": 18,
2754+ "minutes": 0
2755+ },
2756+ "metric": {
2757+ "temp": 15,
2758+ "tempFeels": 13,
2759+ "windSpeed": 14
2760+ },
2761+ "imperial": {
2762+ "temp": 59,
2763+ "tempFeels": 55.400000000000006,
2764+ "windSpeed": 8.693999999999999
2765+ },
2766+ "precipType": "rain",
2767+ "propPrecip": null,
2768+ "humidity": 62,
2769+ "windDeg": 288,
2770+ "windDir": "WNW",
2771+ "icon": "sun",
2772+ "condition": "Sunny",
2773+ "uv": 0
2774+ },
2775+ {
2776+ "timestamp": 1394996400,
2777+ "date": {
2778+ "year": 2014,
2779+ "month": 2,
2780+ "date": 16,
2781+ "hours": 19,
2782+ "minutes": 0
2783+ },
2784+ "metric": {
2785+ "temp": 13,
2786+ "tempFeels": 12,
2787+ "windSpeed": 12
2788+ },
2789+ "imperial": {
2790+ "temp": 55.400000000000006,
2791+ "tempFeels": 53.6,
2792+ "windSpeed": 7.452
2793+ },
2794+ "precipType": "rain",
2795+ "propPrecip": null,
2796+ "humidity": 67,
2797+ "windDeg": 287,
2798+ "windDir": "WNW",
2799+ "icon": "moon",
2800+ "condition": "Clear",
2801+ "uv": 0
2802+ },
2803+ {
2804+ "timestamp": 1395000000,
2805+ "date": {
2806+ "year": 2014,
2807+ "month": 2,
2808+ "date": 16,
2809+ "hours": 20,
2810+ "minutes": 0
2811+ },
2812+ "metric": {
2813+ "temp": 12,
2814+ "tempFeels": 11,
2815+ "windSpeed": 12
2816+ },
2817+ "imperial": {
2818+ "temp": 53.6,
2819+ "tempFeels": 51.8,
2820+ "windSpeed": 7.452
2821+ },
2822+ "precipType": "rain",
2823+ "propPrecip": null,
2824+ "humidity": 72,
2825+ "windDeg": 287,
2826+ "windDir": "WNW",
2827+ "icon": "cloud_moon",
2828+ "condition": "Mostly Clear",
2829+ "uv": 0
2830+ },
2831+ {
2832+ "timestamp": 1395003600,
2833+ "date": {
2834+ "year": 2014,
2835+ "month": 2,
2836+ "date": 16,
2837+ "hours": 21,
2838+ "minutes": 0
2839+ },
2840+ "metric": {
2841+ "temp": 11,
2842+ "tempFeels": 10,
2843+ "windSpeed": 11
2844+ },
2845+ "imperial": {
2846+ "temp": 51.8,
2847+ "tempFeels": 50,
2848+ "windSpeed": 6.8309999999999995
2849+ },
2850+ "precipType": "rain",
2851+ "propPrecip": null,
2852+ "humidity": 74,
2853+ "windDeg": 284,
2854+ "windDir": "WNW",
2855+ "icon": "cloud_moon",
2856+ "condition": "Mostly Clear",
2857+ "uv": 0
2858+ },
2859+ {
2860+ "timestamp": 1395007200,
2861+ "date": {
2862+ "year": 2014,
2863+ "month": 2,
2864+ "date": 16,
2865+ "hours": 22,
2866+ "minutes": 0
2867+ },
2868+ "metric": {
2869+ "temp": 10,
2870+ "tempFeels": 8,
2871+ "windSpeed": 11
2872+ },
2873+ "imperial": {
2874+ "temp": 50,
2875+ "tempFeels": 46.4,
2876+ "windSpeed": 6.8309999999999995
2877+ },
2878+ "precipType": "rain",
2879+ "propPrecip": 10,
2880+ "humidity": 77,
2881+ "windDeg": 279,
2882+ "windDir": "W",
2883+ "icon": "cloud_moon",
2884+ "condition": "Mostly Clear",
2885+ "uv": 0
2886+ },
2887+ {
2888+ "timestamp": 1395010800,
2889+ "date": {
2890+ "year": 2014,
2891+ "month": 2,
2892+ "date": 16,
2893+ "hours": 23,
2894+ "minutes": 0
2895+ },
2896+ "metric": {
2897+ "temp": 10,
2898+ "tempFeels": 8,
2899+ "windSpeed": 9
2900+ },
2901+ "imperial": {
2902+ "temp": 50,
2903+ "tempFeels": 46.4,
2904+ "windSpeed": 5.589
2905+ },
2906+ "precipType": "rain",
2907+ "propPrecip": 10,
2908+ "humidity": 80,
2909+ "windDeg": 273,
2910+ "windDir": "W",
2911+ "icon": "cloud_moon",
2912+ "condition": "Partly Cloudy",
2913+ "uv": 0
2914+ }
2915+ ]
2916+ },
2917+ {
2918+ "date": {
2919+ "year": 2014,
2920+ "month": 2,
2921+ "date": 17,
2922+ "hours": 18,
2923+ "minutes": 59
2924+ },
2925+ "timestamp": 1395082800,
2926+ "metric": {
2927+ "tempMin": 6,
2928+ "tempMax": 15,
2929+ "windSpeed": 14
2930+ },
2931+ "imperial": {
2932+ "tempMin": 42.8,
2933+ "tempMax": 59,
2934+ "windSpeed": 8.693999999999999
2935+ },
2936+ "precipType": "rain",
2937+ "propPrecip": 0,
2938+ "pressure": null,
2939+ "humidity": 71,
2940+ "icon": "cloud_sun",
2941+ "condition": "Partly Cloudy",
2942+ "windDeg": 270,
2943+ "windDir": "W",
2944+ "uv": 2,
2945+ "hourly": [
2946+ {
2947+ "timestamp": 1395014400,
2948+ "date": {
2949+ "year": 2014,
2950+ "month": 2,
2951+ "date": 17,
2952+ "hours": 0,
2953+ "minutes": 0
2954+ },
2955+ "metric": {
2956+ "temp": 9,
2957+ "tempFeels": 7,
2958+ "windSpeed": 9
2959+ },
2960+ "imperial": {
2961+ "temp": 48.2,
2962+ "tempFeels": 44.6,
2963+ "windSpeed": 5.589
2964+ },
2965+ "precipType": "rain",
2966+ "propPrecip": 10,
2967+ "humidity": 80,
2968+ "windDeg": 269,
2969+ "windDir": "W",
2970+ "icon": "cloud_moon",
2971+ "condition": "Partly Cloudy",
2972+ "uv": 0
2973+ },
2974+ {
2975+ "timestamp": 1395018000,
2976+ "date": {
2977+ "year": 2014,
2978+ "month": 2,
2979+ "date": 17,
2980+ "hours": 1,
2981+ "minutes": 0
2982+ },
2983+ "metric": {
2984+ "temp": 8,
2985+ "tempFeels": 7,
2986+ "windSpeed": 9
2987+ },
2988+ "imperial": {
2989+ "temp": 46.4,
2990+ "tempFeels": 44.6,
2991+ "windSpeed": 5.589
2992+ },
2993+ "precipType": "rain",
2994+ "propPrecip": 10,
2995+ "humidity": 83,
2996+ "windDeg": 268,
2997+ "windDir": "W",
2998+ "icon": "cloud_moon",
2999+ "condition": "Partly Cloudy",
3000+ "uv": 0
3001+ },
3002+ {
3003+ "timestamp": 1395021600,
3004+ "date": {
3005+ "year": 2014,
3006+ "month": 2,
3007+ "date": 17,
3008+ "hours": 2,
3009+ "minutes": 0
3010+ },
3011+ "metric": {
3012+ "temp": 8,
3013+ "tempFeels": 7,
3014+ "windSpeed": 11
3015+ },
3016+ "imperial": {
3017+ "temp": 46.4,
3018+ "tempFeels": 44.6,
3019+ "windSpeed": 6.8309999999999995
3020+ },
3021+ "precipType": "rain",
3022+ "propPrecip": 10,
3023+ "humidity": 80,
3024+ "windDeg": 270,
3025+ "windDir": "W",
3026+ "icon": "cloud_moon",
3027+ "condition": "Partly Cloudy",
3028+ "uv": 0
3029+ },
3030+ {
3031+ "timestamp": 1395025200,
3032+ "date": {
3033+ "year": 2014,
3034+ "month": 2,
3035+ "date": 17,
3036+ "hours": 3,
3037+ "minutes": 0
3038+ },
3039+ "metric": {
3040+ "temp": 8,
3041+ "tempFeels": 6,
3042+ "windSpeed": 11
3043+ },
3044+ "imperial": {
3045+ "temp": 46.4,
3046+ "tempFeels": 42.8,
3047+ "windSpeed": 6.8309999999999995
3048+ },
3049+ "precipType": "rain",
3050+ "propPrecip": 10,
3051+ "humidity": 83,
3052+ "windDeg": 270,
3053+ "windDir": "W",
3054+ "icon": "cloud_moon",
3055+ "condition": "Partly Cloudy",
3056+ "uv": 0
3057+ },
3058+ {
3059+ "timestamp": 1395028800,
3060+ "date": {
3061+ "year": 2014,
3062+ "month": 2,
3063+ "date": 17,
3064+ "hours": 4,
3065+ "minutes": 0
3066+ },
3067+ "metric": {
3068+ "temp": 7,
3069+ "tempFeels": 5,
3070+ "windSpeed": 11
3071+ },
3072+ "imperial": {
3073+ "temp": 44.6,
3074+ "tempFeels": 41,
3075+ "windSpeed": 6.8309999999999995
3076+ },
3077+ "precipType": "rain",
3078+ "propPrecip": 10,
3079+ "humidity": 83,
3080+ "windDeg": 268,
3081+ "windDir": "W",
3082+ "icon": "cloud_moon",
3083+ "condition": "Partly Cloudy",
3084+ "uv": 0
3085+ },
3086+ {
3087+ "timestamp": 1395032400,
3088+ "date": {
3089+ "year": 2014,
3090+ "month": 2,
3091+ "date": 17,
3092+ "hours": 5,
3093+ "minutes": 0
3094+ },
3095+ "metric": {
3096+ "temp": 7,
3097+ "tempFeels": 5,
3098+ "windSpeed": 11
3099+ },
3100+ "imperial": {
3101+ "temp": 44.6,
3102+ "tempFeels": 41,
3103+ "windSpeed": 6.8309999999999995
3104+ },
3105+ "precipType": "rain",
3106+ "propPrecip": 10,
3107+ "humidity": 83,
3108+ "windDeg": 266,
3109+ "windDir": "W",
3110+ "icon": "cloud_moon",
3111+ "condition": "Partly Cloudy",
3112+ "uv": 0
3113+ },
3114+ {
3115+ "timestamp": 1395036000,
3116+ "date": {
3117+ "year": 2014,
3118+ "month": 2,
3119+ "date": 17,
3120+ "hours": 6,
3121+ "minutes": 0
3122+ },
3123+ "metric": {
3124+ "temp": 7,
3125+ "tempFeels": 5,
3126+ "windSpeed": 11
3127+ },
3128+ "imperial": {
3129+ "temp": 44.6,
3130+ "tempFeels": 41,
3131+ "windSpeed": 6.8309999999999995
3132+ },
3133+ "precipType": "rain",
3134+ "propPrecip": 10,
3135+ "humidity": 83,
3136+ "windDeg": 266,
3137+ "windDir": "W",
3138+ "icon": "cloud_moon",
3139+ "condition": "Partly Cloudy",
3140+ "uv": 0
3141+ },
3142+ {
3143+ "timestamp": 1395039600,
3144+ "date": {
3145+ "year": 2014,
3146+ "month": 2,
3147+ "date": 17,
3148+ "hours": 7,
3149+ "minutes": 0
3150+ },
3151+ "metric": {
3152+ "temp": 7,
3153+ "tempFeels": 5,
3154+ "windSpeed": 11
3155+ },
3156+ "imperial": {
3157+ "temp": 44.6,
3158+ "tempFeels": 41,
3159+ "windSpeed": 6.8309999999999995
3160+ },
3161+ "precipType": "rain",
3162+ "propPrecip": 10,
3163+ "humidity": 83,
3164+ "windDeg": 270,
3165+ "windDir": "W",
3166+ "icon": "cloud_sun",
3167+ "condition": "Partly Cloudy",
3168+ "uv": 0
3169+ },
3170+ {
3171+ "timestamp": 1395043200,
3172+ "date": {
3173+ "year": 2014,
3174+ "month": 2,
3175+ "date": 17,
3176+ "hours": 8,
3177+ "minutes": 0
3178+ },
3179+ "metric": {
3180+ "temp": 7,
3181+ "tempFeels": 5,
3182+ "windSpeed": 12
3183+ },
3184+ "imperial": {
3185+ "temp": 44.6,
3186+ "tempFeels": 41,
3187+ "windSpeed": 7.452
3188+ },
3189+ "precipType": "rain",
3190+ "propPrecip": 10,
3191+ "humidity": 80,
3192+ "windDeg": 277,
3193+ "windDir": "W",
3194+ "icon": "cloud_sun",
3195+ "condition": "Mostly Cloudy",
3196+ "uv": 0
3197+ },
3198+ {
3199+ "timestamp": 1395046800,
3200+ "date": {
3201+ "year": 2014,
3202+ "month": 2,
3203+ "date": 17,
3204+ "hours": 9,
3205+ "minutes": 0
3206+ },
3207+ "metric": {
3208+ "temp": 8,
3209+ "tempFeels": 6,
3210+ "windSpeed": 12
3211+ },
3212+ "imperial": {
3213+ "temp": 46.4,
3214+ "tempFeels": 42.8,
3215+ "windSpeed": 7.452
3216+ },
3217+ "precipType": "rain",
3218+ "propPrecip": 10,
3219+ "humidity": 77,
3220+ "windDeg": 281,
3221+ "windDir": "W",
3222+ "icon": "cloud_sun",
3223+ "condition": "Mostly Cloudy",
3224+ "uv": 1
3225+ },
3226+ {
3227+ "timestamp": 1395050400,
3228+ "date": {
3229+ "year": 2014,
3230+ "month": 2,
3231+ "date": 17,
3232+ "hours": 10,
3233+ "minutes": 0
3234+ },
3235+ "metric": {
3236+ "temp": 10,
3237+ "tempFeels": 8,
3238+ "windSpeed": 12
3239+ },
3240+ "imperial": {
3241+ "temp": 50,
3242+ "tempFeels": 46.4,
3243+ "windSpeed": 7.452
3244+ },
3245+ "precipType": "rain",
3246+ "propPrecip": null,
3247+ "humidity": 71,
3248+ "windDeg": 281,
3249+ "windDir": "W",
3250+ "icon": "cloud_sun",
3251+ "condition": "Mostly Cloudy",
3252+ "uv": 1
3253+ },
3254+ {
3255+ "timestamp": 1395054000,
3256+ "date": {
3257+ "year": 2014,
3258+ "month": 2,
3259+ "date": 17,
3260+ "hours": 11,
3261+ "minutes": 0
3262+ },
3263+ "metric": {
3264+ "temp": 11,
3265+ "tempFeels": 9,
3266+ "windSpeed": 14
3267+ },
3268+ "imperial": {
3269+ "temp": 51.8,
3270+ "tempFeels": 48.2,
3271+ "windSpeed": 8.693999999999999
3272+ },
3273+ "precipType": "rain",
3274+ "propPrecip": null,
3275+ "humidity": 69,
3276+ "windDeg": 278,
3277+ "windDir": "W",
3278+ "icon": "cloud_sun",
3279+ "condition": "Mostly Cloudy",
3280+ "uv": 2
3281+ },
3282+ {
3283+ "timestamp": 1395057600,
3284+ "date": {
3285+ "year": 2014,
3286+ "month": 2,
3287+ "date": 17,
3288+ "hours": 12,
3289+ "minutes": 0
3290+ },
3291+ "metric": {
3292+ "temp": 12,
3293+ "tempFeels": 10,
3294+ "windSpeed": 14
3295+ },
3296+ "imperial": {
3297+ "temp": 53.6,
3298+ "tempFeels": 50,
3299+ "windSpeed": 8.693999999999999
3300+ },
3301+ "precipType": "rain",
3302+ "propPrecip": null,
3303+ "humidity": 64,
3304+ "windDeg": 275,
3305+ "windDir": "W",
3306+ "icon": "cloud_sun",
3307+ "condition": "Mostly Cloudy",
3308+ "uv": 2
3309+ },
3310+ {
3311+ "timestamp": 1395061200,
3312+ "date": {
3313+ "year": 2014,
3314+ "month": 2,
3315+ "date": 17,
3316+ "hours": 13,
3317+ "minutes": 0
3318+ },
3319+ "metric": {
3320+ "temp": 13,
3321+ "tempFeels": 12,
3322+ "windSpeed": 14
3323+ },
3324+ "imperial": {
3325+ "temp": 55.400000000000006,
3326+ "tempFeels": 53.6,
3327+ "windSpeed": 8.693999999999999
3328+ },
3329+ "precipType": "rain",
3330+ "propPrecip": null,
3331+ "humidity": 59,
3332+ "windDeg": 273,
3333+ "windDir": "W",
3334+ "icon": "cloud_sun",
3335+ "condition": "Mostly Cloudy",
3336+ "uv": 1
3337+ },
3338+ {
3339+ "timestamp": 1395064800,
3340+ "date": {
3341+ "year": 2014,
3342+ "month": 2,
3343+ "date": 17,
3344+ "hours": 14,
3345+ "minutes": 0
3346+ },
3347+ "metric": {
3348+ "temp": 13,
3349+ "tempFeels": 12,
3350+ "windSpeed": 14
3351+ },
3352+ "imperial": {
3353+ "temp": 55.400000000000006,
3354+ "tempFeels": 53.6,
3355+ "windSpeed": 8.693999999999999
3356+ },
3357+ "precipType": "rain",
3358+ "propPrecip": null,
3359+ "humidity": 59,
3360+ "windDeg": 272,
3361+ "windDir": "W",
3362+ "icon": "overcast",
3363+ "condition": "Cloudy",
3364+ "uv": 1
3365+ }
3366+ ]
3367+ },
3368+ {
3369+ "date": {
3370+ "year": 2014,
3371+ "month": 2,
3372+ "date": 18,
3373+ "hours": 18,
3374+ "minutes": 59
3375+ },
3376+ "timestamp": 1395169200,
3377+ "metric": {
3378+ "tempMin": 7,
3379+ "tempMax": 13,
3380+ "windSpeed": 24
3381+ },
3382+ "imperial": {
3383+ "tempMin": 44.6,
3384+ "tempMax": 55.400000000000006,
3385+ "windSpeed": 14.904
3386+ },
3387+ "precipType": "rain",
3388+ "propPrecip": 0,
3389+ "pressure": null,
3390+ "humidity": 70,
3391+ "icon": "overcast",
3392+ "condition": "Cloudy",
3393+ "windDeg": 254,
3394+ "windDir": "WSW",
3395+ "uv": 2,
3396+ "hourly": []
3397+ },
3398+ {
3399+ "date": {
3400+ "year": 2014,
3401+ "month": 2,
3402+ "date": 19,
3403+ "hours": 18,
3404+ "minutes": 59
3405+ },
3406+ "timestamp": 1395255600,
3407+ "metric": {
3408+ "tempMin": 6,
3409+ "tempMax": 17,
3410+ "windSpeed": 27
3411+ },
3412+ "imperial": {
3413+ "tempMin": 42.8,
3414+ "tempMax": 62.6,
3415+ "windSpeed": 16.767
3416+ },
3417+ "precipType": "rain",
3418+ "propPrecip": 0,
3419+ "pressure": null,
3420+ "humidity": 67,
3421+ "icon": "overcast",
3422+ "condition": "Cloudy",
3423+ "windDeg": 257,
3424+ "windDir": "WSW",
3425+ "uv": 2,
3426+ "hourly": []
3427+ },
3428+ {
3429+ "date": {
3430+ "year": 2014,
3431+ "month": 2,
3432+ "date": 20,
3433+ "hours": 18,
3434+ "minutes": 59
3435+ },
3436+ "timestamp": 1395342000,
3437+ "metric": {
3438+ "tempMin": 7,
3439+ "tempMax": 16,
3440+ "windSpeed": 24
3441+ },
3442+ "imperial": {
3443+ "tempMin": 44.6,
3444+ "tempMax": 60.8,
3445+ "windSpeed": 14.904
3446+ },
3447+ "precipType": "rain",
3448+ "propPrecip": 10,
3449+ "pressure": null,
3450+ "humidity": 72,
3451+ "icon": "cloud_sun",
3452+ "condition": "Partly Cloudy",
3453+ "windDeg": 215,
3454+ "windDir": "SW",
3455+ "uv": 3,
3456+ "hourly": []
3457+ },
3458+ {
3459+ "date": {
3460+ "year": 2014,
3461+ "month": 2,
3462+ "date": 21,
3463+ "hours": 18,
3464+ "minutes": 59
3465+ },
3466+ "timestamp": 1395428400,
3467+ "metric": {
3468+ "tempMin": 6,
3469+ "tempMax": 15,
3470+ "windSpeed": 24
3471+ },
3472+ "imperial": {
3473+ "tempMin": 42.8,
3474+ "tempMax": 59,
3475+ "windSpeed": 14.904
3476+ },
3477+ "precipType": "rain",
3478+ "propPrecip": 20,
3479+ "pressure": null,
3480+ "humidity": 74,
3481+ "icon": "cloud_sun",
3482+ "condition": "Partly Cloudy",
3483+ "windDeg": 188,
3484+ "windDir": "S",
3485+ "uv": 2,
3486+ "hourly": []
3487+ },
3488+ {
3489+ "date": {
3490+ "year": 2014,
3491+ "month": 2,
3492+ "date": 22,
3493+ "hours": 18,
3494+ "minutes": 59
3495+ },
3496+ "timestamp": 1395514800,
3497+ "metric": {
3498+ "tempMin": 4,
3499+ "tempMax": 11,
3500+ "windSpeed": 24
3501+ },
3502+ "imperial": {
3503+ "tempMin": 39.2,
3504+ "tempMax": 51.8,
3505+ "windSpeed": 14.904
3506+ },
3507+ "precipType": "rain",
3508+ "propPrecip": 10,
3509+ "pressure": null,
3510+ "humidity": 69,
3511+ "icon": "cloud_sun",
3512+ "condition": "Mostly Cloudy",
3513+ "windDeg": 238,
3514+ "windDir": "WSW",
3515+ "uv": 2,
3516+ "hourly": []
3517+ },
3518+ {
3519+ "date": {
3520+ "year": 2014,
3521+ "month": 2,
3522+ "date": 23,
3523+ "hours": 18,
3524+ "minutes": 59
3525+ },
3526+ "timestamp": 1395601200,
3527+ "metric": {
3528+ "tempMin": 5,
3529+ "tempMax": 12,
3530+ "windSpeed": 16
3531+ },
3532+ "imperial": {
3533+ "tempMin": 41,
3534+ "tempMax": 53.6,
3535+ "windSpeed": 9.936
3536+ },
3537+ "precipType": "rain",
3538+ "propPrecip": 10,
3539+ "pressure": null,
3540+ "humidity": 70,
3541+ "icon": "cloud_sun",
3542+ "condition": "Partly Cloudy",
3543+ "windDeg": 250,
3544+ "windDir": "WSW",
3545+ "uv": 3,
3546+ "hourly": []
3547+ },
3548+ {
3549+ "date": {
3550+ "year": 2014,
3551+ "month": 2,
3552+ "date": 24,
3553+ "hours": 18,
3554+ "minutes": 59
3555+ },
3556+ "timestamp": 1395687600,
3557+ "metric": {
3558+ "tempMin": 5,
3559+ "tempMax": 13,
3560+ "windSpeed": 17
3561+ },
3562+ "imperial": {
3563+ "tempMin": 41,
3564+ "tempMax": 55.400000000000006,
3565+ "windSpeed": 10.557
3566+ },
3567+ "precipType": "rain",
3568+ "propPrecip": 20,
3569+ "pressure": null,
3570+ "humidity": 74,
3571+ "icon": "overcast",
3572+ "condition": "Cloudy",
3573+ "windDeg": 216,
3574+ "windDir": "SW",
3575+ "uv": 2,
3576+ "hourly": []
3577+ }
3578+ ],
3579+ "save": true,
3580+ "updated": 1394894610533
3581+}
3582\ No newline at end of file
3583
3584=== modified file 'tests/autopilot/ubuntu_weather_app/tests/__init__.py'
3585--- tests/autopilot/ubuntu_weather_app/tests/__init__.py 2015-07-26 15:23:33 +0000
3586+++ tests/autopilot/ubuntu_weather_app/tests/__init__.py 2015-08-27 13:48:14 +0000
3587@@ -189,15 +189,12 @@
3588 self.clean_db()
3589
3590 # create blank db
3591- database_tmpl_dir = os.path.join(
3592- os.path.dirname(ubuntu_weather_app.__file__),
3593- 'databases')
3594 logger.debug("Creating blank db on filesystem %s" % self.db_dir)
3595
3596 if not os.path.exists(self.app_dir):
3597 os.makedirs(self.app_dir)
3598
3599- shutil.copytree(database_tmpl_dir, self.db_dir)
3600+ shutil.copytree(self.database_tmpl_dir, self.db_dir)
3601
3602 self.assertThat(
3603 lambda: os.path.exists(self.db_path),
3604@@ -227,6 +224,9 @@
3605 self.app_dir = os.path.join(
3606 os.environ.get('HOME'),
3607 ".local/share/com.ubuntu.weather")
3608+ self.database_tmpl_dir = os.path.join(
3609+ os.path.dirname(ubuntu_weather_app.__file__),
3610+ 'databases')
3611 self.db_dir = os.path.join(self.app_dir, 'Databases')
3612 self.db_file = "34e1e542f2f083ff18f537b07a380071.sqlite"
3613 self.db_path = os.path.join(self.db_dir, self.db_file)
3614@@ -235,24 +235,48 @@
3615 os.path.join(os.path.dirname(__file__), '..', 'files'))
3616
3617
3618+class LegacyDatabaseMixin(DatabaseMixin):
3619+ def load_database_vars(self):
3620+ self.app_dir = os.path.join(
3621+ os.environ.get('HOME'),
3622+ ".local/share/com.ubuntu.weather")
3623+ self.database_tmpl_dir = os.path.join(
3624+ os.path.dirname(ubuntu_weather_app.__file__),
3625+ 'databases', 'legacy')
3626+ self.db_dir = os.path.join(self.app_dir, 'Databases')
3627+ self.db_file = "34e1e542f2f083ff18f537b07a380071.sqlite"
3628+ self.db_path = os.path.join(self.db_dir, self.db_file)
3629+
3630+ self.json_path = os.path.abspath(
3631+ os.path.join(os.path.dirname(__file__), '..', 'files', 'legacy'))
3632+
3633+
3634 class SettingsMixin(object):
3635
3636 """
3637 Helper functions for dealing with the settings file
3638 """
3639
3640- def create_settings_with_location_added(self):
3641- logger.debug("Creating settings with location added")
3642-
3643+ def _create_settings_base(self, path):
3644 if not os.path.exists(self.settings_dir):
3645 os.makedirs(self.settings_dir)
3646
3647- shutil.copyfile(self.settings_location_added, self.settings_filepath)
3648+ shutil.copyfile(path, self.settings_filepath)
3649
3650 self.assertThat(
3651 lambda: os.path.exists(self.settings_filepath),
3652 Eventually(Equals(True)))
3653
3654+ def create_settings_for_migration(self):
3655+ logger.debug("Creating settings with for migration")
3656+
3657+ self._create_settings_base(self.settings_for_migration)
3658+
3659+ def create_settings_with_location_added(self):
3660+ logger.debug("Creating settings with location added")
3661+
3662+ self._create_settings_base(self.settings_location_added)
3663+
3664 def load_settings_vars(self):
3665 self.db_dir = os.path.abspath(
3666 os.path.join(os.path.dirname(__file__), '..', 'databases'))
3667@@ -263,6 +287,8 @@
3668 'com.ubuntu.weather.conf')
3669 self.settings_location_added = os.path.join(self.db_dir,
3670 "location_added.conf")
3671+ self.settings_for_migration = os.path.join(self.db_dir,
3672+ "for_migration.conf")
3673
3674
3675 class UbuntuWeatherAppTestCase(BaseTestCaseWithPatchedHome, DatabaseMixin,
3676@@ -301,3 +327,24 @@
3677 self.add_locations_to_database()
3678
3679 self.app = UbuntuWeatherApp(self.launcher())
3680+
3681+
3682+class UbuntuWeatherAppTestCaseWithLegacyData(BaseTestCaseWithPatchedHome,
3683+ LegacyDatabaseMixin,
3684+ SettingsMixin):
3685+
3686+ """Base test case that launches the ubuntu-weather-app with legacy data."""
3687+
3688+ def setUp(self):
3689+ super(UbuntuWeatherAppTestCaseWithLegacyData, self).setUp()
3690+
3691+ self.load_database_vars()
3692+ self.create_blank_db()
3693+
3694+ self.load_settings_vars()
3695+ self.create_settings_for_migration()
3696+
3697+ logger.debug("Adding fake data to new database")
3698+ self.add_locations_to_database()
3699+
3700+ self.app = UbuntuWeatherApp(self.launcher())
3701
3702=== added file 'tests/autopilot/ubuntu_weather_app/tests/test_migration.py'
3703--- tests/autopilot/ubuntu_weather_app/tests/test_migration.py 1970-01-01 00:00:00 +0000
3704+++ tests/autopilot/ubuntu_weather_app/tests/test_migration.py 2015-08-27 13:48:14 +0000
3705@@ -0,0 +1,47 @@
3706+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
3707+# Copyright 2013, 2014, 2015 Canonical
3708+#
3709+# This program is free software: you can redistribute it and/or modify it
3710+# under the terms of the GNU General Public License version 3, as published
3711+# by the Free Software Foundation.
3712+
3713+"""Ubuntu Weather app autopilot tests."""
3714+
3715+from __future__ import absolute_import
3716+
3717+from autopilot.matchers import Eventually
3718+from testtools.matchers import Equals
3719+
3720+
3721+from ubuntu_weather_app.tests import UbuntuWeatherAppTestCaseWithLegacyData
3722+
3723+
3724+class TestMigration(UbuntuWeatherAppTestCaseWithLegacyData):
3725+
3726+ def setUp(self):
3727+ super(TestMigration, self).setUp()
3728+
3729+ def test_locations_count_startup(self):
3730+ """ tests that the correct number of migrated locations appear """
3731+
3732+ home_page = self.app.get_home_page()
3733+
3734+ self.assertThat(home_page.get_location_count, Eventually(Equals(2)))
3735+
3736+ def test_locations_page(self):
3737+ """ tests that the correct locations are in the list """
3738+
3739+ # Open the locations page from bottom edge
3740+ home_page = self.app.get_home_page()
3741+ home_page.reveal_bottom_edge_page()
3742+
3743+ locations_page = self.app.get_locations_page()
3744+ locations_page.visible.wait_for(True)
3745+
3746+ # Check that the locations are correct
3747+ self.assertThat(locations_page.get_location(0).get_name,
3748+ Eventually(Equals("Hamburg")))
3749+ self.assertThat(locations_page.get_location(1).get_name,
3750+ Eventually(Equals("London")))
3751+
3752+ # TODO: once units test land add tests for testing migrated settings

Subscribers

People subscribed via source and target branches

to all changes: