hostipinfo 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.
data/CHANGES ADDED
@@ -0,0 +1,6 @@
1
+ = HostIpInfo Changelog
2
+
3
+ == Version 0.1.0
4
+ first preview release
5
+
6
+ * first preview release
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2005 Aslak Hellesoy
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README ADDED
@@ -0,0 +1,35 @@
1
+ = HostIpInfo
2
+
3
+ HostIpInfo is get host infomation from ip address.
4
+ (using http://hostip.info)
5
+
6
+ == Installation
7
+
8
+ $ sudo gem install hostipinfo
9
+
10
+ == Usage
11
+
12
+ require 'rubygems'
13
+ require 'host_ip_info'
14
+
15
+ h = HostIpInfo.new
16
+ ip = '12.215.42.19'
17
+ info = h.info(ip)
18
+
19
+ info['country']
20
+ #=> 'UNITED STATES'
21
+ info['country_code']
22
+ #=> 'US'
23
+ info['city']
24
+ #=> 'Sugar Grove'
25
+ info['region']
26
+ #=> 'IL'
27
+ info['latitude']
28
+ #=> 41.7696
29
+ info['longitude']
30
+ #=> -88.4588
31
+
32
+ Author:: gorou ( http://rails2u.com ) <hotchpotch@gmail.com.nospam>
33
+ Copyright:: Copyright (c) 2005 gorou
34
+ License:: MIT License
35
+
@@ -0,0 +1,158 @@
1
+ $:.unshift('lib')
2
+ require 'rubygems'
3
+ require 'meta_project'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/contrib/rubyforgepublisher'
6
+ require 'rake/contrib/xforge'
7
+ require 'rake/clean'
8
+ require 'rake/testtask'
9
+ require 'rake/rdoctask'
10
+
11
+ PKG_NAME = "hostipinfo"
12
+ # Versioning scheme: MAJOR.MINOR.PATCH
13
+ # MAJOR bumps when API is broken backwards
14
+ # MINOR bumps when the API is broken backwards in a very slight/subtle (but not fatal) way
15
+ # -OR when a new release is made and propaganda is sent out.
16
+ # PATCH is bumped for every API addition and/or bugfix (ideally for every commit)
17
+ # Later DamageControl can bump PATCH automatically.
18
+ #
19
+ # (This is subject to change - AH)
20
+ #
21
+ # REMEMBER TO KEEP PKG_VERSION IN SYNC WITH CHANGELOG
22
+ PKG_VERSION = "0.1.0"
23
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
24
+ PKG_FILES = FileList[
25
+ '[A-Z]*',
26
+ 'lib/**/*.rb',
27
+ 'test/**/*.rb',
28
+ 'examples/**/*.rb',
29
+ 'doc/**/*'
30
+ ]
31
+
32
+ task :default => [:test]
33
+
34
+ Rake::TestTask.new(:test) do |t|
35
+ t.libs << "test"
36
+ t.test_files = FileList['**/test*.rb']
37
+ t.verbose = true
38
+ end
39
+
40
+ # Create a task to build the RDOC documentation tree.
41
+ rd = Rake::RDocTask.new("rdoc") do |rdoc|
42
+ rdoc.rdoc_dir = 'html'
43
+ rdoc.title = "hostipinfo"
44
+ rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
45
+ rdoc.rdoc_files.include('README', 'CHANGES')
46
+ rdoc.rdoc_files.include('lib/**/*.rb', 'doc/**/*.rdoc')
47
+ rdoc.rdoc_files.exclude('doc/**/*_attrs.rdoc')
48
+ end
49
+
50
+ # ====================================================================
51
+ # Create a task that will package the Rake software into distributable
52
+ # tar, zip and gem files.
53
+
54
+ spec = Gem::Specification.new do |s|
55
+
56
+ #### Basic information.
57
+
58
+ s.name = PKG_NAME
59
+ s.version = PKG_VERSION
60
+ s.summary = "get host infomation from ipaddress"
61
+ s.description = <<-EOF
62
+ get host infomation from ipaddress
63
+ (using http://hostip.info/ )
64
+ EOF
65
+
66
+ s.files = PKG_FILES.to_a
67
+ s.require_path = 'lib'
68
+
69
+ #### Documentation and testing.
70
+
71
+ s.has_rdoc = true
72
+ s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
73
+ s.rdoc_options <<
74
+ '--title' << 'hostipinfo' <<
75
+ '--main' << 'README' <<
76
+ '--line-numbers'
77
+
78
+ s.test_files = Dir.glob('test/tc_*.rb')
79
+
80
+ #### Make executable
81
+ s.require_path = 'lib'
82
+ s.autorequire = 'spec'
83
+
84
+ #### Author and project details.
85
+
86
+ s.author = "gorou"
87
+ s.email = "hotchpotch@gmail.com"
88
+ s.homepage = "http://hostipinfo.rubyforge.org"
89
+ s.rubyforge_project = "hostipinfo"
90
+ end
91
+
92
+ desc "Build Gem"
93
+ Rake::GemPackageTask.new(spec) do |pkg|
94
+ pkg.need_zip = true
95
+ pkg.need_tar = true
96
+ end
97
+ task :gem => [:test]
98
+
99
+ # Support Tasks ------------------------------------------------------
100
+
101
+ def egrep(pattern)
102
+ Dir['**/*.rb'].each do |fn|
103
+ count = 0
104
+ open(fn) do |f|
105
+ while line = f.gets
106
+ count += 1
107
+ if line =~ pattern
108
+ puts "#{fn}:#{count}:#{line}"
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ desc "Look for TODO and FIXME tags in the code"
116
+ task :todo do
117
+ egrep /#.*(FIXME|TODO|TBD)/
118
+ end
119
+
120
+ task :release => [:verify_env_vars, :release_files, :publish_doc, :publish_news]
121
+
122
+ task :verify_env_vars do
123
+ raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
124
+ raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
125
+ end
126
+
127
+ task :publish_doc => [:rdoc] do
128
+ publisher = Rake::RubyForgePublisher.new(PKG_NAME, ENV['RUBYFORGE_USER'])
129
+ publisher.upload
130
+ end
131
+
132
+ desc "Release gem to RubyForge. MAKE SURE PKG_VERSION is aligned with the CHANGELOG file"
133
+ task :release_files => [:gem] do
134
+ release_files = FileList[
135
+ "pkg/#{PKG_FILE_NAME}.gem"
136
+ ]
137
+
138
+ Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |xf|
139
+ # Never hardcode user name and password in the Rakefile!
140
+ xf.user_name = ENV['RUBYFORGE_USER']
141
+ xf.password = ENV['RUBYFORGE_PASSWORD']
142
+ xf.files = release_files.to_a
143
+ xf.release_name = "HostIpInfo #{PKG_VERSION}"
144
+ end
145
+ end
146
+
147
+ desc "Publish news on RubyForge"
148
+ task :publish_news => [:gem] do
149
+ release_files = FileList[
150
+ "pkg/#{PKG_FILE_NAME}.gem"
151
+ ]
152
+
153
+ Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
154
+ # Never hardcode user name and password in the Rakefile!
155
+ news.user_name = ENV['RUBYFORGE_USER']
156
+ news.password = ENV['RUBYFORGE_PASSWORD']
157
+ end
158
+ end
@@ -0,0 +1,36 @@
1
+ require 'open-uri'
2
+ require 'yaml'
3
+
4
+ class HostIpInfo
5
+ def info(ip)
6
+ ip.strip!
7
+ raise 'invalid ipaddress' unless valid_ipv4?(ip)
8
+ get ip
9
+ end
10
+
11
+ private
12
+ HostIpGetUrl = 'http://www.hostip.info/api/get.html?position=true&ip='
13
+ def get(ip)
14
+ url = HostIpGetUrl + ip
15
+ parse YAML::load(open(url){|i| i.read })
16
+ end
17
+
18
+ def parse(data)
19
+ info = {}
20
+ info['country'], info['country_code'] = data['Country'].match(/\A(.+?)\s*?(?:\((\w+)\))?\Z/)[1..2]
21
+ info['city'], info['region'] = data['City'].split(/\s*,\s*/)
22
+ info['city'] = nil if info['city'].include?('(Unknown city)')
23
+ info['latitude'] = data['Latitude']
24
+ info['longitude'] = data['Longitude']
25
+ info
26
+ end
27
+
28
+ def valid_ipv4?(ip)
29
+ if ip.match(/^(\d{1,3}\.){3}\d{1,3}$/) and
30
+ ip.split('.').reject!{|i| i.to_i < 256 }.empty?
31
+ true
32
+ else
33
+ false
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,51 @@
1
+ require 'test/unit'
2
+ require 'host_ip_info'
3
+
4
+ class TestHostIpInfo < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @host_ip_info = HostIpInfo.new
8
+ end
9
+
10
+ def test_ip_12_215_42_19
11
+ ip = '12.215.42.19'
12
+
13
+ assert_equal({
14
+ 'country' => 'UNITED STATES',
15
+ 'city' => 'Sugar Grove',
16
+ 'country_code' => 'US',
17
+ 'region' => 'IL',
18
+ 'latitude' => 41.7696 ,
19
+ 'longitude' => -88.4588
20
+ },
21
+ @host_ip_info.info(ip)
22
+ )
23
+ end
24
+
25
+ def test_ip_221_243_169_85
26
+ ip = '221.243.169.85'
27
+
28
+ assert_equal({
29
+ 'country' => 'JAPAN',
30
+ 'country_code' => 'JP',
31
+ 'city' => nil,
32
+ 'region' => nil,
33
+ 'latitude' => nil,
34
+ 'longitude' => nil
35
+ },
36
+ @host_ip_info.info(ip)
37
+ )
38
+ end
39
+
40
+ def test_ip_invalid
41
+ ip1 = '291.243.169.85'
42
+ ip2 = 'a221.243.169.85'
43
+ assert_raises(RuntimeError) do
44
+ @host_ip_info.info(ip1)
45
+ end
46
+ assert_raises(RuntimeError) do
47
+ @host_ip_info.info(ip2)
48
+ end
49
+ end
50
+
51
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: hostipinfo
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2005-10-13 00:00:00 +09:00
8
+ summary: get host infomation from ipaddress
9
+ require_paths:
10
+ - lib
11
+ email: hotchpotch@gmail.com
12
+ homepage: http://hostipinfo.rubyforge.org
13
+ rubyforge_project: hostipinfo
14
+ description: get host infomation from ipaddress (using http://hostip.info/ )
15
+ autorequire: spec
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - gorou
30
+ files:
31
+ - MIT-LICENSE
32
+ - Rakefile
33
+ - README
34
+ - CHANGES
35
+ - lib/host_ip_info.rb
36
+ - test/test_host_ip_info.rb
37
+ test_files: []
38
+
39
+ rdoc_options:
40
+ - --title
41
+ - hostipinfo
42
+ - --main
43
+ - README
44
+ - --line-numbers
45
+ extra_rdoc_files:
46
+ - README
47
+ - CHANGES
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ requirements: []
53
+
54
+ dependencies: []
55
+