jsl-placemaker 0.0.1.2 → 0.0.1.5

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/README.rdoc CHANGED
@@ -1,34 +1,67 @@
1
1
  = Description
2
2
 
3
- Ruby interface for the Yahoo PlaceMaker API.
3
+ Yahoo! Placemaker is a freely available geoparsing Web service. It helps developers make their applications location-aware by
4
+ identifying places in unstructured and atomic content - feeds, web pages, news, status updates - and returning geographic metadata
5
+ for geographic indexing and markup.
6
+
7
+ This library is a Ruby interface for accessing the {Yahoo PlaceMaker API}[http://developer.yahoo.com/geo/placemaker/].
4
8
 
5
9
  = Installation
6
10
 
7
- Assuming that you've set up your ruby environment to pull gems from GitHub, install placemaker with the following command:
11
+ Assuming that you've set up your ruby environment to pull gems from GitHub
12
+ (see {the GitHub instructions if you haven't yet done this}[http://gems.github.com]),
13
+ install placemaker with the following command:
8
14
 
9
15
  sudo gem install jsl-placemaker
10
16
 
11
17
  = Usage
12
18
 
13
- The following is an example of using the Placemaker gem to read places in a standard feed.
19
+ The following is an example of using the Placemaker gem to read places in a standard feed. You'll have to get a Yahoo App ID first if you haven't
20
+ already done so.
14
21
 
15
22
  require 'placemaker'
16
- p = Placemaker.new(:appid => YOUR_APP_ID, :document_url => 'http://feeds.feedburner.com/wooster', :document_type => 'text/xml')
17
- results = p.fetch
23
+ p = Placemaker::Client.new(:appid => YOUR_APP_ID, :document_url => 'http://feeds.feedburner.com/wooster', :document_type => 'text/xml')
24
+ p.fetch!
25
+
26
+ This will make a call to the Placemaker service and populate the Placemaker::Client object with data about the places in the content that you
27
+ sent to Yahoo. The information that you'll be interested in may be divided into "documents" and "meta-data".
28
+
29
+ == Documents
30
+
31
+ Once you've run the +fetch!+ method on the Placemaker::Client, you may invoke the method +documents+ which will return a set of Placemaker::Document
32
+ objects corresponding to each of the entries in the feed given to the placemaker service. For example, if you gave a +document_url+ pointing
33
+ to a feed containing 15 entries, there will be 15 documents in the resulting client object.
34
+
35
+ The following are methods that you may invoke on each of the Placemaker::Document objects to find out more about the place information that
36
+ Yahoo was able to glean from the input document:
37
+
38
+ * place_details - Returns a Placemaker::Location object that is a container for one named place mentioned in the document
39
+ * administrative_scope - Returns a Placemaker::Location object that is a container for the smallest administrative place that best describes the document
40
+ * geographic_scope - Returns a Placemaker::Location object that is a container for the smallest place that best describes the document
41
+ * extents - Returns a Placemaker::Extents object that is a container for the the map extents covering the places mentioned in the document
42
+
43
+ Below is a summary of the methods that these objects respond to. You may wish to browse the Placemaker rdoc files for these classes to see
44
+ for more details.
18
45
 
19
- "Results" will be a collection of Placemaker::Document objects. Each of these documents corresponds to a feed entry, and it may
20
- have one or more "places":
46
+ === Placemaker::Location
47
+
48
+ Placemaker::Location objects contain a woe_id, name, location_type and centroid.
49
+
50
+ * woe_id - permanent identifier for the place
51
+ * name - fully qualified name for the place
52
+ * location_type - type name for the place
53
+ * centroid - centroid for the place, responds to +lat+ and +lng+
21
54
 
22
- results.first.places
55
+ === Placemaker::Extents
23
56
 
24
- Places are Placemaker::Place objects, and they contain information about the place that is discussed in this particular feed.
57
+ Placemaker::Extents are bounding boxes for an area of interest. They respond to methods for +center+, +south_west+ and +north_east+. In
58
+ all of these cases, they return a Placemaker::Coordinates object responding to +lat+ and +lng+.
25
59
 
26
- = TODO
60
+ == Meta-data
27
61
 
28
- This library is a rough first pass at using the Yahoo Placemaker API. It needs refinement in the parsing of the resultset
29
- returned by Yahoo, as there is plenty of functionality still unexposed in this interface. It is also still relatively untested
30
- and surely has bugs.
62
+ The request to the Yahoo place coding service returns information about the request. You may invoke the methods +processing_time+,
63
+ +version+, and +document_length+ to find out more about the request.
31
64
 
32
65
  = Author
33
66
 
34
- Justin S. Leitgeb, mailto:justin@phq.org
67
+ Justin S. Leitgeb, justin@phq.org
@@ -1,34 +1,57 @@
1
1
  module Placemaker
2
- class Reader
2
+
3
+ # Main interface to the Placemaker API.
4
+ class Client
3
5
  POST_FIELDS = %w[ appid document_content document_url document_type document_title
4
6
  auto_disambiguate focus_woe_id input_language output_type ].map{|f| f.to_sym}
5
7
 
6
- attr_reader :documents
7
-
8
8
  def initialize(options = {})
9
9
  @options = options
10
10
  @options[:appid] ||= ENV['PLACEMAKER_APPID']
11
- @documents = [ ]
11
+
12
+ @xml_parser = Placemaker::XmlParser.new('NODOC')
13
+
12
14
  verify_content_set
13
15
  verify_document_type_set
14
16
  end
15
17
 
16
- POST_FIELDS.each do |f|
17
- define_method(f) do # def appid
18
- @options[f] # @options[:appid]
19
- end # end
20
- end
21
-
22
- def fetch
18
+ # Fetches the place information for input parameters from the Yahoo Placemaker service
19
+ def fetch!
23
20
  fields = POST_FIELDS.reject{|f| @options[f].nil? }.map do |f|
24
21
  # Change ruby-form fields to url type, e.g., document_content => documentContent
25
22
  cgi_param = f.to_s.gsub(/\_(.)/) {|s| s.upcase}.gsub('_', '').sub(/url/i, 'URL')
26
23
  Curl::PostField.content(cgi_param, @options[f])
27
24
  end
28
25
 
29
- res = Curl::Easy.http_post('http://wherein.yahooapis.com/v1/document', *fields)
30
- xml_parser = Placemaker::XmlParser.new(res.body_str)
31
- @documents = xml_parser.documents
26
+ res = Curl::Easy.http_post('http://wherein.yahooapis.com/v1/document', *fields)
27
+ @xml_parser = Placemaker::XmlParser.new(res.body_str)
28
+ end
29
+
30
+ # Returns a collection of Placemaker::Document items as containers for content location information
31
+ def documents
32
+ @xml_parser.documents
33
+ end
34
+
35
+ # time in seconds to process the document
36
+ def processing_time
37
+ @xml_parser.processing_time
38
+ end
39
+
40
+ # version of the software used to process the document
41
+ def version
42
+ @xml_parser.version
43
+ end
44
+
45
+ # length in bytes of the document
46
+ def document_length
47
+ @xml_parser.document_length
48
+ end
49
+
50
+ # Create convenience methods to access post fields from the @options hash, mostly for testing.
51
+ POST_FIELDS.each do |f|
52
+ define_method(f) do # def appid
53
+ @options[f] # @options[:appid]
54
+ end # end
32
55
  end
33
56
 
34
57
  private
@@ -0,0 +1,13 @@
1
+ module Placemaker
2
+ class Coordinates
3
+ include Placemaker::XmlHelper
4
+
5
+ def lat
6
+ @nodeset.search('.//xmlns:latitude', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.to_f
7
+ end
8
+
9
+ def lng
10
+ @nodeset.search('.//xmlns:longitude', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.to_f
11
+ end
12
+ end
13
+ end
@@ -1,14 +1,32 @@
1
1
  module Placemaker
2
+
2
3
  class Document
3
- def initialize(nodeset)
4
- @nodeset = nodeset
5
- end
4
+ include Placemaker::XmlHelper
6
5
 
7
- def places
6
+ # Returns a Placemaker::Location object that is a container for one named place mentioned in the document
7
+ def place_details
8
8
  @nodeset.search('.//xmlns:placeDetails', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').map do |p|
9
- Placemaker::Place.new(p)
9
+ Placemaker::PlaceDetails.new(p)
10
10
  end
11
11
  end
12
12
 
13
+ # Returns a Placemaker::Location object that is a container for the smallest administrative place that best describes the document
14
+ def administrative_scope
15
+ as = @nodeset.search('.//xmlns:administrativeScope', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').first
16
+ Placemaker::Location.new(as) unless as.nil?
17
+ end
18
+
19
+ # Returns a Placemaker::Location object that is a container for the smallest place that best describes the document
20
+ def geographic_scope
21
+ gs = @nodeset.search('.//xmlns:geographicScope', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').first
22
+ Placemaker::Location.new(gs) unless gs.nil?
23
+ end
24
+
25
+ # Returns a Placemaker::Extents object that is a container for the the map extents covering the places mentioned in the document
26
+ def extents
27
+ extents = @nodeset.search('.//xmlns:extents', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').first
28
+ Placemaker::Extents.new(extents) unless extents.nil?
29
+ end
13
30
  end
31
+
14
32
  end
@@ -0,0 +1,23 @@
1
+ module Placemaker
2
+
3
+ # container for the the map extents covering the places mentioned in the document
4
+ class Extents
5
+ include Placemaker::XmlHelper
6
+
7
+ # coordinates of center (WGS84)
8
+ def center
9
+ Placemaker::Coordinates.new(@nodeset.search('.//xmlns:center', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema'))
10
+ end
11
+
12
+ # coordinates of southwest corner of bounding box (WGS84)
13
+ def south_west
14
+ Placemaker::Coordinates.new(@nodeset.search('.//xmlns:southWest', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema'))
15
+ end
16
+
17
+ # coordinates of northeast corner of bounding box (WGS84)
18
+ def north_east
19
+ Placemaker::Coordinates.new(@nodeset.search('.//xmlns:northEast', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema'))
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,33 @@
1
+ module Placemaker
2
+
3
+ # Parses and contains data for +place+, +administrative scope+ and +geographic scope+ elements.
4
+ class Location
5
+ include Placemaker::XmlHelper
6
+
7
+ # permanent identifier for the place
8
+ def woe_id
9
+ nested_node('woeId').to_i
10
+ end
11
+
12
+ # fully qualified name for the place
13
+ def name
14
+ nested_node('name')
15
+ end
16
+
17
+ # place type name for the place
18
+ def location_type
19
+ nested_node('type')
20
+ end
21
+
22
+ # centroid for the place
23
+ def centroid
24
+ Placemaker::Coordinates.new(@nodeset.search('.//xmlns:centroid', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema'))
25
+ end
26
+
27
+ private
28
+
29
+ def nested_node(name)
30
+ @nodeset.search(".//xmlns:#{name}", 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ module Placemaker
2
+
3
+ # container for one named place mentioned in the document
4
+ class PlaceDetails
5
+ include Placemaker::XmlHelper
6
+
7
+ # Returns a Placemaker::Location object as a container for place information.
8
+ def place
9
+ Placemaker::Location.new(@nodeset.search('.//xmlns:place', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema'))
10
+ end
11
+
12
+ # type of match (0=text or text and coordinates, 1=coordinates only)
13
+ def match_type
14
+ nested_node('matchType').to_i
15
+ end
16
+
17
+ # relative weight of the place within the document (range 1-100)
18
+ def weight
19
+ nested_node('weight').to_i
20
+ end
21
+
22
+ # confidence that the document mentions the place (range 1-10)
23
+ def confidence
24
+ nested_node('confidence').to_i
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module Placemaker
2
+ module XmlHelper
3
+ def initialize(nodeset)
4
+ @nodeset = nodeset
5
+ end
6
+
7
+ # Returns the inner text of a node with the given name under the current @nodeset
8
+ def nested_node(name)
9
+ @nodeset.search(".//xmlns:#{name}", 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text
10
+ end
11
+
12
+ private :nested_node
13
+ end
14
+ end
@@ -3,10 +3,24 @@ module Placemaker
3
3
  def initialize(xml_body)
4
4
  @body = xml_body
5
5
  @xml = Nokogiri::XML(xml_body)
6
+ end
7
+
8
+ # time in seconds to process the document
9
+ def processing_time
10
+ @xml.xpath('.//xmlns:processingTime', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.to_f
11
+ end
12
+
13
+ # version of the software used to process the document
14
+ def version
15
+ @xml.xpath('.//xmlns:version', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.strip
16
+ end
17
+
18
+ # length in bytes of the document
19
+ def document_length
20
+ @xml.xpath('.//xmlns:documentLength', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.to_i
6
21
  end
7
22
 
8
- # Returns a set of documents corresponding to the RSS entries in input data.
9
- # Returns a collection of Placemaker::Document objects.
23
+ # Returns a set of Placemaker::Document objects as containers for content location information
10
24
  def documents
11
25
  @xml.xpath('//xmlns:document', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').map do |d|
12
26
  Placemaker::Document.new(d)
data/lib/placemaker.rb CHANGED
@@ -3,6 +3,8 @@ require 'curb'
3
3
  require 'nokogiri'
4
4
  require 'cgi'
5
5
 
6
+ require File.join(File.dirname(__FILE__), %w[placemaker xml_helper])
7
+
6
8
  lib_dirs = [ 'core_ext', 'placemaker' ].map do |d|
7
9
  File.join(File.dirname(__FILE__), d)
8
10
  end
data/placemaker.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{placemaker}
5
- s.version = "0.0.1.2"
5
+ s.version = "0.0.1.5"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Justin Leitgeb"]
@@ -14,11 +14,12 @@ Gem::Specification.new do |s|
14
14
  ]
15
15
 
16
16
 
17
- s.files = ["lib/core_ext/array.rb", "lib/core_ext/hash.rb", "lib/placemaker/document.rb", "lib/placemaker/place.rb",
18
- "lib/placemaker/reader.rb", "lib/placemaker/xml_parser.rb", "lib/placemaker.rb", "LICENSE",
19
- "placemaker.gemspec", "Rakefile", "README.rdoc", "spec/fixtures/xml_rss_feed_result.xml",
20
- "spec/placemaker/document_spec.rb", "spec/placemaker/place_spec.rb", "spec/placemaker/reader_spec.rb",
21
- "spec/placemaker/xml_parser_spec.rb", "spec/spec_helper.rb"]
17
+ s.files = ["lib/core_ext/array.rb", "lib/core_ext/hash.rb", "lib/placemaker/client.rb", "lib/placemaker/coordinates.rb",
18
+ "lib/placemaker/document.rb", "lib/placemaker/extents.rb", "lib/placemaker/location.rb", "lib/placemaker/place_details.rb",
19
+ "lib/placemaker/xml_helper.rb", "lib/placemaker/xml_parser.rb", "lib/placemaker.rb", "LICENSE", "placemaker.gemspec",
20
+ "Rakefile", "README.rdoc", "spec/fixtures/xml_rss_feed_result.xml", "spec/placemaker/client_spec.rb", "spec/placemaker/coordinates_spec.rb",
21
+ "spec/placemaker/document_spec.rb", "spec/placemaker/extents_spec.rb", "spec/placemaker/location_spec.rb",
22
+ "spec/placemaker/place_details_spec.rb", "spec/placemaker/xml_parser_spec.rb", "spec/spec_helper.rb"]
22
23
 
23
24
  s.has_rdoc = true
24
25
  s.homepage = %q{http://github.com/jsl/placemaker}
@@ -26,8 +27,10 @@ Gem::Specification.new do |s|
26
27
  s.require_paths = ["lib"]
27
28
  s.rubygems_version = %q{1.3.1}
28
29
  s.summary = %q{Ruby interface over the Yahoo Placemaker API}
29
- s.test_files = ["spec/fixtures/xml_rss_feed_result.xml", "spec/placemaker/document_spec.rb", "spec/placemaker/place_spec.rb",
30
- "spec/placemaker/reader_spec.rb", "spec/placemaker/xml_parser_spec.rb", "spec/spec_helper.rb"]
30
+
31
+ s.test_files = ["spec/fixtures/xml_rss_feed_result.xml", "spec/placemaker/client_spec.rb", "spec/placemaker/coordinates_spec.rb",
32
+ "spec/placemaker/document_spec.rb", "spec/placemaker/extents_spec.rb", "spec/placemaker/location_spec.rb",
33
+ "spec/placemaker/place_details_spec.rb", "spec/placemaker/xml_parser_spec.rb", "spec/spec_helper.rb"]
31
34
 
32
35
  s.extra_rdoc_files = [ "README.rdoc" ]
33
36
 
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
2
 
3
- describe Placemaker::Reader do
3
+ describe Placemaker::Client do
4
4
  before do
5
5
  @valid_opts = {
6
6
  :document_url => 'http://www.example.com',
@@ -11,36 +11,36 @@ describe Placemaker::Reader do
11
11
  describe "object initialization" do
12
12
  it "should set appid to the value of ENV['PLACEMAKER_APPID']" do
13
13
  ENV['PLACEMAKER_APPID'] = 'foo'
14
- p = Placemaker::Reader.new(@valid_opts)
14
+ p = Placemaker::Client.new(@valid_opts)
15
15
  p.appid.should == 'foo'
16
16
  end
17
17
 
18
18
  it "should initialize #documents to an empty array" do
19
- p = Placemaker::Reader.new(@valid_opts)
19
+ p = Placemaker::Client.new(@valid_opts)
20
20
  p.documents.should be_a(Array)
21
21
  p.documents.should be_empty
22
22
  end
23
23
 
24
24
  it "should raise an argument error if the document_type is not correctly set" do
25
25
  lambda {
26
- Placemaker::Reader.new(@valid_opts.except(:document_type))
26
+ Placemaker::Client.new(@valid_opts.except(:document_type))
27
27
  }.should raise_error(ArgumentError)
28
28
  end
29
29
 
30
30
  it "should set the appid to the value of options[:appid] if provided" do
31
31
  ENV['PLACEMAKER_APPID'] = 'foo'
32
- p = Placemaker::Reader.new(@valid_opts.merge(:appid => 'fark', :document_url => 'foo'))
32
+ p = Placemaker::Client.new(@valid_opts.merge(:appid => 'fark', :document_url => 'foo'))
33
33
  p.appid.should == 'fark'
34
34
  end
35
35
 
36
36
  it "should create methods to allow access to configuration parameters" do
37
- p = Placemaker::Reader.new(@valid_opts.merge(:document_content => 'foo'))
37
+ p = Placemaker::Client.new(@valid_opts.merge(:document_content => 'foo'))
38
38
  p.document_content.should == 'foo'
39
39
  end
40
40
 
41
41
  it "should raise an error if both document_content and document_url are nil" do
42
42
  lambda {
43
- p = Placemaker::Reader.new
43
+ p = Placemaker::Client.new
44
44
  }.should raise_error(ArgumentError)
45
45
  end
46
46
  end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Placemaker::Coordinates do
4
+ before do
5
+ @xml_str = File.read(File.join(File.dirname(__FILE__), %w[.. fixtures xml_rss_feed_result.xml]))
6
+ @xmlp = Placemaker::XmlParser.new(@xml_str)
7
+ @doc = @xmlp.documents[5]
8
+ @coords = @doc.place_details.first.place.centroid
9
+ end
10
+
11
+ it "should be a Placemaker::Coordinates object" do
12
+ @coords.should be_a(Placemaker::Coordinates)
13
+ end
14
+ end
@@ -6,14 +6,34 @@ describe Placemaker::Document do
6
6
  @xmlp = Placemaker::XmlParser.new(@xml_str)
7
7
  @doc = @xmlp.documents[5]
8
8
  end
9
-
9
+
10
10
  describe "#places" do
11
11
  it "should have 4 places for the given node" do
12
- @doc.places.size.should == 4
12
+ @doc.place_details.size.should == 4
13
+ end
14
+
15
+ it "should return a Placemaker::PlaceDetails object for the first node" do
16
+ @doc.place_details.first.should be_a(Placemaker::PlaceDetails)
17
+ end
18
+ end
19
+
20
+ describe "#administrative_scope" do
21
+ it "should have an administrative scope" do
22
+ @doc.administrative_scope.should_not be_nil
23
+ end
24
+
25
+ it "should return a Placemaker::Location object" do
26
+ @doc.administrative_scope.should be_a(Placemaker::Location)
27
+ end
28
+ end
29
+
30
+ describe "#geographic_scope" do
31
+ it "should have an geographic scope" do
32
+ @doc.geographic_scope.should_not be_nil
13
33
  end
14
34
 
15
- it "should return a Placemaker::Place object for the first node" do
16
- @doc.places.first.should be_a(Placemaker::Place)
35
+ it "should return a Placemaker::Location object" do
36
+ @doc.geographic_scope.should be_a(Placemaker::Location)
17
37
  end
18
38
  end
19
39
  end
@@ -0,0 +1,56 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Placemaker::Extents do
4
+ before do
5
+ @xml_str = File.read(File.join(File.dirname(__FILE__), %w[.. fixtures xml_rss_feed_result.xml]))
6
+ @xmlp = Placemaker::XmlParser.new(@xml_str)
7
+ @doc = @xmlp.documents[5]
8
+ @extents = @doc.extents
9
+ end
10
+
11
+ it "should be a Placemaker::Extents object" do
12
+ @extents.should be_a(Placemaker::Extents)
13
+ end
14
+
15
+ describe "#center" do
16
+ it "should return a Placemaker::Point object" do
17
+ @extents.center.should be_a(Placemaker::Coordinates)
18
+ end
19
+
20
+ it "should have a lat of 38.8913" do
21
+ @extents.center.lat.should == 38.8913
22
+ end
23
+
24
+ it "should have a lng of -77.0337" do
25
+ @extents.center.lng.should == -77.0337
26
+ end
27
+ end
28
+
29
+ describe "#south_west" do
30
+ it "should return a Placemaker::Point object" do
31
+ @extents.south_west.should be_a(Placemaker::Coordinates)
32
+ end
33
+
34
+ it "should have a lat of 18.9108" do
35
+ @extents.south_west.lat.should == 18.9108
36
+ end
37
+
38
+ it "should have a lng of -167.276" do
39
+ @extents.south_west.lng.should == -167.276
40
+ end
41
+ end
42
+
43
+ describe "#north_east" do
44
+ it "should return a Placemaker::Point object" do
45
+ @extents.north_east.should be_a(Placemaker::Coordinates)
46
+ end
47
+
48
+ it "should have a lat of 72.8961" do
49
+ @extents.north_east.lat.should == 72.8961
50
+ end
51
+
52
+ it "should have a lng of -66.6879" do
53
+ @extents.north_east.lng.should == -66.6879
54
+ end
55
+ end
56
+ end
@@ -1,61 +1,44 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
2
 
3
- describe Placemaker::Place do
3
+ describe Placemaker::Location do
4
4
  before do
5
5
  @xml_str = File.read(File.join(File.dirname(__FILE__), %w[.. fixtures xml_rss_feed_result.xml]))
6
6
  @xmlp = Placemaker::XmlParser.new(@xml_str)
7
- @doc = @xmlp.documents[5]
8
- @place = @doc.places.first
7
+ @doc = @xmlp.documents[5]
8
+ @loc = @doc.place_details.first.place
9
9
  end
10
10
 
11
11
  describe "#woe_id" do
12
12
  it "should equal 2442047" do
13
- @place.woe_id.should == 2442047
13
+ @loc.woe_id.should == 2442047
14
14
  end
15
15
  end
16
16
 
17
17
  describe "place_type" do
18
18
  it "should be Town" do
19
- @place.place_type.should == 'Town'
19
+ @loc.location_type.should == 'Town'
20
20
  end
21
21
  end
22
22
 
23
23
  describe "#name" do
24
24
  it "should be Los Angeles, CA, US" do
25
- @place.name.should == 'Los Angeles, CA, US'
25
+ @loc.name.should == 'Los Angeles, CA, US'
26
26
  end
27
27
  end
28
28
 
29
29
  describe "centroid" do
30
30
 
31
31
  it "should be a Placemaker::Point object" do
32
- @place.centroid.should be_a(Placemaker::Point)
32
+ @loc.centroid.should be_a(Placemaker::Coordinates)
33
33
  end
34
34
 
35
35
  it "should return an object with lat set to 34.0533" do
36
- @place.centroid.lat.should == 34.0533
36
+ @loc.centroid.lat.should == 34.0533
37
37
  end
38
38
 
39
39
  it "should return an object with lng set to -118.245" do
40
- @place.centroid.lng.should == -118.245
40
+ @loc.centroid.lng.should == -118.245
41
41
  end
42
42
  end
43
43
 
44
- describe "#match_type" do
45
- it "should be 0" do
46
- @place.match_type.should == 0
47
- end
48
- end
49
-
50
- describe "#weight" do
51
- it "should be 1" do
52
- @place.weight.should == 1
53
- end
54
- end
55
-
56
- describe "#confidence" do
57
- it "should be 9" do
58
- @place.confidence.should == 9
59
- end
60
- end
61
44
  end
@@ -0,0 +1,28 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Placemaker::PlaceDetails do
4
+ before do
5
+ @xml_str = File.read(File.join(File.dirname(__FILE__), %w[.. fixtures xml_rss_feed_result.xml]))
6
+ @xmlp = Placemaker::XmlParser.new(@xml_str)
7
+ @doc = @xmlp.documents[5]
8
+ @pd = @doc.place_details.first
9
+ end
10
+
11
+ describe "#match_type" do
12
+ it "should be 0" do
13
+ @pd.match_type.should == 0
14
+ end
15
+ end
16
+
17
+ describe "#weight" do
18
+ it "should be 1" do
19
+ @pd.weight.should == 1
20
+ end
21
+ end
22
+
23
+ describe "#confidence" do
24
+ it "should be 9" do
25
+ @pd.confidence.should == 9
26
+ end
27
+ end
28
+ end
@@ -5,6 +5,24 @@ describe Placemaker::XmlParser do
5
5
  @xml_str = File.read(File.join(File.dirname(__FILE__), %w[.. fixtures xml_rss_feed_result.xml]))
6
6
  @xmlp = Placemaker::XmlParser.new(@xml_str)
7
7
  end
8
+
9
+ describe "processing_time" do
10
+ it "should return 0.028125" do
11
+ @xmlp.processing_time.should == 0.028125
12
+ end
13
+ end
14
+
15
+ describe "version" do
16
+ it "should return build 090508" do
17
+ @xmlp.version.should == 'build 090508'
18
+ end
19
+ end
20
+
21
+ describe "document_length" do
22
+ it "should return 29700" do
23
+ @xmlp.document_length.should == 29700
24
+ end
25
+ end
8
26
 
9
27
  describe "#documents" do
10
28
  it "should return 15 documents" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsl-placemaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.2
4
+ version: 0.0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Leitgeb
@@ -43,9 +43,13 @@ extra_rdoc_files:
43
43
  files:
44
44
  - lib/core_ext/array.rb
45
45
  - lib/core_ext/hash.rb
46
+ - lib/placemaker/client.rb
47
+ - lib/placemaker/coordinates.rb
46
48
  - lib/placemaker/document.rb
47
- - lib/placemaker/place.rb
48
- - lib/placemaker/reader.rb
49
+ - lib/placemaker/extents.rb
50
+ - lib/placemaker/location.rb
51
+ - lib/placemaker/place_details.rb
52
+ - lib/placemaker/xml_helper.rb
49
53
  - lib/placemaker/xml_parser.rb
50
54
  - lib/placemaker.rb
51
55
  - LICENSE
@@ -53,9 +57,12 @@ files:
53
57
  - Rakefile
54
58
  - README.rdoc
55
59
  - spec/fixtures/xml_rss_feed_result.xml
60
+ - spec/placemaker/client_spec.rb
61
+ - spec/placemaker/coordinates_spec.rb
56
62
  - spec/placemaker/document_spec.rb
57
- - spec/placemaker/place_spec.rb
58
- - spec/placemaker/reader_spec.rb
63
+ - spec/placemaker/extents_spec.rb
64
+ - spec/placemaker/location_spec.rb
65
+ - spec/placemaker/place_details_spec.rb
59
66
  - spec/placemaker/xml_parser_spec.rb
60
67
  - spec/spec_helper.rb
61
68
  has_rdoc: true
@@ -92,8 +99,11 @@ specification_version: 2
92
99
  summary: Ruby interface over the Yahoo Placemaker API
93
100
  test_files:
94
101
  - spec/fixtures/xml_rss_feed_result.xml
102
+ - spec/placemaker/client_spec.rb
103
+ - spec/placemaker/coordinates_spec.rb
95
104
  - spec/placemaker/document_spec.rb
96
- - spec/placemaker/place_spec.rb
97
- - spec/placemaker/reader_spec.rb
105
+ - spec/placemaker/extents_spec.rb
106
+ - spec/placemaker/location_spec.rb
107
+ - spec/placemaker/place_details_spec.rb
98
108
  - spec/placemaker/xml_parser_spec.rb
99
109
  - spec/spec_helper.rb
@@ -1,47 +0,0 @@
1
- module Placemaker
2
- class Point < OpenStruct
3
- end
4
-
5
- class Place
6
- def initialize(nodeset)
7
- @nodeset = nodeset
8
- end
9
-
10
- def centroid
11
- centroid = @nodeset.search('.//xmlns:centroid', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema')
12
- lat = centroid.search('.//xmlns:latitude', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.to_f
13
- lng = centroid.search('.//xmlns:longitude', 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text.to_f
14
- Placemaker::Point.new(:lat => lat, :lng => lng)
15
- end
16
-
17
- def place_type
18
- nested_node('type')
19
- end
20
-
21
- def match_type
22
- nested_node('matchType').to_i
23
- end
24
-
25
- def weight
26
- nested_node('weight').to_i
27
- end
28
-
29
- def confidence
30
- nested_node('confidence').to_i
31
- end
32
-
33
- def name
34
- nested_node('name')
35
- end
36
-
37
- def woe_id
38
- nested_node('woeId').to_i
39
- end
40
-
41
- private
42
-
43
- def nested_node(name)
44
- @nodeset.search(".//xmlns:#{name}", 'xmlns' => 'http://wherein.yahooapis.com/v1/schema').inner_text
45
- end
46
- end
47
- end