shoutcast_api 0.1.4 → 0.1.5
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.
- data/.watchr +21 -0
- data/Rakefile +2 -0
- data/VERSION.yml +3 -3
- data/lib/shoutcast_api.rb +1 -1
- data/shoutcast_api.gemspec +9 -2
- data/test/helper.rb +7 -5
- data/test/test_basic.rb +10 -18
- data/test/test_fetcher.rb +59 -50
- data/test/test_xml.rb +76 -120
- metadata +23 -2
data/.watchr
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
def run(*args)
|
3
|
+
system "ruby -rubygems -Ilib:test #{args.join(' ')}"
|
4
|
+
end
|
5
|
+
|
6
|
+
def run_tests
|
7
|
+
system "rake test"
|
8
|
+
end
|
9
|
+
|
10
|
+
def underscore(file)
|
11
|
+
file.gsub('/', '_')
|
12
|
+
end
|
13
|
+
|
14
|
+
watch('test/test_.*\.rb') {|md| run md[0] }
|
15
|
+
watch('lib/(.*)\.rb') {|md| run "test/test_#{underscore(md[1])}.rb" }
|
16
|
+
watch('test/helper.rb') { run_tests }
|
17
|
+
|
18
|
+
run_tests
|
19
|
+
|
20
|
+
Signal.trap("QUIT") { abort("\n") }
|
21
|
+
Signal.trap("INT") { run_tests }
|
data/Rakefile
CHANGED
@@ -20,6 +20,8 @@ Jeweler::Tasks.new do |gem|
|
|
20
20
|
gem.add_dependency 'roxml', '~> 2.5'
|
21
21
|
|
22
22
|
gem.add_development_dependency "mocha"
|
23
|
+
gem.add_development_dependency "riot", ">= 0.10.4"
|
24
|
+
gem.add_development_dependency "riot_notifier", ">= 0.0.3"
|
23
25
|
|
24
26
|
gem.test_files = Dir.glob('test/test_*.rb')
|
25
27
|
end
|
data/VERSION.yml
CHANGED
data/lib/shoutcast_api.rb
CHANGED
data/shoutcast_api.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{shoutcast_api}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Peter Suschlik"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-12-07}
|
13
13
|
s.default_executable = %q{shoutcast_search}
|
14
14
|
s.email = %q{peter-scapi@suschlik.de}
|
15
15
|
s.executables = ["shoutcast_search"]
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".gitignore",
|
21
|
+
".watchr",
|
21
22
|
"README.rdoc",
|
22
23
|
"Rakefile",
|
23
24
|
"VERSION.yml",
|
@@ -51,15 +52,21 @@ Gem::Specification.new do |s|
|
|
51
52
|
s.add_runtime_dependency(%q<httparty>, ["~> 0.4"])
|
52
53
|
s.add_runtime_dependency(%q<roxml>, ["~> 2.5"])
|
53
54
|
s.add_development_dependency(%q<mocha>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<riot>, [">= 0.10.4"])
|
56
|
+
s.add_development_dependency(%q<riot_notifier>, [">= 0.0.3"])
|
54
57
|
else
|
55
58
|
s.add_dependency(%q<httparty>, ["~> 0.4"])
|
56
59
|
s.add_dependency(%q<roxml>, ["~> 2.5"])
|
57
60
|
s.add_dependency(%q<mocha>, [">= 0"])
|
61
|
+
s.add_dependency(%q<riot>, [">= 0.10.4"])
|
62
|
+
s.add_dependency(%q<riot_notifier>, [">= 0.0.3"])
|
58
63
|
end
|
59
64
|
else
|
60
65
|
s.add_dependency(%q<httparty>, ["~> 0.4"])
|
61
66
|
s.add_dependency(%q<roxml>, ["~> 2.5"])
|
62
67
|
s.add_dependency(%q<mocha>, [">= 0"])
|
68
|
+
s.add_dependency(%q<riot>, [">= 0.10.4"])
|
69
|
+
s.add_dependency(%q<riot_notifier>, [">= 0.0.3"])
|
63
70
|
end
|
64
71
|
end
|
65
72
|
|
data/test/helper.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
|
5
1
|
require 'rubygems'
|
2
|
+
|
6
3
|
require 'mocha'
|
4
|
+
require 'riot'
|
5
|
+
require 'riot_notifier'
|
6
|
+
|
7
|
+
Riot.reporter = RiotNotifier::Libnotify
|
7
8
|
|
8
9
|
require 'shoutcast_api'
|
9
10
|
|
@@ -26,4 +27,5 @@ module TestExtensions
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
|
30
|
+
Riot::Context.send :include, TestExtensions
|
31
|
+
Riot::Situation.send :include, TestExtensions
|
data/test/test_basic.rb
CHANGED
@@ -1,24 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require 'helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
def test_delegators
|
6
|
-
assert_respond_to Shoutcast, :genres
|
7
|
-
assert_respond_to Shoutcast, :search
|
8
|
-
end
|
3
|
+
context Shoutcast do
|
4
|
+
setup { Shoutcast }
|
9
5
|
|
6
|
+
asserts("responds to genres").respond_to(:genres)
|
7
|
+
asserts("responds to search").respond_to(:search)
|
10
8
|
end
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
assert_equal "", file_fixture("empty.plain")
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_http_response_stubbing
|
10
|
+
context "Extensions" do
|
11
|
+
asserts("empty body with empty file") { file_fixture("empty.plain") }.equals("")
|
12
|
+
asserts("http stubbing") do
|
19
13
|
stub_http_response_with("empty.plain")
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
14
|
+
HTTParty.get('').body
|
15
|
+
end.equals("")
|
24
16
|
end
|
data/test/test_fetcher.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'helper'
|
2
2
|
|
3
3
|
require 'ostruct'
|
4
4
|
class FakeResponse < OpenStruct
|
@@ -16,72 +16,81 @@ class FakeResponse < OpenStruct
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
include Shoutcast
|
19
|
+
include Shoutcast
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
context Fetcher do
|
22
|
+
|
23
|
+
setup { Fetcher }
|
24
|
+
|
25
|
+
asserts("base uri") { topic.base_uri }.equals("http://yp.shoutcast.com")
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
context "testing nocache parameter" do
|
28
|
+
setup do
|
29
|
+
fetcher = Fetcher.clone
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
def fetcher.get(path, options)
|
32
|
+
FakeResponse.new do |response|
|
33
|
+
response.options = options
|
34
|
+
end
|
32
35
|
end
|
36
|
+
fetcher
|
33
37
|
end
|
34
38
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# { :nocache => "random" }
|
43
|
-
response = fetcher.send(:fetch, :nocache => "random") { |response| response }
|
44
|
-
assert response
|
45
|
-
assert_instance_of Hash, response.options
|
46
|
-
assert_instance_of Hash, response.options[:query]
|
47
|
-
assert_equal "random", response.options[:query][:nocache]
|
48
|
-
|
49
|
-
# nil
|
50
|
-
response = fetcher.send(:fetch, nil) { |response| response }
|
51
|
-
assert_instance_of Hash, response.options
|
52
|
-
assert_instance_of Hash, response.options[:query]
|
53
|
-
assert response.options[:query][:nocache]
|
54
|
-
end
|
39
|
+
asserts("random nocache parameter") do
|
40
|
+
topic.send(:fetch) {|r| r }.options[:query][:nocache]
|
41
|
+
end.exists
|
42
|
+
|
43
|
+
asserts("random nocache parameter passing nil") do
|
44
|
+
topic.send(:fetch, nil) {|r| r }.options[:query][:nocache]
|
45
|
+
end.exists
|
55
46
|
|
56
|
-
|
57
|
-
|
47
|
+
asserts("static nocache parameter") do
|
48
|
+
topic.send(:fetch, :nocache => "static") {|r| r }.options[:query][:nocache]
|
49
|
+
end.equals("static")
|
58
50
|
|
59
|
-
list = Fetcher.genres
|
60
|
-
# DRY test/text_xml.rb GenrelistTest
|
61
|
-
assert_instance_of Genrelist, list
|
62
|
-
assert_instance_of Genre, list.first
|
63
51
|
end
|
64
52
|
|
65
|
-
|
66
|
-
|
53
|
+
# TODO enable mocked tests again!
|
54
|
+
if false
|
55
|
+
context "fetching genres" do
|
56
|
+
setup do
|
57
|
+
p "here"
|
58
|
+
stub_http_response_with("genrelist.plain")
|
59
|
+
Fetcher.genres
|
60
|
+
end
|
67
61
|
|
68
|
-
|
62
|
+
asserts("class type").kind_of(Genrelist)
|
63
|
+
asserts("first item is a Genre") { topic.first }.kind_of(Genre)
|
69
64
|
end
|
70
65
|
|
71
|
-
|
72
|
-
|
66
|
+
context "fetching empty genres" do
|
67
|
+
setup do
|
68
|
+
stub_http_response_with("empty.plain")
|
69
|
+
Fetcher.genres
|
70
|
+
end
|
73
71
|
|
74
|
-
|
75
|
-
# DRY test/text_xml.rb StationlistTest
|
76
|
-
assert_instance_of Stationlist, list
|
77
|
-
assert_equal "/sbin/tunein-station.pls", list.tunein_base_path
|
78
|
-
assert_instance_of Station, list.first
|
72
|
+
asserts("nil") { topic }.nil
|
79
73
|
end
|
80
74
|
|
81
|
-
|
82
|
-
|
75
|
+
context "search with invalid options" do
|
76
|
+
setup do
|
77
|
+
stub_http_response_with("search_death.plain")
|
78
|
+
Fetcher.search
|
79
|
+
end
|
80
|
+
|
81
|
+
asserts("class type").kind_of(Stationlist)
|
82
|
+
asserts("tunein base path") { topic.tunein_base_path }.equals("/sbin/tunein-station.pls")
|
83
|
+
asserts("first item is a Station") { topic.first }.kind_of(Station)
|
84
|
+
end
|
85
|
+
|
86
|
+
context "searching with empty response" do
|
87
|
+
setup do
|
88
|
+
stub_http_response_with("empty.plain")
|
89
|
+
Fetcher.search
|
90
|
+
end
|
83
91
|
|
84
|
-
|
92
|
+
asserts_topic.nil
|
93
|
+
end
|
85
94
|
end
|
86
95
|
|
87
96
|
end
|
data/test/test_xml.rb
CHANGED
@@ -1,145 +1,101 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@station = Station.from_xml xml
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
include Shoutcast
|
4
|
+
|
5
|
+
context Station do
|
6
|
+
setup do
|
7
|
+
Station.from_xml <<-XML
|
8
|
+
<station
|
9
|
+
id="1234"
|
10
|
+
name=" Metal radio "
|
11
|
+
mt="audio/mpeg"
|
12
|
+
br="128"
|
13
|
+
genre=" Metal Rock "
|
14
|
+
ct=" Heavy Metal Band "
|
15
|
+
lc="123"/>
|
16
|
+
XML
|
19
17
|
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
"strange format"
|
19
|
+
asserts("class type").kind_of(Station)
|
20
|
+
asserts("id") { topic.id }.equals(1234)
|
21
|
+
asserts("name") { topic.name }.equals("Metal radio")
|
22
|
+
asserts("media type") { topic.media_type }.equals("audio/mpeg")
|
23
|
+
asserts("bitrate") { topic.bitrate }.equals(128)
|
24
|
+
asserts("genre") { topic.genre }.equals("Metal Rock")
|
25
|
+
asserts("current title") { topic.current_title }.equals("Heavy Metal Band")
|
26
|
+
asserts("listeners") { topic.listeners }.equals(123)
|
27
|
+
asserts("no tunein path") { topic.tunein }.nil
|
28
|
+
|
29
|
+
context "with media type" do
|
30
|
+
setup do
|
31
|
+
def topic.media_type
|
32
|
+
"strange format"
|
33
|
+
end
|
34
|
+
topic
|
38
35
|
end
|
39
|
-
|
40
|
-
assert_equal "strange format", @station.type
|
36
|
+
asserts("type") { topic.type }.equals("strange format")
|
41
37
|
end
|
42
38
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
assert string.include?(@station.name)
|
48
|
-
assert string.include?(@station.current_title)
|
49
|
-
assert string.include?(@station.bitrate.to_s)
|
50
|
-
assert string.include?(@station.listeners.to_s)
|
39
|
+
context "with to_s" do
|
40
|
+
[ :id, :name, :current_title, :bitrate, :listeners ].each do |attr|
|
41
|
+
asserts("contains #{attr}") { topic.to_s.include?(topic.send(attr).to_s) }
|
42
|
+
end
|
51
43
|
end
|
52
44
|
|
53
|
-
|
54
|
-
|
45
|
+
context "with header" do
|
46
|
+
setup { topic.class.header }
|
55
47
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
assert string.include?("bit")
|
60
|
-
assert string.include?("listen.")
|
48
|
+
%w(id station-name title bit listen.).each do |header|
|
49
|
+
asserts("contains #{header}") { topic.include?(header) }
|
50
|
+
end
|
61
51
|
end
|
62
52
|
|
63
53
|
# TODO test <=>
|
64
|
-
|
65
54
|
end
|
66
55
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
def test_base_uri
|
83
|
-
assert_equal "http://yp.shoutcast.com", Stationlist.base_uri
|
56
|
+
context Stationlist do
|
57
|
+
setup { Stationlist.from_xml file_fixture("search_death.plain") }
|
58
|
+
|
59
|
+
asserts("base uri") { topic.class.base_uri }.equals("http://yp.shoutcast.com")
|
60
|
+
asserts("correct class type").kind_of(Stationlist)
|
61
|
+
asserts("tunein path") { topic.tunein_base_path }.equals("/sbin/tunein-station.pls")
|
62
|
+
asserts("list size") { topic.size }.equals(49)
|
63
|
+
asserts("tunein path") { topic.tunein(topic.first) }.equals { topic.first.tunein }
|
64
|
+
|
65
|
+
context "for first item" do
|
66
|
+
setup { topic.first }
|
67
|
+
asserts("correct class type").kind_of(Station)
|
68
|
+
asserts("tunein path") do
|
69
|
+
topic.tunein
|
70
|
+
end.equals { "http://yp.shoutcast.com/sbin/tunein-station.pls?id=#{topic.id}" }
|
84
71
|
end
|
85
|
-
|
86
|
-
def test_tunein
|
87
|
-
station = @list.first
|
88
|
-
|
89
|
-
assert_equal "http://yp.shoutcast.com/sbin/tunein-station.pls?id=#{station.id}", @list.tunein(station)
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_tunein_propagtion_after_parse
|
93
|
-
station = @list.first
|
94
|
-
|
95
|
-
assert_equal @list.tunein(station), station.tunein
|
96
|
-
end
|
97
|
-
|
98
72
|
end
|
99
73
|
|
74
|
+
context Genrelist do
|
75
|
+
setup { Genrelist.from_xml file_fixture("genrelist.plain") }
|
100
76
|
|
101
|
-
class
|
102
|
-
|
77
|
+
asserts("correct class type").kind_of(Genrelist)
|
78
|
+
asserts("list size") { topic.size }.equals(434)
|
79
|
+
asserts("first item is Genre") { topic.first }.kind_of(Genre)
|
80
|
+
asserts("responds to each").respond_to(:each)
|
81
|
+
asserts("raises NoMethodError on invalid method") { topic.invalid_method }.raises(NoMethodError)
|
82
|
+
asserts("gernes name == to_s") { topic.first.name }.equals { topic.first.to_s }
|
103
83
|
|
104
|
-
|
105
|
-
|
106
|
-
end
|
84
|
+
context "sorted" do
|
85
|
+
setup { topic.sort }
|
107
86
|
|
108
|
-
|
109
|
-
|
110
|
-
assert_equal 434, @list.size
|
111
|
-
assert_instance_of Genre, @list.first
|
112
|
-
assert_respond_to @list, :each
|
113
|
-
assert_raise(NoMethodError) { @list.nothing_found }
|
87
|
+
asserts("first genre name") { topic.first.name }.equals("24h")
|
88
|
+
asserts("last genre name") { topic.last.name }.equals("Zouk")
|
114
89
|
end
|
115
|
-
|
116
|
-
def test_genre_name
|
117
|
-
sorted = @list.sort
|
118
|
-
|
119
|
-
assert_equal "24h", sorted.first.name
|
120
|
-
assert_equal "Zouk", sorted.last.name
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_genre_to_s
|
124
|
-
genre = @list.first
|
125
|
-
|
126
|
-
assert_equal genre.name, genre.to_s
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
class MyClass
|
133
|
-
include Shoutcast::Xml
|
134
90
|
end
|
135
91
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
string = " test mee "
|
142
|
-
assert_equal "test mee", MyClass.trim.call(string)
|
92
|
+
context Xml do
|
93
|
+
setup do
|
94
|
+
Class.new do
|
95
|
+
include Xml
|
96
|
+
end
|
143
97
|
end
|
144
98
|
|
99
|
+
asserts("responds to trim").respond_to(:trim)
|
100
|
+
asserts("trims strings") { topic.trim.call(" trim me ") }.equals("trim me")
|
145
101
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shoutcast_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Suschlik
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-07 00:00:00 +01:00
|
13
13
|
default_executable: shoutcast_search
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,26 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: "0"
|
44
44
|
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: riot
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.10.4
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: riot_notifier
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.0.3
|
64
|
+
version:
|
45
65
|
description:
|
46
66
|
email: peter-scapi@suschlik.de
|
47
67
|
executables:
|
@@ -52,6 +72,7 @@ extra_rdoc_files:
|
|
52
72
|
- README.rdoc
|
53
73
|
files:
|
54
74
|
- .gitignore
|
75
|
+
- .watchr
|
55
76
|
- README.rdoc
|
56
77
|
- Rakefile
|
57
78
|
- VERSION.yml
|