rosemary 0.4.2 → 0.4.3
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/CHANGELOG.md +6 -0
- data/lib/rosemary/api.rb +14 -1
- data/lib/rosemary/bounding_box.rb +46 -0
- data/lib/rosemary/parser.rb +21 -5
- data/lib/rosemary/version.rb +1 -1
- data/lib/rosemary.rb +1 -0
- data/spec/integration/boundary_spec.rb +104 -0
- metadata +6 -3
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -2,6 +2,12 @@ rosemary CHANGELOG | |
| 2 2 | 
             
            ===================================
         | 
| 3 3 | 
             
            This file is used to list changes made in each version.
         | 
| 4 4 |  | 
| 5 | 
            +
            v0.4.2 (2014 Aug 7)
         | 
| 6 | 
            +
            ------
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            * Allow arbitrary tags to be attached to changeset
         | 
| 9 | 
            +
            * Upgrade all specs to 'expect' syntax instead of 'should'
         | 
| 10 | 
            +
             | 
| 5 11 |  | 
| 6 12 | 
             
            v0.4.1 (2014 May 27)
         | 
| 7 13 | 
             
            ------
         | 
    
        data/lib/rosemary/api.rb
    CHANGED
    
    | @@ -93,6 +93,19 @@ module Rosemary | |
| 93 93 | 
             
                  resp
         | 
| 94 94 | 
             
                end
         | 
| 95 95 |  | 
| 96 | 
            +
                # Get the bounding box which is represented by the Rosemary::BoundingBox
         | 
| 97 | 
            +
                #
         | 
| 98 | 
            +
                # @param [Numeric] left is the longitude of the left (westernmost) side of the bounding box.
         | 
| 99 | 
            +
                # @param [Numeric] bottom is the latitude of the bottom (southernmost) side of the bounding box.
         | 
| 100 | 
            +
                # @param [Numeric] right is the longitude of the right (easternmost) side of the bounding box.
         | 
| 101 | 
            +
                # @param [Numeric] top is the latitude of the top (northernmost) side of the bounding box.
         | 
| 102 | 
            +
                # @return [Rosemary::BoundingBox] the bounding box containing all ways, nodes and relations inside the given coordinates
         | 
| 103 | 
            +
                #
         | 
| 104 | 
            +
                def find_bounding_box(left,bottom,right,top)
         | 
| 105 | 
            +
                  do_request(:get, "/map?bbox=#{left},#{bottom},#{right},#{top}", {} )
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
             | 
| 96 109 | 
             
                def permissions
         | 
| 97 110 | 
             
                  if client.nil?
         | 
| 98 111 | 
             
                    get("/permissions")
         | 
| @@ -282,4 +295,4 @@ module Rosemary | |
| 282 295 | 
             
                end
         | 
| 283 296 |  | 
| 284 297 | 
             
              end
         | 
| 285 | 
            -
            end
         | 
| 298 | 
            +
            end
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            require 'builder'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Rosemary
         | 
| 4 | 
            +
              # OpenStreetMap Boundary Box.
         | 
| 5 | 
            +
              #
         | 
| 6 | 
            +
              class BoundingBox < Element
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                attr_accessor :nodes, :ways, :relations, :minlat, :minlon, :maxlat, :maxlon
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                # Create new Node object.
         | 
| 11 | 
            +
                #
         | 
| 12 | 
            +
                # If +id+ is +nil+ a new unique negative ID will be allocated.
         | 
| 13 | 
            +
                def initialize(attrs = {})
         | 
| 14 | 
            +
                  attrs = attrs.dup.stringify_keys!
         | 
| 15 | 
            +
                  @minlat = attrs['minlat'].to_f
         | 
| 16 | 
            +
                  @minlon = attrs['minlon'].to_f
         | 
| 17 | 
            +
                  @maxlat = attrs['maxlat'].to_f
         | 
| 18 | 
            +
                  @maxlon = attrs['maxlon'].to_f
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  @nodes = []
         | 
| 21 | 
            +
                  @ways = []
         | 
| 22 | 
            +
                  @relations = []
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| 26 | 
            +
                def type
         | 
| 27 | 
            +
                  'BoundingBoxBox'
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                # List of attributes for a bounds element
         | 
| 31 | 
            +
                def attribute_list
         | 
| 32 | 
            +
                  [:minlat, :minlon, :maxlat, :maxlon]
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def to_xml(options = {})
         | 
| 36 | 
            +
                  xml = options[:builder] ||= Builder::XmlMarkup.new
         | 
| 37 | 
            +
                  xml.instruct! unless options[:skip_instruct]
         | 
| 38 | 
            +
                  xml.osm(:generator => "rosemary v#{Rosemary::VERSION}", :version => Rosemary::Api::API_VERSION) do
         | 
| 39 | 
            +
                    xml.bounds(attributes)
         | 
| 40 | 
            +
                    [ nodes, ways, relations].each do |elements|
         | 
| 41 | 
            +
                      elements.each { |e| e.to_xml(:builder => xml, :skip_instruct => true) }
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
    
        data/lib/rosemary/parser.rb
    CHANGED
    
    | @@ -26,7 +26,12 @@ class Rosemary::Parser < HTTParty::Parser | |
| 26 26 |  | 
| 27 27 | 
             
                @parser.callbacks = self
         | 
| 28 28 | 
             
                @parser.parse
         | 
| 29 | 
            -
             | 
| 29 | 
            +
             | 
| 30 | 
            +
                if @bounding_box
         | 
| 31 | 
            +
                  @bounding_box
         | 
| 32 | 
            +
                else
         | 
| 33 | 
            +
                  @collection.empty? ? @context : @collection
         | 
| 34 | 
            +
                end
         | 
| 30 35 | 
             
              end
         | 
| 31 36 |  | 
| 32 37 | 
             
              def plain
         | 
| @@ -70,6 +75,7 @@ class Rosemary::Parser < HTTParty::Parser | |
| 70 75 | 
             
                  when 'permissions'  then _start_permissions(attr_hash)
         | 
| 71 76 | 
             
                  when 'permission'   then _start_permission(attr_hash)
         | 
| 72 77 | 
             
                  when 'note'         then _start_note(attr_hash)
         | 
| 78 | 
            +
                  when 'bounds'       then _start_bounds(attr_hash)
         | 
| 73 79 | 
             
                  end
         | 
| 74 80 | 
             
                end
         | 
| 75 81 | 
             
              end
         | 
| @@ -101,15 +107,21 @@ class Rosemary::Parser < HTTParty::Parser | |
| 101 107 |  | 
| 102 108 | 
             
              private
         | 
| 103 109 | 
             
              def _start_node(attr_hash)
         | 
| 104 | 
            -
                 | 
| 110 | 
            +
                node = Rosemary::Node.new(attr_hash)
         | 
| 111 | 
            +
                @bounding_box.nodes << node if @bounding_box
         | 
| 112 | 
            +
                @context = node
         | 
| 105 113 | 
             
              end
         | 
| 106 114 |  | 
| 107 115 | 
             
              def _start_way(attr_hash)
         | 
| 108 | 
            -
                 | 
| 116 | 
            +
                way = Rosemary::Way.new(attr_hash)
         | 
| 117 | 
            +
                @bounding_box.ways << way if @bounding_box
         | 
| 118 | 
            +
                @context = way
         | 
| 109 119 | 
             
              end
         | 
| 110 120 |  | 
| 111 121 | 
             
              def _start_relation(attr_hash)
         | 
| 112 | 
            -
                 | 
| 122 | 
            +
                relation = Rosemary::Relation.new(attr_hash)
         | 
| 123 | 
            +
                @bounding_box.relations << relation if @bounding_box
         | 
| 124 | 
            +
                @context = relation
         | 
| 113 125 | 
             
              end
         | 
| 114 126 |  | 
| 115 127 | 
             
              def _start_changeset(attr_hash)
         | 
| @@ -163,4 +175,8 @@ class Rosemary::Parser < HTTParty::Parser | |
| 163 175 | 
             
                @context.lon = attr_hash['zoom']  if attr_hash['zoom']
         | 
| 164 176 | 
             
              end
         | 
| 165 177 |  | 
| 166 | 
            -
             | 
| 178 | 
            +
              def _start_bounds(attr_hash)
         | 
| 179 | 
            +
                @bounding_box = Rosemary::BoundingBox.new(attr_hash)
         | 
| 180 | 
            +
              end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
            end
         | 
    
        data/lib/rosemary/version.rb
    CHANGED
    
    
    
        data/lib/rosemary.rb
    CHANGED
    
    
| @@ -0,0 +1,104 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            include Rosemary
         | 
| 3 | 
            +
            describe BoundingBox do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              before do
         | 
| 6 | 
            +
                WebMock.disable_net_connect!
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              let :osm do
         | 
| 10 | 
            +
                Api.new
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def valid_fake_boundary
         | 
| 14 | 
            +
                boundary=<<-EOF
         | 
| 15 | 
            +
                <osm>
         | 
| 16 | 
            +
                 <bounds minlat="37.3855400" minlon="-122.0359880" maxlat="37.4116770" maxlon="-122.0094800"/>
         | 
| 17 | 
            +
                 <node id="3147580094" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3872247" lon="-122.0216695"/>
         | 
| 18 | 
            +
                 <node id="3147580093" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3872110" lon="-122.0216157"/>
         | 
| 19 | 
            +
                 <node id="3147580084" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3870427" lon="-122.0216838"/>
         | 
| 20 | 
            +
                 <node id="3147580085" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3870564" lon="-122.0217376"/>
         | 
| 21 | 
            +
                 <node id="3147580103" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3873678" lon="-122.0218229"/>
         | 
| 22 | 
            +
                 <node id="3147580098" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3872486" lon="-122.0213856"/>
         | 
| 23 | 
            +
                 <node id="3147580089" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3871661" lon="-122.0214213"/>
         | 
| 24 | 
            +
                 <node id="3147580092" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3871896" lon="-122.0215072"/>
         | 
| 25 | 
            +
                 <node id="3147580077" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3869174" lon="-122.0216248"/>
         | 
| 26 | 
            +
                 <node id="3147580078" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3869465" lon="-122.0217314"/>
         | 
| 27 | 
            +
                 <node id="3147580081" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3870081" lon="-122.0217048"/>
         | 
| 28 | 
            +
                 <node id="3147580083" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3870225" lon="-122.0217578"/>
         | 
| 29 | 
            +
                 <node id="3147580079" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3869654" lon="-122.0217825"/>
         | 
| 30 | 
            +
                 <node id="3147580080" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3869935" lon="-122.0218854"/>
         | 
| 31 | 
            +
                 <node id="3147580099" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3872596" lon="-122.0217704"/>
         | 
| 32 | 
            +
                 <node id="3147580101" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:05Z" user="matthieun" uid="595221" lat="37.3872838" lon="-122.0218592"/>
         | 
| 33 | 
            +
                 <way id="309425057" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:06Z" user="matthieun" uid="595221">
         | 
| 34 | 
            +
                  <nd ref="3147580094"/>
         | 
| 35 | 
            +
                  <nd ref="3147580093"/>
         | 
| 36 | 
            +
                  <nd ref="3147580084"/>
         | 
| 37 | 
            +
                  <nd ref="3147580085"/>
         | 
| 38 | 
            +
                  <nd ref="3147580094"/>
         | 
| 39 | 
            +
                 </way>
         | 
| 40 | 
            +
                <way id="309425054" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:06Z" user="matthieun" uid="595221">
         | 
| 41 | 
            +
                  <nd ref="3147580103"/>
         | 
| 42 | 
            +
                  <nd ref="3147580098"/>
         | 
| 43 | 
            +
                  <nd ref="3147580089"/>
         | 
| 44 | 
            +
                  <nd ref="3147580092"/>
         | 
| 45 | 
            +
                  <nd ref="3147580077"/>
         | 
| 46 | 
            +
                  <nd ref="3147580078"/>
         | 
| 47 | 
            +
                  <nd ref="3147580081"/>
         | 
| 48 | 
            +
                  <nd ref="3147580083"/>
         | 
| 49 | 
            +
                  <nd ref="3147580079"/>
         | 
| 50 | 
            +
                  <nd ref="3147580080"/>
         | 
| 51 | 
            +
                  <nd ref="3147580099"/>
         | 
| 52 | 
            +
                  <nd ref="3147580101"/>
         | 
| 53 | 
            +
                  <nd ref="3147580103"/>
         | 
| 54 | 
            +
                 </way>
         | 
| 55 | 
            +
                 <relation id="4133073" visible="true" version="1" changeset="26302066" timestamp="2014-10-24T15:12:07Z" user="matthieun" uid="595221">
         | 
| 56 | 
            +
                  <member type="way" ref="309425057" role="inner"/>
         | 
| 57 | 
            +
                  <member type="way" ref="309425054" role="outer"/>
         | 
| 58 | 
            +
                  <tag k="building" v="residential"/>
         | 
| 59 | 
            +
                  <tag k="type" v="multipolygon"/>
         | 
| 60 | 
            +
                 </relation>
         | 
| 61 | 
            +
                </osm>
         | 
| 62 | 
            +
                EOF
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              describe '#find:' do
         | 
| 66 | 
            +
                it "should find an array of Ways, Nodes and Relations from the API response via find_boundary" do
         | 
| 67 | 
            +
                  stub_request(:get, "http://www.openstreetmap.org/api/0.6/map?bbox=-122.035988,37.38554,-122.00948,37.411677").to_return(:status => 200, :body => valid_fake_boundary, :headers => {'Content-Type' => 'application/xml'})
         | 
| 68 | 
            +
                  boundary = osm.find_bounding_box(-122.035988,37.38554,-122.00948,37.411677)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  expect(boundary.class).to eql BoundingBox
         | 
| 71 | 
            +
                  expect(boundary.nodes).to include(Rosemary::Node.new({"id"=>"3147580094", "visible"=>"true", "version"=>"1", "changeset"=>"26302066", "timestamp"=>"2014-10-24T15:12:05Z", "user"=>"matthieun", "uid"=>"595221", "lat"=>"37.3872247", "lon"=>"-122.0216695"}))
         | 
| 72 | 
            +
                  expect(boundary.ways.map { |it| it.id }).to include(309425054)
         | 
| 73 | 
            +
                  expect(boundary.relations.map { |it| it.id }).to include(4133073)
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  parsed_relation = boundary.relations.first
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  expect(parsed_relation.members.length).to equal(2)
         | 
| 78 | 
            +
                  expect(parsed_relation.tags.length).to equal(2)
         | 
| 79 | 
            +
                  expect(boundary.minlat).to be_within(0.00001).of(37.3855400)
         | 
| 80 | 
            +
                  expect(boundary.minlon).to be_within(0.00001).of(-122.0359880)
         | 
| 81 | 
            +
                  expect(boundary.maxlat).to be_within(0.00001).of(37.4116770)
         | 
| 82 | 
            +
                  expect(boundary.maxlon).to be_within(0.00001).of(-122.0094800)
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
              describe '#xml:' do
         | 
| 87 | 
            +
                it "should produce an xml that is equivalent to the parsed one" do
         | 
| 88 | 
            +
                  stub_request(:get, "http://www.openstreetmap.org/api/0.6/map?bbox=-122.035988,37.38554,-122.00948,37.411677").to_return(:status => 200, :body => valid_fake_boundary, :headers => {'Content-Type' => 'application/xml'})
         | 
| 89 | 
            +
                  boundary = osm.find_bounding_box(-122.035988,37.38554,-122.00948,37.411677)
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  xml = boundary.to_xml
         | 
| 92 | 
            +
                  reparsed_boundary = Parser.call(xml, :xml)
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  expect(reparsed_boundary.minlat).to eql(boundary.minlat)
         | 
| 95 | 
            +
                  expect(reparsed_boundary.nodes.length).to eql(boundary.nodes.length)
         | 
| 96 | 
            +
                  expect(reparsed_boundary.nodes.first.lat).to eql(boundary.nodes.first.lat)
         | 
| 97 | 
            +
                  expect(reparsed_boundary.ways.length).to eql(boundary.ways.length)
         | 
| 98 | 
            +
                  expect(reparsed_boundary.ways.first.nodes.first).to eql(boundary.ways.first.nodes.first)
         | 
| 99 | 
            +
                  expect(reparsed_boundary.relations.length).to eql(boundary.relations.length)
         | 
| 100 | 
            +
                  expect(reparsed_boundary.relations.first.tags.first).to eql(boundary.relations.first.tags.first)
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rosemary
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.4. | 
| 4 | 
            +
              version: 0.4.3
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2015-02-19 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: httparty
         | 
| @@ -212,6 +212,7 @@ files: | |
| 212 212 | 
             
            - lib/rosemary.rb
         | 
| 213 213 | 
             
            - lib/rosemary/api.rb
         | 
| 214 214 | 
             
            - lib/rosemary/basic_auth_client.rb
         | 
| 215 | 
            +
            - lib/rosemary/bounding_box.rb
         | 
| 215 216 | 
             
            - lib/rosemary/changeset.rb
         | 
| 216 217 | 
             
            - lib/rosemary/client.rb
         | 
| 217 218 | 
             
            - lib/rosemary/element.rb
         | 
| @@ -228,6 +229,7 @@ files: | |
| 228 229 | 
             
            - lib/rosemary/version.rb
         | 
| 229 230 | 
             
            - lib/rosemary/way.rb
         | 
| 230 231 | 
             
            - rosemary.gemspec
         | 
| 232 | 
            +
            - spec/integration/boundary_spec.rb
         | 
| 231 233 | 
             
            - spec/integration/changeset_spec.rb
         | 
| 232 234 | 
             
            - spec/integration/node_spec.rb
         | 
| 233 235 | 
             
            - spec/integration/note_spec.rb
         | 
| @@ -259,7 +261,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 259 261 | 
             
                  version: '0'
         | 
| 260 262 | 
             
                  segments:
         | 
| 261 263 | 
             
                  - 0
         | 
| 262 | 
            -
                  hash:  | 
| 264 | 
            +
                  hash: 3366646183016379761
         | 
| 263 265 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 264 266 | 
             
              none: false
         | 
| 265 267 | 
             
              requirements:
         | 
| @@ -273,6 +275,7 @@ signing_key: | |
| 273 275 | 
             
            specification_version: 3
         | 
| 274 276 | 
             
            summary: OpenStreetMap API client for ruby
         | 
| 275 277 | 
             
            test_files:
         | 
| 278 | 
            +
            - spec/integration/boundary_spec.rb
         | 
| 276 279 | 
             
            - spec/integration/changeset_spec.rb
         | 
| 277 280 | 
             
            - spec/integration/node_spec.rb
         | 
| 278 281 | 
             
            - spec/integration/note_spec.rb
         |