geocoder-simplified 1.0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ require 'gem_with_extension_example/base'
@@ -0,0 +1,149 @@
1
+ # encoding: utf-8
2
+
3
+ # holy grail of redis info:
4
+ # http://dev.mensfeld.pl/2011/11/using-redis-as-a-temporary-cache-for-data-shared-by-multiple-independent-processes/
5
+
6
+ # monkeypatch ruby from the rails underscore addition to String
7
+
8
+ class GeocoderSimplified
9
+ $:.push File.expand_path("..", __FILE__)
10
+
11
+ require 'geocoder'
12
+ require 'redis'
13
+ require 'util'
14
+ require 'redis-expiring_counter'
15
+
16
+ POSTFIX = "Geocode"
17
+ UNLIMITED_CALLS = Util::MAX_INT32
18
+
19
+ class Configuration # Future Development Stub
20
+ GOOGLE_API_KEY = ""
21
+ YAHOO_API_KEY = ""
22
+ end
23
+ class GeocoderApi# < RedisTable
24
+ attr_reader :name, :key, :max_calls_per_day, :symbol, :counter
25
+ def initialize(name, key, max_calls_per_day)
26
+ @name = name + POSTFIX
27
+ @key = key
28
+ @max_calls_per_day = max_calls_per_day
29
+ @symbol = name.underscore.to_sym
30
+ @counter = RedisExpiringCounter.new(@name, Util::SECONDS_PER_DAY, @max_calls_per_day)
31
+ end
32
+ def count
33
+ @counter.count
34
+ end
35
+ def dump
36
+ @counter.dump
37
+ end
38
+ def locate(place_name)
39
+ location = []
40
+ latitude = 0.0
41
+ longitude = 0.0
42
+
43
+ Geocoder::Configuration.lookup = @symbol # set the geocoder to use this api
44
+
45
+ begin
46
+ warning_text = Util.capture_stderr do
47
+ location = Geocoder.search(place_name)
48
+ increment_count
49
+ end
50
+ # Write sucess to log here
51
+ #Rails.logger.warn "Geocoder: " + warning_text if warning_text != ""
52
+ rescue StandardError => e
53
+ # Write fail to log here
54
+ #Rails.logger.error "Geocoder: " + @name + ": "+ e.to_s
55
+ end
56
+
57
+ if not (location.nil? or location.count == 0)
58
+ latitude = location.first.latitude
59
+ longitude = location.first.longitude
60
+ end
61
+
62
+ return latitude, longitude
63
+ end
64
+ end
65
+
66
+ class << self
67
+ # Attach the default goecoding apis, _in order_. The first added will be the first tried.
68
+ @@api_list = []
69
+ @@api_list << GeocoderApi.new("GeocoderCa", "", UNLIMITED_CALLS)
70
+ @@api_list << GeocoderApi.new("Google", Configuration::GOOGLE_API_KEY, 2500)
71
+ @@api_list << GeocoderApi.new("Yahoo", Configuration::YAHOO_API_KEY, 50000)
72
+ #@@api_list.each{|api| puts "#{api.count}:#{api.symbol}"}
73
+
74
+ def get_counts
75
+ @@api_list.each.inject({}){|h,api| h.update(api.symbol => api.count)}
76
+ end
77
+
78
+ def locate(place_name)
79
+ latitude = 0.0
80
+ longitude = 0.0
81
+ api_name = nil
82
+
83
+ @@api_list.each do |api|
84
+ if api.counter.increment
85
+ latitude, longitude = api.locate(place_name)
86
+ if not (latitude == 0.0 and longitude == 0.0)
87
+ api_name = api.symbol
88
+ end
89
+ end
90
+ break if not (latitude == 0.0 and longitude == 0.0)
91
+ end
92
+
93
+ return latitude, longitude, api_name
94
+ end
95
+ end
96
+ end
97
+
98
+
99
+ if __FILE__ == $0
100
+
101
+ require "version"
102
+
103
+ puts "GeocoderSimplified v#{GeocoderSimplified::VERSION} test:\n\n"
104
+
105
+ [
106
+ "50 W Liberty, Reno",
107
+ "New York Metro, NY",
108
+ "San Francisco, CA",
109
+ "Reno, NV, USA",
110
+ "Peoria",
111
+ "Madrid, Spain",
112
+ "London, England"
113
+ ].each do |place_name|
114
+ latitude, longitude, api_name = GeocoderSimplified.locate(place_name)
115
+ puts "% 35s: (%0.8f, %0.8f) via '%s'" % [place_name, latitude, longitude, api_name]
116
+ end
117
+
118
+ puts
119
+ p GeocoderSimplified.get_counts
120
+
121
+ end
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
@@ -0,0 +1,45 @@
1
+ class String
2
+ def underscore
3
+ self.gsub(/::/, '/').
4
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
5
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
6
+ tr("-", "_").
7
+ downcase
8
+ end
9
+ end
10
+
11
+ class Util
12
+ require 'stringio'
13
+
14
+ MAX_INT32 = 0x7fffffff
15
+ SECONDS_PER_DAY = 4 * 60 * 60
16
+
17
+ class << self
18
+ def dump_database(db)
19
+ puts "-" * 76
20
+ puts "database dump:"
21
+ keys = db.keys
22
+ if keys.size > 0
23
+ values = db.mget(*keys)
24
+ list = Hash[keys.zip(values)]
25
+ list.each{|k, v| puts "%s = %s" % [k, v]}
26
+ end
27
+ end
28
+ def float_with_commas(n, decimal_places)
29
+ whole = Integer(n)
30
+ fraction = n - whole
31
+ decimal_format = "%%.%df" % decimal_places
32
+ whole.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse << (decimal_format % fraction)[1..-1]
33
+ end
34
+ def get_16bit_hash_id(s)
35
+ "%04x" % s.bytes.each_with_index.map{|c,i| c << ((i & 1) * 8)}.inject(0xFFFF){|hash, n| hash ^ n}
36
+ end
37
+ def capture_stderr
38
+ previous_stderr, $stderr = $stderr, StringIO.new
39
+ yield
40
+ $stderr.string
41
+ ensure
42
+ $stderr = previous_stderr
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,10 @@
1
+ class GeocoderSimplified
2
+ # Use semantic versioning: http://semver.org/
3
+
4
+ # NON_FUNCTIONAL 0.0.0.x level changes for changes to documentation and formatting or functionally equivalent sturctural changes
5
+ # PATCH 0.0.x level changes for implementation level detail changes, such as small bug fixes
6
+ # MINOR 0.x.0 level changes for any backwards compatible API changes, such as new functionality/features
7
+ # MAJOR x.0.0 level changes for backwards incompatible
8
+
9
+ VERSION = "1.0.0.1"
10
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: geocoder-simplified
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Vikoren
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-08 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: geocoder
16
+ requirement: &2173625120 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2173625120
25
+ - !ruby/object:Gem::Dependency
26
+ name: redis-expiring_counter
27
+ requirement: &2173616720 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2173616720
36
+ description: The geocoder-simplified gem is intended to offer a no-frills wrapper
37
+ on the geocoder gem.
38
+ email:
39
+ - sean@vikoren.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - lib/geocoder-simplified/base.rb
45
+ - lib/geocoder-simplified/util.rb
46
+ - lib/geocoder-simplified/version.rb
47
+ - lib/geocoder-simplified.rb
48
+ homepage: https://github.com/seanvikoren/geocoder-simplified
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project: geocoder-simplified
68
+ rubygems_version: 1.8.11
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: geocoder-simplified will get lat and long for an address or place name.
72
+ test_files: []