openstreetmap 0.2.1
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 +1 -0
- data/LICENSE +7 -0
- data/Manifest +29 -0
- data/README.md +70 -0
- data/Rakefile +39 -0
- data/lib/changeset_callbacks.rb +31 -0
- data/lib/hash.rb +19 -0
- data/lib/open_street_map/api.rb +214 -0
- data/lib/open_street_map/basic_auth_client.rb +15 -0
- data/lib/open_street_map/changeset.rb +93 -0
- data/lib/open_street_map/element.rb +280 -0
- data/lib/open_street_map/errors.rb +55 -0
- data/lib/open_street_map/member.rb +39 -0
- data/lib/open_street_map/node.rb +51 -0
- data/lib/open_street_map/oauth_client.rb +31 -0
- data/lib/open_street_map/parser.rb +123 -0
- data/lib/open_street_map/relation.rb +52 -0
- data/lib/open_street_map/tags.rb +26 -0
- data/lib/open_street_map/user.rb +34 -0
- data/lib/open_street_map/way.rb +84 -0
- data/lib/openstreetmap.rb +31 -0
- data/openstreetmap.gemspec +53 -0
- data/spec/open_street_map/changeset_spec.rb +90 -0
- data/spec/open_street_map/node_spec.rb +87 -0
- data/spec/open_street_map/relation_spec.rb +26 -0
- data/spec/open_street_map/way_spec.rb +77 -0
- data/spec/open_street_map_changeset_spec.rb +136 -0
- data/spec/open_street_map_node_spec.rb +388 -0
- data/spec/open_street_map_way_spec.rb +56 -0
- metadata +188 -0
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'xml/libxml'
|
3
|
+
class OpenStreetMap::Parser < HTTParty::Parser
|
4
|
+
include LibXML::XML::SaxParser::Callbacks
|
5
|
+
|
6
|
+
attr_accessor :context, :description, :lang, :collection
|
7
|
+
|
8
|
+
def parse
|
9
|
+
return nil if body.nil? || body.empty?
|
10
|
+
if supports_format?
|
11
|
+
self.send(format) # This is a hack, cause the xml format would not be recognized ways, but for nodes and relations
|
12
|
+
else
|
13
|
+
body
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def xml
|
18
|
+
@parser = LibXML::XML::SaxParser.string(body)
|
19
|
+
@parser.callbacks = self
|
20
|
+
@parser.parse
|
21
|
+
@collection.empty? ? @context : @collection
|
22
|
+
end
|
23
|
+
|
24
|
+
def plain
|
25
|
+
body
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_start_document # :nodoc:
|
29
|
+
@collection = []
|
30
|
+
start_document if respond_to?(:start_document)
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_end_document # :nodoc:
|
34
|
+
end_document if respond_to?(:end_document)
|
35
|
+
end
|
36
|
+
|
37
|
+
def on_start_element(name, attr_hash) # :nodoc:
|
38
|
+
case name
|
39
|
+
when 'node' then _start_node(attr_hash)
|
40
|
+
when 'way' then _start_way(attr_hash)
|
41
|
+
when 'relation' then _start_relation(attr_hash)
|
42
|
+
when 'changeset' then _start_changeset(attr_hash)
|
43
|
+
when 'user' then _start_user(attr_hash)
|
44
|
+
when 'tag' then _tag(attr_hash)
|
45
|
+
when 'nd' then _nd(attr_hash)
|
46
|
+
when 'member' then _member(attr_hash)
|
47
|
+
when 'home' then _home(attr_hash)
|
48
|
+
when 'description' then @description = true
|
49
|
+
when 'lang' then @lang = true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def on_end_element(name) # :nodoc:
|
54
|
+
case name
|
55
|
+
when 'description' then @description = false
|
56
|
+
when 'lang' then @lang = false
|
57
|
+
when 'changeset' then _end_changeset
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def on_characters(chars)
|
62
|
+
if @context.class.name == 'OpenStreetMap::User'
|
63
|
+
if @description
|
64
|
+
@context.description = chars
|
65
|
+
end
|
66
|
+
if @lang
|
67
|
+
@context.languages << chars
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def _start_node(attr_hash)
|
75
|
+
@context = OpenStreetMap::Node.new(attr_hash)
|
76
|
+
end
|
77
|
+
|
78
|
+
def _start_way(attr_hash)
|
79
|
+
@context = OpenStreetMap::Way.new(attr_hash)
|
80
|
+
end
|
81
|
+
|
82
|
+
def _start_relation(attr_hash)
|
83
|
+
@context = OpenStreetMap::Relation.new(attr_hash)
|
84
|
+
end
|
85
|
+
|
86
|
+
def _start_changeset(attr_hash)
|
87
|
+
@context = OpenStreetMap::Changeset.new(attr_hash)
|
88
|
+
end
|
89
|
+
|
90
|
+
def _end_changeset
|
91
|
+
@collection << @context
|
92
|
+
end
|
93
|
+
|
94
|
+
def _start_user(attr_hash)
|
95
|
+
@context = OpenStreetMap::User.new(attr_hash)
|
96
|
+
end
|
97
|
+
|
98
|
+
def _nd(attr_hash)
|
99
|
+
@context << attr_hash['ref']
|
100
|
+
end
|
101
|
+
|
102
|
+
def _tag(attr_hash)
|
103
|
+
if respond_to?(:tag)
|
104
|
+
return unless tag(@context, attr_hash['k'], attr_value['v'])
|
105
|
+
end
|
106
|
+
@context.tags.merge!(attr_hash['k'] => attr_hash['v'])
|
107
|
+
end
|
108
|
+
|
109
|
+
def _member(attr_hash)
|
110
|
+
new_member = OpenStreetMap::Member.new(attr_hash['type'], attr_hash['ref'], attr_hash['role'])
|
111
|
+
if respond_to?(:member)
|
112
|
+
return unless member(@context, new_member)
|
113
|
+
end
|
114
|
+
@context.members << new_member
|
115
|
+
end
|
116
|
+
|
117
|
+
def _home(attr_hash)
|
118
|
+
@context.lat = attr_hash['lat'] if attr_hash['lat']
|
119
|
+
@context.lon = attr_hash['lon'] if attr_hash['lon']
|
120
|
+
@context.lon = attr_hash['zoom'] if attr_hash['zoom']
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module OpenStreetMap
|
2
|
+
# OpenStreetMap Relation.
|
3
|
+
#
|
4
|
+
# To create a new OpenStreetMap::Relation object:
|
5
|
+
# relation = OpenStreetMap::Relation.new()
|
6
|
+
#
|
7
|
+
# To get a relation from the API:
|
8
|
+
# relation = OpenStreetMap::Relation.find(17)
|
9
|
+
#
|
10
|
+
class Relation < Element
|
11
|
+
# Array of Member objects
|
12
|
+
attr_reader :members
|
13
|
+
|
14
|
+
# Create new Relation object.
|
15
|
+
#
|
16
|
+
# If +id+ is +nil+ a new unique negative ID will be allocated.
|
17
|
+
def initialize(attrs)
|
18
|
+
attrs.stringify_keys!
|
19
|
+
@members = extract_member(attrs['member'])
|
20
|
+
super(attrs)
|
21
|
+
end
|
22
|
+
|
23
|
+
def type
|
24
|
+
'relation'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Return XML for this relation. This method uses the Builder library.
|
28
|
+
# The only parameter ist the builder object.
|
29
|
+
def to_xml(option = {})
|
30
|
+
xml = options[:builder] ||= Builder::XmlMarkup.new
|
31
|
+
xml.instruct! unless options[:skip_instruct]
|
32
|
+
xml.relation(attributes) do
|
33
|
+
members.each do |member|
|
34
|
+
member.to_xml(:builder => xml, :skip_instruct => true)
|
35
|
+
end
|
36
|
+
tags.to_xml(:builder => xml, :skip_instruct => true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def extract_member(member_array)
|
43
|
+
return [] unless member_array && member_array.size > 0
|
44
|
+
|
45
|
+
member_array.inject([]) do |memo, member|
|
46
|
+
class_to_instantize = "OpenStreetMap::#{member['type'].classify}".constantize
|
47
|
+
memo << class_to_instantize.new(:id => member['ref'])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module OpenStreetMap
|
2
|
+
# A collection of OSM tags which can be attached to a Node, Way,
|
3
|
+
# or Relation.
|
4
|
+
# It is a subclass of Hash.
|
5
|
+
class Tags < Hash
|
6
|
+
|
7
|
+
# Return XML for these tags. This method uses the Builder library.
|
8
|
+
# The only parameter ist the builder object.
|
9
|
+
def to_xml(options = {})
|
10
|
+
xml = options[:builder] ||= Builder::XmlMarkup.new
|
11
|
+
xml.instruct! unless options[:skip_instruct]
|
12
|
+
each do |key, value|
|
13
|
+
xml.tag(:k => key, :v => value)
|
14
|
+
end unless empty?
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return string with comma separated key=value pairs.
|
18
|
+
#
|
19
|
+
# call-seq: to_s -> String
|
20
|
+
#
|
21
|
+
def to_s
|
22
|
+
sort.collect{ |k, v| "#{k}=#{v}" }.join(', ')
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'builder'
|
2
|
+
module OpenStreetMap
|
3
|
+
class User
|
4
|
+
# Unique ID
|
5
|
+
attr_reader :id
|
6
|
+
|
7
|
+
# Display name
|
8
|
+
attr_reader :display_name
|
9
|
+
|
10
|
+
# When this user was created
|
11
|
+
attr_reader :account_created
|
12
|
+
|
13
|
+
# A little prosa about this user
|
14
|
+
attr_accessor :description
|
15
|
+
|
16
|
+
# All languages the user can speak
|
17
|
+
attr_accessor :languages
|
18
|
+
|
19
|
+
# Lat/Lon Coordinates of the users home.
|
20
|
+
attr_accessor :lat, :lon, :zoom
|
21
|
+
|
22
|
+
# A picture from this user
|
23
|
+
attr_accessor :img
|
24
|
+
|
25
|
+
def initialize(attrs = {})
|
26
|
+
attrs.stringify_keys!
|
27
|
+
@id = attrs['id'].to_i if attrs['id']
|
28
|
+
@display_name = attrs['display_name']
|
29
|
+
@account_created = Time.parse(attrs['account_created']) rescue nil
|
30
|
+
@languages = []
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module OpenStreetMap
|
2
|
+
# OpenStreetMap Way.
|
3
|
+
#
|
4
|
+
# To create a new OpenStreetMap::Way object:
|
5
|
+
# way = OpenStreetMap::Way.new()
|
6
|
+
#
|
7
|
+
# To get a way from the API:
|
8
|
+
# way = OpenStreetMap::Way.find_way(17)
|
9
|
+
#
|
10
|
+
class Way < Element
|
11
|
+
# Array of node IDs in this way.
|
12
|
+
attr_reader :nodes
|
13
|
+
|
14
|
+
# Create new Way object.
|
15
|
+
#
|
16
|
+
# id:: ID of this way. If +nil+ a new unique negative ID will be allocated.
|
17
|
+
# user:: Username
|
18
|
+
# timestamp:: Timestamp of last change
|
19
|
+
# nodes:: Array of Node objects and/or node IDs
|
20
|
+
def initialize(attrs = {})
|
21
|
+
attrs.stringify_keys!
|
22
|
+
@nodes = []
|
23
|
+
super(attrs)
|
24
|
+
end
|
25
|
+
|
26
|
+
def type
|
27
|
+
'Way'
|
28
|
+
end
|
29
|
+
|
30
|
+
# Add one or more tags or nodes to this way.
|
31
|
+
#
|
32
|
+
# The argument can be one of the following:
|
33
|
+
#
|
34
|
+
# * If the argument is a Hash or an OSM::Tags object, those tags are added.
|
35
|
+
# * If the argument is an OSM::Node object, its ID is added to the list of node IDs.
|
36
|
+
# * If the argument is an Integer or String containing an Integer, this ID is added to the list of node IDs.
|
37
|
+
# * If the argument is an Array the function is called recursively, i.e. all items in the Array are added.
|
38
|
+
#
|
39
|
+
# Returns the way to allow chaining.
|
40
|
+
#
|
41
|
+
# call-seq: way << something -> Way
|
42
|
+
#
|
43
|
+
def <<(stuff)
|
44
|
+
case stuff
|
45
|
+
when Array # call this method recursively
|
46
|
+
stuff.each do |item|
|
47
|
+
self << item
|
48
|
+
end
|
49
|
+
when OpenStreetMap::Node
|
50
|
+
nodes << stuff.id
|
51
|
+
when String
|
52
|
+
nodes << stuff.to_i
|
53
|
+
when Integer
|
54
|
+
nodes << stuff
|
55
|
+
else
|
56
|
+
tags.merge!(stuff)
|
57
|
+
end
|
58
|
+
self # return self to allow chaining
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# The list of attributes for this Way
|
63
|
+
def attribute_list # :nodoc:
|
64
|
+
[:id, :version, :uid, :user, :timestamp, :changeset]
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.from_xml(xml_string)
|
68
|
+
Parser.call(xml_string, :xml)
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_xml(options = {})
|
72
|
+
xml = options[:builder] ||= Builder::XmlMarkup.new
|
73
|
+
xml.instruct! unless options[:skip_instruct]
|
74
|
+
xml.osm do
|
75
|
+
xml.way(attributes) do
|
76
|
+
nodes.each do |node_id|
|
77
|
+
xml.nd(:ref => node_id)
|
78
|
+
end unless nodes.empty?
|
79
|
+
tags.to_xml(:builder => xml, :skip_instruct => true)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hash'
|
2
|
+
require 'active_model'
|
3
|
+
require 'changeset_callbacks'
|
4
|
+
require 'open_street_map/tags'
|
5
|
+
require 'open_street_map/element'
|
6
|
+
require 'open_street_map/node'
|
7
|
+
require 'open_street_map/way'
|
8
|
+
require 'open_street_map/changeset'
|
9
|
+
require 'open_street_map/relation'
|
10
|
+
require 'open_street_map/member'
|
11
|
+
require 'open_street_map/user'
|
12
|
+
require 'open_street_map/errors'
|
13
|
+
require 'open_street_map/basic_auth_client'
|
14
|
+
require 'open_street_map/oauth_client'
|
15
|
+
require 'open_street_map/parser'
|
16
|
+
require 'open_street_map/api'
|
17
|
+
require 'oauth'
|
18
|
+
|
19
|
+
# The OpenStreetMap class handles all calls to the OpenStreetMap API.
|
20
|
+
#
|
21
|
+
# Usage:
|
22
|
+
# require 'osm'
|
23
|
+
# auth_client = OpenStreetMap::BasicAuthClient.new(:user_name => 'user', :password => 'a_password')
|
24
|
+
# osm = OpenStreetMap.new(auth_client)
|
25
|
+
# @node = osm.find_node(1234)
|
26
|
+
# @node.tags << {:wheelchair => 'no'}
|
27
|
+
# osm.save(@node)
|
28
|
+
#
|
29
|
+
module OpenStreetMap
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "openstreetmap"
|
5
|
+
s.version = "0.2.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Christoph B\u{fc}nte, Enno Brehm"]
|
9
|
+
s.date = "2012-03-22"
|
10
|
+
s.description = "OpenStreetMap API client for ruby"
|
11
|
+
s.email = ["info@christophbuente.de", "guildenstern@gmx.de"]
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.md", "lib/changeset_callbacks.rb", "lib/hash.rb", "lib/open_street_map/api.rb", "lib/open_street_map/basic_auth_client.rb", "lib/open_street_map/changeset.rb", "lib/open_street_map/element.rb", "lib/open_street_map/errors.rb", "lib/open_street_map/member.rb", "lib/open_street_map/node.rb", "lib/open_street_map/oauth_client.rb", "lib/open_street_map/parser.rb", "lib/open_street_map/relation.rb", "lib/open_street_map/tags.rb", "lib/open_street_map/user.rb", "lib/open_street_map/way.rb", "lib/openstreetmap.rb"]
|
13
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README.md", "Rakefile", "lib/changeset_callbacks.rb", "lib/hash.rb", "lib/open_street_map/api.rb", "lib/open_street_map/basic_auth_client.rb", "lib/open_street_map/changeset.rb", "lib/open_street_map/element.rb", "lib/open_street_map/errors.rb", "lib/open_street_map/member.rb", "lib/open_street_map/node.rb", "lib/open_street_map/oauth_client.rb", "lib/open_street_map/parser.rb", "lib/open_street_map/relation.rb", "lib/open_street_map/tags.rb", "lib/open_street_map/user.rb", "lib/open_street_map/way.rb", "lib/openstreetmap.rb", "openstreetmap.gemspec", "spec/open_street_map/changeset_spec.rb", "spec/open_street_map/node_spec.rb", "spec/open_street_map/relation_spec.rb", "spec/open_street_map/way_spec.rb", "spec/open_street_map_changeset_spec.rb", "spec/open_street_map_node_spec.rb", "spec/open_street_map_way_spec.rb"]
|
14
|
+
s.homepage = "https://github.com/sozialhelden/openstreetmap"
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Openstreetmap", "--main", "README.md"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = "openstreetmap"
|
18
|
+
s.rubygems_version = "1.8.16"
|
19
|
+
s.summary = "OpenStreetMap API client for ruby"
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
s.specification_version = 3
|
23
|
+
|
24
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
25
|
+
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
26
|
+
s.add_runtime_dependency(%q<libxml-ruby>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<builder>, [">= 0"])
|
28
|
+
s.add_runtime_dependency(%q<oauth>, [">= 0"])
|
29
|
+
s.add_runtime_dependency(%q<activemodel>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<echoe>, [">= 0"])
|
31
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
32
|
+
s.add_development_dependency(%q<webmock>, [">= 0"])
|
33
|
+
else
|
34
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
35
|
+
s.add_dependency(%q<libxml-ruby>, [">= 0"])
|
36
|
+
s.add_dependency(%q<builder>, [">= 0"])
|
37
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
38
|
+
s.add_dependency(%q<activemodel>, [">= 0"])
|
39
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
40
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
41
|
+
s.add_dependency(%q<webmock>, [">= 0"])
|
42
|
+
end
|
43
|
+
else
|
44
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
45
|
+
s.add_dependency(%q<libxml-ruby>, [">= 0"])
|
46
|
+
s.add_dependency(%q<builder>, [">= 0"])
|
47
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
48
|
+
s.add_dependency(%q<activemodel>, [">= 0"])
|
49
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
50
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
51
|
+
s.add_dependency(%q<webmock>, [">= 0"])
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'openstreetmap'
|
2
|
+
|
3
|
+
describe 'OpenStreetMap::Changeset' do
|
4
|
+
|
5
|
+
let :changeset do
|
6
|
+
OpenStreetMap::Changeset.new( :id => "123",
|
7
|
+
:user => "fred",
|
8
|
+
:uid => "123",
|
9
|
+
:created_at => "2008-11-08T19:07:39+01:00",
|
10
|
+
:open => "true",
|
11
|
+
:min_lat => "52.2",
|
12
|
+
:max_lat => "52.3",
|
13
|
+
:min_lon => "13.4",
|
14
|
+
:max_lon => "13.5")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have an id attribute set from attributes" do
|
18
|
+
changeset.id.should eql(123)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should have an id attribute within xml representation" do
|
22
|
+
changeset.to_xml.should match /id=\"123\"/
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should have a user attributes set from attributes" do
|
26
|
+
changeset.user.should eql("fred")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should have a user attribute within xml representation" do
|
30
|
+
changeset.to_xml.should match /user=\"fred\"/
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have an uid attribute set from attributes" do
|
34
|
+
changeset.uid.should eql(123)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should have an uid attribute within xml representation" do
|
38
|
+
changeset.to_xml.should match /uid=\"123\"/
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have a changeset attributes set from attributes" do
|
42
|
+
changeset.should be_open
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should have an open attribute within xml representation" do
|
46
|
+
changeset.to_xml.should match /open=\"true\"/
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should have a min_lat attribute set from attributes" do
|
50
|
+
changeset.min_lat.should eql(52.2)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should have a min_lat attribute within xml representation" do
|
54
|
+
changeset.to_xml.should match /min_lat=\"52.2\"/
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should have a min_lon attribute set from attributes" do
|
58
|
+
changeset.min_lon.should eql(13.4)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should have a min_lon attribute within xml representation" do
|
62
|
+
changeset.to_xml.should match /min_lon=\"13.4\"/
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should have a max_lat attribute set from attributes" do
|
66
|
+
changeset.max_lat.should eql(52.3)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should have a max_lat attribute within xml representation" do
|
70
|
+
changeset.to_xml.should match /max_lat=\"52.3\"/
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should have a max_lon attribute set from attributes" do
|
74
|
+
changeset.max_lon.should eql(13.5)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should have a max_lon attribute within xml representation" do
|
78
|
+
changeset.to_xml.should match /max_lon=\"13.5\"/
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should have a created_at attribute set from attributes" do
|
82
|
+
changeset.created_at.should eql Time.parse('2008-11-08T19:07:39+01:00')
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should have a created_at attribute within xml representation" do
|
86
|
+
changeset.to_xml.should match /created_at=\"/
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
end
|