auntie 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +49 -0
  4. data/LICENSE +20 -0
  5. data/README.md +39 -0
  6. data/Rakefile +24 -0
  7. data/bin/news +4 -0
  8. data/bin/radio +51 -0
  9. data/bin/sport +4 -0
  10. data/bin/tv +45 -0
  11. data/bin/weather +23 -0
  12. data/features/location.feature +8 -0
  13. data/features/news.feature +8 -0
  14. data/features/radio.feature +8 -0
  15. data/features/sport.feature +8 -0
  16. data/features/step_definitions/location_steps.rb +7 -0
  17. data/features/step_definitions/radio_steps.rb +1 -0
  18. data/features/step_definitions/tv_steps.rb +1 -0
  19. data/features/step_definitions/weather_steps.rb +6 -0
  20. data/features/support/env.rb +15 -0
  21. data/features/tv.feature +8 -0
  22. data/features/weather.feature +8 -0
  23. data/lib/auntie.rb +16 -0
  24. data/lib/bbc/location.rb +44 -0
  25. data/lib/bbc/news.rb +28 -0
  26. data/lib/bbc/now_next.rb +93 -0
  27. data/lib/bbc/schedule.rb +53 -0
  28. data/lib/bbc/shell/characters.rb +68 -0
  29. data/lib/bbc/shell/colors.rb +39 -0
  30. data/lib/bbc/shell/describe_time.rb +20 -0
  31. data/lib/bbc/sport.rb +33 -0
  32. data/lib/bbc/version.rb +7 -0
  33. data/lib/bbc/weather.rb +98 -0
  34. data/scratch +9 -0
  35. data/spec/bbc/location_spec.rb +45 -0
  36. data/spec/bbc/news_spec.rb +43 -0
  37. data/spec/bbc/now_next_spec.rb +53 -0
  38. data/spec/bbc/schedule_spec.rb +56 -0
  39. data/spec/bbc/sport_spec.rb +35 -0
  40. data/spec/bbc/version_spec.rb +18 -0
  41. data/spec/bbc/weather_spec.rb +41 -0
  42. data/spec/fixtures/3dayforecast.json +149 -0
  43. data/spec/fixtures/3hourlyforecast.json +265 -0
  44. data/spec/fixtures/location.json +12 -0
  45. data/spec/fixtures/news.json +31 -0
  46. data/spec/fixtures/now_next_radio.json +7767 -0
  47. data/spec/fixtures/now_next_tv.json +3471 -0
  48. data/spec/fixtures/schedule_radio_today.json +939 -0
  49. data/spec/fixtures/schedule_radio_tomorrow.json +941 -0
  50. data/spec/fixtures/schedule_radio_yesterday.json +1118 -0
  51. data/spec/fixtures/schedule_tv.json +1695 -0
  52. data/spec/fixtures/sport.json +38 -0
  53. data/spec/spec_helper.rb +13 -0
  54. metadata +170 -0
data/scratch ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'yaml'
4
+
5
+ prefs = "#{ENV['HOME']}/.auntie"
6
+ data = YAML.load_file prefs
7
+ puts prefs
8
+ data["Name"] = 'Bob'
9
+ #File.open(prefs, 'w') { |f| YAML.dump(data, f) }
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe Location, "when first created" do
6
+ before(:each) do
7
+ @io = StringIO.new
8
+ @location = Location.new(@io)
9
+ end
10
+
11
+ it "lists location matches for a term" do
12
+ @location.stub_chain(:open, :read) { fixture 'location.json' }
13
+
14
+ @location.find 'royston'
15
+
16
+ expect( @io.string ).to include('Barnsley')
17
+ expect( @io.string ).to include('2639017')
18
+
19
+ expect( @io.string ).to include('Hertfordshire')
20
+ expect( @io.string ).to include('2639018')
21
+ end
22
+
23
+ it "warns when a term is too small" do
24
+ lambda {
25
+ @location.find 'ky'
26
+ }.should raise_error(SystemExit)
27
+
28
+ #TODO: Check it emits "Please use a longer search term"
29
+ end
30
+
31
+ it "explains when no results are found" do
32
+ end
33
+
34
+ it "explains when it fails" do
35
+ @location.stub_chain(:open, :read) { 'corrupt { json' }
36
+
37
+ begin
38
+ @location.find 'Royston Vasey'
39
+ rescue SystemExit
40
+ end
41
+
42
+ expect(@io.string).to end_with "Unable to download location data\n"
43
+ end
44
+ end
45
+
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe News do
6
+
7
+ before(:each) do
8
+ @io = StringIO.new
9
+ @news = News.new(@io)
10
+ end
11
+
12
+ after(:each) do
13
+ @news = nil
14
+ @io = nil
15
+ end
16
+
17
+ it "shows the latest headlines" do
18
+ @news.stub_chain(:open, :read) { fixture 'news.json' }
19
+ @news.load
20
+
21
+ expect( @io.string ).to start_with 'BBC News Headlines'
22
+ expect( @io.string ).to include "Police say Moscow school gunman has been 'neutralised'"
23
+ expect( @io.string ).to end_with "It puts the loss down to cheaper fares and weaker sterling.\n"
24
+ end
25
+
26
+ it "explains when it fails" do
27
+ @news.stub_chain(:open, :read) { 'corrupt { json' }
28
+
29
+ begin
30
+ @news.load
31
+ rescue SystemExit
32
+ end
33
+
34
+ #Unsure why this doesn't work with abort.
35
+ #expect(@news.load).to raise_error(SystemExit, "Unable to download news")
36
+
37
+ expect(@io.string).to end_with "Unable to download news\n"
38
+ end
39
+
40
+ it "truncates output to the size of the shell" do
41
+ #
42
+ end
43
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe NowNext do
6
+ before(:each) do
7
+ @io = StringIO.new
8
+ @nn = NowNext.new @io
9
+
10
+ @nn.stub(:time_now) { Time.at(1391430000) }
11
+ end
12
+
13
+ after(:each) do
14
+ @io = nil
15
+ @nn = nil
16
+ end
17
+
18
+ it "shows what's on tv now" do
19
+ #TODO: Mock Time
20
+ @nn.stub_chain(:open, :read) { fixture 'now_next_tv.json' }
21
+ @nn.tv_now
22
+
23
+ expect(@io.string).to include 'Saints and Scroungers'
24
+ expect(@io.string).to include 'Arthur'
25
+ expect(@io.string).to include 'Seo Alba (This is Alba)'
26
+ end
27
+
28
+ it "shows what's on tv next" do
29
+ @nn.stub_chain(:open, :read) { fixture 'now_next_tv.json' }
30
+
31
+ @nn.tv_next
32
+
33
+ expect(@io.string).to match(/On now\s+One\s+Bargain Hunt/)
34
+ expect(@io.string).to match(/6 hours\s+Three\s+Great Movie Mistakes/)
35
+ end
36
+
37
+ it "shows what's on radio now" do
38
+ @nn.stub_chain(:open, :read) { fixture 'now_next_radio.json' }
39
+
40
+ @nn.radio_now
41
+
42
+ expect(@io.string).to include "Fearne Cotton"
43
+ end
44
+
45
+ it "shows what's on radio next" do
46
+ @nn.stub_chain(:open, :read) { fixture 'now_next_radio.json' }
47
+
48
+ @nn.radio_next
49
+
50
+ expect(@io.string).to match(/40 mins\s+Radio 6 Music\s+Radcliffe and Maconie/)
51
+ expect(@io.string).to match(/5 hours\s+Radio 5 live sports extra\s+Coming up on 5 live sports extra/)
52
+ end
53
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe Schedule do
6
+
7
+ before(:each) do
8
+ @io = StringIO.new
9
+ @schedule = Schedule.new @io
10
+ @schedule.stub(:time_now) { Time.at 1391435797 }
11
+ end
12
+
13
+ after(:each) do
14
+ @io = nil
15
+ @schedule = nil
16
+ end
17
+
18
+ it "lists todays schedule for BBC One" do
19
+ @schedule.stub_chain(:open, :read) { fixture 'schedule_tv.json' }
20
+
21
+ channel = { :id => "bbcone" }
22
+ @schedule.load channel
23
+
24
+ expect(@io.string).to include '13:45 Doctors'
25
+ expect(@io.string).to include '23:40 The Graham Norton Show'
26
+ expect(@io.string).to include '00:30 Joins BBC News'
27
+ end
28
+
29
+ it "lists todays schedule for Radio Six Musix" do
30
+ @schedule.stub_chain(:open, :read) { fixture 'schedule_radio_today.json' }
31
+
32
+ station = { :id => "6music" }
33
+ @schedule.load station
34
+
35
+ expect(@io.string).to include '13:00 Radcliffe and Maconie'
36
+ expect(@io.string).to include '05:00 Chris Hawkins'
37
+ end
38
+
39
+ it "lists yesterday's schedule for Radio Six Music" do
40
+ @schedule.stub_chain(:open, :read) { fixture 'schedule_radio_yesterday.json' }
41
+
42
+ station = { :id => "6music" }
43
+ @schedule.load station
44
+
45
+ expect(@io.string).to include '20:00 Stuart Maconie\'s Freak Zone'
46
+ end
47
+
48
+ it "lists tomorrow's schedule for Radio Six Music" do
49
+ @schedule.stub_chain(:open, :read) { fixture 'schedule_radio_tomorrow.json' }
50
+
51
+ station = { :id => "6music" }
52
+ @schedule.load station
53
+
54
+ expect(@io.string).to include '13:00 Radcliffe and Maconie'
55
+ end
56
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe Sport do
6
+ before(:each) do
7
+ @io = StringIO.new
8
+ @sport = Sport.new(@io)
9
+ end
10
+
11
+ after(:each) do
12
+ @sport = nil
13
+ @io = nil
14
+ end
15
+
16
+ it "shows the latest headlines" do
17
+ @sport.stub_chain(:open, :read) { fixture 'sport.json' }
18
+ @sport.headlines
19
+
20
+ expect( @io.string ).to include 'Winter olympics'
21
+ expect( @io.string ).to include "Leeds boss"
22
+ expect( @io.string ).to include "American football"
23
+ end
24
+
25
+ it "explains when it fails" do
26
+ @sport.stub_chain(:open, :read) { 'corrupt { json' }
27
+
28
+ begin
29
+ @sport.headlines
30
+ rescue SystemExit
31
+ end
32
+
33
+ expect(@io.string).to end_with "Unable to download sport\n"
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe AUNTIE, "when asked" do
6
+ it "provides a human readable name for the application" do
7
+ AUNTIE::NAME.should_not be_nil
8
+ end
9
+
10
+ it "shows the semantic version of the application" do
11
+ AUNTIE::VERSION.should =~ /\d+\.\d+\.\d+/
12
+ end
13
+
14
+ it "has a user agent which includes the application name and version" do
15
+ AUNTIE::USER_AGENT.should =~ /\d+\.\d+\.\d+/
16
+ AUNTIE::USER_AGENT.should =~ /#{AUNTIE::NAME}/
17
+ end
18
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), "/../spec_helper")
4
+
5
+ describe Weather do
6
+ before(:each) do
7
+ @io = StringIO.new
8
+ @weather = Weather.new('w3', @io)
9
+ end
10
+
11
+ after(:each) do
12
+ @weather = nil
13
+ @io = nil
14
+ end
15
+
16
+ it "shows the hourly forecast" do
17
+ @weather.stub_chain(:open, :read) { fixture '3hourlyforecast.json' }
18
+ @weather.hourly
19
+
20
+ expect( @io.string ).to start_with "\nThe next 24 hours in SE1"
21
+ end
22
+
23
+ it "shows the daily forecast" do
24
+ @weather.stub_chain(:open, :read) { fixture '3dayforecast.json' }
25
+ @weather.daily
26
+
27
+ expect( @io.string ).to start_with "\nThe next 3 days in London"
28
+ end
29
+
30
+ it "explains when it fails" do
31
+ @weather.stub_chain(:open, :read) { 'corrupt } json {' }
32
+
33
+ begin
34
+ @weather.hourly
35
+ rescue SystemExit
36
+ end
37
+
38
+ expect(@io.string).to end_with "Unable to download the weather\n"
39
+ end
40
+
41
+ end
@@ -0,0 +1,149 @@
1
+ {
2
+ "forecastContent": {
3
+ "forecasts": [
4
+ {
5
+ "date": "2014-02-03T00:00:00.000Z",
6
+ "day": {
7
+ "humidityPercent": 72,
8
+ "maxTemperature": {
9
+ "centigrade": 9,
10
+ "fahrenheit": 48
11
+ },
12
+ "pressureMillibars": 1004,
13
+ "sunrise": "2014-02-03T07:36:00Z",
14
+ "visibility": "Good",
15
+ "weatherCode": 3,
16
+ "weatherSymbol": {
17
+ "mobile": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/3.gif",
18
+ "webMedium": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_56_icons/en_on_light_bg/3.gif",
19
+ "webSmall": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/3.gif"
20
+ },
21
+ "weatherType": "Sunny Intervals",
22
+ "wind": {
23
+ "direction": "SSE",
24
+ "directionDesc": "South South Easterly",
25
+ "windspeed": {
26
+ "kph": 23,
27
+ "mph": 14
28
+ }
29
+ }
30
+ },
31
+ "dayName": "Monday",
32
+ "dayNameAbbreviation": "Mon",
33
+ "night": {
34
+ "minTemperature": {
35
+ "centigrade": 4,
36
+ "fahrenheit": 39
37
+ },
38
+ "sunset": "2014-02-03T16:53:00Z",
39
+ "weatherCode": 2,
40
+ "weatherSymbol": {
41
+ "mobile": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/2.gif",
42
+ "webMedium": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_56_icons/en_on_light_bg/2.gif",
43
+ "webSmall": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/2.gif"
44
+ },
45
+ "weatherType": "Partly Cloudy"
46
+ }
47
+ },
48
+ {
49
+ "date": "2014-02-04T00:00:00.000Z",
50
+ "day": {
51
+ "humidityPercent": 75,
52
+ "maxTemperature": {
53
+ "centigrade": 9,
54
+ "fahrenheit": 48
55
+ },
56
+ "pressureMillibars": 1003,
57
+ "sunrise": "2014-02-04T07:35:00Z",
58
+ "visibility": "Good",
59
+ "weatherCode": 3,
60
+ "weatherSymbol": {
61
+ "mobile": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/3.gif",
62
+ "webMedium": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_56_icons/en_on_light_bg/3.gif",
63
+ "webSmall": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/3.gif"
64
+ },
65
+ "weatherType": "Sunny Intervals",
66
+ "wind": {
67
+ "direction": "S",
68
+ "directionDesc": "Southerly",
69
+ "windspeed": {
70
+ "kph": 21,
71
+ "mph": 13
72
+ }
73
+ }
74
+ },
75
+ "dayName": "Tuesday",
76
+ "dayNameAbbreviation": "Tue",
77
+ "night": {
78
+ "minTemperature": {
79
+ "centigrade": 5,
80
+ "fahrenheit": 41
81
+ },
82
+ "sunset": "2014-02-04T16:55:00Z",
83
+ "weatherCode": 12,
84
+ "weatherSymbol": {
85
+ "mobile": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/12.gif",
86
+ "webMedium": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_56_icons/en_on_light_bg/12.gif",
87
+ "webSmall": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/12.gif"
88
+ },
89
+ "weatherType": "Light Rain"
90
+ }
91
+ },
92
+ {
93
+ "date": "2014-02-05T00:00:00.000Z",
94
+ "day": {
95
+ "humidityPercent": 76,
96
+ "maxTemperature": {
97
+ "centigrade": 10,
98
+ "fahrenheit": 50
99
+ },
100
+ "pressureMillibars": 983,
101
+ "sunrise": "2014-02-05T07:33:00Z",
102
+ "visibility": "Moderate",
103
+ "weatherCode": 15,
104
+ "weatherSymbol": {
105
+ "mobile": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/15.gif",
106
+ "webMedium": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_56_icons/en_on_light_bg/15.gif",
107
+ "webSmall": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/15.gif"
108
+ },
109
+ "weatherType": "Heavy Rain",
110
+ "wind": {
111
+ "direction": "S",
112
+ "directionDesc": "Southerly",
113
+ "windspeed": {
114
+ "kph": 34,
115
+ "mph": 21
116
+ }
117
+ }
118
+ },
119
+ "dayName": "Wednesday",
120
+ "dayNameAbbreviation": "Wed",
121
+ "night": {
122
+ "minTemperature": {
123
+ "centigrade": 6,
124
+ "fahrenheit": 43
125
+ },
126
+ "sunset": "2014-02-05T16:57:00Z",
127
+ "weatherCode": 7,
128
+ "weatherSymbol": {
129
+ "mobile": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/7.gif",
130
+ "webMedium": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_56_icons/en_on_light_bg/7.gif",
131
+ "webSmall": "http://static.bbci.co.uk/weather/0.5.265/images/icons/individual_40_icons/en_on_light_bg/7.gif"
132
+ },
133
+ "weatherType": "Light Cloud"
134
+ }
135
+ }
136
+ ],
137
+ "location": {
138
+ "continent": null,
139
+ "country": "United Kingdom",
140
+ "county": null,
141
+ "id": "2643743",
142
+ "latitude": "51.521",
143
+ "locationName": "London",
144
+ "longitude": "-0.108",
145
+ "state": null,
146
+ "timezoneName": "Europe/London"
147
+ }
148
+ }
149
+ }