Skip to content

Instantly share code, notes, and snippets.

@knowtheory
Forked from mlins/geolocation.rb
Created May 10, 2009 03:17
Show Gist options
  • Save knowtheory/109488 to your computer and use it in GitHub Desktop.
Save knowtheory/109488 to your computer and use it in GitHub Desktop.
require 'dm-core'
require 'dm-core/core_ext/symbol'
require 'dm-validations'
require 'appengine-apis'
require 'appengine-apis/local_boot'
require 'dm-appengine'
DataMapper::Logger.new(STDOUT, :debug)
DataMapper.setup(:default, "app_engine://memory")
>> Location.first
=> nil
>> Location.find_by_ip
ArgumentError: wrong # of arguments(0 for 1)
from (irb):32:in `find_by_ip'
from (irb):32
>> Location.find_by_ip("255.255.0.1")
NoMethodError: undefined method `add_sort' for #<AppEngine::Datastore::Query:0x15a28df8>
from /Users/ted/Code/jruby/lib/ruby/gems/1.8/gems/dm-appengine-0.0.1/lib/dm-appengine.rb:175:in `map'
from /Users/ted/Code/jruby/lib/ruby/gems/1.8/gems/dm-appengine-0.0.1/lib/dm-appengine.rb:175:in `parse_order'
from /Users/ted/Code/jruby/lib/ruby/gems/1.8/gems/dm-appengine-0.0.1/lib/dm-appengine.rb:153:in `initialize'
from /Users/ted/Code/jruby/lib/ruby/gems/1.8/gems/dm-appengine-0.0.1/lib/dm-appengine.rb:97:in `read'
from /Users/ted/Code/jruby/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/repository.rb:145:in `read'
from /Users/ted/Code/jruby/lib/ruby/gems/1.8/gems/dm-core-0.10.0/lib/dm-core/model.rb:396:in `first'
from (irb):21:in `find_by_ip'
from (irb):33
>>
class Location
include DataMapper::Resource
property :ip_start, Integer, :key => true
property :country_code, String, :length => 2
property :region_code, String, :length => 2
property :city, String, :length => 64
property :zipcode, String, :length => 6
property :latitude, Float
property :longitude, Float
attr_accessor :ip
def self.find_by_ip(ip)
return unless valid_ip?(ip)
o = ip.split('.').collect {|i| i.to_i }
i = (o[0] * 256 + o[1]) * 256 + o[2]
r = first(:ip_start.lte => ip, :order => [:ip_start.desc])
r.ip = ip if r
r
end
def self.valid_ip?(ip)
ip =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?$/
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment