gcoder 0.11.0 → 0.12.0
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/Gemfile.lock +20 -0
- data/README.md +5 -0
- data/Rakefile +2 -2
- data/gcoder.gemspec +2 -1
- data/lib/gcoder.rb +6 -0
- data/lib/gcoder/geocoder.rb +24 -14
- data/lib/gcoder/version.rb +1 -1
- data/spec/gcoder/geocoder_spec.rb +15 -2
- data/spec/support/requests.yml +1 -1
- metadata +51 -61
    
        data/Gemfile.lock
    ADDED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -52,6 +52,11 @@ More info [here](http://code.google.com/apis/maps/documentation/geocoding/#Viewp | |
| 52 52 | 
             
            To access the special features of Google Maps API Premier, you must provide a
         | 
| 53 53 | 
             
            client ID. All client IDs begin with a gme- prefix.
         | 
| 54 54 |  | 
| 55 | 
            +
            ### `:key`
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            To access the special features of Google Maps API Premier, you must provide a
         | 
| 58 | 
            +
            signing key in addition to the client ID.
         | 
| 59 | 
            +
             | 
| 55 60 | 
             
            ### `:storage`
         | 
| 56 61 |  | 
| 57 62 | 
             
            Defines the storage adapter to use for caching results from the geocoder to
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            require 'rubygems/specification' unless defined?(Gem::Specification)
         | 
| 2 | 
            -
            require ' | 
| 2 | 
            +
            require 'rubygems/package_task'
         | 
| 3 3 | 
             
            require 'rake/testtask'
         | 
| 4 4 |  | 
| 5 5 | 
             
            def gemspec
         | 
| @@ -35,7 +35,7 @@ task :release => :package do | |
| 35 35 | 
             
              sh "gem push pkg/#{gemspec.name}-#{gemspec.version}.gem"
         | 
| 36 36 | 
             
            end
         | 
| 37 37 |  | 
| 38 | 
            -
             | 
| 38 | 
            +
            Gem::PackageTask.new(gemspec) do |pkg|
         | 
| 39 39 | 
             
              pkg.gem_spec = gemspec
         | 
| 40 40 | 
             
            end
         | 
| 41 41 | 
             
            task :gem => :gemspec
         | 
    
        data/gcoder.gemspec
    CHANGED
    
    | @@ -11,11 +11,12 @@ Gem::Specification.new do |s| | |
| 11 11 | 
             
              s.summary     = %q{A nice library for geocoding stuff with Google Maps API V3}
         | 
| 12 12 | 
             
              s.description = %q{Uses Google Maps Geocoding API (V3) to geocode stuff and optionally caches the results somewhere.}
         | 
| 13 13 |  | 
| 14 | 
            -
              s.required_rubygems_version = '>= 1. | 
| 14 | 
            +
              s.required_rubygems_version = '>= 1.8.5'
         | 
| 15 15 | 
             
              s.rubyforge_project = 'gcoder'
         | 
| 16 16 |  | 
| 17 17 | 
             
              s.add_dependency 'hashie'
         | 
| 18 18 | 
             
              s.add_dependency 'yajl-ruby'
         | 
| 19 | 
            +
              s.add_dependency 'ruby-hmac'
         | 
| 19 20 |  | 
| 20 21 | 
             
              s.files         = `git ls-files`.split(?\n)
         | 
| 21 22 | 
             
              s.test_files    = `git ls-files -- {test,spec}/*`.split(?\n)
         | 
    
        data/lib/gcoder.rb
    CHANGED
    
    | @@ -1,8 +1,12 @@ | |
| 1 1 | 
             
            require 'yajl'
         | 
| 2 2 | 
             
            require 'hashie'
         | 
| 3 3 | 
             
            require 'net/http'
         | 
| 4 | 
            +
            require 'uri'
         | 
| 5 | 
            +
            require 'base64'
         | 
| 4 6 | 
             
            require 'timeout'
         | 
| 5 7 | 
             
            require 'digest/sha1'
         | 
| 8 | 
            +
            require 'hmac'
         | 
| 9 | 
            +
            require 'hmac-sha1'
         | 
| 6 10 |  | 
| 7 11 | 
             
            $:.unshift(File.dirname(__FILE__))
         | 
| 8 12 |  | 
| @@ -24,6 +28,8 @@ module GCoder | |
| 24 28 | 
             
                :append         => nil,
         | 
| 25 29 | 
             
                :region         => nil,
         | 
| 26 30 | 
             
                :bounds         => nil,
         | 
| 31 | 
            +
                :client         => nil,
         | 
| 32 | 
            +
                :key            => nil,
         | 
| 27 33 | 
             
                :storage        => nil,
         | 
| 28 34 | 
             
                :storage_config => nil
         | 
| 29 35 | 
             
              }.freeze
         | 
    
        data/lib/gcoder/geocoder.rb
    CHANGED
    
    | @@ -5,14 +5,9 @@ module GCoder | |
| 5 5 | 
             
                PATH = '/maps/api/geocode/json'
         | 
| 6 6 |  | 
| 7 7 | 
             
                class Request
         | 
| 8 | 
            -
                  def self.u(string)
         | 
| 9 | 
            -
                    string.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
         | 
| 10 | 
            -
                      '%' + $1.unpack('H2' * $1.size).join('%').upcase
         | 
| 11 | 
            -
                    }.tr(' ', '+')
         | 
| 12 | 
            -
                  end
         | 
| 13 8 |  | 
| 14 9 | 
             
                  def self.to_query(params)
         | 
| 15 | 
            -
                    params.map { |key, val| "#{ | 
| 10 | 
            +
                    URI.escape(params.map { |key, val| "#{key}=#{val}" }.join('&'))
         | 
| 16 11 | 
             
                  end
         | 
| 17 12 |  | 
| 18 13 | 
             
                  def self.stubs
         | 
| @@ -30,17 +25,17 @@ module GCoder | |
| 30 25 |  | 
| 31 26 | 
             
                  def params
         | 
| 32 27 | 
             
                    p = { :sensor => 'false' }
         | 
| 33 | 
            -
                    p[:address] | 
| 34 | 
            -
                    p[:latlng] | 
| 35 | 
            -
                    p[:language] | 
| 36 | 
            -
                    p[:region] | 
| 37 | 
            -
                    p[:bounds] | 
| 38 | 
            -
                    p[:client] | 
| 28 | 
            +
                    p[:address]   = address             if @address
         | 
| 29 | 
            +
                    p[:latlng]    = latlng              if @latlng
         | 
| 30 | 
            +
                    p[:language]  = @config[:language]  if @config[:language]
         | 
| 31 | 
            +
                    p[:region]    = @config[:region]    if @config[:region]
         | 
| 32 | 
            +
                    p[:bounds]    = bounds              if @config[:bounds]
         | 
| 33 | 
            +
                    p[:client]    = @config[:client]    if @config[:client]
         | 
| 39 34 | 
             
                    p
         | 
| 40 35 | 
             
                  end
         | 
| 41 36 |  | 
| 42 37 | 
             
                  def path
         | 
| 43 | 
            -
                    "#{PATH}?#{self.class.to_query(params)}"
         | 
| 38 | 
            +
                    "#{PATH}?#{self.class.to_query(params)}#{"&signature=#{sign_key(@config[:key])}" if @config[:key]}"
         | 
| 44 39 | 
             
                  end
         | 
| 45 40 |  | 
| 46 41 | 
             
                  def uri
         | 
| @@ -97,8 +92,23 @@ module GCoder | |
| 97 92 | 
             
                  def address
         | 
| 98 93 | 
             
                    @config[:append] ? "#{@address} #{@config[:append]}" : @address
         | 
| 99 94 | 
             
                  end
         | 
| 100 | 
            -
             | 
| 95 | 
            +
                  
         | 
| 96 | 
            +
                  def url_safe_base64_decode(string)
         | 
| 97 | 
            +
                    return Base64.decode64(string.tr('-_','+/')).gsub(/\n/,'')
         | 
| 98 | 
            +
                  end
         | 
| 101 99 |  | 
| 100 | 
            +
                  def url_safe_base64_encode(raw)
         | 
| 101 | 
            +
                    return Base64.encode64(raw).tr('+/','-_').gsub(/\n/,'')
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
                  
         | 
| 104 | 
            +
                  def sign_key(key)
         | 
| 105 | 
            +
                    sha1 = HMAC::SHA1.new(url_safe_base64_decode(key))
         | 
| 106 | 
            +
                    sha1 << "#{PATH}?#{self.class.to_query(params)}"
         | 
| 107 | 
            +
                    raw_signature = sha1.digest()
         | 
| 108 | 
            +
                    
         | 
| 109 | 
            +
                    url_safe_base64_encode(raw_signature)  
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
                end
         | 
| 102 112 |  | 
| 103 113 | 
             
                class Response
         | 
| 104 114 | 
             
                  attr_reader :uri, :data
         | 
    
        data/lib/gcoder/version.rb
    CHANGED
    
    
| @@ -1,3 +1,4 @@ | |
| 1 | 
            +
            # encoding: UTF-8
         | 
| 1 2 | 
             
            require 'spec_helper'
         | 
| 2 3 |  | 
| 3 4 | 
             
            describe GCoder::Geocoder::Request do
         | 
| @@ -23,12 +24,18 @@ describe GCoder::Geocoder::Request do | |
| 23 24 | 
             
              end
         | 
| 24 25 |  | 
| 25 26 | 
             
              it 'should URI encode a string' do
         | 
| 26 | 
            -
                GCoder::Geocoder::Request. | 
| 27 | 
            +
                q = GCoder::Geocoder::Request.to_query(:q => 'hello world', :a => 'test')
         | 
| 28 | 
            +
                q.must_equal 'q=hello%20world&a=test'
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              it 'should URI encode a UTF-8 string' do
         | 
| 32 | 
            +
                q = GCoder::Geocoder::Request.to_query(:q => 'मुंबई', :a => 'test')
         | 
| 33 | 
            +
                q.must_equal 'q=%E0%A4%AE%E0%A5%81%E0%A4%82%E0%A4%AC%E0%A4%88&a=test'
         | 
| 27 34 | 
             
              end
         | 
| 28 35 |  | 
| 29 36 | 
             
              it 'should create a query string' do
         | 
| 30 37 | 
             
                q = GCoder::Geocoder::Request.to_query(:q => 'hello world', :a => 'test')
         | 
| 31 | 
            -
                q.must_equal 'q=hello | 
| 38 | 
            +
                q.must_equal 'q=hello%20world&a=test'
         | 
| 32 39 | 
             
              end
         | 
| 33 40 |  | 
| 34 41 | 
             
              it '(when passed a bounds option) should generate correct query params' do
         | 
| @@ -50,4 +57,10 @@ describe GCoder::Geocoder::Request do | |
| 50 57 | 
             
                  req.params[:address].must_equal 'queen and spadina'
         | 
| 51 58 | 
             
                end
         | 
| 52 59 | 
             
              end
         | 
| 60 | 
            +
              
         | 
| 61 | 
            +
              it "(when passed a premier client and key) should generate correct query params" do
         | 
| 62 | 
            +
                q = GCoder::Geocoder::Request.new('los angeles', :client => "gme-test", :key => "zNf23lb-YIoD4kEFN34C6324cww=").path
         | 
| 63 | 
            +
                q.must_equal '/maps/api/geocode/json?sensor=false&address=los%20angeles&client=gme-test&signature=p0EiRD298eLhlGTqlBA5RKxv448='
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
              
         | 
| 53 66 | 
             
            end
         | 
    
        data/spec/support/requests.yml
    CHANGED
    
    | @@ -15,4 +15,4 @@ | |
| 15 15 | 
             
              :uri: http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=overlimit
         | 
| 16 16 |  | 
| 17 17 | 
             
            - :file: 6.json
         | 
| 18 | 
            -
              :uri: http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=invalid
         | 
| 18 | 
            +
              :uri: http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=invalid
         | 
    
        metadata
    CHANGED
    
    | @@ -1,61 +1,61 @@ | |
| 1 | 
            -
            --- !ruby/object:Gem::Specification | 
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: gcoder
         | 
| 3 | 
            -
            version: !ruby/object:Gem::Version | 
| 4 | 
            -
               | 
| 5 | 
            -
               | 
| 6 | 
            -
              - 0
         | 
| 7 | 
            -
              - 11
         | 
| 8 | 
            -
              - 0
         | 
| 9 | 
            -
              version: 0.11.0
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.12.0
         | 
| 5 | 
            +
              prerelease: 
         | 
| 10 6 | 
             
            platform: ruby
         | 
| 11 | 
            -
            authors: | 
| 7 | 
            +
            authors:
         | 
| 12 8 | 
             
            - Carsten Nielsen
         | 
| 13 9 | 
             
            - Christos Pappas
         | 
| 14 10 | 
             
            autorequire: 
         | 
| 15 11 | 
             
            bindir: bin
         | 
| 16 12 | 
             
            cert_chain: []
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
            dependencies: 
         | 
| 21 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 13 | 
            +
            date: 2011-07-15 00:00:00.000000000Z
         | 
| 14 | 
            +
            dependencies:
         | 
| 15 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 22 16 | 
             
              name: hashie
         | 
| 23 | 
            -
               | 
| 24 | 
            -
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 17 | 
            +
              requirement: &2160555480 !ruby/object:Gem::Requirement
         | 
| 25 18 | 
             
                none: false
         | 
| 26 | 
            -
                requirements: | 
| 27 | 
            -
                - -  | 
| 28 | 
            -
                  - !ruby/object:Gem::Version | 
| 29 | 
            -
                     | 
| 30 | 
            -
                    - 0
         | 
| 31 | 
            -
                    version: "0"
         | 
| 19 | 
            +
                requirements:
         | 
| 20 | 
            +
                - - ! '>='
         | 
| 21 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 22 | 
            +
                    version: '0'
         | 
| 32 23 | 
             
              type: :runtime
         | 
| 33 | 
            -
               | 
| 34 | 
            -
             | 
| 24 | 
            +
              prerelease: false
         | 
| 25 | 
            +
              version_requirements: *2160555480
         | 
| 26 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 35 27 | 
             
              name: yajl-ruby
         | 
| 28 | 
            +
              requirement: &2160554660 !ruby/object:Gem::Requirement
         | 
| 29 | 
            +
                none: false
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ! '>='
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 36 35 | 
             
              prerelease: false
         | 
| 37 | 
            -
               | 
| 36 | 
            +
              version_requirements: *2160554660
         | 
| 37 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 38 | 
            +
              name: ruby-hmac
         | 
| 39 | 
            +
              requirement: &2160553960 !ruby/object:Gem::Requirement
         | 
| 38 40 | 
             
                none: false
         | 
| 39 | 
            -
                requirements: | 
| 40 | 
            -
                - -  | 
| 41 | 
            -
                  - !ruby/object:Gem::Version | 
| 42 | 
            -
                     | 
| 43 | 
            -
                    - 0
         | 
| 44 | 
            -
                    version: "0"
         | 
| 41 | 
            +
                requirements:
         | 
| 42 | 
            +
                - - ! '>='
         | 
| 43 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 44 | 
            +
                    version: '0'
         | 
| 45 45 | 
             
              type: :runtime
         | 
| 46 | 
            -
               | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 46 | 
            +
              prerelease: false
         | 
| 47 | 
            +
              version_requirements: *2160553960
         | 
| 48 | 
            +
            description: Uses Google Maps Geocoding API (V3) to geocode stuff and optionally caches
         | 
| 49 | 
            +
              the results somewhere.
         | 
| 50 | 
            +
            email:
         | 
| 49 51 | 
             
            - heycarsten@gmail.com
         | 
| 50 52 | 
             
            executables: []
         | 
| 51 | 
            -
             | 
| 52 53 | 
             
            extensions: []
         | 
| 53 | 
            -
             | 
| 54 54 | 
             
            extra_rdoc_files: []
         | 
| 55 | 
            -
             | 
| 56 | 
            -
            files: 
         | 
| 55 | 
            +
            files:
         | 
| 57 56 | 
             
            - .gitignore
         | 
| 58 57 | 
             
            - Gemfile
         | 
| 58 | 
            +
            - Gemfile.lock
         | 
| 59 59 | 
             
            - LICENSE
         | 
| 60 60 | 
             
            - README.md
         | 
| 61 61 | 
             
            - Rakefile
         | 
| @@ -77,41 +77,31 @@ files: | |
| 77 77 | 
             
            - spec/support/requests/4.json
         | 
| 78 78 | 
             
            - spec/support/requests/5.json
         | 
| 79 79 | 
             
            - spec/support/requests/6.json
         | 
| 80 | 
            -
            has_rdoc: true
         | 
| 81 80 | 
             
            homepage: http://github.com/heycarsten/gcoder
         | 
| 82 81 | 
             
            licenses: []
         | 
| 83 | 
            -
             | 
| 84 82 | 
             
            post_install_message: 
         | 
| 85 83 | 
             
            rdoc_options: []
         | 
| 86 | 
            -
             | 
| 87 | 
            -
            require_paths: 
         | 
| 84 | 
            +
            require_paths:
         | 
| 88 85 | 
             
            - lib
         | 
| 89 | 
            -
            required_ruby_version: !ruby/object:Gem::Requirement | 
| 86 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 90 87 | 
             
              none: false
         | 
| 91 | 
            -
              requirements: | 
| 92 | 
            -
              - -  | 
| 93 | 
            -
                - !ruby/object:Gem::Version | 
| 94 | 
            -
                   | 
| 95 | 
            -
             | 
| 96 | 
            -
                  version: "0"
         | 
| 97 | 
            -
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 88 | 
            +
              requirements:
         | 
| 89 | 
            +
              - - ! '>='
         | 
| 90 | 
            +
                - !ruby/object:Gem::Version
         | 
| 91 | 
            +
                  version: '0'
         | 
| 92 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 98 93 | 
             
              none: false
         | 
| 99 | 
            -
              requirements: | 
| 100 | 
            -
              - -  | 
| 101 | 
            -
                - !ruby/object:Gem::Version | 
| 102 | 
            -
                   | 
| 103 | 
            -
                  - 1
         | 
| 104 | 
            -
                  - 3
         | 
| 105 | 
            -
                  - 6
         | 
| 106 | 
            -
                  version: 1.3.6
         | 
| 94 | 
            +
              requirements:
         | 
| 95 | 
            +
              - - ! '>='
         | 
| 96 | 
            +
                - !ruby/object:Gem::Version
         | 
| 97 | 
            +
                  version: 1.8.5
         | 
| 107 98 | 
             
            requirements: []
         | 
| 108 | 
            -
             | 
| 109 99 | 
             
            rubyforge_project: gcoder
         | 
| 110 | 
            -
            rubygems_version: 1. | 
| 100 | 
            +
            rubygems_version: 1.8.5
         | 
| 111 101 | 
             
            signing_key: 
         | 
| 112 102 | 
             
            specification_version: 3
         | 
| 113 103 | 
             
            summary: A nice library for geocoding stuff with Google Maps API V3
         | 
| 114 | 
            -
            test_files: | 
| 104 | 
            +
            test_files:
         | 
| 115 105 | 
             
            - spec/gcoder/geocoder_spec.rb
         | 
| 116 106 | 
             
            - spec/gcoder/resolver_spec.rb
         | 
| 117 107 | 
             
            - spec/gcoder/storage_spec.rb
         |