radiospieler 0.3.7 → 0.3.8

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/Gemfile CHANGED
@@ -5,6 +5,7 @@ source "http://rubygems.org"
5
5
 
6
6
  gem "htmlentities"
7
7
  gem "simple_cache_rs"
8
+ gem "nokogiri"
8
9
 
9
10
  # Add dependencies to develop your gem here.
10
11
  # Include everything needed to run rake, tests, features, etc.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- addressable (2.2.7)
4
+ addressable (2.2.8)
5
5
  archive-tar-minitar (0.5.2)
6
6
  columnize (0.3.6)
7
7
  crack (0.3.1)
@@ -12,10 +12,11 @@ GEM
12
12
  git (>= 1.2.5)
13
13
  rake
14
14
  rdoc
15
- json (1.6.6)
15
+ json (1.7.0)
16
16
  linecache19 (0.5.12)
17
17
  ruby_core_source (>= 0.1.4)
18
- multi_json (1.2.0)
18
+ multi_json (1.3.4)
19
+ nokogiri (1.5.2)
19
20
  psych (1.3.2)
20
21
  rake (0.9.2.2)
21
22
  rdoc (3.12)
@@ -30,15 +31,15 @@ GEM
30
31
  ruby-debug-base19 (>= 0.11.19)
31
32
  ruby_core_source (0.1.5)
32
33
  archive-tar-minitar (>= 0.5.2)
33
- simple_cache_rs (0.9.2)
34
+ simple_cache_rs (0.9.3)
34
35
  sqlite3
35
36
  simple_cov (0.2.0)
36
- simplecov (0.6.1)
37
- multi_json (~> 1.0)
37
+ simplecov (0.6.2)
38
+ multi_json (~> 1.3)
38
39
  simplecov-html (~> 0.5.3)
39
40
  simplecov-html (0.5.3)
40
- sqlite3 (1.3.5)
41
- vcr (2.0.1)
41
+ sqlite3 (1.3.6)
42
+ vcr (2.1.1)
42
43
  webmock (1.8.6)
43
44
  addressable (>= 2.2.7)
44
45
  crack (>= 0.1.7)
@@ -50,6 +51,7 @@ DEPENDENCIES
50
51
  bundler
51
52
  htmlentities
52
53
  jeweler
54
+ nokogiri
53
55
  psych
54
56
  ruby-debug19
55
57
  simple_cache_rs
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.7
1
+ 0.3.8
@@ -1,16 +1,5 @@
1
1
  class ImplementationMissing < NameError; end
2
2
 
3
- class Object
4
- private
5
-
6
- def implementation_missing!
7
- calling_method_name = caller[1]
8
- calling_method_name = $1 if calling_method_name =~ /.*in `(.*)'$/
9
-
10
- raise ImplementationMissing, "Implementation missing: #{self.class.name}##{calling_method_name}"
11
- end
12
- end
13
-
14
3
  module Kernel
15
4
  private
16
5
 
@@ -1,5 +1,6 @@
1
1
  require 'net/http'
2
2
  require 'simple_cache'
3
+ require 'nokogiri'
3
4
 
4
5
  # The Http module defines a
5
6
  #
@@ -23,18 +24,25 @@ module Http
23
24
  end
24
25
  end
25
26
 
26
- def get(url, max_age = MaxAge.for(url))
27
+ def get(url, max_age = nil)
28
+ body, headers = get_body_and_headers(url, max_age)
29
+ body
30
+ end
31
+
32
+ def get_body_and_headers(url, max_age = nil)
33
+ max_age ||= MaxAge.for(url)
34
+
27
35
  App.logger.benchmark("[GET] #{url}", :minimum => 20) do
28
- SimpleCache.cached(url, max_age) do
36
+ SimpleCache.cached("f-#{url}", max_age) do
29
37
  App.logger.debug "[GET] #{url}"
30
- get_(url)
38
+ get_body_and_headers_(url)
31
39
  end
32
40
  end
33
41
  end
34
42
 
35
43
  private
36
44
 
37
- def get_(uri_str, limit = 10)
45
+ def get_body_and_headers_(uri_str, limit = 10)
38
46
  raise 'too many redirections' if limit == 0
39
47
 
40
48
  uri = URI.parse(uri_str)
@@ -49,13 +57,45 @@ module Http
49
57
 
50
58
  case response
51
59
  when Net::HTTPSuccess then
52
- response.body
60
+ body, headers = response.body, response.to_hash
61
+ [ reencode(body, response["Content-Type"]), headers ]
53
62
  when Net::HTTPRedirection then
54
63
  location = response['location']
55
64
  App.logger.debug "redirected to #{location}"
56
- get_(location, limit - 1)
65
+ get_body_and_headers_(location, limit - 1)
57
66
  else
58
- response.value
67
+ [ response.value, nil ]
59
68
  end
60
69
  end
70
+
71
+ def reencode(body, content_type)
72
+ encodings = [ "ISO-8859-1", "UTF-8" ]
73
+
74
+ encodings.unshift($1) if content_type =~ /; charset=(\S+)/
75
+ encodings.unshift(html_encoding(body)) if content_type =~ /html/
76
+
77
+ force_valid_encoding body, *encodings
78
+ end
79
+
80
+ def force_valid_encoding(string, *encodings)
81
+ encodings.each do |enc|
82
+ next unless enc
83
+ begin
84
+ s = string.force_encoding(enc)
85
+ next unless s.valid_encoding?
86
+ return s.encode("UTF-8")
87
+ rescue Encoding::UndefinedConversionError
88
+ end
89
+ end
90
+
91
+ nil
92
+ end
93
+
94
+ def html_encoding(html)
95
+ doc = Nokogiri.HTML(html)
96
+ node = doc.css("meta[http-equiv='Content-Type']").first
97
+
98
+ return unless node && node["content"] =~ /; charset=(\S+)/
99
+ $1
100
+ end
61
101
  end
data/radiospieler.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "radiospieler"
8
- s.version = "0.3.7"
8
+ s.version = "0.3.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["radiospiel"]
12
- s.date = "2012-04-28"
12
+ s.date = "2012-05-03"
13
13
  s.description = "Some basics that your application could benefit from."
14
14
  s.email = "eno@open-lab.org"
15
15
  s.extra_rdoc_files = [
@@ -58,12 +58,13 @@ Gem::Specification.new do |s|
58
58
  "test/string_ext_test.rb",
59
59
  "test/test_helper.rb",
60
60
  "test/tls_test.rb",
61
- "test/uid_test.rb"
61
+ "test/uid_test.rb",
62
+ "test/uri_test.rb"
62
63
  ]
63
64
  s.homepage = "http://github.com/radiospiel/radiospieler"
64
65
  s.licenses = ["MIT"]
65
66
  s.require_paths = ["lib"]
66
- s.rubygems_version = "1.8.17"
67
+ s.rubygems_version = "1.8.10"
67
68
  s.summary = "Application base code"
68
69
 
69
70
  if s.respond_to? :specification_version then
@@ -72,6 +73,7 @@ Gem::Specification.new do |s|
72
73
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
73
74
  s.add_runtime_dependency(%q<htmlentities>, [">= 0"])
74
75
  s.add_runtime_dependency(%q<simple_cache_rs>, [">= 0"])
76
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
75
77
  s.add_development_dependency(%q<bundler>, [">= 0"])
76
78
  s.add_development_dependency(%q<jeweler>, [">= 0"])
77
79
  s.add_development_dependency(%q<vcr>, [">= 0"])
@@ -83,6 +85,7 @@ Gem::Specification.new do |s|
83
85
  else
84
86
  s.add_dependency(%q<htmlentities>, [">= 0"])
85
87
  s.add_dependency(%q<simple_cache_rs>, [">= 0"])
88
+ s.add_dependency(%q<nokogiri>, [">= 0"])
86
89
  s.add_dependency(%q<bundler>, [">= 0"])
87
90
  s.add_dependency(%q<jeweler>, [">= 0"])
88
91
  s.add_dependency(%q<vcr>, [">= 0"])
@@ -95,6 +98,7 @@ Gem::Specification.new do |s|
95
98
  else
96
99
  s.add_dependency(%q<htmlentities>, [">= 0"])
97
100
  s.add_dependency(%q<simple_cache_rs>, [">= 0"])
101
+ s.add_dependency(%q<nokogiri>, [">= 0"])
98
102
  s.add_dependency(%q<bundler>, [">= 0"])
99
103
  s.add_dependency(%q<jeweler>, [">= 0"])
100
104
  s.add_dependency(%q<vcr>, [">= 0"])
data/radiospieler.tmproj CHANGED
@@ -2,8 +2,6 @@
2
2
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
3
  <plist version="1.0">
4
4
  <dict>
5
- <key>currentDocument</key>
6
- <string>lib/app/app/config.rb</string>
7
5
  <key>documents</key>
8
6
  <array>
9
7
  <dict>
@@ -20,74 +18,10 @@
20
18
  <key>fileHierarchyDrawerWidth</key>
21
19
  <integer>221</integer>
22
20
  <key>metaData</key>
23
- <dict>
24
- <key>Gemfile</key>
25
- <dict>
26
- <key>caret</key>
27
- <dict>
28
- <key>column</key>
29
- <integer>17</integer>
30
- <key>line</key>
31
- <integer>8</integer>
32
- </dict>
33
- <key>firstVisibleColumn</key>
34
- <integer>0</integer>
35
- <key>firstVisibleLine</key>
36
- <integer>0</integer>
37
- </dict>
38
- <key>lib/app/app/config.rb</key>
39
- <dict>
40
- <key>caret</key>
41
- <dict>
42
- <key>column</key>
43
- <integer>21</integer>
44
- <key>line</key>
45
- <integer>27</integer>
46
- </dict>
47
- <key>firstVisibleColumn</key>
48
- <integer>0</integer>
49
- <key>firstVisibleLine</key>
50
- <integer>0</integer>
51
- </dict>
52
- <key>lib/app/app/root.rb</key>
53
- <dict>
54
- <key>caret</key>
55
- <dict>
56
- <key>column</key>
57
- <integer>0</integer>
58
- <key>line</key>
59
- <integer>6</integer>
60
- </dict>
61
- <key>firstVisibleColumn</key>
62
- <integer>0</integer>
63
- <key>firstVisibleLine</key>
64
- <integer>0</integer>
65
- </dict>
66
- <key>lib/extensions/zz_geocoder.rb</key>
67
- <dict>
68
- <key>caret</key>
69
- <dict>
70
- <key>column</key>
71
- <integer>21</integer>
72
- <key>line</key>
73
- <integer>8</integer>
74
- </dict>
75
- <key>firstVisibleColumn</key>
76
- <integer>0</integer>
77
- <key>firstVisibleLine</key>
78
- <integer>0</integer>
79
- </dict>
80
- </dict>
81
- <key>openDocuments</key>
82
- <array>
83
- <string>Gemfile</string>
84
- <string>lib/app/app/config.rb</string>
85
- <string>lib/app/app/root.rb</string>
86
- <string>lib/extensions/zz_geocoder.rb</string>
87
- </array>
21
+ <dict/>
88
22
  <key>showFileHierarchyDrawer</key>
89
23
  <true/>
90
24
  <key>windowFrame</key>
91
- <string>{{10, 0}, {1128, 746}}</string>
25
+ <string>{{0, 0}, {1365, 1178}}</string>
92
26
  </dict>
93
27
  </plist>
data/test/http_test.rb CHANGED
@@ -9,10 +9,19 @@ VCR.configure do |c|
9
9
  end
10
10
 
11
11
  class HttpTest < Test::Unit::TestCase
12
- def test_get
13
- VCR.use_cassette('http_test') do
12
+ def test_get_with_redirection
13
+ VCR.use_cassette('http_test') do
14
14
  google = Http.get("http://google.de")
15
15
  assert google.starts_with?("<!doctype html>")
16
- end
16
+ end
17
+ end
18
+
19
+ def test_get_body_and_headers
20
+ VCR.use_cassette('http_test') do
21
+ body, headers = Http.get_body_and_headers("http://google.de", 0)
22
+ assert body.starts_with?("<!doctype html>")
23
+ assert_equal ["text/html; charset=ISO-8859-1"], headers["content-type"]
24
+ assert_equal "UTF-8", body.encoding.name
25
+ end
17
26
  end
18
27
  end
data/test/uri_test.rb ADDED
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'test_helper'
4
+
5
+ class UriTest < Test::Unit::TestCase
6
+ def test_valid
7
+ assert_equal URI("http://xx.yy/ss"), URI.valid?("http://xx.yy/ss")
8
+ assert_equal false, URI.valid?("an cd")
9
+ end
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: radiospieler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-28 00:00:00.000000000 Z
12
+ date: 2012-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: htmlentities
16
- requirement: &70150272140540 !ruby/object:Gem::Requirement
16
+ requirement: &70261390331080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70150272140540
24
+ version_requirements: *70261390331080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: simple_cache_rs
27
- requirement: &70150272139360 !ruby/object:Gem::Requirement
27
+ requirement: &70261390330540 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70150272139360
35
+ version_requirements: *70261390330540
36
+ - !ruby/object:Gem::Dependency
37
+ name: nokogiri
38
+ requirement: &70261390329900 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70261390329900
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: bundler
38
- requirement: &70150272138640 !ruby/object:Gem::Requirement
49
+ requirement: &70261390329360 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *70150272138640
57
+ version_requirements: *70261390329360
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: jeweler
49
- requirement: &70150272136360 !ruby/object:Gem::Requirement
60
+ requirement: &70261390328680 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *70150272136360
68
+ version_requirements: *70261390328680
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: vcr
60
- requirement: &70150272135120 !ruby/object:Gem::Requirement
71
+ requirement: &70261390327980 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *70150272135120
79
+ version_requirements: *70261390327980
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: webmock
71
- requirement: &70150272133840 !ruby/object:Gem::Requirement
82
+ requirement: &70261390326640 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *70150272133840
90
+ version_requirements: *70261390326640
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: psych
82
- requirement: &70150272132340 !ruby/object:Gem::Requirement
93
+ requirement: &70261390325880 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,10 +98,10 @@ dependencies:
87
98
  version: '0'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *70150272132340
101
+ version_requirements: *70261390325880
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: simplecov
93
- requirement: &70150272129720 !ruby/object:Gem::Requirement
104
+ requirement: &70261390325340 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ! '>='
@@ -98,10 +109,10 @@ dependencies:
98
109
  version: '0'
99
110
  type: :development
100
111
  prerelease: false
101
- version_requirements: *70150272129720
112
+ version_requirements: *70261390325340
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: ruby-debug19
104
- requirement: &70150272128160 !ruby/object:Gem::Requirement
115
+ requirement: &70261390324680 !ruby/object:Gem::Requirement
105
116
  none: false
106
117
  requirements:
107
118
  - - ! '>='
@@ -109,10 +120,10 @@ dependencies:
109
120
  version: '0'
110
121
  type: :development
111
122
  prerelease: false
112
- version_requirements: *70150272128160
123
+ version_requirements: *70261390324680
113
124
  - !ruby/object:Gem::Dependency
114
125
  name: simple_cov
115
- requirement: &70150272126900 !ruby/object:Gem::Requirement
126
+ requirement: &70261390324020 !ruby/object:Gem::Requirement
116
127
  none: false
117
128
  requirements:
118
129
  - - ! '>='
@@ -120,7 +131,7 @@ dependencies:
120
131
  version: '0'
121
132
  type: :development
122
133
  prerelease: false
123
- version_requirements: *70150272126900
134
+ version_requirements: *70261390324020
124
135
  description: Some basics that your application could benefit from.
125
136
  email: eno@open-lab.org
126
137
  executables: []
@@ -171,6 +182,7 @@ files:
171
182
  - test/test_helper.rb
172
183
  - test/tls_test.rb
173
184
  - test/uid_test.rb
185
+ - test/uri_test.rb
174
186
  homepage: http://github.com/radiospiel/radiospieler
175
187
  licenses:
176
188
  - MIT
@@ -186,7 +198,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
198
  version: '0'
187
199
  segments:
188
200
  - 0
189
- hash: 1605468515752856034
201
+ hash: -453988988338308160
190
202
  required_rubygems_version: !ruby/object:Gem::Requirement
191
203
  none: false
192
204
  requirements:
@@ -195,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
207
  version: '0'
196
208
  requirements: []
197
209
  rubyforge_project:
198
- rubygems_version: 1.8.17
210
+ rubygems_version: 1.8.10
199
211
  signing_key:
200
212
  specification_version: 3
201
213
  summary: Application base code