woefoo 0.0.14 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,9 +1,21 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem "rake", "0.9.2.2"
4
+ gem "nokogiri", "1.5.0"
5
+ gem "geokit", "1.5.0"
6
+ gem "typhoeus", "0.1.27"
7
+ gem "json", "1.6.1", :require => "json/pure"
8
+ gem "activerecord", "2.3.14"
9
+ gem "ancestry", "1.2.4"
10
+
3
11
  # Specify your gem's dependencies in woefoo.gemspec
4
12
  gemspec
5
13
 
14
+ group :development do
15
+ gem "mysql", "2.8.1"
16
+ end
17
+
6
18
  group :test do
7
- gem "mocha", "~> 0.9.7"
8
- gem "shoulda"
9
- end
19
+ gem "mocha", "0.10.0"
20
+ gem "shoulda", "2.11.3"
21
+ end
data/lib/woefoo.rb CHANGED
@@ -1,17 +1,21 @@
1
- require 'cgi'
2
- require 'typhoeus'
3
- require 'active_record'
4
- require 'ancestry'
5
- require 'woefoo/config'
6
- require 'woefoo/town_match_validators'
7
- require 'woefoo/response'
8
- require 'woefoo/geoplanet_place'
9
- require 'woefoo/geoplanet_alias'
10
- require 'woefoo/geoplanet_adjacency'
1
+ require "cgi"
2
+ require "typhoeus"
3
+ require "nokogiri"
4
+ require "activerecord"
5
+ require "ancestry"
11
6
 
12
7
  module Woefoo
8
+
9
+ autoload :Config, "woefoo/config"
10
+ autoload :TownMatchValidators, "woefoo/town_match_validators"
11
+ autoload :Response, "woefoo/response"
12
+ autoload :GeoplanetPlace, "woefoo/geoplanet_place"
13
+ autoload :GeoplanetAlias, "woefoo/geoplanet_alias"
14
+ autoload :GeoplanetAdjacency, "woefoo/geoplanet_adjacency"
15
+
13
16
  include Woefoo::Config
14
17
  include Woefoo::TownMatchValidators
18
+
15
19
  extend self
16
20
  # Fires a placefinder request to yahoo, returns with suggested places that match the query
17
21
 
@@ -21,22 +25,20 @@ module Woefoo
21
25
  # First try the parameterized query, if the user bothered to separate out the fields
22
26
  if opts.length > 1
23
27
  results[:parameterized_response] = perform_parameterized_lookup(opts)
24
- results[:woeid] = canonical_town_match(results[:parameterized_response])
28
+ results[:woeid] = canonical_town_match(results[:parameterized_response], opts)
25
29
  end
26
30
 
27
31
  if !results[:woeid]
28
32
  results[:query_response] = perform_lookup(opts)
29
- results[:woeid] = canonical_town_match(results[:query_response])
33
+ results[:woeid] = canonical_town_match(results[:query_response], opts)
30
34
  end
31
-
32
35
  results
33
36
  end
34
37
 
35
38
  def lookup_town_woeid_by_geo(opts={})
36
39
  results = {:woeid=>nil}
37
40
  results[:geo_response] = perform_geo_lookup(opts)
38
- results[:woeid] = canonical_town_match(results[:geo_response])
39
-
41
+ results[:woeid] = canonical_town_match(results[:geo_response], opts)
40
42
  results
41
43
  end
42
44
 
@@ -50,15 +52,14 @@ module Woefoo
50
52
 
51
53
  # Takes a Woefoo Response, and figures out a Town-level or equivalent
52
54
  # woe id that identifies where the queried address is
53
- def canonical_town_match(response)
55
+ def canonical_town_match(response, input_opts = {})
54
56
  default_validators.each do |v|
55
- if v[:conditions].call(response)
56
- return v[:validator].call(response)
57
+ if v[:conditions].call(response, input_opts)
58
+ return v[:validator].call(response, input_opts)
57
59
  end
58
60
  end
59
61
  end
60
62
 
61
-
62
63
  # Build a single query url
63
64
  def build_query_url(opts={})
64
65
  s = ""
@@ -85,7 +86,6 @@ module Woefoo
85
86
  "http://where.yahooapis.com/geocode?appid=#{@appid}&count=#{placefinder_result_count}#{s}"
86
87
  end
87
88
 
88
-
89
89
  def build_geo_url(opts={})
90
90
  "http://where.yahooapis.com/geocode?appid=#{@appid}&count=#{placefinder_result_count}&gflags=R&q=#{opts[:lat]},+#{opts[:lng]}"
91
91
  end
@@ -111,11 +111,11 @@ module Woefoo
111
111
  def build_query_keys(opts={})
112
112
  k = [:line1, :city, :state, :postal, :country]
113
113
  if opts.include?(:country)
114
- if opts[:country] != "US" && opts[:country] != "CA"
114
+ unless ["US", "CA", "GB", "UK"].include? opts[:country]
115
115
  k.delete(:state)
116
116
  k.delete(:postal)
117
117
  end
118
118
  end
119
119
  k
120
120
  end
121
- end
121
+ end
data/lib/woefoo/config.rb CHANGED
@@ -14,11 +14,11 @@ module Woefoo
14
14
  end
15
15
 
16
16
  def min_input_quality
17
- (@min_input_quality && @min_input_quality > 0) ? @min_input_quality : 40
17
+ (@min_input_quality && @min_input_quality > 0) ? @min_input_quality : 39
18
18
  end
19
19
 
20
20
  def min_result_quality
21
- (@min_result_quality && @min_result_quality > 0) ? @min_result_quality : 40
21
+ (@min_result_quality && @min_result_quality > 0) ? @min_result_quality : 39
22
22
  end
23
23
  end
24
24
  end
@@ -1,5 +1,3 @@
1
- require 'nokogiri'
2
-
3
1
  module Woefoo
4
2
  class Response
5
3
  attr_reader :query_options
@@ -1,22 +1,38 @@
1
1
  # A town match validator is a hash of two procs, the first proc is
2
2
  # a procedure for conditions in which this validator should be used,
3
3
  # and the second proc is the actual validator to run on the place results
4
- require 'geokit'
5
4
 
6
5
  module Woefoo::TownMatchValidators
6
+
7
+ # is this needed?
7
8
  extend self
8
9
 
10
+
11
+ # np1 = [51.591049,-2.988250]
12
+ # np2 = [52.016029,-4.833970]
13
+ # puts D.distance_between(np1, np2)
14
+ #
15
+ # D basically gives a way to call GeoKit::Mappable::ClassMethods.distance_between
16
+ class D
17
+ extend GeoKit::Mappable::ClassMethods
18
+ end
19
+
20
+ #
21
+ def close_enough_to_input_lat_lng? a,b
22
+ D.distance_between(a, b) <= 15.0
23
+ end
24
+
9
25
  def default_validators
10
26
  [{
11
- :conditions => Proc.new {|response|
27
+ :conditions => Proc.new {|response, input_opts|
12
28
  true # If all else fails, use this catch all validator
13
29
  },
14
- :validator => Proc.new {|response|
30
+ :validator => Proc.new {|response, input_opts|
15
31
  best_match=nil
16
32
  if response.input_quality >= min_input_quality
17
33
  response.results.each do |r|
18
- if r[:quality] >= response.input_quality && r[:quality] >= min_result_quality
19
- place=Woefoo::GeoplanetPlace.find_by_woeid(r[:woeid])
34
+ if r[:quality] >= min_result_quality
35
+ place = Woefoo::GeoplanetPlace.find_by_woeid(r[:woeid])
20
36
  if place
21
37
  if place.place_type=="Town"
22
38
  # If the query included a country code, make sure the place we're picking is in the same country!
@@ -32,6 +48,10 @@ module Woefoo::TownMatchValidators
32
48
  puts "Encountered a woeid without a geoplanet place #{r[:woeid]}"
33
49
  end
34
50
  end
51
+ if input_opts[:lat] && input_opts[:lng]
52
+ best_match = nil unless
53
+ close_enough_to_input_lat_lng?([input_opts[:lat], input_opts[:lng]], [r[:latitude], r[:longitude]])
54
+ end
35
55
  break if best_match
36
56
  end
37
57
  end
@@ -1,3 +1,3 @@
1
1
  module Woefoo
2
- VERSION = "0.0.14"
2
+ VERSION = "1.0.0"
3
3
  end
data/test/woefoo_test.rb CHANGED
@@ -59,8 +59,8 @@ class WoefooTest < Test::Unit::TestCase
59
59
  should "use default validator if no users validators are specified" do
60
60
  response = mock()
61
61
  place = mock()
62
- Woefoo::GeoplanetPlace.expects(:find_by_woeid).with(12345).returns(place)
63
- response.expects(:input_quality).twice.returns(75)
62
+ Woefoo::GeoplanetPlace.stubs(:find_by_woeid).with(12345).returns(place)
63
+ response.expects(:input_quality).once.returns(75)
64
64
  response.expects(:results).returns([{:quality => 80, :woeid=>12345, :woetype=>7}])
65
65
  response.expects(:query_options).returns({})
66
66
  place.expects(:place_type).returns("Town")
@@ -69,4 +69,4 @@ class WoefooTest < Test::Unit::TestCase
69
69
  assert_equal 12345, best_woeid, "WOEID town match mismatch!"
70
70
  end
71
71
  end
72
- end
72
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: woefoo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
+ - 1
7
8
  - 0
8
9
  - 0
9
- - 14
10
- version: 0.0.14
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - smnirven
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-10 00:00:00 Z
18
+ date: 2011-11-24 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: typhoeus