jgeoip 0.0.6-java → 0.1.0-java

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/Buildfile CHANGED
@@ -13,13 +13,10 @@ define 'jgeoip' do
13
13
  # add dependencies from jar
14
14
  compile.with('org.kohsuke:geoip:jar:1.2.5')
15
15
 
16
- # package our shiny little bidder jar
17
- package :jar, :file => _("lib/java/jgeoip-#{JGeoIP::VERSION}.jar")
18
-
19
16
  desc 'copy all dependent jars to lib folder'
20
17
  task :copy_dependencies do
21
18
  cp project.compile.dependencies.collect(&:to_s), project.path_to('lib/java')
22
19
  end
23
20
 
24
- task :setup => [ :clean, :compile, :package, :copy_dependencies ]
21
+ task :setup => [ :clean, :copy_dependencies ]
25
22
  end
data/README.md CHANGED
@@ -7,7 +7,7 @@ You can easily use it with the free GeoIP Library from maxmind.com aswell as the
7
7
 
8
8
  p JGeoIP.new('/opt/MaxMind/GeoLiteCity.dat').city('github.com')
9
9
 
10
- Will return a hash with all the result properties.
10
+ Will return a location object with all the result properties and a #to_hash method
11
11
 
12
12
 
13
13
  ### speed?
@@ -17,7 +17,7 @@ Results are promising:
17
17
 
18
18
  pure ruby GeoIP:
19
19
  35.614000 0.000000 35.614000 ( 35.614000)
20
- JGeoIP:
20
+ JGeoIP (Old Version, as extension, updating soon):
21
21
  1.318000 0.000000 1.318000 ( 1.318000)
22
22
 
23
23
  Please note that we did a warmup to give the JIT a chance.
@@ -25,6 +25,6 @@ The benchmark does 100k lookups.
25
25
  Those results are Java 7, jruby-1.6.5 based. Looking forward to 1.7.0.
26
26
 
27
27
  ### TODO
28
- * migrate from the hash to a location object which is able to calculate the distance to another one and might just be a container for the original maxmind one
28
+ * switch back to an extension and a proxy object: this is surely faster. but time is money at the moment
29
29
  * integrate the other lookup methods: so far we're just able to do city lookups
30
30
  * check all the license related stuff: the maxmind lib is LGPL, which would be okay for me
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
7
7
  s.authors = ["Tobias Schlottke"]
8
8
  s.email = ["tobias.schlottke@gmail.com"]
9
9
  s.homepage = "http://github.com/tobsch/jgeoip"
10
- s.summary = 'Fast JRuby extension for Maxminds GeoIP Databases'
11
- s.description = 'This gem wraps maxminds original java library with a pure jRuby extension, which should make things faster than calling the lib through jRuby directly.'
10
+ s.summary = 'Fast jRuby library for Maxminds GeoIP Databases'
11
+ s.description = 'This gem wraps maxminds original java library, which should make things faster than using other pure ruby libraries.'
12
12
  s.platform = 'java'
13
13
 
14
14
  s.files = `git ls-files`.split("\n")
@@ -1,12 +1,9 @@
1
1
  require 'java'
2
2
 
3
- # load the version file
4
- require File.expand_path('../jgeoip/version', __FILE__)
5
-
6
3
  # Load the required jars
7
4
  require File.expand_path('../java/geoip-1.2.5', __FILE__)
8
- require File.expand_path("../java/jgeoip-#{JGeoIP::VERSION}", __FILE__)
9
5
 
10
- # import the jRuby Extension
11
- java_import 'org.github.tobsch.jgeoip.JGeoIPLibrary'
12
- JGeoIPLibrary.new.load(JRuby.runtime, false)
6
+ # load the version file
7
+ require File.expand_path('../jgeoip/version', __FILE__)
8
+ require File.expand_path('../jgeoip/jgeoip', __FILE__)
9
+ require File.expand_path('../jgeoip/location', __FILE__)
@@ -0,0 +1,12 @@
1
+ class JGeoIP
2
+ # Import the geoip jar
3
+ java_import 'com.maxmind.geoip.LookupService'
4
+
5
+ def initialize(database_path)
6
+ @cl = LookupService.new(database_path, LookupService::GEOIP_MEMORY_CACHE)
7
+ end
8
+
9
+ def city(search_string)
10
+ @cl.getLocation(search_string)
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ class Java::ComMaxmindGeoip::Location
2
+ # returns a list of all relevant keys
3
+ def keys
4
+ mapping.keys
5
+ end
6
+
7
+ # getter for all value
8
+ def [](key)
9
+ mapping.key?(key) ? self.send(mapping[key]) : nil
10
+ end
11
+
12
+ def inspect
13
+ to_hash.inspect
14
+ end
15
+
16
+ def to_hash
17
+ mapping.inject({}) { |mem, map| mem[map.first] = self[map.last]; mem }
18
+ end
19
+
20
+ protected
21
+ def mapping
22
+ {
23
+ :city => :city,
24
+ :postal_code => :postalCode,
25
+ :country_code => :countryCode,
26
+ :country_name => :countryName,
27
+ :region => :region,
28
+ :latitude => :latitude,
29
+ :longitude => :longitude,
30
+ :dma_code => :dma_code,
31
+ :area_code => :area_code,
32
+ :metro_code => :metro_code
33
+ }
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  class JGeoIP
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -13,19 +13,19 @@ def benchmark(description, &block)
13
13
  }
14
14
  }
15
15
  end
16
+ # check the JGeoIP
17
+ require File.expand_path('../../lib/jgeoip.rb', __FILE__)
16
18
 
17
19
  # check the pure lib
18
20
  require 'geoip'
19
21
  db = GeoIP.new('/opt/MaxMind/GeoLiteCity.dat')
20
- benchmark 'pure ruby GeoIP:' do
22
+ benchmark 'pure ruby GeoIP:' do
21
23
  result = db.city('github.com')
22
24
  end
23
25
 
24
-
25
- # check the JGeoIP
26
- require File.expand_path('../../lib/jgeoip.rb', __FILE__)
27
26
  db = JGeoIP.new('/opt/MaxMind/GeoLiteCity.dat')
28
27
  benchmark 'JGeoIP:' do
29
28
  result = db.city('github.com')
30
29
  end
31
30
 
31
+
@@ -16,7 +16,13 @@ class JGeoIPTest < Test::Unit::TestCase
16
16
 
17
17
  should 'find the city by ip too' do
18
18
  result = @geo.city('207.97.227.239')
19
- assert_equal 'San Francisco', result[:city]
19
+ assert_equal 'United States', result[:country_name]
20
+ end
21
+
22
+ should 'be able to return the result as a hash' do
23
+ result = @geo.city('85.183.18.35')
24
+ assert_kind_of Hash, result.to_hash
25
+ assert_equal 'Germany', result[:country_name]
20
26
  end
21
27
 
22
28
  should 'throw a clean exception if the ip was not found' do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jgeoip
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.1.0
6
6
  platform: java
7
7
  authors:
8
8
  - Tobias Schlottke
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirement: *2106
59
59
  prerelease: false
60
60
  type: :development
61
- description: This gem wraps maxminds original java library with a pure jRuby extension, which should make things faster than calling the lib through jRuby directly.
61
+ description: This gem wraps maxminds original java library, which should make things faster than using other pure ruby libraries.
62
62
  email:
63
63
  - tobias.schlottke@gmail.com
64
64
  executables: []
@@ -81,17 +81,16 @@ files:
81
81
  amdlb2lwLmdlbXNwZWM=
82
82
  - !binary |-
83
83
  bGliL2phdmEvZ2VvaXAtMS4yLjUuamFy
84
- - !binary |-
85
- bGliL2phdmEvamdlb2lwLTAuMC42Lmphcg==
86
84
  - !binary |-
87
85
  bGliL2pnZW9pcC5yYg==
86
+ - !binary |-
87
+ bGliL2pnZW9pcC9qZ2VvaXAucmI=
88
+ - !binary |-
89
+ bGliL2pnZW9pcC9sb2NhdGlvbi5yYg==
88
90
  - !binary |-
89
91
  bGliL2pnZW9pcC92ZXJzaW9uLnJi
90
92
  - !binary |-
91
93
  c2NyaXB0L2JlbmNobWFyay5yYg==
92
- - !binary |-
93
- c3JjL21haW4vamF2YS9vcmcvZ2l0aHViL3RvYnNjaC9qZ2VvaXAvSkdlb0lQ
94
- TGlicmFyeS5qYXZh
95
94
  - !binary |-
96
95
  dGVzdC90ZXN0X2hlbHBlci5yYg==
97
96
  - !binary |-
@@ -121,7 +120,7 @@ rubyforge_project:
121
120
  rubygems_version: 1.8.15
122
121
  signing_key:
123
122
  specification_version: 3
124
- summary: Fast JRuby extension for Maxminds GeoIP Databases
123
+ summary: Fast jRuby library for Maxminds GeoIP Databases
125
124
  test_files:
126
125
  - !binary |-
127
126
  dGVzdC90ZXN0X2hlbHBlci5yYg==
Binary file
@@ -1,88 +0,0 @@
1
-
2
- package org.github.tobsch.jgeoip;
3
- import com.maxmind.geoip.*;
4
-
5
- import java.io.IOException;
6
- import java.util.ArrayList;
7
- import java.util.Iterator;
8
- import java.util.List;
9
- import java.util.HashMap;
10
- import org.jruby.runtime.Block;
11
- import java.util.Map;
12
- import java.util.HashSet;
13
- import java.util.Set;
14
- import java.lang.Object;
15
- import org.jruby.Ruby;
16
- import org.jruby.RubyNil;
17
- import org.jruby.RubyArray;
18
- import org.jruby.RubyClass;
19
- import org.jruby.RubyFixnum;
20
- import org.jruby.RubyObject;
21
- import org.jruby.RubyStruct;
22
- import org.jruby.RubyString;
23
- import org.jruby.RubyFloat;
24
- import org.jruby.RubyHash;
25
- import org.jruby.anno.JRubyMethod;
26
- import org.jruby.runtime.ObjectAllocator;
27
- import org.jruby.runtime.ThreadContext;
28
- import org.jruby.runtime.builtin.IRubyObject;
29
- import org.jruby.runtime.load.Library;
30
- import org.jruby.RubySymbol;
31
-
32
- /**
33
- *
34
- *
35
- */
36
- public class JGeoIPLibrary implements Library {
37
- private Ruby ruby;
38
-
39
- public void load(Ruby ruby, boolean bln) throws IOException {
40
- this.ruby = ruby;
41
-
42
- RubyClass jgeoip = ruby.defineClass("JGeoIP", ruby.getObject(), new ObjectAllocator() {
43
- public IRubyObject allocate(Ruby ruby, RubyClass rc) {
44
- return new JGeoIP(ruby, rc);
45
- }
46
- });
47
-
48
- jgeoip.defineAnnotatedMethods(JGeoIP.class);
49
- }
50
-
51
- public class JGeoIP extends RubyObject {
52
- LookupService cl;
53
-
54
- public JGeoIP(final Ruby ruby, RubyClass rubyClass) {
55
- super(ruby, rubyClass);
56
- }
57
-
58
- @JRubyMethod
59
- public IRubyObject initialize(ThreadContext context, IRubyObject databaseLocation) throws IOException {
60
- cl = new LookupService(databaseLocation.toString(), LookupService.GEOIP_MEMORY_CACHE);
61
-
62
- return context.nil;
63
- }
64
-
65
- @JRubyMethod
66
- public IRubyObject city(ThreadContext context, IRubyObject searchString) throws IOException {
67
- Location location = cl.getLocation(searchString.toString());
68
- if (location == null) {
69
- RubyNil nil = new RubyNil(ruby);
70
- return nil;
71
- }
72
-
73
- RubyHash loc = new RubyHash(ruby);
74
- loc.put(RubySymbol.newSymbol(ruby, "city"), RubyString.newString(ruby, location.city));
75
- loc.put(RubySymbol.newSymbol(ruby, "postal_code"), RubyString.newString(ruby, location.postalCode));
76
- loc.put(RubySymbol.newSymbol(ruby, "country_code"), RubyString.newString(ruby, location.countryCode));
77
- loc.put(RubySymbol.newSymbol(ruby, "country_name"), RubyString.newString(ruby, location.countryName));
78
- loc.put(RubySymbol.newSymbol(ruby, "region"), RubyString.newString(ruby, location.region));
79
- loc.put(RubySymbol.newSymbol(ruby, "latitude"), RubyFloat.newFloat(ruby, location.latitude));
80
- loc.put(RubySymbol.newSymbol(ruby, "longitude"), RubyFloat.newFloat(ruby, location.longitude));
81
- loc.put(RubySymbol.newSymbol(ruby, "dma_code"), RubyFixnum.newFixnum(ruby, location.dma_code));
82
- loc.put(RubySymbol.newSymbol(ruby, "area_code"), RubyFixnum.newFixnum(ruby, location.area_code));
83
- loc.put(RubySymbol.newSymbol(ruby, "metro_code"), RubyFixnum.newFixnum(ruby, location.metro_code));
84
-
85
- return loc;
86
- }
87
- }
88
- }