end
end
+ # Raised when a diff is uploaded containing many changeset IDs which don't match
+ # the changeset ID that the diff was uploaded to.
+ class APIChangesetMismatchError < APIError
+ def initialize(provided, allowed)
+ @provided, @allowed = provided, allowed
+ end
+
+ def render_opts
+ { :text => "Changeset mismatch: Provided #{@provided} but only " +
+ "#{@allowed} is allowed.", :status => :conflict }
+ end
+ end
+
+ # Raised when a diff upload has an unknown action. You can only have create,
+ # modify, or delete
+ class APIChangesetActionInvalid < APIError
+ def initialize(provided)
+ @provided = provided
+ end
+
+ def render_opts
+ { :text => "Unknown action #{@provided}, choices are create, modify, delete.",
+ :status => :bad_request }
+ end
+ end
+
+ # Raised when bad XML is encountered which stops things parsing as
+ # they should.
+ class APIBadXMLError < APIError
+ def initialize(model, xml)
+ @model, @xml = model, xml
+ end
+
+ def render_opts
+ { :text => "Cannot parse valid #{@model} from xml string #{@xml}",
+ :status => :bad_request }
+ end
+ end
+
# Raised when the provided version is not equal to the latest in the db.
class APIVersionMismatchError < APIError
- def initialize(provided, latest)
- @provided, @latest = provided, latest
+ def initialize(id, type, provided, latest)
+ @id, @type, @provided, @latest = id, type, provided, latest
end
- attr_reader :provided, :latest
+ attr_reader :provided, :latest, :id, :type
def render_opts
{ :text => "Version mismatch: Provided " + provided.to_s +
- ", server had: " + latest.to_s, :status => :conflict }
+ ", server had: " + latest.to_s + " of " + type + " " + id.to_s,
+ :status => :conflict }
end
end
:status => :bad_request }
end
end
+
+ # Raised when a way has more than the configured number of way nodes.
+ # This prevents ways from being to long and difficult to work with
+ class APITooManyWayNodesError < APIError
+ def initialize(provided, max)
+ @provided, @max = provided, max
+ end
+
+ attr_reader :provided, :max
+
+ def render_opts
+ { :text => "You tried to add #{provided} nodes to the way, however only #{max} are allowed",
+ :status => :bad_request }
+ end
+ end
# Helper methods for going to/from mercator and lat/lng.
class Mercator
doc.encoding = 'UTF-8'
root = XML::Node.new 'osm'
root['version'] = API_VERSION
- root['generator'] = 'OpenStreetMap server'
+ root['generator'] = GENERATOR
doc.root = root
return doc
end