diff --git a/Gemfile.lock b/Gemfile.lock index 33316f1..eecfcbb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,26 +6,26 @@ PATH GEM remote: http://rubygems.org/ specs: - diff-lcs (1.1.2) + diff-lcs (1.2.4) fakeweb (1.3.0) - rake (0.8.7) + rake (10.1.0) rcov (0.9.9) - rspec (2.0.0.beta.20) - rspec-core (= 2.0.0.beta.20) - rspec-expectations (= 2.0.0.beta.20) - rspec-mocks (= 2.0.0.beta.20) - rspec-core (2.0.0.beta.20) - rspec-expectations (2.0.0.beta.20) - diff-lcs (>= 1.1.2) - rspec-mocks (2.0.0.beta.20) + rspec (2.13.0) + rspec-core (~> 2.13.0) + rspec-expectations (~> 2.13.0) + rspec-mocks (~> 2.13.0) + rspec-core (2.13.1) + rspec-expectations (2.13.0) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.13.1) PLATFORMS ruby DEPENDENCIES - bundler (~> 1.0.0) + bundler (~> 1.3.5) fakeweb (~> 1.3.0) - rake + rake (~> 10.1.0) rcov (~> 0.9.9) - rspec (= 2.0.0.beta.20) + rspec (= 2.13.0) ruby-geonames! diff --git a/lib/toponym_search_criteria.rb b/lib/toponym_search_criteria.rb index 400449e..926f63e 100644 --- a/lib/toponym_search_criteria.rb +++ b/lib/toponym_search_criteria.rb @@ -30,6 +30,7 @@ class ToponymSearchCriteria attr :feature_class attr :feature_codes attr :admin_code_1 + attr :country_bias attr :max_rows attr :start_row @@ -37,6 +38,15 @@ class ToponymSearchCriteria attr_writer :name_starts_with, :tag, :language, :style attr_writer :feature_class, :feature_codes, :admin_code_1 attr_writer :max_rows, :start_row + attr_writer :country_bias + + def name_required? + !!@name_required + end + + def name_required=(value) + @name_required = value + end end end diff --git a/lib/web_service.rb b/lib/web_service.rb index 577c84e..21c200f 100644 --- a/lib/web_service.rb +++ b/lib/web_service.rb @@ -20,21 +20,15 @@ module Geonames class WebService def WebService.get_element_child_text( element, child ) - if !element.elements[child].nil? - element.elements[child][0].to_s - end + element.elements[child][0].to_s unless element.elements[child].nil? end def WebService.get_element_child_float( element, child ) - if !element.elements[child].nil? - element.elements[child][0].to_s.to_f - end + element.elements[child][0].to_s.to_f unless element.elements[child].nil? end def WebService.get_element_child_int( element, child ) - if !element.elements[child].nil? - element.elements[child][0].to_s.to_i - end + element.elements[child][0].to_s.to_i unless element.elements[child].nil? end def WebService.element_to_postal_code ( element ) @@ -52,7 +46,6 @@ def WebService.element_to_postal_code ( element ) postal_code.postal_code = WebService::get_element_child_text( element, 'postalcode' ) return postal_code - end def WebService.element_to_wikipedia_article ( element ) @@ -71,7 +64,6 @@ def WebService.element_to_wikipedia_article ( element ) article.distance = WebService::get_element_child_float( element, 'distance' ) return article - end def WebService.element_to_toponym ( element ) @@ -97,7 +89,6 @@ def WebService.element_to_toponym ( element ) toponym.admin_name_2 = WebService::get_element_child_text( element, 'adminName2' ) return toponym - end def WebService.element_to_intersection ( element ) @@ -118,11 +109,11 @@ def WebService.element_to_intersection ( element ) intersection.postal_code = WebService::get_element_child_text( element, 'postalcode' ) return intersection - end def WebService.element_to_country_info(element) - country_info = Geonames::CountryInfo.new + country_info = CountryInfo.new + country_info.country_code = WebService.get_element_child_text(element, 'countryCode') country_info.country_name = WebService.get_element_child_text(element, 'countryName') country_info.iso_numeric = WebService.get_element_child_int(element, 'isoNumeric') @@ -153,7 +144,7 @@ def WebService.postal_code_search( postal_code, place_name, country_code,*args ) postal_code_sc.place_name = place_name postal_code_sc.country_code = country_code - WebService.postal_code_search postal_code_sc, args + WebService.postal_code_search(postal_code_sc, args) end def WebService.postal_code_search( search_criteria, *args ) @@ -161,30 +152,27 @@ def WebService.postal_code_search( search_criteria, *args ) postal_codes = Array.new url = "/postalCodeSearch?a=a" - url = url + search_criteria.to_query_params_string + url << search_criteria.to_query_params_string res = make_request(url,args) - - doc = REXML::Document.new res.body + doc = REXML::Document.new(res.body) doc.elements.each("geonames/code") do |element| postal_codes << WebService::element_to_postal_code( element ) end postal_codes - end def WebService.find_nearby_postal_codes( search_criteria ) - # postal codes to reutrn + # postal codes to return postal_codes = Array.new url = "/findNearbyPostalCodes?a=a" url = url + search_criteria.to_query_params_string res = make_request(url) - - doc = REXML::Document.new res.body + doc = REXML::Document.new(res.body) doc.elements.each("geonames/code") do |element| postal_codes << WebService::element_to_postal_code( element ) @@ -199,47 +187,40 @@ def WebService.find_nearby_place_name( lat, long ) url = "/findNearbyPlaceName?a=a" - url = url + "&lat=" + lat.to_s - url = url + "&lng=" + long.to_s + url << "&lat=#{lat}" + url << "&lng=#{long}" res = make_request(url) doc = REXML::Document.new res.body doc.elements.each("geonames/geoname") do |element| - places << WebService::element_to_toponym( element ) - end return places - end def WebService.find_nearest_intersection( lat, long ) - url = "/findNearestIntersection?a=a" - url = url + "&lat=" + lat.to_s - url = url + "&lng=" + long.to_s + url << "&lat=#{lat}" + url << "&lng=#{long}" res = make_request(url) - doc = REXML::Document.new res.body intersection = [] doc.elements.each("geonames/intersection") do |element| - intersection = WebService::element_to_intersection( element ) - end return intersection - end def WebService.timezone( lat, long, *args ) res = make_request("/timezone?lat=#{lat.to_s}&lng=#{long.to_s}", args) + doc = REXML::Document.new res.body timezone = Timezone.new doc.elements.each("geonames/timezone") do |element| @@ -247,17 +228,20 @@ def WebService.timezone( lat, long, *args ) timezone.gmt_offset = WebService::get_element_child_float( element, 'gmtOffset' ) timezone.dst_offset = WebService::get_element_child_float( element, 'dstOffset' ) end + timezone end def WebService.make_request(path_and_query, *args) url = Geonames.base_url + path_and_query - url += "&username=#{Geonames.username}" if Geonames.username - url += "&lang=#{Geonames.lang}" + url << "&username=#{Geonames.username}" if Geonames.username + url << "&lang=#{Geonames.lang}" + options = { :open_timeout => 60, :read_timeout => 60 } + options.update(args.last.is_a?(::Hash) ? args.pop : {}) uri = URI.parse(url) req = Net::HTTP::Get.new(uri.path + '?' + uri.query) @@ -288,19 +272,18 @@ def WebService.find_nearby_wikipedia( hashes ) url = "/findNearbyWikipedia?a=a" if !lat.nil? && !long.nil? - url = url + "&lat=" + lat.to_s - url = url + "&lng=" + long.to_s - url = url + "&radius=" + radius.to_s unless radius.nil? - url = url + "&max_rows=" + max_rows.to_s unless max_rows.nil? + url << "&lat=#{lat}" + url << "&lng=#{long}" + url << "&radius=#{radius}" unless radius.nil? + url << "&max_rows=#{max_rows}" unless max_rows.nil? elsif !q.nil? - url = url + "&q=" + q - url = url + "&radius=" + radius.to_s unless radius.nil? - url = url + "&max_rows=" + max_rows.to_s unless max_rows.nil? + url << "&q=#{q}" + url << "&radius=#{radius}" unless radius.nil? + url << "&max_rows=#{max_rows}" unless max_rows.nil? end res = make_request(url) - doc = REXML::Document.new res.body doc.elements.each("geonames/entry") do |element| @@ -308,7 +291,6 @@ def WebService.find_nearby_wikipedia( hashes ) end return articles - end def WebService.findBoundingBoxWikipedia( hashes ) @@ -332,15 +314,14 @@ def WebService.find_bounding_box_wikipedia( hashes ) url = "/wikipediaBoundingBox?a=a" - url = url + "&north=" + north.to_s - url = url + "&east=" + east.to_s - url = url + "&south=" + south.to_s - url = url + "&west=" + west.to_s - url = url + "&radius=" + radius.to_s unless radius.nil? - url = url + "&max_rows=" + max_rows.to_s unless max_rows.nil? + url << "&north=#{north}" + url << "&east=#{east}" + url << "&south=#{south}" + url << "&west=#{west}" + url << "&radius=#{radius}" unless radius.nil? + url << "&max_rows=#{max_rows}" unless max_rows.nil? res = make_request(url) - doc = REXML::Document.new res.body doc.elements.each("geonames/entry") do |element| @@ -348,11 +329,9 @@ def WebService.find_bounding_box_wikipedia( hashes ) end return articles - end - def WebService.country_subdivision ( lat, long, radius = 0, maxRows = 1 ) - + def WebService.country_subdivision ( lat, long, radius = 0, max_rows = 1 ) country_subdivisions = Array.new # maxRows is only implemented in the xml version: @@ -360,19 +339,16 @@ def WebService.country_subdivision ( lat, long, radius = 0, maxRows = 1 ) # Therefore 'type=xml' is added: url = "/countrySubdivision?a=a&type=xml" - url = url + "&lat=" + lat.to_s - url = url + "&lng=" + long.to_s - url = url + "&maxRows=" + maxRows.to_s - url = url + "&radius=" + radius.to_s + url << "&lat=#{lat}" + url << "&lng=#{long}" + url << "&maxRows=#{max_rows}" + url << "&radius=#{radius}" res = make_request(url) doc = REXML::Document.new res.body - doc.elements.each("geonames/countrySubdivision") do |element| - country_subdivision = CountrySubdivision.new - country_subdivision.country_code = WebService::get_element_child_text( element, 'countryCode' ) country_subdivision.country_name = WebService::get_element_child_text( element, 'countryName' ) country_subdivision.admin_code_1 = WebService::get_element_child_text( element, 'adminCode1' ) @@ -381,17 +357,15 @@ def WebService.country_subdivision ( lat, long, radius = 0, maxRows = 1 ) country_subdivision.code_iso = WebService::get_element_child_text( element, 'code[@type="ISO3166-2"]') country_subdivisions << country_subdivision - end return country_subdivisions - end def WebService.country_info(country_code = false) url = "/countryInfo?a=a" - url += "&country=#{country_code.to_s}" if country_code + url << "&country=#{country_code.to_s}" if country_code res = make_request(url) doc = REXML::Document.new res.body @@ -404,7 +378,7 @@ def WebService.country_info(country_code = false) countries.size > 1 ? countries : countries[0] end - def WebService.country_code ( lat, long, radius = 0, maxRows = 1 ) + def WebService.country_code ( lat, long, radius = 0, max_rows = 1 ) # maxRows is only implemented in the xml version: # http://groups.google.com/group/geonames/browse_thread/thread/f7f1bb2504ed216e # Therefore 'type=xml' is added: @@ -412,23 +386,19 @@ def WebService.country_code ( lat, long, radius = 0, maxRows = 1 ) countries = Array.new - url = url + "&lat=" + lat.to_s - url = url + "&lng=" + long.to_s - url = url + "&maxRows=" + maxRows.to_s - url = url + "&radius=" + radius.to_s + url << "&lat=#{lat}" + url << "&lng=#{long}" + url << "&maxRows=#{max_rows}" + url << "&radius=#{radius}" res = make_request(url) - doc = REXML::Document.new res.body doc.elements.each("geonames/country") do |element| - countries << WebService::element_to_toponym( element ) - end return countries - end def WebService.search( search_criteria ) @@ -437,75 +407,37 @@ def WebService.search( search_criteria ) url = "/search?a=a" - if !search_criteria.q.nil? - url = url + "&q=" + CGI::escape( search_criteria.q ) - end - - if !search_criteria.name_equals.nil? - url = url + "&name_equals=" + CGI::escape( search_criteria.name_equals ) - end - - if !search_criteria.name_starts_with.nil? - url = url + "&name_startsWith=" + CGI::escape( search_criteria.name_starts_with ) - end - - if !search_criteria.name.nil? - url = url + "&name=" + CGI::escape( search_criteria.name ) - end - - if !search_criteria.tag.nil? - url = url + "&tag=" + CGI::escape( search_criteria.tag ) - end - - if !search_criteria.country_code.nil? - url = url + "&country=" + CGI::escape( search_criteria.country_code ) - end - - if !search_criteria.admin_code_1.nil? - url = url + "&adminCode1=" + CGI::escape( search_criteria.admin_code_1 ) - end - - if !search_criteria.language.nil? - url = url + "&lang=" + CGI::escape( search_criteria.language ) - end - - if !search_criteria.feature_class.nil? - url = url + "&featureClass=" + CGI::escape( search_criteria.feature_class ) - end - - if !search_criteria.feature_codes.nil? + url << "&q=#{CGI::escape( search_criteria.q )}" unless search_criteria.q.nil? + url << "&name_equals=#{CGI::escape( search_criteria.name_equals )}" unless search_criteria.name_equals.nil? + url << "&name_startsWith=#{CGI::escape( search_criteria.name_starts_with )}" unless search_criteria.name_starts_with.nil? + url << "&name=#{CGI::escape( search_criteria.name )}" unless search_criteria.name.nil? + url << "&tag=#{CGI::escape( search_criteria.tag )}" unless search_criteria.tag.nil? + url << "&country=#{CGI::escape( search_criteria.country_code )}" unless search_criteria.country_code.nil? + url << "&adminCode1=#{CGI::escape( search_criteria.admin_code_1 )}" unless search_criteria.admin_code_1.nil? + url << "&lang=#{CGI::escape( search_criteria.language )}" unless search_criteria.language.nil? + url << "&featureClass=#{CGI::escape( search_criteria.feature_class )}" unless search_criteria.feature_class.nil? + + unless search_criteria.feature_codes.nil? for feature_code in search_criteria.feature_codes - url = url + "&fcode=" + CGI::escape( feature_code ) + url << "&featureCode=#{CGI::escape( feature_code )}" end end - if !search_criteria.max_rows.nil? - url = url + "&maxRows=" + CGI::escape( search_criteria.max_rows ) - end - - if !search_criteria.start_row.nil? - url = url + "&startRow=" + CGI::escape( search_criteria.start_row ) - end - - if !search_criteria.style.nil? - url = url + "&style=" + CGI::escape( search_criteria.style ) - end + url << "&countryBias=#{CGI::escape( search_criteria.country_bias )}" unless search_criteria.country_bias.nil? + url << "&isNameRequired=true" if search_criteria.name_required? + url << "&maxRows=#{CGI::escape( search_criteria.max_rows )}" unless search_criteria.max_rows.nil? + url << "&startRow=#{CGI::escape( search_criteria.start_row )}" unless search_criteria.start_row.nil? + url << "&style=#{CGI::escape( search_criteria.style )}" unless search_criteria.style.nil? res = make_request(url) - doc = REXML::Document.new res.body - toponym_sr.total_results_count = doc.elements["geonames/totalResultsCount"].text - doc.elements.each("geonames/geoname") do |element| - toponym_sr.toponyms << WebService::element_to_toponym( element ) - end return toponym_sr end - end end diff --git a/ruby-geonames.gemspec b/ruby-geonames.gemspec index 3e4ded1..dd03dec 100644 --- a/ruby-geonames.gemspec +++ b/ruby-geonames.gemspec @@ -12,9 +12,9 @@ Gem::Specification.new do |s| s.has_rdoc = true s.extra_rdoc_files = ["README.markdown"] s.required_rubygems_version = ">= 1.3.6" - s.add_development_dependency "bundler", "~> 1.0.0" + s.add_development_dependency "bundler", "~> 1.3.5" s.add_development_dependency "fakeweb", "~> 1.3.0" - s.add_development_dependency "rake" + s.add_development_dependency "rake", "~> 10.1.0" s.add_development_dependency "rcov", "~> 0.9.9" - s.add_development_dependency "rspec", "2.0.0.beta.20" + s.add_development_dependency "rspec", "2.13.0" end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index fb2de35..739c084 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,7 +14,7 @@ Bundler.require(:default, :development) -Rspec.configure do |config| +RSpec.configure do |config| config.mock_with :rspec end diff --git a/spec/support/fakeweb.rb b/spec/support/fakeweb.rb index 331dd44..83d5aae 100644 --- a/spec/support/fakeweb.rb +++ b/spec/support/fakeweb.rb @@ -1,6 +1,6 @@ FakeWeb.allow_net_connect = false -Rspec.configure do |config| +RSpec.configure do |config| config.before(:each) do FakeWeb.clean_registry end