Cleanup trailing whitespace
This commit is contained in:
parent
e1f79d84ad
commit
34e3e51456
129 changed files with 1056 additions and 1076 deletions
|
@ -626,23 +626,12 @@ Style/SymbolProc:
|
|||
Style/Tab:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 6
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
Style/TrailingBlankLines:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStyles.
|
||||
Style/TrailingComma:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 1052
|
||||
# Cop supports --auto-correct.
|
||||
Style/TrailingWhitespace:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 13
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, Whitelist.
|
||||
|
|
2
Vagrantfile
vendored
2
Vagrantfile
vendored
|
@ -4,7 +4,7 @@
|
|||
Vagrant.configure("2") do |config|
|
||||
config.vm.box = "precise64"
|
||||
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
|
||||
|
||||
|
||||
# port forward for webrick on 3000
|
||||
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# amf_controller is a semi-standalone API for Flash clients, particularly
|
||||
# Potlatch. All interaction between Potlatch (as a .SWF application) and the
|
||||
# OSM database takes place using this controller. Messages are
|
||||
# amf_controller is a semi-standalone API for Flash clients, particularly
|
||||
# Potlatch. All interaction between Potlatch (as a .SWF application) and the
|
||||
# OSM database takes place using this controller. Messages are
|
||||
# encoded in the Actionscript Message Format (AMF).
|
||||
#
|
||||
# Helper functions are in /lib/potlatch.rb
|
||||
|
@ -11,25 +11,25 @@
|
|||
# == General structure
|
||||
#
|
||||
# Apart from the amf_read and amf_write methods (which distribute the requests
|
||||
# from the AMF message), each method generally takes arguments in the order
|
||||
# they were sent by the Potlatch SWF. Do not assume typing has been preserved.
|
||||
# from the AMF message), each method generally takes arguments in the order
|
||||
# they were sent by the Potlatch SWF. Do not assume typing has been preserved.
|
||||
# Methods all return an array to the SWF.
|
||||
#
|
||||
# == API 0.6
|
||||
#
|
||||
# Note that this requires a patched version of composite_primary_keys 1.1.0
|
||||
# (see http://groups.google.com/group/compositekeys/t/a00e7562b677e193)
|
||||
# (see http://groups.google.com/group/compositekeys/t/a00e7562b677e193)
|
||||
# if you are to run with POTLATCH_USE_SQL=false .
|
||||
#
|
||||
#
|
||||
# == Debugging
|
||||
#
|
||||
#
|
||||
# Any method that returns a status code (0 for ok) can also send:
|
||||
# return(-1,"message") <-- just puts up a dialogue
|
||||
# return(-2,"message") <-- also asks the user to e-mail me
|
||||
# return(-3,["type",v],id) <-- version conflict
|
||||
# return(-4,"type",id) <-- object not found
|
||||
# -5 indicates the method wasn't called (due to a previous error)
|
||||
#
|
||||
#
|
||||
# To write to the Rails log, use logger.info("message").
|
||||
|
||||
# Remaining issues:
|
||||
|
@ -43,7 +43,7 @@ class AmfController < ApplicationController
|
|||
|
||||
# Main AMF handlers: process the raw AMF string (using AMF library) and
|
||||
# calls each action (private method) accordingly.
|
||||
|
||||
|
||||
def amf_read
|
||||
self.status = :ok
|
||||
self.content_type = Mime::AMF
|
||||
|
@ -63,7 +63,7 @@ class AmfController < ApplicationController
|
|||
when 'findrelations'; result = findrelations(*args)
|
||||
when 'getpoi'; result = getpoi(*args)
|
||||
end
|
||||
|
||||
|
||||
result
|
||||
end
|
||||
end
|
||||
|
@ -128,7 +128,7 @@ class AmfController < ApplicationController
|
|||
|
||||
# Start new changeset
|
||||
# Returns success_code,success_message,changeset id
|
||||
|
||||
|
||||
def startchangeset(usertoken, cstags, closeid, closecomment, opennew)
|
||||
amf_handle_error("'startchangeset'",nil,nil) do
|
||||
user = getuser(usertoken)
|
||||
|
@ -156,14 +156,14 @@ class AmfController < ApplicationController
|
|||
cs.save_with_tags!
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# open a new changeset
|
||||
if opennew!=0
|
||||
cs = Changeset.new
|
||||
cs.tags = cstags
|
||||
cs.user_id = user.id
|
||||
if !closecomment.empty?
|
||||
cs.tags['comment']=closecomment
|
||||
if !closecomment.empty?
|
||||
cs.tags['comment']=closecomment
|
||||
# in case closecomment has chars not allowed in xml
|
||||
cs.tags = strip_non_xml_chars cs.tags
|
||||
end
|
||||
|
@ -234,10 +234,10 @@ class AmfController < ApplicationController
|
|||
|
||||
##
|
||||
# Find all the ways, POI nodes (i.e. not part of ways), and relations
|
||||
# in a given bounding box. Nodes are returned in full; ways and relations
|
||||
# are IDs only.
|
||||
# in a given bounding box. Nodes are returned in full; ways and relations
|
||||
# are IDs only.
|
||||
#
|
||||
# return is of the form:
|
||||
# return is of the form:
|
||||
# [success_code, success_message,
|
||||
# [[way_id, way_version], ...],
|
||||
# [[node_id, lat, lon, [tags, ...], node_version], ...],
|
||||
|
@ -265,7 +265,7 @@ class AmfController < ApplicationController
|
|||
else
|
||||
# find the way ids in an area
|
||||
nodes_in_area = Node.bbox(bbox).visible.includes(:ways)
|
||||
ways = nodes_in_area.inject([]) { |sum, node|
|
||||
ways = nodes_in_area.inject([]) { |sum, node|
|
||||
visible_ways = node.ways.select { |w| w.visible? }
|
||||
sum + visible_ways.collect { |w| [w.id,w.version] }
|
||||
}.uniq
|
||||
|
@ -339,22 +339,22 @@ class AmfController < ApplicationController
|
|||
[0, '', wayid, points, tags, version, uid]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Get an old version of a way, and all constituent nodes.
|
||||
#
|
||||
# For undelete (version<0), always uses the most recent version of each node,
|
||||
# even if it's moved. For revert (version >= 0), uses the node in existence
|
||||
# For undelete (version<0), always uses the most recent version of each node,
|
||||
# even if it's moved. For revert (version >= 0), uses the node in existence
|
||||
# at the time, generating a new id if it's still visible and has been moved/
|
||||
# retagged.
|
||||
#
|
||||
# Returns:
|
||||
# 0. success code,
|
||||
# 1. id,
|
||||
# 2. array of points,
|
||||
# 3. hash of tags,
|
||||
# 4. version,
|
||||
# 0. success code,
|
||||
# 1. id,
|
||||
# 2. array of points,
|
||||
# 3. hash of tags,
|
||||
# 4. version,
|
||||
# 5. is this the current, visible version? (boolean)
|
||||
|
||||
|
||||
def getway_old(id, timestamp) #:doc:
|
||||
amf_handle_error_with_timeout("'getway_old' #{id}, #{timestamp}", 'way',id) do
|
||||
if timestamp == ''
|
||||
|
@ -387,15 +387,15 @@ class AmfController < ApplicationController
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Find history of a way.
|
||||
# Returns 'way', id, and an array of previous versions:
|
||||
# - formerly [old_way.version, old_way.timestamp.strftime("%d %b %Y, %H:%M"), old_way.visible ? 1 : 0, user, uid]
|
||||
# - now [timestamp,user,uid]
|
||||
#
|
||||
# Heuristic: Find all nodes that have ever been part of the way;
|
||||
# Heuristic: Find all nodes that have ever been part of the way;
|
||||
# get a list of their revision dates; add revision dates of the way;
|
||||
# sort and collapse list (to within 2 seconds); trim all dates before the
|
||||
# sort and collapse list (to within 2 seconds); trim all dates before the
|
||||
# start date of the way.
|
||||
|
||||
def getway_history(wayid) #:doc:
|
||||
|
@ -431,11 +431,11 @@ class AmfController < ApplicationController
|
|||
return ['way', wayid, []]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Find history of a node. Returns 'node', id, and an array of previous versions as above.
|
||||
|
||||
def getnode_history(nodeid) #:doc:
|
||||
begin
|
||||
begin
|
||||
history = Node.find(nodeid).old_nodes.unredacted.reverse.collect do |old_node|
|
||||
[(old_node.timestamp + 1).strftime("%d %b %Y, %H:%M:%S")] + change_user(old_node)
|
||||
end
|
||||
|
@ -454,7 +454,7 @@ class AmfController < ApplicationController
|
|||
|
||||
# Find GPS traces with specified name/id.
|
||||
# Returns array listing GPXs, each one comprising id, name and description.
|
||||
|
||||
|
||||
def findgpx(searchterm, usertoken)
|
||||
amf_handle_error_with_timeout("'findgpx'" ,nil,nil) do
|
||||
user = getuser(usertoken)
|
||||
|
@ -482,7 +482,7 @@ class AmfController < ApplicationController
|
|||
# 3. hash of tags,
|
||||
# 4. list of members,
|
||||
# 5. version.
|
||||
|
||||
|
||||
def getrelation(relid) #:doc:
|
||||
amf_handle_error("'getrelation' #{relid}" ,'relation',relid) do
|
||||
rel = Relation.where(:id => relid).first
|
||||
|
@ -494,7 +494,7 @@ class AmfController < ApplicationController
|
|||
|
||||
# Find relations with specified name/id.
|
||||
# Returns array of relations, each in same form as getrelation.
|
||||
|
||||
|
||||
def findrelations(searchterm)
|
||||
rels = []
|
||||
if searchterm.to_i>0 then
|
||||
|
@ -575,7 +575,7 @@ class AmfController < ApplicationController
|
|||
relation.delete_with_history!(new_relation, user)
|
||||
end
|
||||
end # transaction
|
||||
|
||||
|
||||
if relid <= 0
|
||||
return [0, '', relid, new_relation.id, new_relation.version]
|
||||
else
|
||||
|
@ -586,7 +586,7 @@ class AmfController < ApplicationController
|
|||
|
||||
# Save a way to the database, including all nodes. Any nodes in the previous
|
||||
# version and no longer used are deleted.
|
||||
#
|
||||
#
|
||||
# Parameters:
|
||||
# 0. hash of renumbered nodes (added by amf_controller)
|
||||
# 1. current user token (for authentication)
|
||||
|
@ -597,7 +597,7 @@ class AmfController < ApplicationController
|
|||
# 6. hash of way tags
|
||||
# 7. array of nodes to change (each one is [lon,lat,id,version,tags]),
|
||||
# 8. hash of nodes to delete (id->version).
|
||||
#
|
||||
#
|
||||
# Returns:
|
||||
# 0. '0' (code for success),
|
||||
# 1. message,
|
||||
|
@ -610,7 +610,7 @@ class AmfController < ApplicationController
|
|||
def putway(renumberednodes, usertoken, changeset_id, wayversion, originalway, pointlist, attributes, nodes, deletednodes) #:doc:
|
||||
amf_handle_error("'putway' #{originalway}" ,'way',originalway) do
|
||||
# -- Initialise
|
||||
|
||||
|
||||
user = getuser(usertoken)
|
||||
if !user then return -1,"You are not logged in, so the way could not be saved." end
|
||||
if user.blocks.active.exists? then return -1,t('application.setup_user_auth.blocked') end
|
||||
|
@ -748,7 +748,7 @@ class AmfController < ApplicationController
|
|||
new_node.lat = lat
|
||||
new_node.lon = lon
|
||||
new_node.tags = tags
|
||||
if id <= 0
|
||||
if id <= 0
|
||||
# We're creating the node
|
||||
new_node.create_with_history(user)
|
||||
elsif visible
|
||||
|
@ -767,7 +767,7 @@ class AmfController < ApplicationController
|
|||
return [0, '', id, new_node.id, new_node.version]
|
||||
else
|
||||
return [0, '', id, node.id, node.version]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -799,7 +799,7 @@ class AmfController < ApplicationController
|
|||
# * the changeset id
|
||||
# * the id of the way to change
|
||||
# * the version of the way that was downloaded
|
||||
# * a hash of the id and versions of all the nodes that are in the way, if any
|
||||
# * a hash of the id and versions of all the nodes that are in the way, if any
|
||||
# of the nodes have been changed by someone else then, there is a problem!
|
||||
# Returns 0 (success), unchanged way id, new way version, new node versions.
|
||||
|
||||
|
@ -809,7 +809,7 @@ class AmfController < ApplicationController
|
|||
unless user then return -1,"You are not logged in, so the way could not be deleted." end
|
||||
if user.blocks.active.exists? then return -1,t('application.setup_user_auth.blocked') end
|
||||
if REQUIRE_TERMS_AGREED and user.terms_agreed.nil? then return -1,"You must accept the contributor terms before you can edit." end
|
||||
|
||||
|
||||
way_id = way_id.to_i
|
||||
nodeversions = {}
|
||||
old_way=nil # returned, so scope it outside the transaction
|
||||
|
@ -853,7 +853,7 @@ class AmfController < ApplicationController
|
|||
|
||||
# Authenticate token
|
||||
# (can also be of form user:pass)
|
||||
# When we are writing to the api, we need the actual user model,
|
||||
# When we are writing to the api, we need the actual user model,
|
||||
# not just the id, hence this abstraction
|
||||
|
||||
def getuser(token) #:doc:
|
||||
|
@ -868,7 +868,7 @@ class AmfController < ApplicationController
|
|||
def getlocales
|
||||
Dir.glob("#{Rails.root}/config/potlatch/locales/*").collect { |f| File.basename(f, ".yml") }
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# check that all key-value pairs are valid UTF-8.
|
||||
def tags_ok(tags)
|
||||
|
@ -903,19 +903,19 @@ class AmfController < ApplicationController
|
|||
FROM current_way_nodes
|
||||
INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id
|
||||
INNER JOIN current_ways ON current_ways.id =current_way_nodes.id
|
||||
WHERE current_nodes.visible=TRUE
|
||||
AND current_ways.visible=TRUE
|
||||
WHERE current_nodes.visible=TRUE
|
||||
AND current_ways.visible=TRUE
|
||||
AND #{OSM.sql_for_area(bbox, "current_nodes.")}
|
||||
EOF
|
||||
return ActiveRecord::Base.connection.select_all(sql).collect { |a| [a['wayid'].to_i,a['version'].to_i] }
|
||||
end
|
||||
|
||||
|
||||
def sql_find_pois_in_area(bbox)
|
||||
pois=[]
|
||||
sql=<<-EOF
|
||||
SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.version
|
||||
FROM current_nodes
|
||||
LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id
|
||||
SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.version
|
||||
FROM current_nodes
|
||||
LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id
|
||||
WHERE current_nodes.visible=TRUE
|
||||
AND cwn.id IS NULL
|
||||
AND #{OSM.sql_for_area(bbox, "current_nodes.")}
|
||||
|
@ -929,15 +929,15 @@ class AmfController < ApplicationController
|
|||
end
|
||||
pois
|
||||
end
|
||||
|
||||
|
||||
def sql_find_relations_in_area_and_ways(bbox,way_ids)
|
||||
# ** It would be more Potlatchy to get relations for nodes within ways
|
||||
# during 'getway', not here
|
||||
sql=<<-EOF
|
||||
SELECT DISTINCT cr.id AS relid,cr.version AS version
|
||||
SELECT DISTINCT cr.id AS relid,cr.version AS version
|
||||
FROM current_relations cr
|
||||
INNER JOIN current_relation_members crm ON crm.id=cr.id
|
||||
INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='Node'
|
||||
INNER JOIN current_relation_members crm ON crm.id=cr.id
|
||||
INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='Node'
|
||||
WHERE #{OSM.sql_for_area(bbox, "cn.")}
|
||||
EOF
|
||||
unless way_ids.empty?
|
||||
|
@ -946,20 +946,20 @@ class AmfController < ApplicationController
|
|||
SELECT DISTINCT cr.id AS relid,cr.version AS version
|
||||
FROM current_relations cr
|
||||
INNER JOIN current_relation_members crm ON crm.id=cr.id
|
||||
WHERE crm.member_type='Way'
|
||||
WHERE crm.member_type='Way'
|
||||
AND crm.member_id IN (#{way_ids.join(',')})
|
||||
EOF
|
||||
end
|
||||
ActiveRecord::Base.connection.select_all(sql).collect { |a| [a['relid'].to_i,a['version'].to_i] }
|
||||
end
|
||||
|
||||
|
||||
def sql_get_nodes_in_way(wayid)
|
||||
points=[]
|
||||
sql=<<-EOF
|
||||
SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,current_nodes.version
|
||||
FROM current_way_nodes,current_nodes
|
||||
WHERE current_way_nodes.id=#{wayid.to_i}
|
||||
AND current_way_nodes.node_id=current_nodes.id
|
||||
SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,current_nodes.version
|
||||
FROM current_way_nodes,current_nodes
|
||||
WHERE current_way_nodes.id=#{wayid.to_i}
|
||||
AND current_way_nodes.node_id=current_nodes.id
|
||||
AND current_nodes.visible=TRUE
|
||||
ORDER BY sequence_id
|
||||
EOF
|
||||
|
@ -973,7 +973,7 @@ class AmfController < ApplicationController
|
|||
end
|
||||
points
|
||||
end
|
||||
|
||||
|
||||
def sql_get_tags_in_way(wayid)
|
||||
tags={}
|
||||
ActiveRecord::Base.connection.select_all("SELECT k,v FROM current_way_tags WHERE id=#{wayid.to_i}").each do |row|
|
||||
|
@ -990,4 +990,3 @@ class AmfController < ApplicationController
|
|||
ActiveRecord::Base.connection.select_one("SELECT user FROM current_ways,changesets WHERE current_ways.id=#{wayid.to_i} AND current_ways.changeset=changesets.id")['user']
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class ApiController < ApplicationController
|
|||
root['version'] = '1.0'
|
||||
root['creator'] = 'OpenStreetMap.org'
|
||||
root['xmlns'] = "http://www.topografix.com/GPX/1/0"
|
||||
|
||||
|
||||
doc.root = root
|
||||
|
||||
# initialise these variables outside of the loop so that they
|
||||
|
@ -75,21 +75,21 @@ class ApiController < ApplicationController
|
|||
# use the anonymous track segment if the user hasn't allowed
|
||||
# their GPX points to be tracked.
|
||||
timestamps = false
|
||||
if anon_track.nil?
|
||||
if anon_track.nil?
|
||||
anon_track = XML::Node.new 'trk'
|
||||
doc.root << anon_track
|
||||
end
|
||||
track = anon_track
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if trackid != point.trackid
|
||||
if gpx_file.trackable?
|
||||
trkseg = XML::Node.new 'trkseg'
|
||||
track << trkseg
|
||||
trackid = point.trackid
|
||||
else
|
||||
if anon_trkseg.nil?
|
||||
if anon_trkseg.nil?
|
||||
anon_trkseg = XML::Node.new 'trkseg'
|
||||
anon_track << anon_trkseg
|
||||
end
|
||||
|
@ -105,14 +105,14 @@ class ApiController < ApplicationController
|
|||
render :text => doc.to_s, :content_type => "text/xml"
|
||||
end
|
||||
|
||||
# This is probably the most common call of all. It is used for getting the
|
||||
# This is probably the most common call of all. It is used for getting the
|
||||
# OSM data for a specified bounding box, usually for editing. First the
|
||||
# bounding box (bbox) is checked to make sure that it is sane. All nodes
|
||||
# bounding box (bbox) is checked to make sure that it is sane. All nodes
|
||||
# are searched, then all the ways that reference those nodes are found.
|
||||
# All Nodes that are referenced by those ways are fetched and added to the list
|
||||
# of nodes.
|
||||
# Then all the relations that reference the already found nodes and ways are
|
||||
# fetched. All the nodes and ways that are referenced by those ways are then
|
||||
# fetched. All the nodes and ways that are referenced by those ways are then
|
||||
# fetched. Finally all the xml is returned.
|
||||
def map
|
||||
# Figure out the bbox
|
||||
|
@ -185,15 +185,15 @@ class ApiController < ApplicationController
|
|||
doc.root << way.to_xml_node(visible_nodes, changeset_cache, user_display_name_cache)
|
||||
way_ids << way.id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
relations = Relation.nodes(visible_nodes.keys).visible +
|
||||
Relation.ways(way_ids).visible
|
||||
|
||||
# we do not normally return the "other" partners referenced by an relation,
|
||||
# e.g. if we return a way A that is referenced by relation X, and there's
|
||||
# another way B also referenced, that is not returned. But we do make
|
||||
# an exception for cases where an relation references another *relation*;
|
||||
# we do not normally return the "other" partners referenced by an relation,
|
||||
# e.g. if we return a way A that is referenced by relation X, and there's
|
||||
# another way B also referenced, that is not returned. But we do make
|
||||
# an exception for cases where an relation references another *relation*;
|
||||
# in that case we return that as well (but we don't go recursive here)
|
||||
relations += Relation.relations(relations.collect { |r| r.id }).visible
|
||||
|
||||
|
@ -254,8 +254,8 @@ class ApiController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
# External apps that use the api are able to query the api to find out some
|
||||
# parameters of the API. It currently returns:
|
||||
# External apps that use the api are able to query the api to find out some
|
||||
# parameters of the API. It currently returns:
|
||||
# * minimum and maximum API versions that can be used.
|
||||
# * maximum area that can be requested in a bbox request in square degrees
|
||||
# * number of tracepoints that are returned in each tracepoints page
|
||||
|
@ -290,7 +290,7 @@ class ApiController < ApplicationController
|
|||
doc.root << api
|
||||
policy = XML::Node.new 'policy'
|
||||
blacklist = XML::Node.new 'imagery'
|
||||
IMAGERY_BLACKLIST.each do |url_regex|
|
||||
IMAGERY_BLACKLIST.each do |url_regex|
|
||||
xnd = XML::Node.new 'blacklist'
|
||||
xnd['regex'] = url_regex.to_s
|
||||
blacklist << xnd
|
||||
|
|
|
@ -51,8 +51,8 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
|
||||
##
|
||||
# requires the user to be logged in by the token or HTTP methods, or have an
|
||||
# OAuth token with the right capability. this method is a bit of a pain to call
|
||||
# requires the user to be logged in by the token or HTTP methods, or have an
|
||||
# OAuth token with the right capability. this method is a bit of a pain to call
|
||||
# directly, since it's cumbersome to call filters with arguments in rails. to
|
||||
# make it easier to read and write the code, there are some utility methods
|
||||
# below.
|
||||
|
@ -161,18 +161,18 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
end
|
||||
|
||||
def authorize(realm='Web Password', errormessage="Couldn't authenticate you")
|
||||
def authorize(realm='Web Password', errormessage="Couldn't authenticate you")
|
||||
# make the @user object from any auth sources we have
|
||||
setup_user_auth
|
||||
|
||||
# handle authenticate pass/fail
|
||||
unless @user
|
||||
# no auth, the user does not exist or the password was wrong
|
||||
response.headers["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
|
||||
response.headers["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
|
||||
render :text => errormessage, :status => :unauthorized
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# to be used as a before_filter *after* authorize. this checks that
|
||||
|
@ -180,15 +180,15 @@ class ApplicationController < ActionController::Base
|
|||
#
|
||||
# NOTE: this isn't a very good way of doing it - it duplicates logic
|
||||
# from require_moderator - but what we really need to do is a fairly
|
||||
# drastic refactoring based on :format and respond_to? but not a
|
||||
# drastic refactoring based on :format and respond_to? but not a
|
||||
# good idea to do that in this branch.
|
||||
def authorize_moderator(errormessage="Access restricted to moderators")
|
||||
def authorize_moderator(errormessage="Access restricted to moderators")
|
||||
# check user is a moderator
|
||||
unless @user.moderator?
|
||||
render :text => errormessage, :status => :forbidden
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def check_database_readable(need_api = false)
|
||||
if STATUS == :database_offline or (need_api and STATUS == :api_offline)
|
||||
|
@ -230,7 +230,7 @@ class ApplicationController < ActionController::Base
|
|||
:offline
|
||||
elsif STATUS == :database_readonly
|
||||
:readonly
|
||||
else
|
||||
else
|
||||
:online
|
||||
end
|
||||
end
|
||||
|
@ -264,7 +264,7 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
# Report and error to the user
|
||||
# (If anyone ever fixes Rails so it can set a http status "reason phrase",
|
||||
# rather than only a status code and having the web engine make up a
|
||||
# rather than only a status code and having the web engine make up a
|
||||
# phrase from that, we can also put the error message into the status
|
||||
# message. For now, rails won't let us)
|
||||
def report_error(message, status = :bad_request)
|
||||
|
@ -283,7 +283,7 @@ class ApplicationController < ActionController::Base
|
|||
render :text => message, :status => status, :content_type => "text/plain"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def set_locale
|
||||
response.header['Vary'] = 'Accept-Language'
|
||||
|
||||
|
@ -448,23 +448,23 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
helper_method :preferred_editor
|
||||
|
||||
private
|
||||
private
|
||||
|
||||
# extract authorisation credentials from headers, returns user = nil if none
|
||||
def get_auth_data
|
||||
if request.env.has_key? 'X-HTTP_AUTHORIZATION' # where mod_rewrite might have put it
|
||||
authdata = request.env['X-HTTP_AUTHORIZATION'].to_s.split
|
||||
elsif request.env.has_key? 'REDIRECT_X_HTTP_AUTHORIZATION' # mod_fcgi
|
||||
authdata = request.env['REDIRECT_X_HTTP_AUTHORIZATION'].to_s.split
|
||||
def get_auth_data
|
||||
if request.env.has_key? 'X-HTTP_AUTHORIZATION' # where mod_rewrite might have put it
|
||||
authdata = request.env['X-HTTP_AUTHORIZATION'].to_s.split
|
||||
elsif request.env.has_key? 'REDIRECT_X_HTTP_AUTHORIZATION' # mod_fcgi
|
||||
authdata = request.env['REDIRECT_X_HTTP_AUTHORIZATION'].to_s.split
|
||||
elsif request.env.has_key? 'HTTP_AUTHORIZATION' # regular location
|
||||
authdata = request.env['HTTP_AUTHORIZATION'].to_s.split
|
||||
end
|
||||
end
|
||||
# only basic authentication supported
|
||||
if authdata and authdata[0] == 'Basic'
|
||||
if authdata and authdata[0] == 'Basic'
|
||||
user, pass = Base64.decode64(authdata[1]).split(':',2)
|
||||
end
|
||||
return [user, pass]
|
||||
end
|
||||
end
|
||||
return [user, pass]
|
||||
end
|
||||
|
||||
# used by oauth plugin to get the current user
|
||||
def current_user
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
class BrowseController < ApplicationController
|
||||
layout :map_layout
|
||||
|
||||
before_filter :authorize_web
|
||||
before_filter :set_locale
|
||||
before_filter :authorize_web
|
||||
before_filter :set_locale
|
||||
before_filter :except => [ :query ] { |c| c.check_database_readable(true) }
|
||||
before_filter :require_oauth
|
||||
around_filter :web_timeout
|
||||
|
|
|
@ -98,7 +98,7 @@ class DiaryEntryController < ApplicationController
|
|||
end
|
||||
else
|
||||
@entries = DiaryEntry.joins(:user).where(:users => { :status => ["active", "confirmed"] })
|
||||
|
||||
|
||||
if params[:language]
|
||||
@title = t 'diary_entry.list.in_language_title', :language => Language.find(params[:language]).english_name
|
||||
@entries = @entries.where(:language_code => params[:language])
|
||||
|
|
|
@ -35,12 +35,12 @@ class NodeController < ApplicationController
|
|||
render :text => "", :status => :gone
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Update a node from given XML
|
||||
def update
|
||||
node = Node.find(params[:id])
|
||||
new_node = Node.from_xml(request.raw_post)
|
||||
|
||||
|
||||
unless new_node and new_node.id == node.id
|
||||
raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
|
||||
end
|
||||
|
@ -48,13 +48,13 @@ class NodeController < ApplicationController
|
|||
render :text => node.version.to_s, :content_type => "text/plain"
|
||||
end
|
||||
|
||||
# Delete a node. Doesn't actually delete it, but retains its history
|
||||
# Delete a node. Doesn't actually delete it, but retains its history
|
||||
# in a wiki-like way. We therefore treat it like an update, so the delete
|
||||
# method returns the new version number.
|
||||
def delete
|
||||
node = Node.find(params[:id])
|
||||
new_node = Node.from_xml(request.raw_post)
|
||||
|
||||
|
||||
unless new_node and new_node.id == node.id
|
||||
raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
|
||||
end
|
||||
|
|
|
@ -146,7 +146,7 @@ class NotesController < ApplicationController
|
|||
format.xml { render :action => :show }
|
||||
format.json { render :action => :show }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Reopen a note
|
||||
|
@ -176,7 +176,7 @@ class NotesController < ApplicationController
|
|||
format.xml { render :action => :show }
|
||||
format.json { render :action => :show }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Get a feed of recent notes and comments
|
||||
|
@ -278,33 +278,33 @@ class NotesController < ApplicationController
|
|||
##
|
||||
# Display a list of notes by a specified user
|
||||
def mine
|
||||
if params[:display_name]
|
||||
if params[:display_name]
|
||||
if @this_user = User.active.find_by_display_name(params[:display_name])
|
||||
@title = t 'note.mine.title', :user => @this_user.display_name
|
||||
@heading = t 'note.mine.heading', :user => @this_user.display_name
|
||||
@title = t 'note.mine.title', :user => @this_user.display_name
|
||||
@heading = t 'note.mine.heading', :user => @this_user.display_name
|
||||
@description = t 'note.mine.subheading', :user => render_to_string(:partial => "user", :object => @this_user)
|
||||
@page = (params[:page] || 1).to_i
|
||||
@page = (params[:page] || 1).to_i
|
||||
@page_size = 10
|
||||
@notes = @this_user.notes.order("updated_at DESC, id").uniq.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author).to_a
|
||||
else
|
||||
@title = t 'user.no_such_user.title'
|
||||
@not_found_user = params[:display_name]
|
||||
@title = t 'user.no_such_user.title'
|
||||
@not_found_user = params[:display_name]
|
||||
|
||||
render :template => 'user/no_such_user', :status => :not_found
|
||||
end
|
||||
render :template => 'user/no_such_user', :status => :not_found
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
#------------------------------------------------------------
|
||||
# utility functions below.
|
||||
#------------------------------------------------------------
|
||||
|
||||
private
|
||||
#------------------------------------------------------------
|
||||
# utility functions below.
|
||||
#------------------------------------------------------------
|
||||
|
||||
##
|
||||
# Render an OK response
|
||||
def render_ok
|
||||
if params[:format] == "js"
|
||||
render :text => "osbResponse();", :content_type => "text/javascript"
|
||||
render :text => "osbResponse();", :content_type => "text/javascript"
|
||||
else
|
||||
render :text => "ok " + @note.id.to_s + "\n", :content_type => "text/plain" if @note
|
||||
render :text => "ok\n", :content_type => "text/plain" unless @note
|
||||
|
@ -334,7 +334,7 @@ private
|
|||
else
|
||||
closed_since = 7
|
||||
end
|
||||
|
||||
|
||||
if closed_since < 0
|
||||
notes = notes.where("status != 'hidden'")
|
||||
elsif closed_since > 0
|
||||
|
@ -351,9 +351,9 @@ private
|
|||
def add_comment(note, text, event, notify = true)
|
||||
attributes = { :visible => true, :event => event, :body => text }
|
||||
|
||||
if @user
|
||||
if @user
|
||||
attributes[:author_id] = @user.id
|
||||
else
|
||||
else
|
||||
attributes[:author_ip] = request.remote_ip
|
||||
end
|
||||
|
||||
|
|
|
@ -18,12 +18,12 @@ class OldController < ApplicationController
|
|||
|
||||
def history
|
||||
# the .where() method used in the lookup_old_element_versions
|
||||
# call won't throw an error if no records are found, so we have
|
||||
# call won't throw an error if no records are found, so we have
|
||||
# to do that ourselves.
|
||||
raise OSM::APINotFoundError.new if @elements.empty?
|
||||
|
||||
doc = OSM::API.new.get_xml_doc
|
||||
|
||||
|
||||
visible_elements = if show_redactions?
|
||||
@elements
|
||||
else
|
||||
|
@ -33,20 +33,20 @@ class OldController < ApplicationController
|
|||
visible_elements.each do |element|
|
||||
doc.root << element.to_xml_node
|
||||
end
|
||||
|
||||
|
||||
render :text => doc.to_s, :content_type => "text/xml"
|
||||
end
|
||||
|
||||
|
||||
def version
|
||||
if @old_element.redacted? and not show_redactions?
|
||||
render :text => "", :status => :forbidden
|
||||
|
||||
else
|
||||
response.last_modified = @old_element.timestamp
|
||||
|
||||
|
||||
doc = OSM::API.new.get_xml_doc
|
||||
doc.root << @old_element.to_xml_node
|
||||
|
||||
|
||||
render :text => doc.to_s, :content_type => "text/xml"
|
||||
end
|
||||
end
|
||||
|
@ -58,19 +58,19 @@ class OldController < ApplicationController
|
|||
# be redacted in that redaction.
|
||||
redaction = Redaction.find(redaction_id.to_i)
|
||||
@old_element.redact!(redaction)
|
||||
|
||||
|
||||
else
|
||||
# if no redaction ID was provided, then this is an unredact
|
||||
# operation.
|
||||
@old_element.redact!(nil)
|
||||
end
|
||||
|
||||
|
||||
# just return an empty 200 OK for success
|
||||
render :text => ""
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def show_redactions?
|
||||
@user and @user.moderator? and params[:show_redactions] == "true"
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class OldNodeController < OldController
|
||||
|
||||
private
|
||||
|
||||
|
||||
def lookup_old_element
|
||||
@old_element = OldNode.find([params[:id], params[:version]])
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class OldRelationController < OldController
|
||||
|
||||
private
|
||||
|
||||
|
||||
def lookup_old_element
|
||||
@old_element = OldRelation.find([params[:id], params[:version]])
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class OldWayController < OldController
|
||||
|
||||
private
|
||||
|
||||
|
||||
def lookup_old_element
|
||||
@old_element = OldWay.find([params[:id], params[:version]])
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
class RedactionsController < ApplicationController
|
||||
layout 'site'
|
||||
|
||||
|
||||
before_filter :authorize_web
|
||||
before_filter :set_locale
|
||||
before_filter :require_user, :only => [:new, :create, :edit, :update, :destroy]
|
||||
|
@ -16,7 +16,7 @@ class RedactionsController < ApplicationController
|
|||
def new
|
||||
@redaction = Redaction.new
|
||||
end
|
||||
|
||||
|
||||
def create
|
||||
@redaction = Redaction.new
|
||||
@redaction.user = @user
|
||||
|
@ -31,13 +31,13 @@ class RedactionsController < ApplicationController
|
|||
render :action => 'new'
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def show
|
||||
end
|
||||
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
|
||||
def update
|
||||
# note - don't update the user ID
|
||||
@redaction.title = params[:redaction][:title]
|
||||
|
@ -50,7 +50,7 @@ class RedactionsController < ApplicationController
|
|||
render :action => 'edit'
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def destroy
|
||||
unless @redaction.old_nodes.empty? and
|
||||
@redaction.old_ways.empty? and
|
||||
|
|
|
@ -14,8 +14,8 @@ class RelationController < ApplicationController
|
|||
assert_method :put
|
||||
|
||||
relation = Relation.from_xml(request.raw_post, true)
|
||||
|
||||
# We assume that an exception has been thrown if there was an error
|
||||
|
||||
# We assume that an exception has been thrown if there was an error
|
||||
# generating the relation
|
||||
#if relation
|
||||
relation.create_with_history @user
|
||||
|
@ -40,7 +40,7 @@ class RelationController < ApplicationController
|
|||
|
||||
relation = Relation.find(params[:id])
|
||||
new_relation = Relation.from_xml(request.raw_post)
|
||||
|
||||
|
||||
if new_relation and new_relation.id == relation.id
|
||||
relation.update_from new_relation, @user
|
||||
render :text => relation.version.to_s, :content_type => "text/plain"
|
||||
|
@ -62,7 +62,7 @@ class RelationController < ApplicationController
|
|||
|
||||
# -----------------------------------------------------------------
|
||||
# full
|
||||
#
|
||||
#
|
||||
# input parameters: id
|
||||
#
|
||||
# returns XML representation of one relation object plus all its
|
||||
|
@ -70,37 +70,37 @@ class RelationController < ApplicationController
|
|||
# -----------------------------------------------------------------
|
||||
def full
|
||||
relation = Relation.find(params[:id])
|
||||
|
||||
|
||||
if relation.visible
|
||||
|
||||
|
||||
# first find the ids of nodes, ways and relations referenced by this
|
||||
# relation - note that we exclude this relation just in case.
|
||||
|
||||
|
||||
node_ids = relation.members.select { |m| m[0] == 'Node' }.map { |m| m[1] }
|
||||
way_ids = relation.members.select { |m| m[0] == 'Way' }.map { |m| m[1] }
|
||||
relation_ids = relation.members.select { |m| m[0] == 'Relation' and m[1] != relation.id }.map { |m| m[1] }
|
||||
|
||||
|
||||
# next load the relations and the ways.
|
||||
|
||||
|
||||
relations = Relation.where(:id => relation_ids).includes(:relation_tags)
|
||||
ways = Way.where(:id => way_ids).includes(:way_nodes, :way_tags)
|
||||
|
||||
# now additionally collect nodes referenced by ways. Note how we
|
||||
|
||||
# now additionally collect nodes referenced by ways. Note how we
|
||||
# recursively evaluate ways but NOT relations.
|
||||
|
||||
|
||||
way_node_ids = ways.collect { |way|
|
||||
way.way_nodes.collect { |way_node| way_node.node_id }
|
||||
}
|
||||
node_ids += way_node_ids.flatten
|
||||
nodes = Node.where(:id => node_ids.uniq).includes(:node_tags)
|
||||
|
||||
|
||||
# create XML.
|
||||
doc = OSM::API.new.get_xml_doc
|
||||
visible_nodes = {}
|
||||
visible_members = { "Node" => {}, "Way" => {}, "Relation" => {} }
|
||||
changeset_cache = {}
|
||||
user_display_name_cache = {}
|
||||
|
||||
|
||||
nodes.each do |node|
|
||||
if node.visible? # should be unnecessary if data is consistent.
|
||||
doc.root << node.to_xml_node(changeset_cache, user_display_name_cache)
|
||||
|
@ -123,7 +123,7 @@ class RelationController < ApplicationController
|
|||
# finally add self and output
|
||||
doc.root << relation.to_xml_node(visible_members, changeset_cache, user_display_name_cache)
|
||||
render :text => doc.to_s, :content_type => "text/xml"
|
||||
|
||||
|
||||
else
|
||||
render :text => "", :status => :gone
|
||||
end
|
||||
|
|
|
@ -10,23 +10,23 @@ class SwfController < ApplicationController
|
|||
|
||||
# ====================================================================
|
||||
# Public methods
|
||||
|
||||
|
||||
# ---- trackpoints compile SWF of trackpoints
|
||||
|
||||
def trackpoints
|
||||
|
||||
def trackpoints
|
||||
|
||||
# - Initialise
|
||||
|
||||
|
||||
baselong =params['baselong'].to_f
|
||||
basey =params['basey'].to_f
|
||||
masterscale =params['masterscale'].to_f
|
||||
|
||||
|
||||
bbox = BoundingBox.new(params['xmin'], params['ymin'],
|
||||
params['xmax'], params['ymax'])
|
||||
start=params['start'].to_i;
|
||||
|
||||
|
||||
# - Begin movie
|
||||
|
||||
|
||||
bounds_left =0
|
||||
bounds_right =320*20
|
||||
bounds_bottom=0
|
||||
|
@ -38,13 +38,13 @@ class SwfController < ApplicationController
|
|||
absy=0
|
||||
xl=yb= 9999999
|
||||
xr=yt=-9999999
|
||||
|
||||
|
||||
# - Send SQL for GPS tracks
|
||||
|
||||
|
||||
b=''
|
||||
lasttime=0
|
||||
lasttrack=lastfile='-1'
|
||||
|
||||
|
||||
if params['token']
|
||||
user=User.authenticate(:token => params[:token])
|
||||
sql="SELECT gps_points.latitude*0.0000001 AS lat,gps_points.longitude*0.0000001 AS lon,gpx_files.id AS fileid,"+
|
||||
|
@ -66,9 +66,9 @@ class SwfController < ApplicationController
|
|||
"LIMIT 10000 OFFSET #{start}"
|
||||
end
|
||||
gpslist=ActiveRecord::Base.connection.select_all sql
|
||||
|
||||
|
||||
# - Draw GPS trace lines
|
||||
|
||||
|
||||
r=startShape()
|
||||
gpslist.each do |row|
|
||||
xs=(long2coord(row['lon'].to_f,baselong,masterscale)*20).floor
|
||||
|
@ -88,24 +88,24 @@ class SwfController < ApplicationController
|
|||
r+=[b.slice!(0...80)].pack("B*")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# (Unwayed segments removed)
|
||||
|
||||
|
||||
# - Write shape
|
||||
|
||||
|
||||
b+=endShape()
|
||||
r+=[b].pack("B*")
|
||||
m+=swfRecord(2,packUI16(1) + packRect(xl,xr,yb,yt) + r)
|
||||
m+=swfRecord(4,packUI16(1) + packUI16(1))
|
||||
|
||||
|
||||
# - Create Flash header and write to browser
|
||||
|
||||
|
||||
m+=swfRecord(1,'') # Show frame
|
||||
m+=swfRecord(0,'') # End
|
||||
|
||||
|
||||
m=packRect(bounds_left,bounds_right,bounds_bottom,bounds_top) + 0.chr + 12.chr + packUI16(1) + m
|
||||
m='FWS' + 6.chr + packUI32(m.length+8) + m
|
||||
|
||||
|
||||
render :text => m, :content_type => "application/x-shockwave-flash"
|
||||
end
|
||||
|
||||
|
@ -113,7 +113,7 @@ class SwfController < ApplicationController
|
|||
|
||||
# =======================================================================
|
||||
# SWF functions
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# Line-drawing
|
||||
|
||||
|
@ -125,18 +125,18 @@ class SwfController < ApplicationController
|
|||
s+=34.chr # 2 fill, 2 line index bits
|
||||
s
|
||||
end
|
||||
|
||||
|
||||
def endShape
|
||||
'000000'
|
||||
end
|
||||
|
||||
|
||||
def startAndMove(x,y,col)
|
||||
d='001001' # Line style change, moveTo
|
||||
l =[lengthSB(x),lengthSB(y)].max
|
||||
d+=sprintf("%05b%0#{l}b%0#{l}b",l,x,y)
|
||||
d+=col # Select line style
|
||||
end
|
||||
|
||||
|
||||
def drawTo(absx,absy,x,y)
|
||||
dx=x-absx
|
||||
dy=y-absy
|
||||
|
@ -154,7 +154,7 @@ class SwfController < ApplicationController
|
|||
end
|
||||
d
|
||||
end
|
||||
|
||||
|
||||
def drawSection(x1,y1,x2,y2)
|
||||
d='11' # TypeFlag, EdgeFlag
|
||||
dx=x2-x1
|
||||
|
@ -195,33 +195,33 @@ class SwfController < ApplicationController
|
|||
|
||||
# -----------------------------------------------------------------------
|
||||
# Generic pack functions
|
||||
|
||||
|
||||
def packUI16(n)
|
||||
[n.floor].pack("v")
|
||||
end
|
||||
|
||||
|
||||
def packUI32(n)
|
||||
[n.floor].pack("V")
|
||||
end
|
||||
|
||||
|
||||
# Find number of bits required to store arbitrary-length binary
|
||||
|
||||
|
||||
def lengthSB(n)
|
||||
Math.frexp(n+ (n==0?1:0) )[1]+1
|
||||
end
|
||||
|
||||
|
||||
# ====================================================================
|
||||
# Co-ordinate conversion
|
||||
# (this is duplicated from amf_controller, should probably share)
|
||||
|
||||
|
||||
def lat2coord(a,basey,masterscale)
|
||||
-(lat2y(a)-basey)*masterscale
|
||||
end
|
||||
|
||||
|
||||
def long2coord(a,baselong,masterscale)
|
||||
(a-baselong)*masterscale
|
||||
end
|
||||
|
||||
|
||||
def lat2y(a)
|
||||
180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2))
|
||||
end
|
||||
|
|
|
@ -34,7 +34,7 @@ class UserBlocksController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
if @valid_params
|
||||
if @valid_params
|
||||
@user_block = UserBlock.new(
|
||||
:user_id => @this_user.id,
|
||||
:creator_id => @user.id,
|
||||
|
@ -42,7 +42,7 @@ class UserBlocksController < ApplicationController
|
|||
:ends_at => Time.now.getutc() + @block_period.hours,
|
||||
:needs_view => params[:user_block][:needs_view]
|
||||
)
|
||||
|
||||
|
||||
if @user_block.save
|
||||
flash[:notice] = t('user_block.create.flash', :name => @this_user.display_name)
|
||||
redirect_to @user_block
|
||||
|
@ -54,8 +54,8 @@ class UserBlocksController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def update
|
||||
if @valid_params
|
||||
def update
|
||||
if @valid_params
|
||||
if @user_block.creator_id != @user.id
|
||||
flash[:error] = t('user_block.update.only_creator_can_edit')
|
||||
redirect_to :action => "edit"
|
||||
|
@ -125,10 +125,10 @@ class UserBlocksController < ApplicationController
|
|||
|
||||
if !UserBlock::PERIODS.include?(@block_period)
|
||||
flash[:error] = t('user_block.filter.block_period')
|
||||
|
||||
|
||||
elsif @user_block and !@user_block.active?
|
||||
flash[:error] = t('user_block.filter.block_expired')
|
||||
|
||||
|
||||
else
|
||||
@valid_params = true
|
||||
end
|
||||
|
|
|
@ -70,7 +70,7 @@ class UserPreferenceController < ApplicationController
|
|||
def update_one
|
||||
begin
|
||||
pref = UserPreference.find([@user.id, params[:preference_key]])
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
pref = UserPreference.new
|
||||
pref.user = @user
|
||||
pref.k = params[:preference_key]
|
||||
|
|
|
@ -31,7 +31,7 @@ class UserRolesController < ApplicationController
|
|||
end
|
||||
|
||||
##
|
||||
# require that the given role is valid. the role is a URL
|
||||
# require that the given role is valid. the role is a URL
|
||||
# parameter, so should always be present.
|
||||
def require_valid_role
|
||||
@role = params[:role]
|
||||
|
|
|
@ -14,7 +14,7 @@ class WayController < ApplicationController
|
|||
assert_method :put
|
||||
|
||||
way = Way.from_xml(request.raw_post, true)
|
||||
|
||||
|
||||
if way
|
||||
way.create_with_history @user
|
||||
render :text => way.id.to_s, :content_type => "text/plain"
|
||||
|
@ -25,9 +25,9 @@ class WayController < ApplicationController
|
|||
|
||||
def read
|
||||
way = Way.find(params[:id])
|
||||
|
||||
|
||||
response.last_modified = way.timestamp
|
||||
|
||||
|
||||
if way.visible
|
||||
render :text => way.to_xml.to_s, :content_type => "text/xml"
|
||||
else
|
||||
|
@ -38,7 +38,7 @@ class WayController < ApplicationController
|
|||
def update
|
||||
way = Way.find(params[:id])
|
||||
new_way = Way.from_xml(request.raw_post)
|
||||
|
||||
|
||||
if new_way and new_way.id == way.id
|
||||
way.update_from(new_way, @user)
|
||||
render :text => way.version.to_s, :content_type => "text/plain"
|
||||
|
@ -51,7 +51,7 @@ class WayController < ApplicationController
|
|||
def delete
|
||||
way = Way.find(params[:id])
|
||||
new_way = Way.from_xml(request.raw_post)
|
||||
|
||||
|
||||
if new_way and new_way.id == way.id
|
||||
way.delete_with_history!(new_way, @user)
|
||||
render :text => way.version.to_s, :content_type => "text/plain"
|
||||
|
@ -62,7 +62,7 @@ class WayController < ApplicationController
|
|||
|
||||
def full
|
||||
way = Way.includes(:nodes => :node_tags).find(params[:id])
|
||||
|
||||
|
||||
if way.visible
|
||||
visible_nodes = {}
|
||||
changeset_cache = {}
|
||||
|
@ -76,7 +76,7 @@ class WayController < ApplicationController
|
|||
end
|
||||
end
|
||||
doc.root << way.to_xml_node(visible_nodes, changeset_cache, user_display_name_cache)
|
||||
|
||||
|
||||
render :text => doc.to_s, :content_type => "text/xml"
|
||||
else
|
||||
render :text => "", :status => :gone
|
||||
|
@ -104,7 +104,7 @@ class WayController < ApplicationController
|
|||
end
|
||||
|
||||
##
|
||||
# returns all the ways which are currently using the node given in the
|
||||
# returns all the ways which are currently using the node given in the
|
||||
# :id parameter. note that this used to return deleted ways as well, but
|
||||
# this seemed not to be the expected behaviour, so it was removed.
|
||||
def ways_for_node
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
module UserBlocksHelper
|
||||
##
|
||||
# returns a translated string representing the status of the
|
||||
# returns a translated string representing the status of the
|
||||
# user block (i.e: whether it's active, what the expiry time is)
|
||||
def block_status(block)
|
||||
if block.active?
|
||||
|
@ -11,7 +11,7 @@ module UserBlocksHelper
|
|||
end
|
||||
else
|
||||
# the max of the last update time or the ends_at time is when this block finished
|
||||
# either because the user viewed the block (updated_at) or it expired or was
|
||||
# either because the user viewed the block (updated_at) or it expired or was
|
||||
# revoked (ends_at)
|
||||
last_time = [block.ends_at, block.updated_at].max
|
||||
I18n.t('user_block.helper.time_past', :time => distance_of_time_in_words_to_now(last_time))
|
||||
|
|
|
@ -18,7 +18,7 @@ module UserRolesHelper
|
|||
url = grant_role_path(:display_name => user.display_name, :role => role)
|
||||
confirm = t("user_role.grant.are_you_sure", :name => user.display_name, :role => role)
|
||||
end
|
||||
elsif user.has_role?(role)
|
||||
elsif user.has_role?(role)
|
||||
image = "roles/#{role}.png"
|
||||
alt = t("user.view.role.#{role}")
|
||||
title = t("user.view.role.#{role}")
|
||||
|
|
|
@ -7,9 +7,9 @@ class AccessToken < OauthToken
|
|||
validates_presence_of :user, :secret
|
||||
|
||||
before_create :set_authorized_at
|
||||
|
||||
protected
|
||||
|
||||
|
||||
protected
|
||||
|
||||
def set_authorized_at
|
||||
self.authorized_at = Time.now
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@ class Changeset < ActiveRecord::Base
|
|||
has_many :old_nodes
|
||||
has_many :old_ways
|
||||
has_many :old_relations
|
||||
|
||||
|
||||
has_many :comments, -> { where(:visible => true).order(:created_at) }, :class_name => "ChangesetComment"
|
||||
has_and_belongs_to_many :subscribers, :class_name => 'User', :join_table => 'changesets_subscribers', :association_foreign_key => 'subscriber_id'
|
||||
|
||||
|
@ -107,7 +107,7 @@ class Changeset < ActiveRecord::Base
|
|||
# suggested on the wiki page by kleptog.
|
||||
def update_bbox!(bbox_update)
|
||||
bbox.expand!(bbox_update, EXPAND)
|
||||
|
||||
|
||||
# update active record. rails 2.1's dirty handling should take care of
|
||||
# whether this object needs saving or not.
|
||||
self.min_lon, self.min_lat, self.max_lon, self.max_lat = @bbox.to_a if bbox.complete?
|
||||
|
|
|
@ -9,7 +9,7 @@ class ChangesetComment < ActiveRecord::Base
|
|||
validates_presence_of :author
|
||||
validates_associated :author
|
||||
validates :visible, :inclusion => { :in => [true,false] }
|
||||
|
||||
|
||||
# Return the comment text
|
||||
def body
|
||||
RichText.new("text", read_attribute(:body))
|
||||
|
|
|
@ -16,7 +16,7 @@ class ClientApplication < ActiveRecord::Base
|
|||
before_validation :generate_keys, :on => :create
|
||||
|
||||
attr_accessor :token_callback_url
|
||||
|
||||
|
||||
def self.find_token(token_key)
|
||||
token = OauthToken.find_by_token(token_key, :include => :client_application)
|
||||
if token && token.authorized?
|
||||
|
@ -36,7 +36,7 @@ class ClientApplication < ActiveRecord::Base
|
|||
false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def self.all_permissions
|
||||
PERMISSIONS
|
||||
end
|
||||
|
@ -44,11 +44,11 @@ class ClientApplication < ActiveRecord::Base
|
|||
def oauth_server
|
||||
@oauth_server ||= OAuth::Server.new("http://" + SERVER_URL)
|
||||
end
|
||||
|
||||
|
||||
def credentials
|
||||
@oauth_client ||= OAuth::Consumer.new(key, secret)
|
||||
end
|
||||
|
||||
|
||||
def create_request_token(params={})
|
||||
params = { :client_application => self, :callback_url => self.token_callback_url }
|
||||
permissions.each do |p|
|
||||
|
@ -67,7 +67,7 @@ class ClientApplication < ActiveRecord::Base
|
|||
|
||||
token = access_tokens.create(params)
|
||||
end
|
||||
|
||||
|
||||
token
|
||||
end
|
||||
|
||||
|
@ -77,7 +77,7 @@ class ClientApplication < ActiveRecord::Base
|
|||
end
|
||||
|
||||
protected
|
||||
|
||||
|
||||
# this is the set of permissions that the client can ask for. clients
|
||||
# have to say up-front what permissions they want and when users sign up they
|
||||
# can agree or not agree to each of them.
|
||||
|
|
|
@ -23,5 +23,5 @@ class Language < ActiveRecord::Base
|
|||
name = english_name
|
||||
name += " (#{native_name})" unless native_name.nil?
|
||||
name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -16,7 +16,7 @@ class Node < ActiveRecord::Base
|
|||
has_many :ways, :through => :way_nodes
|
||||
|
||||
has_many :node_tags
|
||||
|
||||
|
||||
has_many :old_way_nodes
|
||||
has_many :ways_via_history, :class_name=> "Way", :through => :old_way_nodes, :source => :way
|
||||
|
||||
|
@ -57,7 +57,7 @@ class Node < ActiveRecord::Base
|
|||
|
||||
def self.from_xml_node(pt, create=false)
|
||||
node = Node.new
|
||||
|
||||
|
||||
raise OSM::APIBadXMLError.new("node", pt, "lat missing") if pt['lat'].nil?
|
||||
raise OSM::APIBadXMLError.new("node", pt, "lon missing") if pt['lon'].nil?
|
||||
node.lat = OSM.parse_float(pt['lat'], OSM::APIBadXMLError, "node", pt, "lat not a number")
|
||||
|
@ -74,7 +74,7 @@ class Node < ActiveRecord::Base
|
|||
unless create
|
||||
raise OSM::APIBadXMLError.new("node", pt, "ID is required when updating.") if pt['id'].nil?
|
||||
node.id = pt['id'].to_i
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# We want to make sure that there is no id with zero anyway
|
||||
raise OSM::APIBadUserInput.new("ID of node cannot be zero when updating.") if node.id == 0
|
||||
end
|
||||
|
@ -110,7 +110,7 @@ class Node < ActiveRecord::Base
|
|||
raise OSM::APIAlreadyDeletedError.new("node", new_node.id)
|
||||
end
|
||||
|
||||
# need to start the transaction here, so that the database can
|
||||
# need to start the transaction here, so that the database can
|
||||
# provide repeatable reads for the used-by checks. this means it
|
||||
# shouldn't be possible to get race conditions.
|
||||
Node.transaction do
|
||||
|
@ -118,17 +118,17 @@ class Node < ActiveRecord::Base
|
|||
check_consistency(self, new_node, user)
|
||||
ways = Way.joins(:way_nodes).where(:visible => true, :current_way_nodes => { :node_id => id }).order(:id)
|
||||
raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by ways #{ways.collect { |w| w.id }.join(",")}.") unless ways.empty?
|
||||
|
||||
|
||||
rels = Relation.joins(:relation_members).where(:visible => true, :current_relation_members => { :member_type => "Node", :member_id => id }).order(:id)
|
||||
raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by relations #{rels.collect { |r| r.id }.join(",")}.") unless rels.empty?
|
||||
|
||||
self.changeset_id = new_node.changeset_id
|
||||
self.tags = {}
|
||||
self.visible = false
|
||||
|
||||
|
||||
# update the changeset with the deleted position
|
||||
changeset.update_bbox!(bbox)
|
||||
|
||||
|
||||
save_with_history!
|
||||
end
|
||||
end
|
||||
|
@ -137,27 +137,27 @@ class Node < ActiveRecord::Base
|
|||
Node.transaction do
|
||||
self.lock!
|
||||
check_consistency(self, new_node, user)
|
||||
|
||||
|
||||
# update changeset first
|
||||
self.changeset_id = new_node.changeset_id
|
||||
self.changeset = new_node.changeset
|
||||
|
||||
|
||||
# update changeset bbox with *old* position first
|
||||
changeset.update_bbox!(bbox);
|
||||
|
||||
|
||||
# FIXME logic needs to be double checked
|
||||
self.latitude = new_node.latitude
|
||||
self.latitude = new_node.latitude
|
||||
self.longitude = new_node.longitude
|
||||
self.tags = new_node.tags
|
||||
self.visible = true
|
||||
|
||||
|
||||
# update changeset bbox with *new* position
|
||||
changeset.update_bbox!(bbox);
|
||||
|
||||
|
||||
save_with_history!
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def create_with_history(user)
|
||||
check_create_consistency(self, user)
|
||||
self.version = 0
|
||||
|
@ -200,8 +200,8 @@ class Node < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def tags=(t)
|
||||
@tags = t
|
||||
end
|
||||
@tags = t
|
||||
end
|
||||
|
||||
def add_tag_key_val(k,v)
|
||||
@tags = Hash.new unless @tags
|
||||
|
@ -226,7 +226,7 @@ class Node < ActiveRecord::Base
|
|||
def fix_placeholders!(id_map, placeholder_id = nil)
|
||||
# nodes don't refer to anything, so there is nothing to do here
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def save_with_history!
|
||||
|
@ -242,10 +242,10 @@ class Node < ActiveRecord::Base
|
|||
tags.each do |k,v|
|
||||
tag = NodeTag.new
|
||||
tag.node_id = self.id
|
||||
tag.k = k
|
||||
tag.v = v
|
||||
tag.k = k
|
||||
tag.v = v
|
||||
tag.save!
|
||||
end
|
||||
end
|
||||
|
||||
# Create an OldNode
|
||||
old_node = OldNode.from_node(self)
|
||||
|
@ -259,5 +259,5 @@ class Node < ActiveRecord::Base
|
|||
changeset.save!
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
|
|
@ -3,7 +3,7 @@ class NodeTag < ActiveRecord::Base
|
|||
self.primary_keys = "node_id", "k"
|
||||
|
||||
belongs_to :node
|
||||
|
||||
|
||||
validates_presence_of :node
|
||||
validates_length_of :k, :maximum => 255, :allow_blank => true
|
||||
validates_uniqueness_of :k, :scope => :node_id
|
||||
|
|
|
@ -8,25 +8,25 @@ class OauthToken < ActiveRecord::Base
|
|||
validates_presence_of :client_application, :token
|
||||
|
||||
before_validation :generate_keys, :on => :create
|
||||
|
||||
|
||||
def invalidated?
|
||||
invalidated_at != nil
|
||||
end
|
||||
|
||||
|
||||
def invalidate!
|
||||
update_attributes(:invalidated_at => Time.now)
|
||||
end
|
||||
|
||||
|
||||
def authorized?
|
||||
authorized_at != nil && !invalidated?
|
||||
end
|
||||
|
||||
|
||||
def to_query
|
||||
"oauth_token=#{token}&oauth_token_secret=#{secret}"
|
||||
end
|
||||
|
||||
|
||||
protected
|
||||
|
||||
|
||||
def generate_keys
|
||||
self.token = OAuth::Helper.generate_key(40)[0,40]
|
||||
self.secret = OAuth::Helper.generate_key(40)[0,40]
|
||||
|
|
|
@ -38,7 +38,7 @@ class OldNode < ActiveRecord::Base
|
|||
old_node.version = node.version
|
||||
return old_node
|
||||
end
|
||||
|
||||
|
||||
def to_xml
|
||||
doc = OSM::API.new.get_xml_doc
|
||||
doc.root << to_xml_node()
|
||||
|
@ -63,7 +63,7 @@ class OldNode < ActiveRecord::Base
|
|||
|
||||
def save_with_dependencies!
|
||||
save!
|
||||
|
||||
|
||||
self.tags.each do |k,v|
|
||||
tag = OldNodeTag.new
|
||||
tag.k = k
|
||||
|
@ -79,22 +79,22 @@ class OldNode < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def tags=(t)
|
||||
@tags = t
|
||||
@tags = t
|
||||
end
|
||||
|
||||
def tags_as_hash
|
||||
def tags_as_hash
|
||||
return self.tags
|
||||
end
|
||||
|
||||
# Pretend we're not in any ways
|
||||
def ways
|
||||
return []
|
||||
end
|
||||
|
||||
# Pretend we're not in any relations
|
||||
def containing_relation_members
|
||||
return []
|
||||
end
|
||||
end
|
||||
|
||||
# Pretend we're not in any ways
|
||||
def ways
|
||||
return []
|
||||
end
|
||||
|
||||
# Pretend we're not in any relations
|
||||
def containing_relation_members
|
||||
return []
|
||||
end
|
||||
|
||||
# check whether this element is the latest version - that is,
|
||||
# has the same version as its "current" counterpart.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class OldRelation < ActiveRecord::Base
|
||||
include ConsistencyValidations
|
||||
include ObjectMetadata
|
||||
|
||||
|
||||
self.table_name = "relations"
|
||||
self.primary_keys = "relation_id", "version"
|
||||
|
||||
|
@ -15,7 +15,7 @@ class OldRelation < ActiveRecord::Base
|
|||
|
||||
has_many :old_members, -> { order(:sequence_id) }, :class_name => 'OldRelationMember', :foreign_key => [:relation_id, :version]
|
||||
has_many :old_tags, :class_name => 'OldRelationTag', :foreign_key => [:relation_id, :version]
|
||||
|
||||
|
||||
validates_associated :changeset
|
||||
|
||||
def self.from_relation(relation)
|
||||
|
@ -89,7 +89,7 @@ class OldRelation < ActiveRecord::Base
|
|||
member_el['role'] = member.member_role.to_s
|
||||
el << member_el
|
||||
end
|
||||
|
||||
|
||||
add_tags_to_xml_node(el, self.old_tags)
|
||||
|
||||
return el
|
||||
|
|
|
@ -3,7 +3,7 @@ class OldRelationTag < ActiveRecord::Base
|
|||
self.primary_keys = "relation_id", "version", "k"
|
||||
|
||||
belongs_to :old_relation, :foreign_key => [:relation_id, :version]
|
||||
|
||||
|
||||
validates_presence_of :old_relation
|
||||
validates_length_of :k, :maximum => 255, :allow_blank => true
|
||||
validates_uniqueness_of :k, :scope => [:relation_id, :version]
|
||||
|
|
|
@ -17,7 +17,7 @@ class OldWay < ActiveRecord::Base
|
|||
has_many :old_tags, :class_name => 'OldWayTag', :foreign_key => [:way_id, :version]
|
||||
|
||||
validates_associated :changeset
|
||||
|
||||
|
||||
def self.from_way(way)
|
||||
old_way = OldWay.new
|
||||
old_way.visible = way.visible
|
||||
|
@ -79,7 +79,7 @@ class OldWay < ActiveRecord::Base
|
|||
node_el['ref'] = nd.node_id.to_s
|
||||
el << node_el
|
||||
end
|
||||
|
||||
|
||||
add_tags_to_xml_node(el, self.old_tags)
|
||||
|
||||
return el
|
||||
|
@ -87,7 +87,7 @@ class OldWay < ActiveRecord::Base
|
|||
|
||||
# Read full version of old way
|
||||
# For get_nodes_undelete, uses same nodes, even if they've moved since
|
||||
# For get_nodes_revert, allocates new ids
|
||||
# For get_nodes_revert, allocates new ids
|
||||
# Currently returns Potlatch-style array
|
||||
# where [5] indicates whether latest version is usable as is (boolean)
|
||||
# (i.e. is it visible? are we actually reverting to an earlier version?)
|
||||
|
@ -98,7 +98,7 @@ class OldWay < ActiveRecord::Base
|
|||
[node.lon, node.lat, n, node.version, node.tags_as_hash, node.visible]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def get_nodes_revert(timestamp)
|
||||
points=[]
|
||||
self.nds.each do |n|
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
##
|
||||
# Redaction represents a record associated with a particular
|
||||
# action on the database to hide revisions from the history
|
||||
# which are not appropriate to redistribute any more.
|
||||
# which are not appropriate to redistribute any more.
|
||||
#
|
||||
# The circumstances of the redaction can be recorded in the
|
||||
# record's title and description fields, which can be
|
||||
# record's title and description fields, which can be
|
||||
# displayed linked from the redacted records.
|
||||
#
|
||||
class Redaction < ActiveRecord::Base
|
||||
|
@ -14,7 +14,7 @@ class Redaction < ActiveRecord::Base
|
|||
has_many :old_ways
|
||||
has_many :old_relations
|
||||
|
||||
# this method overrides the AR default to provide the rich
|
||||
# this method overrides the AR default to provide the rich
|
||||
# text object for the description field.
|
||||
def description
|
||||
RichText.new(read_attribute(:description_format), read_attribute(:description))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
class Relation < ActiveRecord::Base
|
||||
require 'xml/libxml'
|
||||
|
||||
|
||||
include ConsistencyValidations
|
||||
include NotRedactable
|
||||
include ObjectMetadata
|
||||
|
@ -18,13 +18,13 @@ class Relation < ActiveRecord::Base
|
|||
has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation
|
||||
|
||||
validates_presence_of :id, :on => :update
|
||||
validates_presence_of :timestamp,:version, :changeset_id
|
||||
validates_presence_of :timestamp,:version, :changeset_id
|
||||
validates_uniqueness_of :id
|
||||
validates_inclusion_of :visible, :in => [ true, false ]
|
||||
validates_numericality_of :id, :on => :update, :integer_only => true
|
||||
validates_numericality_of :changeset_id, :version, :integer_only => true
|
||||
validates_associated :changeset
|
||||
|
||||
|
||||
scope :visible, -> { where(:visible => true) }
|
||||
scope :invisible, -> { where(:visible => false) }
|
||||
scope :nodes, ->(*ids) { joins(:relation_members).where(:current_relation_members => { :member_type => "Node", :member_id => ids.flatten }) }
|
||||
|
@ -54,17 +54,17 @@ class Relation < ActiveRecord::Base
|
|||
relation.version = pt['version']
|
||||
raise OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt['changeset'].nil?
|
||||
relation.changeset_id = pt['changeset']
|
||||
|
||||
|
||||
unless create
|
||||
raise OSM::APIBadXMLError.new("relation", pt, "ID is required when updating") if pt['id'].nil?
|
||||
relation.id = pt['id'].to_i
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# We want to make sure that there is no id with zero anyway
|
||||
raise OSM::APIBadUserInput.new("ID of relation cannot be zero when updating.") if relation.id == 0
|
||||
end
|
||||
|
||||
|
||||
# We don't care about the timestamp nor the visibility as these are either
|
||||
# set explicitly or implicit in the action. The visibility is set to true,
|
||||
# set explicitly or implicit in the action. The visibility is set to true,
|
||||
# and manually set to false before the actual delete.
|
||||
relation.visible = true
|
||||
|
||||
|
@ -79,13 +79,13 @@ class Relation < ActiveRecord::Base
|
|||
end
|
||||
|
||||
# need to initialise the relation members array explicitly, as if this
|
||||
# isn't done for a new relation then @members attribute will be nil,
|
||||
# and the members will be loaded from the database instead of being
|
||||
# isn't done for a new relation then @members attribute will be nil,
|
||||
# and the members will be loaded from the database instead of being
|
||||
# empty, as intended.
|
||||
relation.members = Array.new
|
||||
|
||||
pt.find('member').each do |member|
|
||||
#member_type =
|
||||
#member_type =
|
||||
logger.debug "each member"
|
||||
raise OSM::APIBadXMLError.new("relation", pt, "The #{member['type']} is not allowed only, #{TYPES.inspect} allowed") unless TYPES.include? member['type']
|
||||
logger.debug "after raise"
|
||||
|
@ -128,7 +128,7 @@ class Relation < ActiveRecord::Base
|
|||
if p
|
||||
member_el = XML::Node.new 'member'
|
||||
member_el['type'] = member.member_type.downcase
|
||||
member_el['ref'] = member.member_id.to_s
|
||||
member_el['ref'] = member.member_id.to_s
|
||||
member_el['role'] = member.member_role
|
||||
el << member_el
|
||||
end
|
||||
|
@ -137,7 +137,7 @@ class Relation < ActiveRecord::Base
|
|||
add_tags_to_xml_node(el, self.relation_tags)
|
||||
|
||||
return el
|
||||
end
|
||||
end
|
||||
|
||||
# FIXME is this really needed?
|
||||
def members
|
||||
|
@ -174,21 +174,21 @@ class Relation < ActiveRecord::Base
|
|||
end
|
||||
|
||||
##
|
||||
# updates the changeset bounding box to contain the bounding box of
|
||||
# updates the changeset bounding box to contain the bounding box of
|
||||
# the element with given +type+ and +id+. this only works with nodes
|
||||
# and ways at the moment, as they're the only elements to respond to
|
||||
# the :bbox call.
|
||||
def update_changeset_element(type, id)
|
||||
element = Kernel.const_get(type.capitalize).find(id)
|
||||
changeset.update_bbox! element.bbox
|
||||
end
|
||||
end
|
||||
|
||||
def delete_with_history!(new_relation, user)
|
||||
unless self.visible
|
||||
raise OSM::APIAlreadyDeletedError.new("relation", new_relation.id)
|
||||
end
|
||||
|
||||
# need to start the transaction here, so that the database can
|
||||
# need to start the transaction here, so that the database can
|
||||
# provide repeatable reads for the used-by checks. this means it
|
||||
# shouldn't be possible to get race conditions.
|
||||
Relation.transaction do
|
||||
|
@ -221,7 +221,7 @@ class Relation < ActiveRecord::Base
|
|||
save_with_history!
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def create_with_history(user)
|
||||
check_create_consistency(self, user)
|
||||
unless self.preconditions_ok?
|
||||
|
@ -233,9 +233,9 @@ class Relation < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def preconditions_ok?(good_members = [])
|
||||
# These are hastables that store an id in the index of all
|
||||
# These are hastables that store an id in the index of all
|
||||
# the nodes/way/relations that have already been added.
|
||||
# If the member is valid and visible then we add it to the
|
||||
# If the member is valid and visible then we add it to the
|
||||
# relevant hash table, with the value true as a cache.
|
||||
# Thus if you have nodes with the ids of 50 and 1 already in the
|
||||
# relation, then the hash table nodes would contain:
|
||||
|
@ -273,8 +273,8 @@ class Relation < ActiveRecord::Base
|
|||
|
||||
##
|
||||
# if any members are referenced by placeholder IDs (i.e: negative) then
|
||||
# this calling this method will fix them using the map from placeholders
|
||||
# to IDs +id_map+.
|
||||
# this calling this method will fix them using the map from placeholders
|
||||
# to IDs +id_map+.
|
||||
def fix_placeholders!(id_map, placeholder_id = nil)
|
||||
self.members.map! do |type, id, role|
|
||||
old_id = id.to_i
|
||||
|
@ -289,7 +289,7 @@ class Relation < ActiveRecord::Base
|
|||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def save_with_history!
|
||||
Relation.transaction do
|
||||
# have to be a little bit clever here - to detect if any tags
|
||||
|
@ -306,9 +306,9 @@ class Relation < ActiveRecord::Base
|
|||
key = old_tag.k
|
||||
# if we can match the tags we currently have to the list
|
||||
# of old tags, then we never set the tags_changed flag. but
|
||||
# if any are different then set the flag and do the DB
|
||||
# if any are different then set the flag and do the DB
|
||||
# update.
|
||||
if tags.has_key? key
|
||||
if tags.has_key? key
|
||||
tags_changed |= (old_tag.v != tags[key])
|
||||
|
||||
# remove from the map, so that we can expect an empty map
|
||||
|
@ -331,7 +331,7 @@ class Relation < ActiveRecord::Base
|
|||
tag.v = v
|
||||
tag.save!
|
||||
end
|
||||
|
||||
|
||||
# same pattern as before, but this time we're collecting the
|
||||
# changed members in an array, as the bounding box updates for
|
||||
# elements are per-element, not blanked on/off like for tags.
|
||||
|
@ -378,7 +378,7 @@ class Relation < ActiveRecord::Base
|
|||
# bounding box. this is similar to how the map call does things and is
|
||||
# reasonable on the assumption that adding or removing members doesn't
|
||||
# materially change the rest of the relation.
|
||||
any_relations =
|
||||
any_relations =
|
||||
changed_members.collect { |id,type| type == "relation" }.
|
||||
inject(false) { |b,s| b or s }
|
||||
|
||||
|
@ -387,7 +387,7 @@ class Relation < ActiveRecord::Base
|
|||
# FIXME: check for tag changes along with element deletions and
|
||||
# make sure that the deleted element's bounding box is hit.
|
||||
self.members
|
||||
else
|
||||
else
|
||||
changed_members
|
||||
end
|
||||
update_members.each do |type, id, role|
|
||||
|
|
|
@ -63,7 +63,7 @@ class Trace < ActiveRecord::Base
|
|||
f.syswrite(data)
|
||||
f.close
|
||||
end
|
||||
|
||||
|
||||
def icon_picture= (data)
|
||||
f = File.new(icon_picture_name, "wb")
|
||||
f.syswrite(data)
|
||||
|
@ -78,7 +78,7 @@ class Trace < ActiveRecord::Base
|
|||
f.close
|
||||
data
|
||||
end
|
||||
|
||||
|
||||
def icon_picture
|
||||
f = File.new(icon_picture_name, "rb")
|
||||
logger.info "icon picture file: '#{f.path}'"
|
||||
|
@ -86,7 +86,7 @@ class Trace < ActiveRecord::Base
|
|||
f.close
|
||||
data
|
||||
end
|
||||
|
||||
|
||||
def large_picture_name
|
||||
"#{GPX_IMAGE_DIR}/#{id}.gif"
|
||||
end
|
||||
|
@ -192,14 +192,14 @@ class Trace < ActiveRecord::Base
|
|||
|
||||
def self.from_xml_node(pt, create=false)
|
||||
trace = Trace.new
|
||||
|
||||
|
||||
raise OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt['visibility'].nil?
|
||||
trace.visibility = pt['visibility']
|
||||
|
||||
unless create
|
||||
raise OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt['id'].nil?
|
||||
trace.id = pt['id'].to_i
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# We want to make sure that there is no id with zero anyway
|
||||
raise OSM::APIBadUserInput.new("ID of trace cannot be zero when updating.") if trace.id == 0
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@ class UserPreference < ActiveRecord::Base
|
|||
self.primary_keys = "user_id", "k"
|
||||
|
||||
belongs_to :user
|
||||
|
||||
|
||||
validates_length_of :k, :within => 1..255
|
||||
validates_length_of :v, :within => 1..255
|
||||
|
||||
|
@ -11,7 +11,7 @@ class UserPreference < ActiveRecord::Base
|
|||
el1 = XML::Node.new 'preference'
|
||||
el1['k'] = self.k
|
||||
el1['v'] = self.v
|
||||
|
||||
|
||||
return el1
|
||||
end
|
||||
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
class Way < ActiveRecord::Base
|
||||
require 'xml/libxml'
|
||||
|
||||
|
||||
include ConsistencyValidations
|
||||
include NotRedactable
|
||||
include ObjectMetadata
|
||||
|
||||
self.table_name = "current_ways"
|
||||
|
||||
|
||||
belongs_to :changeset
|
||||
|
||||
has_many :old_ways, -> { order(:version) }
|
||||
|
@ -56,13 +56,13 @@ class Way < ActiveRecord::Base
|
|||
unless create
|
||||
raise OSM::APIBadXMLError.new("way", pt, "ID is required when updating") if pt['id'].nil?
|
||||
way.id = pt['id'].to_i
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# .to_i will return 0 if there is no number that can be parsed.
|
||||
# We want to make sure that there is no id with zero anyway
|
||||
raise OSM::APIBadUserInput.new("ID of way cannot be zero when updating.") if way.id == 0
|
||||
end
|
||||
|
||||
# We don't care about the timestamp nor the visibility as these are either
|
||||
# set explicitly or implicit in the action. The visibility is set to true,
|
||||
# set explicitly or implicit in the action. The visibility is set to true,
|
||||
# and manually set to false before the actual delete.
|
||||
way.visible = true
|
||||
|
||||
|
@ -85,7 +85,7 @@ class Way < ActiveRecord::Base
|
|||
|
||||
# Find a way given it's ID, and in a single SQL call also grab its nodes
|
||||
#
|
||||
|
||||
|
||||
# You can't pull in all the tags too unless we put a sequence_id on the way_tags table and have a multipart key
|
||||
def self.find_eager(id)
|
||||
way = Way.find(id, :include => {:way_nodes => :node})
|
||||
|
@ -133,7 +133,7 @@ class Way < ActiveRecord::Base
|
|||
add_tags_to_xml_node(el, self.way_tags)
|
||||
|
||||
return el
|
||||
end
|
||||
end
|
||||
|
||||
def nds
|
||||
@nds ||= self.way_nodes.collect { |n| n.node_id }
|
||||
|
@ -182,7 +182,7 @@ class Way < ActiveRecord::Base
|
|||
unless new_way.preconditions_ok?(self.nds)
|
||||
raise OSM::APIPreconditionFailedError.new("Cannot update way #{self.id}: data is invalid.")
|
||||
end
|
||||
|
||||
|
||||
self.changeset_id = new_way.changeset_id
|
||||
self.changeset = new_way.changeset
|
||||
self.tags = new_way.tags
|
||||
|
@ -228,8 +228,8 @@ class Way < ActiveRecord::Base
|
|||
unless self.visible
|
||||
raise OSM::APIAlreadyDeletedError.new("way", new_way.id)
|
||||
end
|
||||
|
||||
# need to start the transaction here, so that the database can
|
||||
|
||||
# need to start the transaction here, so that the database can
|
||||
# provide repeatable reads for the used-by checks. this means it
|
||||
# shouldn't be possible to get race conditions.
|
||||
Way.transaction do
|
||||
|
@ -255,8 +255,8 @@ class Way < ActiveRecord::Base
|
|||
|
||||
##
|
||||
# if any referenced nodes are placeholder IDs (i.e: are negative) then
|
||||
# this calling this method will fix them using the map from placeholders
|
||||
# to IDs +id_map+.
|
||||
# this calling this method will fix them using the map from placeholders
|
||||
# to IDs +id_map+.
|
||||
def fix_placeholders!(id_map, placeholder_id = nil)
|
||||
self.nds.map! do |node_id|
|
||||
if node_id < 0
|
||||
|
@ -270,12 +270,12 @@ class Way < ActiveRecord::Base
|
|||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def save_with_history!
|
||||
t = Time.now.getutc
|
||||
|
||||
# update the bounding box, note that this has to be done both before
|
||||
# and after the save, so that nodes from both versions are included in the
|
||||
# update the bounding box, note that this has to be done both before
|
||||
# and after the save, so that nodes from both versions are included in the
|
||||
# bbox. we use a copy of the changeset so that it isn't reloaded
|
||||
# later in the save.
|
||||
cs = self.changeset
|
||||
|
@ -315,7 +315,7 @@ class Way < ActiveRecord::Base
|
|||
# new set of nodes.
|
||||
self.reload
|
||||
|
||||
# update and commit the bounding box, now that way nodes
|
||||
# update and commit the bounding box, now that way nodes
|
||||
# have been updated and we're in a transaction.
|
||||
cs.update_bbox!(bbox) unless nodes.empty?
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ class WayTag < ActiveRecord::Base
|
|||
self.primary_keys = "way_id", "k"
|
||||
|
||||
belongs_to :way
|
||||
|
||||
|
||||
validates_presence_of :way
|
||||
validates_length_of :k, :maximum => 255, :allow_blank => true
|
||||
validates_uniqueness_of :k, :scope => :way_id
|
||||
|
|
|
@ -4,7 +4,7 @@ if defined?(ActiveRecord::ConnectionAdaptors::AbstractAdapter)
|
|||
class AbstractAdapter
|
||||
protected
|
||||
alias_method :old_log, :log
|
||||
|
||||
|
||||
def log(sql, name)
|
||||
if block_given?
|
||||
old_log(sql, name) do
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Configure ActionMailer SMTP settings
|
||||
ActionMailer::Base.smtp_settings = {
|
||||
:address => 'localhost',
|
||||
:port => 25,
|
||||
:port => 25,
|
||||
:domain => 'localhost',
|
||||
:enable_starttls_auto => false
|
||||
}
|
||||
|
|
|
@ -11,16 +11,16 @@ if defined?(SOFT_MEMORY_LIMIT) and defined?(PhusionPassenger)
|
|||
def initialize(app)
|
||||
@app = app
|
||||
end
|
||||
|
||||
|
||||
def call(env)
|
||||
# Process this requst
|
||||
status, headers, body = @app.call(env)
|
||||
|
||||
|
||||
# Restart if we've hit our memory limit
|
||||
if resident_size > SOFT_MEMORY_LIMIT
|
||||
Process.kill("USR1", Process.pid)
|
||||
end
|
||||
|
||||
|
||||
# Return the result of this request
|
||||
[status, headers, body]
|
||||
end
|
||||
|
@ -31,7 +31,7 @@ if defined?(SOFT_MEMORY_LIMIT) and defined?(PhusionPassenger)
|
|||
fields = File.open("/proc/self/statm") do |file|
|
||||
fields = file.gets.split(" ")
|
||||
end
|
||||
|
||||
|
||||
# Return resident size in megabytes
|
||||
return fields[1].to_i / 256
|
||||
end
|
||||
|
|
|
@ -12,7 +12,7 @@ class R2Template < Tilt::Template
|
|||
def prepare
|
||||
@output = R2.r2(data)
|
||||
end
|
||||
|
||||
|
||||
def evaluate(scope, locals, &block)
|
||||
@output
|
||||
end
|
||||
|
|
|
@ -78,7 +78,7 @@ OpenStreetMap::Application.routes.draw do
|
|||
match 'api/0.6/gpx/:id' => 'trace#api_delete', :via => :delete, :id => /\d+/
|
||||
match 'api/0.6/gpx/:id/details' => 'trace#api_read', :via => :get, :id => /\d+/
|
||||
match 'api/0.6/gpx/:id/data' => 'trace#api_data', :via => :get
|
||||
|
||||
|
||||
# AMF (ActionScript) API
|
||||
match 'api/0.6/amf/read' => 'amf#amf_read', :via => :post
|
||||
match 'api/0.6/amf/write' => 'amf#amf_write', :via => :post
|
||||
|
|
|
@ -217,6 +217,6 @@ class CreateOsmDb < ActiveRecord::Migration
|
|||
end
|
||||
|
||||
def self.down
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -96,7 +96,7 @@ class CleanupOsmDb < ActiveRecord::Migration
|
|||
add_index "users", ["display_name"], :name => "users_display_name_idx", :unique => true
|
||||
|
||||
change_column "way_segments", "segment_id", :bigint, :null => false
|
||||
|
||||
|
||||
change_column "way_tags", "k", :string, :null => false
|
||||
change_column "way_tags", "v", :string, :null => false
|
||||
change_column "way_tags", "version", :bigint, :null => false
|
||||
|
@ -120,7 +120,7 @@ class CleanupOsmDb < ActiveRecord::Migration
|
|||
change_column "way_tags", "k", :string, :default => nil
|
||||
|
||||
change_column "way_segments", "segment_id", :integer
|
||||
|
||||
|
||||
remove_index "users", :name => "users_display_name_idx"
|
||||
add_index "users", ["display_name"], :name => "users_display_name_idx"
|
||||
remove_index "users", :name => "users_email_idx"
|
||||
|
@ -211,7 +211,7 @@ class CleanupOsmDb < ActiveRecord::Migration
|
|||
change_column "current_segments", "user_id", :bigint
|
||||
change_column "current_segments", "node_b", :bigint
|
||||
change_column "current_segments", "node_a", :bigint
|
||||
|
||||
|
||||
add_index "current_nodes", ["id"], :name => "current_nodes_id_idx"
|
||||
remove_primary_key "current_nodes"
|
||||
change_column "current_nodes", "timestamp", :datetime
|
||||
|
|
|
@ -56,7 +56,7 @@ class TileNodes < ActiveRecord::Migration
|
|||
change_column "current_nodes", "tile", :bigint
|
||||
|
||||
upgrade_table "current_nodes_v5", "current_nodes", Node
|
||||
|
||||
|
||||
drop_table "current_nodes_v5"
|
||||
|
||||
remove_index "nodes", :name=> "nodes_uid_idx"
|
||||
|
|
|
@ -9,7 +9,7 @@ class RemoveSegments < ActiveRecord::Migration
|
|||
|
||||
cmd = "db/migrate/008_remove_segments_helper"
|
||||
src = "#{cmd}.cc"
|
||||
if not File.exists? cmd or File.mtime(cmd) < File.mtime(src) then
|
||||
if not File.exists? cmd or File.mtime(cmd) < File.mtime(src) then
|
||||
system 'c++ -O3 -Wall `mysql_config --cflags --libs` ' +
|
||||
"#{src} -o #{cmd}" or fail
|
||||
end
|
||||
|
|
|
@ -9,7 +9,7 @@ class PopulateNodeTagsAndRemove < ActiveRecord::Migration
|
|||
|
||||
cmd = "db/migrate/020_populate_node_tags_and_remove_helper"
|
||||
src = "#{cmd}.c"
|
||||
if not File.exists? cmd or File.mtime(cmd) < File.mtime(src) then
|
||||
if not File.exists? cmd or File.mtime(cmd) < File.mtime(src) then
|
||||
system 'cc -O3 -Wall `mysql_config --cflags --libs` ' +
|
||||
"#{src} -o #{cmd}" or fail
|
||||
end
|
||||
|
|
|
@ -17,8 +17,8 @@ class MoveToInnodb < ActiveRecord::Migration
|
|||
|
||||
@@ver_tbl.each { |tbl|
|
||||
add_column "current_#{tbl}", "version", :bigint, :null => false
|
||||
# As the initial version of all nodes, ways and relations is 0, we set the
|
||||
# current version to something less so that we can update the version in
|
||||
# As the initial version of all nodes, ways and relations is 0, we set the
|
||||
# current version to something less so that we can update the version in
|
||||
# batches of 10000
|
||||
tbl.classify.constantize.update_all("version=-1")
|
||||
while tbl.classify.constantize.count(:conditions => {:version => -1}) > 0
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'migrate'
|
|||
class AddChangesets < ActiveRecord::Migration
|
||||
@@conv_user_tables = ['current_nodes',
|
||||
'current_relations', 'current_ways', 'nodes', 'relations', 'ways' ]
|
||||
|
||||
|
||||
def self.up
|
||||
create_table "changesets", :id => false do |t|
|
||||
t.column "id", :bigserial, :primary_key => true, :null => false
|
||||
|
@ -23,13 +23,13 @@ class AddChangesets < ActiveRecord::Migration
|
|||
end
|
||||
|
||||
add_index "changeset_tags", ["id"], :name => "changeset_tags_id_idx"
|
||||
|
||||
|
||||
#
|
||||
# Initially we will have one changeset for every user containing
|
||||
# all edits up to the API change,
|
||||
# Initially we will have one changeset for every user containing
|
||||
# all edits up to the API change,
|
||||
# all the changesets will have the id of the user that made them.
|
||||
# We need to generate a changeset for each user in the database
|
||||
execute "INSERT INTO changesets (id, user_id, created_at, open)" +
|
||||
execute "INSERT INTO changesets (id, user_id, created_at, open)" +
|
||||
"SELECT id, id, creation_time, false from users;"
|
||||
|
||||
@@conv_user_tables.each { |tbl|
|
||||
|
|
|
@ -7,12 +7,12 @@ class OrderRelationMembers < ActiveRecord::Migration
|
|||
add_column(:relation_members, :sequence_id, :integer,
|
||||
:default => 0, :null => false)
|
||||
|
||||
# update the sequence column with default (partial) ordering by
|
||||
# update the sequence column with default (partial) ordering by
|
||||
# element ID. the sequence ID is a smaller int type, so we can't
|
||||
# just copy the member_id.
|
||||
execute("update relation_members set sequence_id = mod(member_id, 16384)")
|
||||
|
||||
# need to update the primary key to include the sequence number,
|
||||
# need to update the primary key to include the sequence number,
|
||||
# otherwise the primary key will barf when we have repeated members.
|
||||
# mysql barfs on this anyway, so we need a single command. this may
|
||||
# not work in postgres... needs testing.
|
||||
|
|
|
@ -5,21 +5,21 @@ class AddEndTimeToChangesets < ActiveRecord::Migration
|
|||
# swap the boolean closed-or-not for a time when the changeset will
|
||||
# close or has closed.
|
||||
add_column(:changesets, :closed_at, :datetime, :null => false)
|
||||
|
||||
|
||||
# it appears that execute will only accept string arguments, so
|
||||
# this is an ugly, ugly hack to get some sort of mysql/postgres
|
||||
# independence. now i have to go wash my brain with bleach.
|
||||
execute("update changesets set closed_at=(now()-'1 hour'::interval) where open=(1=0)")
|
||||
execute("update changesets set closed_at=(now()+'1 hour'::interval) where open=(1=1)")
|
||||
|
||||
# remove the open column as it is unnecessary now and denormalises
|
||||
# remove the open column as it is unnecessary now and denormalises
|
||||
# the table.
|
||||
remove_column :changesets, :open
|
||||
|
||||
# add a column to keep track of the number of changes in a changeset.
|
||||
# could probably work out how many changes there are here, but i'm not
|
||||
# sure its actually important.
|
||||
add_column(:changesets, :num_changes, :integer,
|
||||
add_column(:changesets, :num_changes, :integer,
|
||||
:null => false, :default => 0)
|
||||
end
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ class CreateOauthTables < ActiveRecord::Migration
|
|||
t.timestamps
|
||||
end
|
||||
add_index :client_applications, :key, :unique => true
|
||||
|
||||
|
||||
create_table :oauth_tokens do |t|
|
||||
t.integer :user_id
|
||||
t.string :type, :limit => 20
|
||||
|
@ -22,9 +22,9 @@ class CreateOauthTables < ActiveRecord::Migration
|
|||
t.timestamp :authorized_at, :invalidated_at
|
||||
t.timestamps
|
||||
end
|
||||
|
||||
|
||||
add_index :oauth_tokens, :token, :unique => true
|
||||
|
||||
|
||||
create_table :oauth_nonces do |t|
|
||||
t.string :nonce
|
||||
t.integer :timestamp
|
||||
|
@ -32,7 +32,7 @@ class CreateOauthTables < ActiveRecord::Migration
|
|||
t.timestamps
|
||||
end
|
||||
add_index :oauth_nonces, [:nonce, :timestamp], :unique => true
|
||||
|
||||
|
||||
end
|
||||
|
||||
def self.down
|
||||
|
|
|
@ -5,12 +5,12 @@ class AddMapBugTables < ActiveRecord::Migration
|
|||
create_enumeration :map_bug_status_enum, ["open", "closed", "hidden"]
|
||||
|
||||
create_table :map_bugs do |t|
|
||||
t.integer :latitude, :null => false
|
||||
t.integer :longitude, :null => false
|
||||
t.integer :latitude, :null => false
|
||||
t.integer :longitude, :null => false
|
||||
t.column :tile, :bigint, :null => false
|
||||
t.datetime :last_changed, :null => false
|
||||
t.datetime :date_created, :null => false
|
||||
t.string :nearby_place
|
||||
t.datetime :date_created, :null => false
|
||||
t.string :nearby_place
|
||||
t.string :text
|
||||
t.column :status, :map_bug_status_enum, :null => false
|
||||
end
|
||||
|
|
|
@ -4,7 +4,7 @@ class RefactorMapBugTables < ActiveRecord::Migration
|
|||
def self.up
|
||||
create_table :map_bug_comment do |t|
|
||||
t.column :bug_id, :bigint, :null => false
|
||||
t.boolean :visible, :null => false
|
||||
t.boolean :visible, :null => false
|
||||
t.datetime :date_created, :null => false
|
||||
t.string :commenter_name
|
||||
t.string :commenter_ip
|
||||
|
@ -12,7 +12,7 @@ class RefactorMapBugTables < ActiveRecord::Migration
|
|||
t.string :comment
|
||||
end
|
||||
|
||||
remove_column :map_bugs, :text
|
||||
remove_column :map_bugs, :text
|
||||
|
||||
change_column :map_bug_comment, :id, :bigint
|
||||
|
||||
|
|
|
@ -6,6 +6,6 @@ class AddDateClosed < ActiveRecord::Migration
|
|||
end
|
||||
|
||||
def self.down
|
||||
remove_column :map_bugs, :date_closed
|
||||
remove_column :map_bugs, :date_closed
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
class AddOpenId < ActiveRecord::Migration
|
||||
def self.up
|
||||
add_column :users, :openid_url, :string
|
||||
add_column :users, :openid_url, :string
|
||||
add_index :users, [:openid_url], :name => "user_openid_url_idx", :unique => true
|
||||
end
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class AddTermsSeenToUser < ActiveRecord::Migration
|
||||
def self.up
|
||||
add_column :users, :terms_seen, :boolean, :null => false, :default => false
|
||||
|
||||
|
||||
# best guess available is just that everyone who has agreed has
|
||||
# seen the terms, and that noone else has.
|
||||
User.update_all "terms_seen = (terms_agreed is not null)"
|
||||
|
|
|
@ -13,23 +13,23 @@ module ActionController
|
|||
#
|
||||
# Pagination is included automatically for all controllers.
|
||||
#
|
||||
# For help rendering pagination links, see
|
||||
# For help rendering pagination links, see
|
||||
# ActionView::Helpers::PaginationHelper.
|
||||
#
|
||||
# ==== Automatic pagination for every action in a controller
|
||||
#
|
||||
# class PersonController < ApplicationController
|
||||
# class PersonController < ApplicationController
|
||||
# model :person
|
||||
#
|
||||
# paginate :people, :order => 'last_name, first_name',
|
||||
# :per_page => 20
|
||||
#
|
||||
#
|
||||
# # ...
|
||||
# end
|
||||
#
|
||||
# Each action in this controller now has access to a <tt>@people</tt>
|
||||
# instance variable, which is an ordered collection of model objects for the
|
||||
# current page (at most 20, sorted by last name and first name), and a
|
||||
# current page (at most 20, sorted by last name and first name), and a
|
||||
# <tt>@person_pages</tt> Paginator instance. The current page is determined
|
||||
# by the <tt>params[:page]</tt> variable.
|
||||
#
|
||||
|
@ -44,23 +44,23 @@ module ActionController
|
|||
# and <tt>@people</tt> for a single action, and uses the default of 10 items
|
||||
# per page.
|
||||
#
|
||||
# ==== Custom/"classic" pagination
|
||||
# ==== Custom/"classic" pagination
|
||||
#
|
||||
# def list
|
||||
# @person_pages = Paginator.new self, Person.count, 10, params[:page]
|
||||
# @people = Person.find :all, :order => 'last_name, first_name',
|
||||
# @people = Person.find :all, :order => 'last_name, first_name',
|
||||
# :limit => @person_pages.items_per_page,
|
||||
# :offset => @person_pages.current.offset
|
||||
# end
|
||||
#
|
||||
# Explicitly creates the paginator from the previous example and uses
|
||||
#
|
||||
# Explicitly creates the paginator from the previous example and uses
|
||||
# Paginator#to_sql to retrieve <tt>@people</tt> from the model.
|
||||
#
|
||||
module Pagination
|
||||
unless const_defined?(:OPTIONS)
|
||||
# A hash holding options for controllers using macro-style pagination
|
||||
OPTIONS = Hash.new
|
||||
|
||||
|
||||
# The default options for pagination
|
||||
DEFAULT_OPTIONS = {
|
||||
:class_name => nil,
|
||||
|
@ -80,18 +80,18 @@ module ActionController
|
|||
else
|
||||
DEFAULT_OPTIONS[:group] = nil
|
||||
end
|
||||
|
||||
|
||||
def self.included(base) #:nodoc:
|
||||
super
|
||||
base.extend(ClassMethods)
|
||||
end
|
||||
|
||||
|
||||
def self.validate_options!(collection_id, options, in_action) #:nodoc:
|
||||
options.merge!(DEFAULT_OPTIONS) {|key, old, new| old}
|
||||
|
||||
valid_options = DEFAULT_OPTIONS.keys
|
||||
valid_options << :actions unless in_action
|
||||
|
||||
|
||||
unknown_option_keys = options.keys - valid_options
|
||||
raise ActionController::ActionControllerError,
|
||||
"Unknown options: #{unknown_option_keys.join(', ')}" unless
|
||||
|
@ -110,7 +110,7 @@ module ActionController
|
|||
# <tt>:singular_name</tt>:: the singular name to use, if it can't be inferred by singularizing the collection name
|
||||
# <tt>:class_name</tt>:: the class name to use, if it can't be inferred by
|
||||
# camelizing the singular name
|
||||
# <tt>:per_page</tt>:: the maximum number of items to include in a
|
||||
# <tt>:per_page</tt>:: the maximum number of items to include in a
|
||||
# single page. Defaults to 10
|
||||
# <tt>:conditions</tt>:: optional conditions passed to Model.find(:all, *params) and
|
||||
# Model.count
|
||||
|
@ -133,13 +133,13 @@ module ActionController
|
|||
paginator_and_collection_for(collection_id, options)
|
||||
end
|
||||
|
||||
# These methods become class methods on any controller
|
||||
# These methods become class methods on any controller
|
||||
module ClassMethods
|
||||
# Creates a +before_filter+ which automatically paginates an Active
|
||||
# Record model for all actions in a controller (or certain actions if
|
||||
# specified with the <tt>:actions</tt> option).
|
||||
#
|
||||
# +options+ are the same as PaginationHelper#paginate, with the addition
|
||||
# +options+ are the same as PaginationHelper#paginate, with the addition
|
||||
# of:
|
||||
# <tt>:actions</tt>:: an array of actions for which the pagination is
|
||||
# active. Defaults to +nil+ (i.e., every action)
|
||||
|
@ -158,17 +158,17 @@ module ActionController
|
|||
next unless options[:actions].include? action_name if
|
||||
options[:actions]
|
||||
|
||||
paginator, collection =
|
||||
paginator, collection =
|
||||
paginator_and_collection_for(collection_id, options)
|
||||
|
||||
paginator_name = "@#{options[:singular_name]}_pages"
|
||||
self.instance_variable_set(paginator_name, paginator)
|
||||
|
||||
collection_name = "@#{collection_id.to_s}"
|
||||
self.instance_variable_set(collection_name, collection)
|
||||
self.instance_variable_set(collection_name, collection)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Returns the total number of items in the collection to be paginated for
|
||||
# the +model+ and given +conditions+. Override this method to implement a
|
||||
# custom counter.
|
||||
|
@ -185,7 +185,7 @@ module ActionController
|
|||
|
||||
collection.count
|
||||
end
|
||||
|
||||
|
||||
# Returns a collection of items for the given +model+ and +options[conditions]+,
|
||||
# ordered by +options[order]+, for the current page in the given +paginator+.
|
||||
# Override this method to implement a custom finder.
|
||||
|
@ -199,10 +199,10 @@ module ActionController
|
|||
if options[:select]
|
||||
collection = collection.select(options[:select])
|
||||
end
|
||||
|
||||
|
||||
collection.offset(paginator.current.offset).limit(options[:per_page])
|
||||
end
|
||||
|
||||
|
||||
protected :create_paginators_and_retrieve_collections,
|
||||
:count_collection_for_pagination,
|
||||
:find_collection_for_pagination
|
||||
|
@ -213,10 +213,10 @@ module ActionController
|
|||
count = count_collection_for_pagination(klass, options)
|
||||
paginator = Paginator.new(self, count, options[:per_page], page)
|
||||
collection = find_collection_for_pagination(klass, options, paginator)
|
||||
|
||||
return paginator, collection
|
||||
|
||||
return paginator, collection
|
||||
end
|
||||
|
||||
|
||||
private :paginator_and_collection_for
|
||||
|
||||
# A class representing a paginator for an Active Record collection.
|
||||
|
@ -236,13 +236,13 @@ module ActionController
|
|||
@item_count = item_count || 0
|
||||
@items_per_page = items_per_page
|
||||
@pages = {}
|
||||
|
||||
|
||||
self.current_page = current_page
|
||||
end
|
||||
attr_reader :controller, :item_count, :items_per_page
|
||||
|
||||
|
||||
# Sets the current page number of this paginator. If +page+ is a Page
|
||||
# object, its +number+ attribute is used as the value; if the page does
|
||||
# object, its +number+ attribute is used as the value; if the page does
|
||||
# not belong to this Paginator, an ArgumentError is raised.
|
||||
def current_page=(page)
|
||||
if page.is_a? Page
|
||||
|
@ -267,7 +267,7 @@ module ActionController
|
|||
|
||||
# Returns a new Page representing the last page in this paginator.
|
||||
def last_page
|
||||
@last_page ||= self[page_count]
|
||||
@last_page ||= self[page_count]
|
||||
end
|
||||
alias last :last_page
|
||||
|
||||
|
@ -312,12 +312,12 @@ module ActionController
|
|||
attr_reader :paginator, :number
|
||||
alias to_i :number
|
||||
|
||||
# Compares two Page objects and returns true when they represent the
|
||||
# Compares two Page objects and returns true when they represent the
|
||||
# same page (i.e., their paginators are the same and they have the
|
||||
# same page number).
|
||||
def ==(page)
|
||||
return false if page.nil?
|
||||
@paginator == page.paginator and
|
||||
@paginator == page.paginator and
|
||||
@number == page.number
|
||||
end
|
||||
|
||||
|
@ -334,12 +334,12 @@ module ActionController
|
|||
def offset
|
||||
@paginator.items_per_page * (@number - 1)
|
||||
end
|
||||
|
||||
|
||||
# Returns the number of the first item displayed.
|
||||
def first_item
|
||||
offset + 1
|
||||
end
|
||||
|
||||
|
||||
# Returns the number of the last item displayed.
|
||||
def last_item
|
||||
[@paginator.items_per_page * @number, @paginator.item_count].min
|
||||
|
@ -367,7 +367,7 @@ module ActionController
|
|||
if last? then nil else @paginator[@number + 1] end
|
||||
end
|
||||
|
||||
# Returns a new Window object for this page with the specified
|
||||
# Returns a new Window object for this page with the specified
|
||||
# +padding+.
|
||||
def window(padding=2)
|
||||
Window.new(self, padding)
|
||||
|
@ -377,7 +377,7 @@ module ActionController
|
|||
def to_sql
|
||||
[@paginator.items_per_page, offset]
|
||||
end
|
||||
|
||||
|
||||
def to_param #:nodoc:
|
||||
@number.to_s
|
||||
end
|
||||
|
|
|
@ -27,7 +27,7 @@ module ActionView
|
|||
# (i.e. Older Pages: 1 2 3 4)
|
||||
# <tt>:suffix</tt>:: suffix for pagination links
|
||||
# (i.e. 1 2 3 4 <- Older Pages)
|
||||
# <tt>:window_size</tt>:: the number of pages to show around
|
||||
# <tt>:window_size</tt>:: the number of pages to show around
|
||||
# the current page (defaults to <tt>2</tt>)
|
||||
# <tt>:always_show_anchors</tt>:: whether or not the first and last
|
||||
# pages should always be shown
|
||||
|
@ -48,18 +48,18 @@ module ActionView
|
|||
# # => <a href="/?page=1/">1</a> <a href="/?page=2/">2</a> <a href="/?page=3/">3</a> ... <a href="/?page=10/">10</a>
|
||||
#
|
||||
# pagination_links(@person_pages, :always_show_anchors => false)
|
||||
# # => 1 <a href="/?page=2/">2</a> <a href="/?page=3/">3</a>
|
||||
# # => 1 <a href="/?page=2/">2</a> <a href="/?page=3/">3</a>
|
||||
#
|
||||
# pagination_links(@person_pages, :window_size => 1)
|
||||
# # => 1 <a href="/?page=2/">2</a> ... <a href="/?page=10/">10</a>
|
||||
#
|
||||
# pagination_links(@person_pages, :params => { :viewer => "flash" })
|
||||
# # => 1 <a href="/?page=2&viewer=flash/">2</a> <a href="/?page=3&viewer=flash/">3</a> ...
|
||||
# # => 1 <a href="/?page=2&viewer=flash/">2</a> <a href="/?page=3&viewer=flash/">3</a> ...
|
||||
# # <a href="/?page=10&viewer=flash/">10</a>
|
||||
def pagination_links(paginator, options={}, html_options={})
|
||||
name = options[:name] || DEFAULT_OPTIONS[:name]
|
||||
params = (options[:params] || DEFAULT_OPTIONS[:params]).clone
|
||||
|
||||
|
||||
prefix = options[:prefix] || ''
|
||||
suffix = options[:suffix] || ''
|
||||
|
||||
|
@ -71,9 +71,9 @@ module ActionView
|
|||
|
||||
# Iterate through the pages of a given +paginator+, invoking a
|
||||
# block for each page number that needs to be rendered as a link.
|
||||
#
|
||||
#
|
||||
# ==== Options
|
||||
# <tt>:window_size</tt>:: the number of pages to show around
|
||||
# <tt>:window_size</tt>:: the number of pages to show around
|
||||
# the current page (defaults to +2+)
|
||||
# <tt>:always_show_anchors</tt>:: whether or not the first and last
|
||||
# pages should always be shown
|
||||
|
@ -98,9 +98,9 @@ module ActionView
|
|||
current_page = paginator.current_page
|
||||
window_pages = current_page.window(options[:window_size]).pages
|
||||
return if window_pages.length <= 1 unless link_to_current_page
|
||||
|
||||
|
||||
first, last = paginator.first, paginator.last
|
||||
|
||||
|
||||
html = ''
|
||||
|
||||
html << prefix if prefix
|
||||
|
@ -110,7 +110,7 @@ module ActionView
|
|||
html << ' ... ' if wp_first.number - first.number > 1
|
||||
html << ' '
|
||||
end
|
||||
|
||||
|
||||
window_pages.each do |page|
|
||||
if current_page == page && !link_to_current_page
|
||||
html << page.number.to_s
|
||||
|
@ -119,8 +119,8 @@ module ActionView
|
|||
end
|
||||
html << ' '
|
||||
end
|
||||
|
||||
if always_show_anchors and not (wp_last = window_pages[-1]).last?
|
||||
|
||||
if always_show_anchors and not (wp_last = window_pages[-1]).last?
|
||||
html << ' ... ' if last.number - wp_last.number > 1
|
||||
html << yield(last.number)
|
||||
end
|
||||
|
@ -129,7 +129,7 @@ module ActionView
|
|||
|
||||
html
|
||||
end
|
||||
|
||||
|
||||
end # PaginationHelper
|
||||
end # Helpers
|
||||
end # ActionView
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
module ConsistencyValidations
|
||||
# Generic checks that are run for the updates and deletes of
|
||||
# node, ways and relations. This code is here to avoid duplication,
|
||||
# node, ways and relations. This code is here to avoid duplication,
|
||||
# and allow the extention of the checks without having to modify the
|
||||
# code in 6 places for all the updates and deletes. Some of these tests are
|
||||
# needed for creates, but are currently not run :-(
|
||||
# code in 6 places for all the updates and deletes. Some of these tests are
|
||||
# needed for creates, but are currently not run :-(
|
||||
# This will throw an exception if there is an inconsistency
|
||||
def check_consistency(old, new, user)
|
||||
if new.id != old.id or new.id.nil? or old.id.nil?
|
||||
|
@ -18,7 +18,7 @@ module ConsistencyValidations
|
|||
raise OSM::APIChangesetAlreadyClosedError.new(new.changeset)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# This is similar to above, just some validations don't apply
|
||||
def check_create_consistency(new, user)
|
||||
if new.changeset.nil?
|
||||
|
@ -38,7 +38,7 @@ module ConsistencyValidations
|
|||
# may alter it.
|
||||
if changeset.nil?
|
||||
raise OSM::APIChangesetMissingError.new
|
||||
elsif user.id != changeset.user_id
|
||||
elsif user.id != changeset.user_id
|
||||
raise OSM::APIUserChangesetMismatchError.new
|
||||
elsif not changeset.is_open?
|
||||
raise OSM::APIChangesetAlreadyClosedError.new(changeset)
|
||||
|
|
|
@ -13,7 +13,7 @@ while(true) do
|
|||
ActiveRecord::Base.logger.info("GPX Import daemon wake @ #{Time.now}.")
|
||||
|
||||
Trace.find(:all, :conditions => { :inserted => false, :visible => true }, :order => "id").each do |trace|
|
||||
Signal.trap("TERM") do
|
||||
Signal.trap("TERM") do
|
||||
terminated = true
|
||||
end
|
||||
|
||||
|
@ -39,7 +39,7 @@ while(true) do
|
|||
end
|
||||
|
||||
Trace.find(:all, :conditions => { :visible => false }, :order => "id").each do |trace|
|
||||
Signal.trap("TERM") do
|
||||
Signal.trap("TERM") do
|
||||
terminated = true
|
||||
end
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@ class DiffReader
|
|||
include ConsistencyValidations
|
||||
|
||||
# maps each element type to the model class which handles it
|
||||
MODELS = {
|
||||
"node" => Node,
|
||||
"way" => Way,
|
||||
MODELS = {
|
||||
"node" => Node,
|
||||
"way" => Way,
|
||||
"relation" => Relation
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@ class DiffReader
|
|||
end
|
||||
|
||||
##
|
||||
# An element-block mapping for using the LibXML reader interface.
|
||||
# An element-block mapping for using the LibXML reader interface.
|
||||
#
|
||||
# Since a lot of LibXML reader usage is boilerplate iteration through
|
||||
# elements, it would be better to DRY and do this in a block. This
|
||||
|
@ -73,13 +73,13 @@ class DiffReader
|
|||
else
|
||||
read_or_die
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
read_or_die
|
||||
end
|
||||
|
||||
##
|
||||
# An element-block mapping for using the LibXML reader interface.
|
||||
# An element-block mapping for using the LibXML reader interface.
|
||||
#
|
||||
# Since a lot of LibXML reader usage is boilerplate iteration through
|
||||
# elements, it would be better to DRY and do this in a block. This
|
||||
|
@ -89,7 +89,7 @@ class DiffReader
|
|||
model = MODELS[model_name]
|
||||
raise OSM::APIBadUserInput.new("Unexpected element type #{model_name}, " +
|
||||
"expected node, way or relation.") if model.nil?
|
||||
# new in libxml-ruby >= 2, expand returns an element not associated
|
||||
# new in libxml-ruby >= 2, expand returns an element not associated
|
||||
# with a document. this means that there's no encoding parameter,
|
||||
# which means basically nothing works.
|
||||
expanded = @reader.expand
|
||||
|
@ -112,7 +112,7 @@ class DiffReader
|
|||
# such as save_ and delete_with_history.
|
||||
def check(model, xml, new)
|
||||
raise OSM::APIBadXMLError.new(model, xml) if new.nil?
|
||||
unless new.changeset_id == @changeset.id
|
||||
unless new.changeset_id == @changeset.id
|
||||
raise OSM::APIChangesetMismatchError.new(new.changeset_id, @changeset.id)
|
||||
end
|
||||
end
|
||||
|
@ -122,7 +122,7 @@ class DiffReader
|
|||
# is *not* transactional, so code which calls it should ensure that the
|
||||
# appropriate transaction block is in place.
|
||||
#
|
||||
# On a failure to meet preconditions (e.g: optimistic locking fails)
|
||||
# On a failure to meet preconditions (e.g: optimistic locking fails)
|
||||
# an exception subclassing OSM::APIError will be thrown.
|
||||
def commit
|
||||
|
||||
|
@ -162,7 +162,7 @@ class DiffReader
|
|||
|
||||
# create element given user
|
||||
new.create_with_history(@changeset.user)
|
||||
|
||||
|
||||
# save placeholder => allocated ID map
|
||||
ids[model_sym][placeholder_id] = new.id
|
||||
|
||||
|
@ -173,7 +173,7 @@ class DiffReader
|
|||
xml_result["new_version"] = new.version.to_s
|
||||
result.root << xml_result
|
||||
end
|
||||
|
||||
|
||||
elsif action_name == 'modify'
|
||||
# modify an existing element. again, this code doesn't directly deal
|
||||
# with types, but uses duck typing to handle them transparently.
|
||||
|
@ -199,7 +199,7 @@ class DiffReader
|
|||
|
||||
xml_result = XML::Node.new model.to_s.downcase
|
||||
xml_result["old_id"] = client_id.to_s
|
||||
xml_result["new_id"] = id.to_s
|
||||
xml_result["new_id"] = id.to_s
|
||||
# version is updated in "old" through the update, so we must not
|
||||
# return new.version here but old.version!
|
||||
xml_result["new_version"] = old.version.to_s
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
module Editors
|
||||
module Editors
|
||||
ALL_EDITORS = [ "potlatch", "potlatch2", "id", "remote" ]
|
||||
RECOMMENDED_EDITORS = [ "id", "potlatch2", "remote" ]
|
||||
end
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
module GeoRecord
|
||||
# This scaling factor is used to convert between the float lat/lon that is
|
||||
# This scaling factor is used to convert between the float lat/lon that is
|
||||
# returned by the API, and the integer lat/lon equivalent that is stored in
|
||||
# the database.
|
||||
SCALE = 10000000
|
||||
|
||||
|
||||
def self.included(base)
|
||||
base.scope :bbox, ->(bbox) { base.where(OSM.sql_for_area(bbox)) }
|
||||
base.before_save :update_tile
|
||||
|
@ -40,7 +40,7 @@ module GeoRecord
|
|||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def lat2y(a)
|
||||
180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2))
|
||||
end
|
||||
|
|
|
@ -1,66 +1,66 @@
|
|||
# OutputCompression
|
||||
# Rails output compression filters
|
||||
#
|
||||
# Adds two classmethods to ActionController that can be used as after-filters:
|
||||
# strip_whitespace and compress_output.
|
||||
# If you use page-caching, you MUST specify the compress_output filter AFTER
|
||||
# caches_page, otherwise the compressed data will be cached instead of the HTML
|
||||
#
|
||||
# class MyController < ApplicationController
|
||||
# after_filter :strip_whitespace
|
||||
# caches_page :index
|
||||
# after_filter :compress_output
|
||||
# end
|
||||
# Rails output compression filters
|
||||
#
|
||||
# Adds two classmethods to ActionController that can be used as after-filters:
|
||||
# strip_whitespace and compress_output.
|
||||
# If you use page-caching, you MUST specify the compress_output filter AFTER
|
||||
# caches_page, otherwise the compressed data will be cached instead of the HTML
|
||||
#
|
||||
# class MyController < ApplicationController
|
||||
# after_filter :strip_whitespace
|
||||
# caches_page :index
|
||||
# after_filter :compress_output
|
||||
# end
|
||||
|
||||
begin
|
||||
require 'zlib'
|
||||
require 'stringio'
|
||||
GZIP_SUPPORTED = true
|
||||
rescue
|
||||
GZIP_SUPPORTED = false
|
||||
end
|
||||
begin
|
||||
require 'zlib'
|
||||
require 'stringio'
|
||||
GZIP_SUPPORTED = true
|
||||
rescue
|
||||
GZIP_SUPPORTED = false
|
||||
end
|
||||
|
||||
module CompressionSystem
|
||||
def compress_output
|
||||
module CompressionSystem
|
||||
def compress_output
|
||||
return unless accepts_gzip?
|
||||
output = StringIO.new
|
||||
def output.close
|
||||
# Zlib does a close. Bad Zlib...
|
||||
rewind
|
||||
end
|
||||
gz = Zlib::GzipWriter.new(output)
|
||||
gz.write(response.body)
|
||||
gz.close
|
||||
if output.length < response.body.length
|
||||
@old_response_body = response.body
|
||||
response.body = output.string
|
||||
response.headers['Content-encoding'] = @compression_encoding
|
||||
end
|
||||
end
|
||||
|
||||
def accepts_gzip?
|
||||
return false unless GZIP_SUPPORTED
|
||||
accepts = request.env['HTTP_ACCEPT_ENCODING']
|
||||
return false unless accepts && accepts =~ /(x-gzip|gzip)/
|
||||
@compression_encoding = $1
|
||||
true
|
||||
end
|
||||
|
||||
def strip_whitespace
|
||||
response.body.gsub!(/()|(.*?<\/script>)|()|()|\s+/m) do |m|
|
||||
if m =~ /^()(.*?)<\/script>$/m
|
||||
$1 + $2.strip.gsub(/\s+/, ' ').gsub('',"\n-->") + ''
|
||||
elsif m =~ /^$/m
|
||||
''
|
||||
elsif m =~ /^<(textarea|pre)/
|
||||
m
|
||||
else ' '
|
||||
end
|
||||
output = StringIO.new
|
||||
def output.close
|
||||
# Zlib does a close. Bad Zlib...
|
||||
rewind
|
||||
end
|
||||
response.body.gsub! /\s+\s+/, '>'
|
||||
end
|
||||
end
|
||||
gz = Zlib::GzipWriter.new(output)
|
||||
gz.write(response.body)
|
||||
gz.close
|
||||
if output.length < response.body.length
|
||||
@old_response_body = response.body
|
||||
response.body = output.string
|
||||
response.headers['Content-encoding'] = @compression_encoding
|
||||
end
|
||||
end
|
||||
|
||||
class ActionController::Base
|
||||
include CompressionSystem
|
||||
end
|
||||
def accepts_gzip?
|
||||
return false unless GZIP_SUPPORTED
|
||||
accepts = request.env['HTTP_ACCEPT_ENCODING']
|
||||
return false unless accepts && accepts =~ /(x-gzip|gzip)/
|
||||
@compression_encoding = $1
|
||||
true
|
||||
end
|
||||
|
||||
def strip_whitespace
|
||||
response.body.gsub!(/()|(.*?<\/script>)|()|()|\s+/m) do |m|
|
||||
if m =~ /^()(.*?)<\/script>$/m
|
||||
$1 + $2.strip.gsub(/\s+/, ' ').gsub('',"\n-->") + ''
|
||||
elsif m =~ /^$/m
|
||||
''
|
||||
elsif m =~ /^<(textarea|pre)/
|
||||
m
|
||||
else ' '
|
||||
end
|
||||
end
|
||||
response.body.gsub! /\s+\s+/, '>'
|
||||
end
|
||||
end
|
||||
|
||||
class ActionController::Base
|
||||
include CompressionSystem
|
||||
end
|
||||
|
|
|
@ -5,33 +5,33 @@ module Potlatch
|
|||
|
||||
# The AMF class is a set of helper functions for encoding and decoding AMF.
|
||||
class AMF
|
||||
|
||||
|
||||
# Return two-byte integer
|
||||
def self.getint(s)
|
||||
def self.getint(s)
|
||||
s.getbyte*256+s.getbyte
|
||||
end
|
||||
|
||||
# Return four-byte long
|
||||
def self.getlong(s)
|
||||
def self.getlong(s)
|
||||
((s.getbyte*256+s.getbyte)*256+s.getbyte)*256+s.getbyte
|
||||
end
|
||||
|
||||
# Return string with two-byte length
|
||||
def self.getstring(s)
|
||||
# Return string with two-byte length
|
||||
def self.getstring(s)
|
||||
len=s.getbyte*256+s.getbyte
|
||||
str=s.read(len)
|
||||
str.force_encoding("UTF-8") if str.respond_to?("force_encoding")
|
||||
str
|
||||
end
|
||||
|
||||
# Return eight-byte double-precision float
|
||||
def self.getdouble(s)
|
||||
# Return eight-byte double-precision float
|
||||
def self.getdouble(s)
|
||||
a=s.read(8).unpack('G') # G big-endian, E little-endian
|
||||
a[0]
|
||||
end
|
||||
|
||||
# Return numeric array
|
||||
def self.getarray(s)
|
||||
def self.getarray(s)
|
||||
len=getlong(s)
|
||||
arr=[]
|
||||
for i in (0..len-1)
|
||||
|
@ -40,8 +40,8 @@ module Potlatch
|
|||
arr
|
||||
end
|
||||
|
||||
# Return object/hash
|
||||
def self.getobject(s)
|
||||
# Return object/hash
|
||||
def self.getobject(s)
|
||||
arr={}
|
||||
while (key=getstring(s))
|
||||
if (key=='') then break end
|
||||
|
@ -52,7 +52,7 @@ module Potlatch
|
|||
end
|
||||
|
||||
# Parse and get value
|
||||
def self.getvalue(s)
|
||||
def self.getvalue(s)
|
||||
case s.getbyte
|
||||
when 0; return getdouble(s) # number
|
||||
when 1; return s.getbyte # boolean
|
||||
|
@ -68,7 +68,7 @@ module Potlatch
|
|||
end
|
||||
|
||||
# Envelope data into AMF writeable form
|
||||
def self.putdata(index,n)
|
||||
def self.putdata(index,n)
|
||||
d =encodestring(index+"/onResult")
|
||||
d+=encodestring("null")
|
||||
d+=[-1].pack("N")
|
||||
|
@ -76,7 +76,7 @@ module Potlatch
|
|||
end
|
||||
|
||||
# Pack variables as AMF
|
||||
def self.encodevalue(n)
|
||||
def self.encodevalue(n)
|
||||
case n.class.to_s
|
||||
when 'Array'
|
||||
a=10.chr+encodelong(n.length)
|
||||
|
@ -112,13 +112,13 @@ module Potlatch
|
|||
a.chr+b.chr+n
|
||||
end
|
||||
|
||||
# Encode number as eight-byte double precision float
|
||||
def self.encodedouble(n)
|
||||
# Encode number as eight-byte double precision float
|
||||
def self.encodedouble(n)
|
||||
[n].pack('G')
|
||||
end
|
||||
|
||||
# Encode number as four-byte long
|
||||
def self.encodelong(n)
|
||||
def self.encodelong(n)
|
||||
[n].pack('N')
|
||||
end
|
||||
|
||||
|
@ -243,7 +243,7 @@ module Potlatch
|
|||
}
|
||||
end
|
||||
icon_list.reverse!
|
||||
|
||||
|
||||
# Read auto-complete
|
||||
autotags={}; autotags['point']={}; autotags['way']={}; autotags['POI']={};
|
||||
File.open("#{Rails.root}/config/potlatch/autocomplete.txt") do |file|
|
||||
|
@ -262,4 +262,3 @@ module Potlatch
|
|||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ module Quova
|
|||
def status
|
||||
@ipinfo["GetIpInfoResult"]["Response"]["Status"].to_i
|
||||
end
|
||||
|
||||
|
||||
def country_code
|
||||
@ipinfo["GetIpInfoResult"]["Location"]["Country"]["Name"]
|
||||
end
|
||||
|
@ -63,4 +63,3 @@ module Quova
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ module Redactable
|
|||
# in scope for the module itself.
|
||||
base.scope :unredacted, -> { base.where(:redaction_id => nil) }
|
||||
end
|
||||
|
||||
|
||||
def redacted?
|
||||
not self.redaction.nil?
|
||||
end
|
||||
|
|
|
@ -102,7 +102,7 @@ module RichText
|
|||
else
|
||||
"<a rel=\"nofollow\" href=\"#{link}\">#{link}</a>"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ module SessionPersistence
|
|||
# session_expires_after 1.hour
|
||||
# session_expires_after 2.weeks
|
||||
def session_expires_after(seconds)
|
||||
session[session_persistence_key] = seconds
|
||||
session[session_persistence_key] = seconds
|
||||
end
|
||||
|
||||
# Expire the session.
|
||||
|
|
|
@ -7,12 +7,12 @@
|
|||
module ShortLink
|
||||
|
||||
# array of 64 chars to encode 6 bits. this is almost like base64 encoding, but
|
||||
# the symbolic chars are different, as base64's + and / aren't very
|
||||
# the symbolic chars are different, as base64's + and / aren't very
|
||||
# URL-friendly.
|
||||
ARRAY = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['_','~']
|
||||
|
||||
##
|
||||
# Given a string encoding a location, returns the [lon, lat, z] tuple of that
|
||||
# Given a string encoding a location, returns the [lon, lat, z] tuple of that
|
||||
# location.
|
||||
def self.decode(str)
|
||||
x = 0
|
||||
|
@ -42,15 +42,15 @@ module ShortLink
|
|||
y <<= (32 - z)
|
||||
|
||||
# project the parameters back to their coordinate ranges.
|
||||
[(x * 360.0 / 2**32) - 180.0,
|
||||
(y * 180.0 / 2**32) - 90.0,
|
||||
[(x * 360.0 / 2**32) - 180.0,
|
||||
(y * 180.0 / 2**32) - 90.0,
|
||||
z - 8 - (z_offset % 3)]
|
||||
end
|
||||
|
||||
##
|
||||
# given a location and zoom, return a short string representing it.
|
||||
def self.encode(lon, lat, z)
|
||||
code = interleave_bits(((lon + 180.0) * 2**32 / 360.0).to_i,
|
||||
code = interleave_bits(((lon + 180.0) * 2**32 / 360.0).to_i,
|
||||
((lat + 90.0) * 2**32 / 180.0).to_i)
|
||||
str = ""
|
||||
# add eight to the zoom level, which approximates an accuracy of
|
||||
|
@ -63,12 +63,12 @@ module ShortLink
|
|||
# partial zoom levels (characters themselves have a granularity
|
||||
# of 3 zoom levels).
|
||||
((z + 8) % 3).times { str << "-" }
|
||||
|
||||
|
||||
return str
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
##
|
||||
# interleaves the bits of two 32-bit numbers. the result is known
|
||||
# as a Morton code.
|
||||
|
|
|
@ -6,14 +6,14 @@ namespace 'db' do
|
|||
increment = 1000
|
||||
offset = 0
|
||||
id_max = OldNode.find(:first, :order => 'id desc').id
|
||||
|
||||
|
||||
while offset < (id_max + increment)
|
||||
hash = {}
|
||||
|
||||
#should be offsetting not selecting
|
||||
OldNode.find(:all, :limit => increment, :offset => offset, :order => 'timestamp').each do |node|
|
||||
if hash[node.id].nil?
|
||||
hash[node.id] = []
|
||||
hash[node.id] = []
|
||||
end
|
||||
hash[node.id] << node
|
||||
end
|
||||
|
@ -31,16 +31,10 @@ namespace 'db' do
|
|||
temp_old_node.tile = node.tile
|
||||
temp_old_node.version = n
|
||||
temp_old_node.save! || raise
|
||||
n +=1
|
||||
n +=1
|
||||
end
|
||||
end
|
||||
offset += increment
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
namespace :test do
|
||||
Rails::TestTask.new(lib: "test:prepare") do |t|
|
||||
Rails::TestTask.new(lib: "test:prepare") do |t|
|
||||
t.pattern = 'test/lib/**/*_test.rb'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActiveRecord
|
||||
module Validations
|
||||
module ClassMethods
|
||||
|
||||
|
||||
# error message when invalid UTF-8 is detected
|
||||
@@invalid_utf8_message = " is invalid UTF-8"
|
||||
|
||||
|
@ -13,7 +13,7 @@ module ActiveRecord
|
|||
validates_each(attrs) do |record, attr, value|
|
||||
record.errors.add(attr, @@invalid_utf8_message) unless UTF8.valid? value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
#!/usr/bin/env ruby
|
||||
Dir[File.dirname(__FILE__) + "/../lib/daemons/*_ctl"].each {|f| `#{f} #{ARGV.first}`}
|
||||
Dir[File.dirname(__FILE__) + "/../lib/daemons/*_ctl"].each {|f| `#{f} #{ARGV.first}`}
|
||||
|
|
|
@ -30,7 +30,7 @@ def po2hash(f)
|
|||
elsif line[0..7] == 'msgstr "'
|
||||
msgstr = line[8..-2]
|
||||
end
|
||||
|
||||
|
||||
if !path.empty? and !msgstr.empty?
|
||||
add_translation(trs, path, msgstr)
|
||||
path = []
|
||||
|
|
|
@ -57,7 +57,7 @@ begin
|
|||
puts "<tr><th>Nodes</th><td>#{day_count}</td><td>#{week_count}</td><td>#{month_count}</td></tr>"
|
||||
|
||||
puts "</table>"
|
||||
|
||||
|
||||
puts "<h2>Top users editing over the past...</h2>"
|
||||
puts "<table>"
|
||||
puts "<tr><th>Day</th><th>Week</th><th>Month</th></tr>"
|
||||
|
|
|
@ -24,7 +24,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
amf_content "getway", "/1", [id]
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
amf_parse_response
|
||||
way = amf_result("/1")
|
||||
assert_equal 0, way[0]
|
||||
assert_equal "", way[1]
|
||||
|
@ -55,7 +55,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
amf_content "getway", "/1", [id]
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
amf_parse_response
|
||||
way = amf_result("/1")
|
||||
assert_equal 0, way[0]
|
||||
assert_equal "", way[1]
|
||||
|
@ -72,7 +72,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
amf_content "getway", "/1", [id]
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
amf_parse_response
|
||||
way = amf_result("/1")
|
||||
assert_equal 0, way[0]
|
||||
assert_equal "", way[1]
|
||||
|
@ -90,7 +90,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
amf_content "getway", "/1", [id]
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
amf_parse_response
|
||||
way = amf_result("/1")
|
||||
assert_equal 0, way[0]
|
||||
assert_equal "", way[1]
|
||||
|
@ -125,7 +125,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
amf_content "whichways", "/1", [minlon, minlat, maxlon, maxlat]
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
amf_parse_response
|
||||
|
||||
# check contents of message
|
||||
map = amf_result "/1"
|
||||
|
@ -230,7 +230,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
amf_content "whichways_deleted", "/1", bbox
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
amf_parse_response
|
||||
|
||||
map = amf_result "/1"
|
||||
assert_deleted_boundary_error map, " The server said: The maximum bbox size is 0.25, and your request was too large. Either request a smaller area, or use planet.osm"
|
||||
|
@ -280,11 +280,11 @@ class AmfControllerTest < ActionController::TestCase
|
|||
# instead of a version number...
|
||||
# try to get version 1
|
||||
v1 = ways(:way_with_versions_v1)
|
||||
{ latest.id => '',
|
||||
{ latest.id => '',
|
||||
v1.way_id => v1.timestamp.strftime("%d %b %Y, %H:%M:%S")
|
||||
}.each do |id, t|
|
||||
amf_content "getway_old", "/1", [id, t]
|
||||
post :amf_read
|
||||
post :amf_read
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
returned_way = amf_result("/1")
|
||||
|
@ -294,7 +294,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
assert_equal latest.version, returned_way[5]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# test that the server doesn't fall over when rubbish is passed
|
||||
# into the method args.
|
||||
|
@ -323,8 +323,8 @@ class AmfControllerTest < ActionController::TestCase
|
|||
v1 = ways(:way_with_versions_v1)
|
||||
# try to get last visible version of non-existent way
|
||||
# try to get specific version of non-existent way
|
||||
[[0, ''],
|
||||
[0, '1 Jan 1970, 00:00:00'],
|
||||
[[0, ''],
|
||||
[0, '1 Jan 1970, 00:00:00'],
|
||||
[v1.way_id, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")]
|
||||
].each do |id, t|
|
||||
amf_content "getway_old", "/1", [id, t]
|
||||
|
@ -351,7 +351,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
|
||||
# ['way',wayid,history]
|
||||
assert_equal 'way', history[0]
|
||||
assert_equal latest.id, history[1]
|
||||
assert_equal latest.id, history[1]
|
||||
# We use dates rather than version numbers here, because you might
|
||||
# have moved a node within a way (i.e. way version not incremented).
|
||||
# The timestamp is +1 because we say "give me the revision of 15:33:02",
|
||||
|
@ -384,14 +384,14 @@ class AmfControllerTest < ActionController::TestCase
|
|||
# ['node',nodeid,history]
|
||||
# note that (as per getway_history) we actually round up
|
||||
# to the next second
|
||||
assert_equal history[0], 'node',
|
||||
assert_equal history[0], 'node',
|
||||
'first element should be "node"'
|
||||
assert_equal history[1], latest.id,
|
||||
'second element should be the input node ID'
|
||||
assert_equal history[2].first[0],
|
||||
assert_equal history[2].first[0],
|
||||
(latest.timestamp + 1).strftime("%d %b %Y, %H:%M:%S"),
|
||||
'first element in third element (array) should be the latest version'
|
||||
assert_equal history[2].last[0],
|
||||
assert_equal history[2].last[0],
|
||||
(nodes(:node_with_versions_v1).timestamp + 1).strftime("%d %b %Y, %H:%M:%S"),
|
||||
'last element in third element (array) should be the initial version'
|
||||
end
|
||||
|
@ -419,13 +419,13 @@ class AmfControllerTest < ActionController::TestCase
|
|||
assert_response :success
|
||||
amf_parse_response
|
||||
result = amf_result("/1")
|
||||
|
||||
|
||||
assert_equal 0, result[0]
|
||||
assert_equal "", result[1]
|
||||
assert_equal nd.id, result[2]
|
||||
assert_equal nd.id, result[3]
|
||||
assert_equal nd.version+1, result[4]
|
||||
|
||||
|
||||
# Now try to update again, with a different lat/lon, using the updated version number
|
||||
lat = nd.lat+0.1
|
||||
lon = nd.lon-0.1
|
||||
|
@ -434,14 +434,14 @@ class AmfControllerTest < ActionController::TestCase
|
|||
assert_response :success
|
||||
amf_parse_response
|
||||
result = amf_result("/2")
|
||||
|
||||
|
||||
assert_equal 0, result[0]
|
||||
assert_equal "", result[1]
|
||||
assert_equal nd.id, result[2]
|
||||
assert_equal nd.id, result[3]
|
||||
assert_equal nd.version+2, result[4]
|
||||
end
|
||||
|
||||
|
||||
# Check that we can create a no valid poi
|
||||
# Using similar method for the node controller test
|
||||
def test_putpoi_create_valid
|
||||
|
@ -452,21 +452,21 @@ class AmfControllerTest < ActionController::TestCase
|
|||
lon = rand(100)-50 + rand
|
||||
# normal user has a changeset open
|
||||
changeset = changesets(:public_user_first_change)
|
||||
|
||||
|
||||
amf_content "putpoi", "/1", ["test@example.com:test", changeset.id, nil, nil, lon, lat, {}, nil]
|
||||
post :amf_write
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
result = amf_result("/1")
|
||||
|
||||
|
||||
# check the array returned by the amf
|
||||
assert_equal 5, result.size
|
||||
assert_equal 0, result[0], "expected to get the status ok from the amf"
|
||||
assert_equal 0, result[2], "The old id should be 0"
|
||||
assert result[3] > 0, "The new id should be greater than 0"
|
||||
assert_equal 1, result[4], "The new version should be 1"
|
||||
|
||||
# Finally check that the node that was saved has saved the data correctly
|
||||
|
||||
# Finally check that the node that was saved has saved the data correctly
|
||||
# in both the current and history tables
|
||||
# First check the current table
|
||||
current_node = Node.find(result[3].to_i)
|
||||
|
@ -482,7 +482,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
assert_in_delta lon, first_historic_node.lon, 0.00001, "The longitude was not retreuved correctly"
|
||||
assert_equal 0, first_historic_node.tags.size, "There seems to be a tag that have been attached to this node"
|
||||
assert_equal result[4], first_historic_node.version, "The version returned, is different to the one returned by the amf"
|
||||
|
||||
|
||||
####
|
||||
# This node has some tags
|
||||
tnd = Node.new
|
||||
|
@ -491,7 +491,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
lon = rand(100)-50 + rand
|
||||
# normal user has a changeset open
|
||||
changeset = changesets(:public_user_first_change)
|
||||
|
||||
|
||||
amf_content "putpoi", "/2", ["test@example.com:test", changeset.id, nil, nil, lon, lat, { "key" => "value", "ping" => "pong" }, nil]
|
||||
post :amf_write
|
||||
assert_response :success
|
||||
|
@ -504,8 +504,8 @@ class AmfControllerTest < ActionController::TestCase
|
|||
assert_equal 0, result[2], "The old id should be 0"
|
||||
assert result[3] > 0, "The new id should be greater than 0"
|
||||
assert_equal 1, result[4], "The new version should be 1"
|
||||
|
||||
# Finally check that the node that was saved has saved the data correctly
|
||||
|
||||
# Finally check that the node that was saved has saved the data correctly
|
||||
# in both the current and history tables
|
||||
# First check the current table
|
||||
current_node = Node.find(result[3].to_i)
|
||||
|
@ -524,7 +524,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
assert_equal({ "key" => "value", "ping" => "pong" }, first_historic_node.tags, "tags are different")
|
||||
assert_equal result[4], first_historic_node.version, "The version returned, is different to the one returned by the amf"
|
||||
end
|
||||
|
||||
|
||||
# try creating a POI with rubbish in the tags
|
||||
def test_putpoi_create_with_control_chars
|
||||
# This node has no tags
|
||||
|
@ -534,24 +534,24 @@ class AmfControllerTest < ActionController::TestCase
|
|||
lon = rand(100)-50 + rand
|
||||
# normal user has a changeset open
|
||||
changeset = changesets(:public_user_first_change)
|
||||
|
||||
|
||||
mostly_invalid = (0..31).to_a.map {|i| i.chr}.join
|
||||
tags = { "something" => "foo#{mostly_invalid}bar" }
|
||||
|
||||
|
||||
amf_content "putpoi", "/1", ["test@example.com:test", changeset.id, nil, nil, lon, lat, tags, nil]
|
||||
post :amf_write
|
||||
assert_response :success
|
||||
amf_parse_response
|
||||
result = amf_result("/1")
|
||||
|
||||
|
||||
# check the array returned by the amf
|
||||
assert_equal 5, result.size
|
||||
assert_equal 0, result[0], "Expected to get the status ok in the amf"
|
||||
assert_equal 0, result[2], "The old id should be 0"
|
||||
assert result[3] > 0, "The new id should be greater than 0"
|
||||
assert_equal 1, result[4], "The new version should be 1"
|
||||
|
||||
# Finally check that the node that was saved has saved the data correctly
|
||||
|
||||
# Finally check that the node that was saved has saved the data correctly
|
||||
# in both the current and history tables
|
||||
# First check the current table
|
||||
current_node = Node.find(result[3].to_i)
|
||||
|
@ -569,10 +569,10 @@ class AmfControllerTest < ActionController::TestCase
|
|||
lon = rand(100)-50 + rand
|
||||
# normal user has a changeset open
|
||||
changeset = changesets(:public_user_first_change)
|
||||
|
||||
|
||||
invalid = "\xc0\xc0"
|
||||
tags = { "something" => "foo#{invalid}bar" }
|
||||
|
||||
|
||||
amf_content "putpoi", "/1", ["test@example.com:test", changeset.id, nil, nil, lon, lat, tags, nil]
|
||||
post :amf_write
|
||||
assert_response :success
|
||||
|
@ -581,29 +581,29 @@ class AmfControllerTest < ActionController::TestCase
|
|||
|
||||
assert_equal 2, result.size
|
||||
assert_equal -1, result[0], "Expected to get the status FAIL in the amf"
|
||||
assert_equal "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1.", result[1]
|
||||
assert_equal "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1.", result[1]
|
||||
end
|
||||
|
||||
|
||||
def test_putpoi_delete_valid
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
def test_putpoi_delete_already_deleted
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
def test_putpoi_delete_not_found
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
def test_putpoi_invalid_latlon
|
||||
|
||||
|
||||
end
|
||||
|
||||
def test_startchangeset_invalid_xmlchar_comment
|
||||
invalid = "\035\022"
|
||||
comment = "foo#{invalid}bar"
|
||||
|
||||
|
||||
amf_content "startchangeset", "/1", ["test@example.com:test", Hash.new, nil, comment, 1]
|
||||
post :amf_write
|
||||
assert_response :success
|
||||
|
@ -691,7 +691,7 @@ class AmfControllerTest < ActionController::TestCase
|
|||
yield map, bbox
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# this should be what AMF controller returns when the bbox of a
|
||||
# whichways request is invalid or too large.
|
||||
def assert_boundary_error(map, msg=nil, error_hint=nil)
|
||||
|
|
|
@ -3,16 +3,16 @@ require 'api_controller'
|
|||
|
||||
class ApiControllerTest < ActionController::TestCase
|
||||
api_fixtures
|
||||
|
||||
|
||||
def setup
|
||||
super
|
||||
@badbigbbox = %w{ -0.1,-0.1,1.1,1.1 10,10,11,11 }
|
||||
@badmalformedbbox = %w{ -0.1 hello
|
||||
@badmalformedbbox = %w{ -0.1 hello
|
||||
10N2W10.1N2.1W }
|
||||
@badlatmixedbbox = %w{ 0,0.1,0.1,0 -0.1,80,0.1,70 0.24,54.34,0.25,54.33 }
|
||||
@badlonmixedbbox = %w{ 80,-0.1,70,0.1 54.34,0.24,54.33,0.25 }
|
||||
@badlonmixedbbox = %w{ 80,-0.1,70,0.1 54.34,0.24,54.33,0.25 }
|
||||
#@badlatlonoutboundsbbox = %w{ 191,-0.1,193,0.1 -190.1,89.9,-190,90 }
|
||||
@goodbbox = %w{ -0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0
|
||||
@goodbbox = %w{ -0.1,-0.1,0.1,0.1 51.1,-0.1,51.2,0
|
||||
-0.1,%20-0.1,%200.1,%200.1 -0.1edcd,-0.1d,0.1,0.1 -0.1E,-0.1E,0.1S,0.1N S0.1,W0.1,N0.1,E0.1}
|
||||
# That last item in the goodbbox really shouldn't be there, as the API should
|
||||
# reall reject it, however this is to test to see if the api changes.
|
||||
|
@ -26,7 +26,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
{ :controller => "api", :action => "capabilities" }
|
||||
)
|
||||
assert_recognizes(
|
||||
{ :controller => "api", :action => "capabilities" },
|
||||
{ :controller => "api", :action => "capabilities" },
|
||||
{ :path => "/api/0.6/capabilities", :method => :get }
|
||||
)
|
||||
assert_routing(
|
||||
|
@ -75,7 +75,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
# Should also test for the ways and relation
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# This differs from the above test in that we are making the bbox exactly
|
||||
# the same as the node we are looking at
|
||||
def test_map_inclusive
|
||||
|
@ -92,7 +92,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
# Should also test for the ways and relation
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_tracepoints
|
||||
point = gpx_files(:public_trace_file)
|
||||
minlon = point.longitude-0.001
|
||||
|
@ -108,7 +108,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_tracepoints_trackable
|
||||
point = gpx_files(:trackable_trace_file)
|
||||
minlon = point.longitude-0.002
|
||||
|
@ -130,7 +130,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_tracepoints_identifiable
|
||||
point = gpx_files(:identifiable_trace_file)
|
||||
minlon = point.longitude-0.002
|
||||
|
@ -153,7 +153,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_map_without_bbox
|
||||
["trackpoints", "map"].each do |tq|
|
||||
get tq
|
||||
|
@ -161,7 +161,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
assert_equal "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat", @response.body, "A bbox param was expected"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_traces_page_less_than_0
|
||||
-10.upto(-1) do |i|
|
||||
get :trackpoints, :page => i, :bbox => "-0.1,-0.1,0.1,0.1"
|
||||
|
@ -173,7 +173,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
assert_response :success, "The page number was #{i} and should have been accepted"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_bbox_too_big
|
||||
@badbigbbox.each do |bbox|
|
||||
[ "trackpoints", "map" ].each do |tq|
|
||||
|
@ -183,7 +183,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_bbox_malformed
|
||||
@badmalformedbbox.each do |bbox|
|
||||
[ "trackpoints", "map" ].each do |tq|
|
||||
|
@ -193,7 +193,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_bbox_lon_mixedup
|
||||
@badlonmixedbbox.each do |bbox|
|
||||
[ "trackpoints", "map" ].each do |tq|
|
||||
|
@ -203,7 +203,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_bbox_lat_mixedup
|
||||
@badlatmixedbbox.each do |bbox|
|
||||
["trackpoints", "map"].each do |tq|
|
||||
|
@ -213,7 +213,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# We can't actually get an out of bounds error, as the bbox is sanitised.
|
||||
#def test_latlon_outofbounds
|
||||
# @badlatlonoutboundsbbox.each do |bbox|
|
||||
|
@ -225,8 +225,8 @@ class ApiControllerTest < ActionController::TestCase
|
|||
# end
|
||||
# end
|
||||
#end
|
||||
|
||||
# MySQL and Postgres require that the C based functions are installed for
|
||||
|
||||
# MySQL and Postgres require that the C based functions are installed for
|
||||
# this test to work. More information is available from:
|
||||
# http://wiki.openstreetmap.org/wiki/Rails#Installing_the_quadtile_functions
|
||||
# or by looking at the readme in db/README
|
||||
|
@ -235,7 +235,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
get :changes
|
||||
assert_response :success
|
||||
#print @response.body
|
||||
# As we have loaded the fixtures, we can assume that there are no
|
||||
# As we have loaded the fixtures, we can assume that there are no
|
||||
# changes at the time we have frozen at
|
||||
now = Time.now.getutc
|
||||
hourago = now - 1.hour
|
||||
|
@ -244,7 +244,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
Timecop.return
|
||||
end
|
||||
|
||||
|
||||
def test_changes_zoom_invalid
|
||||
zoom_to_test = %w{ p -1 0 17 one two }
|
||||
zoom_to_test.each do |zoom|
|
||||
|
@ -253,7 +253,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
assert_equal @response.body, "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_changes_zoom_valid
|
||||
1.upto(16) do |zoom|
|
||||
get :changes, :zoom => zoom
|
||||
|
@ -265,7 +265,7 @@ class ApiControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_hours_invalid
|
||||
invalid = %w{ -21 335 -1 0 25 26 100 one two three ping pong : }
|
||||
invalid.each do |hour|
|
||||
|
@ -274,14 +274,14 @@ class ApiControllerTest < ActionController::TestCase
|
|||
assert_equal @response.body, "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours", "Problem with the hour: #{hour}."
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_hours_valid
|
||||
1.upto(24) do |hour|
|
||||
get :changes, :hours => hour
|
||||
assert_response :success
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_capabilities
|
||||
get :capabilities
|
||||
assert_response :success
|
||||
|
|
|
@ -1922,7 +1922,7 @@ EOF
|
|||
assert_no_difference('ChangesetComment.count') do
|
||||
post :comment, { :id => changesets(:normal_user_closed_change).id, :text => '' }
|
||||
end
|
||||
assert_response :bad_request
|
||||
assert_response :bad_request
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -2062,7 +2062,7 @@ EOF
|
|||
post :unhide_comment, { :id => comment.id }
|
||||
assert_response :unauthorized
|
||||
end
|
||||
|
||||
|
||||
basic_authorization(users(:public_user).email, 'test')
|
||||
|
||||
# not a moderator
|
||||
|
|
|
@ -89,12 +89,12 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
get :new
|
||||
assert_response :redirect
|
||||
assert_redirected_to :controller => :user, :action => "login", :referer => "/diary/new"
|
||||
# Now pretend to login by using the session hash, with the
|
||||
# Now pretend to login by using the session hash, with the
|
||||
# id of the person we want to login as through session(:user)=user.id
|
||||
get(:new, nil, {'user' => users(:normal_user).id})
|
||||
assert_response :success
|
||||
#print @response.body
|
||||
|
||||
|
||||
#print @response.to_yaml
|
||||
assert_select "title", :text => /New Diary Entry/, :count => 1
|
||||
assert_select "div.content-heading", :count => 1 do
|
||||
|
@ -112,16 +112,16 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_editing_diary_entry
|
||||
entry = diary_entries(:normal_user_entry_1)
|
||||
|
||||
# Make sure that you are redirected to the login page when you are
|
||||
# Make sure that you are redirected to the login page when you are
|
||||
# not logged in, without and with the id of the entry you want to edit
|
||||
get :edit, :display_name => entry.user.display_name, :id => entry.id
|
||||
assert_response :redirect
|
||||
assert_redirected_to :controller => :user, :action => "login", :referer => "/user/#{entry.user.display_name}/diary/#{entry.id}/edit"
|
||||
|
||||
|
||||
# Verify that you get a not found error, when you pass a bogus id
|
||||
get(:edit, {:display_name => entry.user.display_name, :id => 9999}, {'user' => entry.user.id})
|
||||
assert_response :not_found
|
||||
|
@ -129,7 +129,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
assert_select "h2", :text => "No entry with the id: 9999", :count => 1
|
||||
end
|
||||
|
||||
# Now pass the id, and check that you can edit it, when using the same
|
||||
# Now pass the id, and check that you can edit it, when using the same
|
||||
# user as the person who created the entry
|
||||
get(:edit, {:display_name => entry.user.display_name, :id => entry.id}, {'user' => entry.user.id})
|
||||
assert_response :success
|
||||
|
@ -157,13 +157,13 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
new_latitude = "1.1"
|
||||
new_longitude = "2.2"
|
||||
new_language_code = "en"
|
||||
post(:edit, {:display_name => entry.user.display_name, :id => entry.id, 'commit' => 'save',
|
||||
post(:edit, {:display_name => entry.user.display_name, :id => entry.id, 'commit' => 'save',
|
||||
'diary_entry'=>{'title' => new_title, 'body' => new_body, 'latitude' => new_latitude,
|
||||
'longitude' => new_longitude, 'language_code' => new_language_code} },
|
||||
{'user' => entry.user.id})
|
||||
assert_response :redirect
|
||||
assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id
|
||||
|
||||
|
||||
# Now check that the new data is rendered, when logged in
|
||||
get :view, {:display_name => entry.user.display_name, :id => entry.id}, {'user' => entry.user.id}
|
||||
assert_response :success
|
||||
|
@ -203,13 +203,13 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_edit_diary_entry_i18n
|
||||
get :edit, {:display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id}, {'user' => users(:normal_user).id}
|
||||
assert_response :success
|
||||
assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry"
|
||||
end
|
||||
|
||||
|
||||
def test_create_diary_entry
|
||||
# Make sure that you are redirected to the login page when you
|
||||
# are not logged in
|
||||
|
@ -245,7 +245,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
new_longitude = "2.2"
|
||||
new_language_code = "en"
|
||||
assert_difference "DiaryEntry.count", 1 do
|
||||
post(:new, {'commit' => 'save',
|
||||
post(:new, {'commit' => 'save',
|
||||
'diary_entry'=>{'title' => new_title, 'body' => new_body, 'latitude' => new_latitude,
|
||||
'longitude' => new_longitude, 'language_code' => new_language_code} },
|
||||
{:user => users(:normal_user).id})
|
||||
|
@ -260,14 +260,14 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
assert_equal new_longitude.to_f, entry.longitude
|
||||
assert_equal new_language_code, entry.language_code
|
||||
end
|
||||
|
||||
|
||||
def test_creating_diary_comment
|
||||
entry = diary_entries(:normal_user_entry_1)
|
||||
|
||||
# Make sure that you are denied when you are not logged in
|
||||
post :comment, :display_name => entry.user.display_name, :id => entry.id
|
||||
assert_response :forbidden
|
||||
|
||||
|
||||
# Verify that you get a not found error, when you pass a bogus id
|
||||
post :comment, {:display_name => entry.user.display_name, :id => 9999}, {:user => users(:public_user).id}
|
||||
assert_response :not_found
|
||||
|
@ -304,7 +304,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
assert_select ".richtext", :text => /New comment/, :count => 1
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Check that you can get the expected response and template for all available languages
|
||||
# Should test that there are no <span class="translation_missing">
|
||||
def test_listing_diary_entries
|
||||
|
@ -312,14 +312,14 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
assert_response :success, "Should be able to list the diary entries in locale"
|
||||
assert_template 'list', "Should use the list template in locale"
|
||||
assert_select "span[class=translation_missing]", false, "Missing translation in list of diary entries"
|
||||
|
||||
|
||||
# Now try to find a specific user's diary entry
|
||||
get :list, {:display_name => users(:normal_user).display_name}
|
||||
assert_response :success, "Should be able to list the diary entries for a user in locale"
|
||||
assert_template 'list', "Should use the list template for a user in locale"
|
||||
assert_no_missing_translations
|
||||
end
|
||||
|
||||
|
||||
def test_rss
|
||||
get :rss, {:format => :rss}
|
||||
assert_response :success, "Should be able to get a diary RSS"
|
||||
|
@ -331,13 +331,13 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_rss_language
|
||||
get :rss, {:language => diary_entries(:normal_user_entry_1).language_code, :format => :rss}
|
||||
assert_response :success, "Should be able to get a specific language diary RSS"
|
||||
assert_select "rss>channel>item", :count => 1 #, "Diary entries should be filtered by language"
|
||||
end
|
||||
|
||||
|
||||
# def test_rss_nonexisting_language
|
||||
# get :rss, {:language => 'xx', :format => :rss}
|
||||
# assert_response :not_found, "Should not be able to get a nonexisting language diary RSS"
|
||||
|
@ -354,7 +354,7 @@ class DiaryEntryControllerTest < ActionController::TestCase
|
|||
assert_response :success, "Should be able to get a specific users diary RSS"
|
||||
assert_select "rss>channel>item", :count => 2 #, "Diary entries should be filtered by user"
|
||||
end
|
||||
|
||||
|
||||
def test_rss_nonexisting_user
|
||||
# Try a user that has never existed
|
||||
get :rss, {:display_name => 'fakeUsername76543', :format => :rss}
|
||||
|
|
|
@ -22,7 +22,7 @@ class ExportControllerTest < ActionController::TestCase
|
|||
assert_response :redirect
|
||||
assert_redirected_to "http://api.openstreetmap.org/api/#{API_VERSION}/map?bbox=0.0,50.0,1.0,51.0"
|
||||
end
|
||||
|
||||
|
||||
###
|
||||
# test the finish action for mapnik images
|
||||
def test_finish_mapnik
|
||||
|
|
|
@ -31,7 +31,7 @@ class NodeControllerTest < ActionController::TestCase
|
|||
def test_create
|
||||
# cannot read password from fixture as it is stored as MD5 digest
|
||||
## First try with no auth
|
||||
|
||||
|
||||
# create a node with random lat/lon
|
||||
lat = rand(100)-50 + rand
|
||||
lon = rand(100)-50 + rand
|
||||
|
@ -45,11 +45,11 @@ class NodeControllerTest < ActionController::TestCase
|
|||
# hope for unauthorized
|
||||
assert_response :unauthorized, "node upload did not return unauthorized status"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Now try with the user which doesn't have their data public
|
||||
basic_authorization(users(:normal_user).email, "test")
|
||||
|
||||
|
||||
# create a node with random lat/lon
|
||||
lat = rand(100)-50 + rand
|
||||
lon = rand(100)-50 + rand
|
||||
|
@ -64,10 +64,10 @@ class NodeControllerTest < ActionController::TestCase
|
|||
assert_require_public_data "node create did not return forbidden status"
|
||||
|
||||
|
||||
|
||||
|
||||
## Now try with the user that has the public data
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
||||
|
||||
# create a node with random lat/lon
|
||||
lat = rand(100)-50 + rand
|
||||
lon = rand(100)-50 + rand
|
||||
|
@ -99,7 +99,7 @@ class NodeControllerTest < ActionController::TestCase
|
|||
changeset = changesets(:public_user_first_change)
|
||||
lat = 3.434
|
||||
lon = 3.23
|
||||
|
||||
|
||||
# test that the upload is rejected when xml is valid, but osm doc isn't
|
||||
content("<create/>")
|
||||
put :create
|
||||
|
@ -166,10 +166,10 @@ class NodeControllerTest < ActionController::TestCase
|
|||
## first try to delete node without auth
|
||||
delete :delete, :id => current_nodes(:visible_node).id
|
||||
assert_response :unauthorized
|
||||
|
||||
|
||||
|
||||
|
||||
## now set auth for the non-data public user
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
|
||||
# try to delete with an invalid (closed) changeset
|
||||
content update_changeset(current_nodes(:visible_node).to_xml,
|
||||
|
@ -209,10 +209,10 @@ class NodeControllerTest < ActionController::TestCase
|
|||
assert_require_public_data
|
||||
"shouldn't be able to delete a node used in a relation (#{@response.body})"
|
||||
|
||||
|
||||
|
||||
|
||||
## now set auth for the public data user
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
|
||||
# try to delete with an invalid (closed) changeset
|
||||
content update_changeset(current_nodes(:visible_node).to_xml,
|
||||
|
@ -228,13 +228,13 @@ class NodeControllerTest < ActionController::TestCase
|
|||
# try to delete a node with a different ID
|
||||
content(nodes(:public_visible_node).to_xml)
|
||||
delete :delete, :id => current_nodes(:visible_node).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"should not be able to delete a node with a different ID from the XML"
|
||||
|
||||
# try to delete a node rubbish in the payloads
|
||||
content("<delete/>")
|
||||
delete :delete, :id => current_nodes(:visible_node).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"should not be able to delete a node without a valid XML payload"
|
||||
|
||||
# valid delete now takes a payload
|
||||
|
@ -282,11 +282,11 @@ class NodeControllerTest < ActionController::TestCase
|
|||
content current_nodes(:visible_node).to_xml
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :unauthorized
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Second test with the private user
|
||||
|
||||
|
||||
# setup auth
|
||||
basic_authorization(users(:normal_user).email, "test")
|
||||
|
||||
|
@ -317,7 +317,7 @@ class NodeControllerTest < ActionController::TestCase
|
|||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lat', -91.0);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_require_public_data "node at lat=-91 should be forbidden, when data isn't public"
|
||||
|
||||
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lon', 181.0);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_require_public_data "node at lon=181 should be forbidden, when data isn't public"
|
||||
|
@ -325,20 +325,20 @@ class NodeControllerTest < ActionController::TestCase
|
|||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lon', -181.0);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_require_public_data "node at lon=-181 should be forbidden, when data isn't public"
|
||||
|
||||
|
||||
## finally, produce a good request which should work
|
||||
content current_nodes(:visible_node).to_xml
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_require_public_data "should have failed with a forbidden when data isn't public"
|
||||
|
||||
|
||||
## Finally test with the public user
|
||||
|
||||
|
||||
# try and update a node without authorisation
|
||||
# first try to delete node without auth
|
||||
content current_nodes(:visible_node).to_xml
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :forbidden
|
||||
|
||||
|
||||
# setup auth
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
||||
|
@ -369,7 +369,7 @@ class NodeControllerTest < ActionController::TestCase
|
|||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lat', -91.0);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :bad_request, "node at lat=-91 should be rejected"
|
||||
|
||||
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lon', 181.0);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :bad_request, "node at lon=181 should be rejected"
|
||||
|
@ -382,34 +382,34 @@ class NodeControllerTest < ActionController::TestCase
|
|||
current_node_version = current_nodes(:visible_node).version
|
||||
|
||||
# try and submit a version behind
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml,
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml,
|
||||
'version', current_node_version - 1);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :conflict, "should have failed on old version number"
|
||||
|
||||
|
||||
# try and submit a version ahead
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml,
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml,
|
||||
'version', current_node_version + 1);
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :conflict, "should have failed on skipped version number"
|
||||
|
||||
# try and submit total crap in the version field
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml,
|
||||
content xml_attr_rewrite(current_nodes(:visible_node).to_xml,
|
||||
'version', 'p1r4t3s!');
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :conflict,
|
||||
assert_response :conflict,
|
||||
"should not be able to put 'p1r4at3s!' in the version field"
|
||||
|
||||
|
||||
## try an update with the wrong ID
|
||||
content current_nodes(:public_visible_node).to_xml
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"should not be able to update a node with a different ID from the XML"
|
||||
|
||||
## try an update with a minimal valid XML doc which isn't a well-formed OSM doc.
|
||||
content "<update/>"
|
||||
put :update, :id => current_nodes(:visible_node).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"should not be able to update a node with non-OSM XML doc."
|
||||
|
||||
## finally, produce a good request which should work
|
||||
|
@ -464,7 +464,7 @@ class NodeControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content node_xml
|
||||
put :update, :id => current_nodes(:public_visible_node).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"adding duplicate tags to a node should fail with 'bad request'"
|
||||
assert_equal "Element node/#{current_nodes(:public_visible_node).id} has duplicate tags with key #{current_node_tags(:t1).k}", @response.body
|
||||
end
|
||||
|
@ -475,20 +475,20 @@ class NodeControllerTest < ActionController::TestCase
|
|||
basic_authorization(users(:normal_user).email, "test")
|
||||
changeset_id = changesets(:normal_user_first_change).id
|
||||
|
||||
# try and put something into a string that the API might
|
||||
# try and put something into a string that the API might
|
||||
# use unquoted and therefore allow code injection...
|
||||
content "<osm><node lat='0' lon='0' changeset='#{changeset_id}'>" +
|
||||
'<tag k="#{@user.inspect}" v="0"/>' +
|
||||
'</node></osm>'
|
||||
put :create
|
||||
assert_require_public_data "Shouldn't be able to create with non-public user"
|
||||
|
||||
|
||||
|
||||
|
||||
## Then try with the public data user
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
changeset_id = changesets(:public_user_first_change).id
|
||||
|
||||
# try and put something into a string that the API might
|
||||
# try and put something into a string that the API might
|
||||
# use unquoted and therefore allow code injection...
|
||||
content "<osm><node lat='0' lon='0' changeset='#{changeset_id}'>" +
|
||||
'<tag k="#{@user.inspect}" v="0"/>' +
|
||||
|
@ -500,13 +500,13 @@ class NodeControllerTest < ActionController::TestCase
|
|||
# find the node in the database
|
||||
checknode = Node.find(nodeid)
|
||||
assert_not_nil checknode, "node not found in data base after upload"
|
||||
|
||||
|
||||
# and grab it using the api
|
||||
get :read, :id => nodeid
|
||||
assert_response :success
|
||||
apinode = Node.from_xml(@response.body)
|
||||
assert_not_nil apinode, "downloaded node is nil, but shouldn't be"
|
||||
|
||||
|
||||
# check the tags are not corrupted
|
||||
assert_equal checknode.tags, apinode.tags
|
||||
assert apinode.tags.include?('#{@user.inspect}')
|
||||
|
|
|
@ -724,7 +724,7 @@ class NotesControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
get :feed, {:bbox => "1,1,1.2,1.2", :format => "rss"}
|
||||
assert_response :success
|
||||
assert_response :success
|
||||
assert_equal "application/rss+xml", @response.content_type
|
||||
assert_select "rss", :count => 1 do
|
||||
assert_select "channel", :count => 1 do
|
||||
|
@ -755,6 +755,6 @@ class NotesControllerTest < ActionController::TestCase
|
|||
assert_response :success
|
||||
|
||||
get :mine, {:display_name => "non-existent"}
|
||||
assert_response :not_found
|
||||
assert_response :not_found
|
||||
end
|
||||
end
|
||||
|
|
|
@ -89,8 +89,8 @@ class OauthClientsControllerTest < ActionController::TestCase
|
|||
}
|
||||
end
|
||||
assert_response :success
|
||||
assert_template "new"
|
||||
|
||||
assert_template "new"
|
||||
|
||||
assert_difference "ClientApplication.count", 1 do
|
||||
post :create, {
|
||||
:display_name => user.display_name,
|
||||
|
@ -161,7 +161,7 @@ class OauthClientsControllerTest < ActionController::TestCase
|
|||
assert_template "not_found"
|
||||
|
||||
put :update, {
|
||||
:display_name => user.display_name,
|
||||
:display_name => user.display_name,
|
||||
:id => client.id,
|
||||
:client_application => {
|
||||
:name => "New Name",
|
||||
|
@ -174,7 +174,7 @@ class OauthClientsControllerTest < ActionController::TestCase
|
|||
assert_template "edit"
|
||||
|
||||
put :update, {
|
||||
:display_name => user.display_name,
|
||||
:display_name => user.display_name,
|
||||
:id => client.id,
|
||||
:client_application => {
|
||||
:name => "New Name",
|
||||
|
|
|
@ -27,16 +27,16 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
|
||||
##
|
||||
# test the version call by submitting several revisions of a new node
|
||||
# to the API and ensuring that later calls to version return the
|
||||
# to the API and ensuring that later calls to version return the
|
||||
# matching versions of the object.
|
||||
#
|
||||
##
|
||||
# FIXME Move this test to being an integration test since it spans multiple controllers
|
||||
# FIXME Move this test to being an integration test since it spans multiple controllers
|
||||
def test_version
|
||||
## First try this with a non-public user
|
||||
basic_authorization(users(:normal_user).email, "test")
|
||||
changeset_id = changesets(:normal_user_first_change).id
|
||||
|
||||
|
||||
# setup a simple XML node
|
||||
xml_doc = current_nodes(:visible_node).to_xml
|
||||
xml_node = xml_doc.find("//osm/node").first
|
||||
|
@ -50,7 +50,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
versions[xml_node['version']] = xml_doc.to_s
|
||||
|
||||
# randomly move the node about
|
||||
20.times do
|
||||
20.times do
|
||||
# move the node somewhere else
|
||||
xml_node['lat'] = precision(rand * 180 - 90).to_s
|
||||
xml_node['lon'] = precision(rand * 360 - 180).to_s
|
||||
|
@ -65,7 +65,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
# add a bunch of random tags
|
||||
30.times do
|
||||
30.times do
|
||||
xml_tag = XML::Node.new("tag")
|
||||
xml_tag['k'] = random_string
|
||||
xml_tag['v'] = random_string
|
||||
|
@ -83,7 +83,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
|
||||
# probably should check that they didn't get written to the database
|
||||
|
||||
|
||||
|
||||
## Now do it with the public user
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
changeset_id = changesets(:public_user_first_change).id
|
||||
|
@ -101,7 +101,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
versions[xml_node['version']] = xml_doc.to_s
|
||||
|
||||
# randomly move the node about
|
||||
20.times do
|
||||
20.times do
|
||||
# move the node somewhere else
|
||||
xml_node['lat'] = precision(rand * 180 - 90).to_s
|
||||
xml_node['lon'] = precision(rand * 360 - 180).to_s
|
||||
|
@ -116,7 +116,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
# add a bunch of random tags
|
||||
30.times do
|
||||
30.times do
|
||||
xml_tag = XML::Node.new("tag")
|
||||
xml_tag['k'] = random_string
|
||||
xml_tag['v'] = random_string
|
||||
|
@ -145,21 +145,21 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
assert_nodes_are_equal check_node, api_node
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_not_found_version
|
||||
check_not_found_id_version(70000,312344)
|
||||
check_not_found_id_version(-1, -13)
|
||||
check_not_found_id_version(nodes(:visible_node).id, 24354)
|
||||
check_not_found_id_version(24356, nodes(:visible_node).version)
|
||||
end
|
||||
|
||||
|
||||
def check_not_found_id_version(id, version)
|
||||
get :version, :id => id, :version => version
|
||||
assert_response :not_found
|
||||
rescue ActionController::UrlGenerationError => ex
|
||||
assert_match /No route matches/, ex.to_s
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# Test that getting the current version is identical to picking
|
||||
# that version with the version URI call.
|
||||
|
@ -181,7 +181,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# test the redaction of an old version of a node, while being
|
||||
# test the redaction of an old version of a node, while being
|
||||
# authorised as a normal user.
|
||||
def test_redact_node_normal_user
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
@ -200,10 +200,10 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
do_redact_node(nodes(:node_with_versions_v4),
|
||||
redactions(:example))
|
||||
assert_response :bad_request, "shouldn't be OK to redact current version as moderator."
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# test that redacted nodes aren't visible, regardless of
|
||||
# test that redacted nodes aren't visible, regardless of
|
||||
# authorisation except as moderator...
|
||||
def test_version_redacted
|
||||
node = nodes(:redacted_node_redacted_version)
|
||||
|
@ -234,7 +234,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# test the redaction of an old version of a node, while being
|
||||
# test the redaction of an old version of a node, while being
|
||||
# authorised as a moderator.
|
||||
def test_redact_node_moderator
|
||||
node = nodes(:node_with_versions_v3)
|
||||
|
@ -249,7 +249,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
assert_response :forbidden, "After redaction, node should be gone for moderator, when flag not passed."
|
||||
get :version, :id => node.node_id, :version => node.version, :show_redactions => 'true'
|
||||
assert_response :success, "After redaction, node should not be gone for moderator, when flag passed."
|
||||
|
||||
|
||||
# and when accessed via history
|
||||
get :history, :id => node.node_id
|
||||
assert_response :success, "Redaction shouldn't have stopped history working."
|
||||
|
@ -274,7 +274,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
# check can't see the redacted data
|
||||
get :version, :id => node.node_id, :version => node.version
|
||||
assert_response :forbidden, "Redacted node shouldn't be visible via the version API."
|
||||
|
||||
|
||||
# and when accessed via history
|
||||
get :history, :id => node.node_id
|
||||
assert_response :success, "Redaction shouldn't have stopped history working."
|
||||
|
@ -284,7 +284,7 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
def do_redact_node(node, redaction)
|
||||
get :version, :id => node.node_id, :version => node.version
|
||||
assert_response :success, "should be able to get version #{node.version} of node #{node.node_id}."
|
||||
|
||||
|
||||
# now redact it
|
||||
post :redact, :id => node.node_id, :version => node.version, :redaction => redaction.id
|
||||
end
|
||||
|
@ -293,14 +293,14 @@ class OldNodeControllerTest < ActionController::TestCase
|
|||
# get the current version of the node
|
||||
current_node = with_controller(NodeController.new) do
|
||||
get :read, :id => node_id
|
||||
assert_response :success, "cant get current node #{node_id}"
|
||||
assert_response :success, "cant get current node #{node_id}"
|
||||
Node.from_xml(@response.body)
|
||||
end
|
||||
assert_not_nil current_node, "getting node #{node_id} returned nil"
|
||||
|
||||
# get the "old" version of the node from the old_node interface
|
||||
get :version, :id => node_id, :version => current_node.version
|
||||
assert_response :success, "cant get old node #{node_id}, v#{current_node.version}"
|
||||
assert_response :success, "cant get old node #{node_id}, v#{current_node.version}"
|
||||
old_node = Node.from_xml(@response.body)
|
||||
|
||||
# check the nodes are the same
|
||||
|
|
|
@ -44,7 +44,7 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# test the redaction of an old version of a relation, while being
|
||||
# test the redaction of an old version of a relation, while being
|
||||
# authorised as a normal user.
|
||||
def test_redact_relation_normal_user
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
@ -63,10 +63,10 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
do_redact_relation(relations(:relation_with_versions_v4),
|
||||
redactions(:example))
|
||||
assert_response :bad_request, "shouldn't be OK to redact current version as moderator."
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# test that redacted relations aren't visible, regardless of
|
||||
# test that redacted relations aren't visible, regardless of
|
||||
# authorisation except as moderator...
|
||||
def test_version_redacted
|
||||
relation = relations(:relation_with_redacted_versions_v2)
|
||||
|
@ -98,7 +98,7 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# test the redaction of an old version of a relation, while being
|
||||
# test the redaction of an old version of a relation, while being
|
||||
# authorised as a moderator.
|
||||
def test_redact_relation_moderator
|
||||
relation = relations(:relation_with_versions_v3)
|
||||
|
@ -113,7 +113,7 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
assert_response :forbidden, "After redaction, node should be gone for moderator, when flag not passed."
|
||||
get :version, :id => relation.relation_id, :version => relation.version, :show_redactions => 'true'
|
||||
assert_response :success, "After redaction, node should not be gone for moderator, when flag passed."
|
||||
|
||||
|
||||
# and when accessed via history
|
||||
get :history, :id => relation.relation_id
|
||||
assert_response :success, "Redaction shouldn't have stopped history working."
|
||||
|
@ -138,7 +138,7 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
# check can't see the redacted data
|
||||
get :version, :id => relation.relation_id, :version => relation.version
|
||||
assert_response :forbidden, "Redacted node shouldn't be visible via the version API."
|
||||
|
||||
|
||||
# and when accessed via history
|
||||
get :history, :id => relation.relation_id
|
||||
assert_response :success, "Redaction shouldn't have stopped history working."
|
||||
|
@ -183,7 +183,7 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
assert_response :success, "couldn't get relation #{relation_id}, v#{history_relation.version}"
|
||||
version_relation = Relation.from_xml(@response.body)
|
||||
assert_not_nil version_relation, "failed to parse #{relation_id}, v#{history_relation.version}"
|
||||
|
||||
|
||||
assert_relations_are_equal history_relation, version_relation
|
||||
end
|
||||
end
|
||||
|
@ -191,7 +191,7 @@ class OldRelationControllerTest < ActionController::TestCase
|
|||
def do_redact_relation(relation, redaction)
|
||||
get :version, :id => relation.relation_id, :version => relation.version
|
||||
assert_response :success, "should be able to get version #{relation.version} of node #{relation.relation_id}."
|
||||
|
||||
|
||||
# now redact it
|
||||
post :redact, :id => relation.relation_id, :version => relation.version, :redaction => redaction.id
|
||||
end
|
||||
|
|
|
@ -30,19 +30,19 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
get :history, :id => ways(:visible_way).way_id
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
|
||||
def test_history_invisible
|
||||
# check that an invisible way's history is returned properly
|
||||
get :history, :id => ways(:invisible_way).way_id
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
|
||||
def test_history_invalid
|
||||
# check chat a non-existent way is not returned
|
||||
get :history, :id => 0
|
||||
assert_response :not_found
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# check that we can retrieve versions of a way
|
||||
def test_version
|
||||
|
@ -52,7 +52,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# check that returned history is the same as getting all
|
||||
# check that returned history is the same as getting all
|
||||
# versions of a way from the api.
|
||||
def test_history_equals_versions
|
||||
check_history_equals_versions(current_ways(:visible_way).id)
|
||||
|
@ -70,7 +70,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# test the redaction of an old version of a way, while being
|
||||
# test the redaction of an old version of a way, while being
|
||||
# authorised as a normal user.
|
||||
def test_redact_way_normal_user
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
@ -89,10 +89,10 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
do_redact_way(ways(:way_with_versions_v4),
|
||||
redactions(:example))
|
||||
assert_response :bad_request, "shouldn't be OK to redact current version as moderator."
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# test that redacted ways aren't visible, regardless of
|
||||
# test that redacted ways aren't visible, regardless of
|
||||
# authorisation except as moderator...
|
||||
def test_version_redacted
|
||||
way = ways(:way_with_redacted_versions_v2)
|
||||
|
@ -124,7 +124,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
##
|
||||
# test the redaction of an old version of a way, while being
|
||||
# test the redaction of an old version of a way, while being
|
||||
# authorised as a moderator.
|
||||
def test_redact_way_moderator
|
||||
way = ways(:way_with_versions_v3)
|
||||
|
@ -139,7 +139,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
assert_response :forbidden, "After redaction, node should be gone for moderator, when flag not passed."
|
||||
get :version, :id => way.way_id, :version => way.version, :show_redactions => 'true'
|
||||
assert_response :success, "After redaction, node should not be gone for moderator, when flag passed."
|
||||
|
||||
|
||||
# and when accessed via history
|
||||
get :history, :id => way.way_id
|
||||
assert_response :success, "Redaction shouldn't have stopped history working."
|
||||
|
@ -164,7 +164,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
# check can't see the redacted data
|
||||
get :version, :id => way.way_id, :version => way.version
|
||||
assert_response :forbidden, "Redacted node shouldn't be visible via the version API."
|
||||
|
||||
|
||||
# and when accessed via history
|
||||
get :history, :id => way.way_id
|
||||
assert_response :success, "Redaction shouldn't have stopped history working."
|
||||
|
@ -209,7 +209,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
assert_response :success, "couldn't get way #{way_id}, v#{history_way.version}"
|
||||
version_way = Way.from_xml(@response.body)
|
||||
assert_not_nil version_way, "failed to parse #{way_id}, v#{history_way.version}"
|
||||
|
||||
|
||||
assert_ways_are_equal history_way, version_way
|
||||
end
|
||||
end
|
||||
|
@ -217,7 +217,7 @@ class OldWayControllerTest < ActionController::TestCase
|
|||
def do_redact_way(way, redaction)
|
||||
get :version, :id => way.way_id, :version => way.version
|
||||
assert_response :success, "should be able to get version #{way.version} of node #{way.way_id}."
|
||||
|
||||
|
||||
# now redact it
|
||||
post :redact, :id => way.way_id, :version => way.version, :redaction => redaction.id
|
||||
end
|
||||
|
|
|
@ -68,7 +68,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
# check that all relations containing a particular node, and no extra
|
||||
# relations, are returned from the relations_for_node call.
|
||||
def test_relations_for_node
|
||||
check_relations_for_element(:relations_for_node, "node",
|
||||
check_relations_for_element(:relations_for_node, "node",
|
||||
current_nodes(:node_used_by_relationship).id,
|
||||
[ :visible_relation, :used_relation ])
|
||||
end
|
||||
|
@ -146,7 +146,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
|
||||
def test_create
|
||||
basic_authorization users(:normal_user).email, "test"
|
||||
|
||||
|
||||
# put the relation in a dummy fixture changset
|
||||
changeset_id = changesets(:normal_user_first_change).id
|
||||
|
||||
|
@ -154,7 +154,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
content "<osm><relation changeset='#{changeset_id}'><tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for forbidden, due to user
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"relation upload should have failed with forbidden"
|
||||
|
||||
###
|
||||
|
@ -166,11 +166,11 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for forbidden due to user
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"relation upload did not return forbidden status"
|
||||
|
||||
|
||||
###
|
||||
# create an relation with a node as member, this time test that we don't
|
||||
# create an relation with a node as member, this time test that we don't
|
||||
# need a role attribute to be included
|
||||
nid = current_nodes(:used_node_1).id
|
||||
content "<osm><relation changeset='#{changeset_id}'>" +
|
||||
|
@ -178,7 +178,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for forbidden due to user
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"relation upload did not return forbidden status"
|
||||
|
||||
###
|
||||
|
@ -191,14 +191,14 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for forbidden, due to user
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"relation upload did not return success status"
|
||||
|
||||
|
||||
|
||||
## Now try with the public user
|
||||
basic_authorization users(:public_user).email, "test"
|
||||
|
||||
|
||||
# put the relation in a dummy fixture changset
|
||||
changeset_id = changesets(:public_user_first_change).id
|
||||
|
||||
|
@ -206,23 +206,23 @@ class RelationControllerTest < ActionController::TestCase
|
|||
content "<osm><relation changeset='#{changeset_id}'><tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for success
|
||||
assert_response :success,
|
||||
assert_response :success,
|
||||
"relation upload did not return success status"
|
||||
# read id of created relation and search for it
|
||||
relationid = @response.body
|
||||
checkrelation = Relation.find(relationid)
|
||||
assert_not_nil checkrelation,
|
||||
assert_not_nil checkrelation,
|
||||
"uploaded relation not found in data base after upload"
|
||||
# compare values
|
||||
assert_equal checkrelation.members.length, 0,
|
||||
assert_equal checkrelation.members.length, 0,
|
||||
"saved relation contains members but should not"
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
"saved relation does not contain exactly one tag"
|
||||
assert_equal changeset_id, checkrelation.changeset.id,
|
||||
"saved relation does not belong in the changeset it was assigned to"
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
"saved relation does not belong to user that created it"
|
||||
assert_equal true, checkrelation.visible,
|
||||
assert_equal true, checkrelation.visible,
|
||||
"saved relation is not visible"
|
||||
# ok the relation is there but can we also retrieve it?
|
||||
get :read, :id => relationid
|
||||
|
@ -238,32 +238,32 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for success
|
||||
assert_response :success,
|
||||
assert_response :success,
|
||||
"relation upload did not return success status"
|
||||
# read id of created relation and search for it
|
||||
relationid = @response.body
|
||||
checkrelation = Relation.find(relationid)
|
||||
assert_not_nil checkrelation,
|
||||
assert_not_nil checkrelation,
|
||||
"uploaded relation not found in data base after upload"
|
||||
# compare values
|
||||
assert_equal checkrelation.members.length, 1,
|
||||
assert_equal checkrelation.members.length, 1,
|
||||
"saved relation does not contain exactly one member"
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
"saved relation does not contain exactly one tag"
|
||||
assert_equal changeset_id, checkrelation.changeset.id,
|
||||
"saved relation does not belong in the changeset it was assigned to"
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
"saved relation does not belong to user that created it"
|
||||
assert_equal true, checkrelation.visible,
|
||||
assert_equal true, checkrelation.visible,
|
||||
"saved relation is not visible"
|
||||
# ok the relation is there but can we also retrieve it?
|
||||
|
||||
|
||||
get :read, :id => relationid
|
||||
assert_response :success
|
||||
|
||||
|
||||
|
||||
|
||||
###
|
||||
# create an relation with a node as member, this time test that we don't
|
||||
# create an relation with a node as member, this time test that we don't
|
||||
# need a role attribute to be included
|
||||
nid = current_nodes(:used_node_1).id
|
||||
content "<osm><relation changeset='#{changeset_id}'>" +
|
||||
|
@ -271,26 +271,26 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for success
|
||||
assert_response :success,
|
||||
assert_response :success,
|
||||
"relation upload did not return success status"
|
||||
# read id of created relation and search for it
|
||||
relationid = @response.body
|
||||
checkrelation = Relation.find(relationid)
|
||||
assert_not_nil checkrelation,
|
||||
assert_not_nil checkrelation,
|
||||
"uploaded relation not found in data base after upload"
|
||||
# compare values
|
||||
assert_equal checkrelation.members.length, 1,
|
||||
assert_equal checkrelation.members.length, 1,
|
||||
"saved relation does not contain exactly one member"
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
"saved relation does not contain exactly one tag"
|
||||
assert_equal changeset_id, checkrelation.changeset.id,
|
||||
"saved relation does not belong in the changeset it was assigned to"
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
"saved relation does not belong to user that created it"
|
||||
assert_equal true, checkrelation.visible,
|
||||
assert_equal true, checkrelation.visible,
|
||||
"saved relation is not visible"
|
||||
# ok the relation is there but can we also retrieve it?
|
||||
|
||||
|
||||
get :read, :id => relationid
|
||||
assert_response :success
|
||||
|
||||
|
@ -304,23 +304,23 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></relation></osm>"
|
||||
put :create
|
||||
# hope for success
|
||||
assert_response :success,
|
||||
assert_response :success,
|
||||
"relation upload did not return success status"
|
||||
# read id of created relation and search for it
|
||||
relationid = @response.body
|
||||
checkrelation = Relation.find(relationid)
|
||||
assert_not_nil checkrelation,
|
||||
assert_not_nil checkrelation,
|
||||
"uploaded relation not found in data base after upload"
|
||||
# compare values
|
||||
assert_equal checkrelation.members.length, 2,
|
||||
assert_equal checkrelation.members.length, 2,
|
||||
"saved relation does not have exactly two members"
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
assert_equal checkrelation.tags.length, 1,
|
||||
"saved relation does not contain exactly one tag"
|
||||
assert_equal changeset_id, checkrelation.changeset.id,
|
||||
"saved relation does not belong in the changeset it was assigned to"
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
assert_equal users(:public_user).id, checkrelation.changeset.user_id,
|
||||
"saved relation does not belong to user that created it"
|
||||
assert_equal true, checkrelation.visible,
|
||||
assert_equal true, checkrelation.visible,
|
||||
"saved relation is not visible"
|
||||
# ok the relation is there but can we also retrieve it?
|
||||
get :read, :id => relationid
|
||||
|
@ -334,7 +334,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
|
||||
##
|
||||
# test that, when tags are updated on a relation, the correct things
|
||||
# happen to the correct tables and the API gives sensible results.
|
||||
# happen to the correct tables and the API gives sensible results.
|
||||
# this is to test a case that gregory marler noticed and posted to
|
||||
# josm-dev.
|
||||
## FIXME Move this to an integration test
|
||||
|
@ -364,8 +364,8 @@ class RelationControllerTest < ActionController::TestCase
|
|||
|
||||
##
|
||||
# test that, when tags are updated on a relation when using the diff
|
||||
# upload function, the correct things happen to the correct tables
|
||||
# and the API gives sensible results. this is to test a case that
|
||||
# upload function, the correct things happen to the correct tables
|
||||
# and the API gives sensible results. this is to test a case that
|
||||
# gregory marler noticed and posted to josm-dev.
|
||||
def test_update_relation_tags_via_upload
|
||||
basic_authorization users(:public_user).email, "test"
|
||||
|
@ -407,7 +407,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
"</relation></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :precondition_failed,
|
||||
assert_response :precondition_failed,
|
||||
"relation upload with invalid node did not return 'precondition failed'"
|
||||
assert_equal "Precondition failed: Relation with id cannot be saved due to Node with id 0", @response.body
|
||||
end
|
||||
|
@ -417,10 +417,10 @@ class RelationControllerTest < ActionController::TestCase
|
|||
# -------------------------------------
|
||||
def test_create_invalid_xml
|
||||
basic_authorization users(:public_user).email, "test"
|
||||
|
||||
|
||||
# put the relation in a dummy fixture changeset that works
|
||||
changeset_id = changesets(:public_user_first_change).id
|
||||
|
||||
|
||||
# create some xml that should return an error
|
||||
content "<osm><relation changeset='#{changeset_id}'>" +
|
||||
"<member type='type' ref='#{current_nodes(:used_node_1).id}' role=''/>" +
|
||||
|
@ -431,21 +431,21 @@ class RelationControllerTest < ActionController::TestCase
|
|||
assert_match(/Cannot parse valid relation from xml string/, @response.body)
|
||||
assert_match(/The type is not allowed only, /, @response.body)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
# -------------------------------------
|
||||
# Test deleting relations.
|
||||
# -------------------------------------
|
||||
|
||||
|
||||
def test_delete
|
||||
## First try to delete relation without auth
|
||||
delete :delete, :id => current_relations(:visible_relation).id
|
||||
assert_response :unauthorized
|
||||
|
||||
|
||||
|
||||
|
||||
## Then try with the private user, to make sure that you get a forbidden
|
||||
basic_authorization(users(:normal_user).email, "test")
|
||||
|
||||
|
||||
# this shouldn't work, as we should need the payload...
|
||||
delete :delete, :id => current_relations(:visible_relation).id
|
||||
assert_response :forbidden
|
||||
|
@ -481,7 +481,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
delete :delete, :id => current_relations(:invisible_relation).id
|
||||
assert_response :forbidden
|
||||
|
||||
# this works now because the relation which was using this one
|
||||
# this works now because the relation which was using this one
|
||||
# has been deleted.
|
||||
content(relations(:used_relation).to_xml)
|
||||
delete :delete, :id => current_relations(:used_relation).id
|
||||
|
@ -491,10 +491,10 @@ class RelationControllerTest < ActionController::TestCase
|
|||
delete :delete, :id => 0
|
||||
assert_response :forbidden
|
||||
|
||||
|
||||
|
||||
|
||||
## now set auth for the public user
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
|
||||
# this shouldn't work, as we should need the payload...
|
||||
delete :delete, :id => current_relations(:visible_relation).id
|
||||
|
@ -520,7 +520,7 @@ class RelationControllerTest < ActionController::TestCase
|
|||
# this won't work because the relation is in a changeset owned by someone else
|
||||
content(relations(:used_relation).to_xml)
|
||||
delete :delete, :id => current_relations(:used_relation).id
|
||||
assert_response :conflict,
|
||||
assert_response :conflict,
|
||||
"shouldn't be able to delete a relation in a changeset owned by someone else (#{@response.body})"
|
||||
|
||||
# this won't work because the relation in the payload is different to that passed
|
||||
|
@ -528,11 +528,11 @@ class RelationControllerTest < ActionController::TestCase
|
|||
delete :delete, :id => current_relations(:used_relation).id
|
||||
assert_not_equal relations(:public_used_relation).id, current_relations(:used_relation).id
|
||||
assert_response :bad_request, "shouldn't be able to delete a relation when payload is different to the url"
|
||||
|
||||
|
||||
# this won't work because the relation is in-use by another relation
|
||||
content(relations(:public_used_relation).to_xml)
|
||||
delete :delete, :id => current_relations(:public_used_relation).id
|
||||
assert_response :precondition_failed,
|
||||
assert_response :precondition_failed,
|
||||
"shouldn't be able to delete a relation used in a relation (#{@response.body})"
|
||||
assert_equal "Precondition failed: The relation 5 is used in relation 6.", @response.body
|
||||
|
||||
|
@ -550,17 +550,17 @@ class RelationControllerTest < ActionController::TestCase
|
|||
content(relations(:invisible_relation).to_xml)
|
||||
delete :delete, :id => current_relations(:invisible_relation).id
|
||||
assert_response :gone
|
||||
|
||||
|
||||
# Public visible relation needs to be deleted
|
||||
content(relations(:public_visible_relation).to_xml)
|
||||
delete :delete, :id => current_relations(:public_visible_relation).id
|
||||
assert_response :success
|
||||
|
||||
# this works now because the relation which was using this one
|
||||
# this works now because the relation which was using this one
|
||||
# has been deleted.
|
||||
content(relations(:public_used_relation).to_xml)
|
||||
delete :delete, :id => current_relations(:public_used_relation).id
|
||||
assert_response :success,
|
||||
assert_response :success,
|
||||
"should be able to delete a relation used in an old relation (#{@response.body})"
|
||||
|
||||
# this won't work since the relation never existed
|
||||
|
@ -582,10 +582,10 @@ class RelationControllerTest < ActionController::TestCase
|
|||
new_tag['k'] = "some_new_tag"
|
||||
new_tag['v'] = "some_new_value"
|
||||
relation_element << new_tag
|
||||
|
||||
|
||||
# update changeset ID to point to new changeset
|
||||
update_changeset(relation_xml, changeset_id)
|
||||
|
||||
|
||||
# upload the change
|
||||
content relation_xml
|
||||
put :update, :id => current_relations(:visible_relation).id
|
||||
|
@ -613,25 +613,25 @@ class RelationControllerTest < ActionController::TestCase
|
|||
new_member['type'] = element.class.to_s.downcase
|
||||
new_member['role'] = "some_role"
|
||||
relation_element << new_member
|
||||
|
||||
|
||||
# update changeset ID to point to new changeset
|
||||
update_changeset(relation_xml, changeset_id)
|
||||
|
||||
|
||||
# upload the change
|
||||
content relation_xml
|
||||
put :update, :id => current_relations(:visible_relation).id
|
||||
assert_response :success, "can't update relation for add #{element.class}/bbox test: #{@response.body}"
|
||||
|
||||
# get it back and check the ordering
|
||||
# get it back and check the ordering
|
||||
get :read, :id => relation_id
|
||||
assert_response :success, "can't read back the relation: #{@response.body}"
|
||||
check_ordering(relation_xml, @response.body)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# remove a member from a relation and check the bounding box is
|
||||
# remove a member from a relation and check the bounding box is
|
||||
# only that element.
|
||||
def test_remove_member_bounding_box
|
||||
check_changeset_modify(BoundingBox.new(5,5,5,5)) do |changeset_id|
|
||||
|
@ -640,22 +640,22 @@ class RelationControllerTest < ActionController::TestCase
|
|||
relation_xml.
|
||||
find("//osm/relation/member[@type='node'][@ref='5']").
|
||||
first.remove!
|
||||
|
||||
|
||||
# update changeset ID to point to new changeset
|
||||
update_changeset(relation_xml, changeset_id)
|
||||
|
||||
|
||||
# upload the change
|
||||
content relation_xml
|
||||
put :update, :id => current_relations(:visible_relation).id
|
||||
assert_response :success, "can't update relation for remove node/bbox test"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# check that relations are ordered
|
||||
def test_relation_member_ordering
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
||||
|
||||
doc_str = <<OSM
|
||||
<osm>
|
||||
<relation changeset='4'>
|
||||
|
@ -707,7 +707,7 @@ OSM
|
|||
end
|
||||
end
|
||||
|
||||
##
|
||||
##
|
||||
# check that relations can contain duplicate members
|
||||
def test_relation_member_duplicates
|
||||
doc_str = <<OSM
|
||||
|
@ -723,14 +723,14 @@ OSM
|
|||
doc = XML::Parser.string(doc_str).parse
|
||||
|
||||
## First try with the private user
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
|
||||
content doc
|
||||
put :create
|
||||
assert_response :forbidden
|
||||
|
||||
## Now try with the public user
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
|
||||
content doc
|
||||
put :create
|
||||
|
@ -757,7 +757,7 @@ OSM
|
|||
</osm>
|
||||
OSM
|
||||
doc = XML::Parser.string(doc_str).parse
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
|
||||
content doc
|
||||
put :create
|
||||
|
@ -780,28 +780,28 @@ OSM
|
|||
##
|
||||
# remove all the members from a relation. the result is pretty useless, but
|
||||
# still technically valid.
|
||||
def test_remove_all_members
|
||||
def test_remove_all_members
|
||||
check_changeset_modify(BoundingBox.new(3,3,5,5)) do |changeset_id|
|
||||
relation_xml = current_relations(:visible_relation).to_xml
|
||||
relation_xml.
|
||||
find("//osm/relation/member").
|
||||
each {|m| m.remove!}
|
||||
|
||||
|
||||
# update changeset ID to point to new changeset
|
||||
update_changeset(relation_xml, changeset_id)
|
||||
|
||||
|
||||
# upload the change
|
||||
content relation_xml
|
||||
put :update, :id => current_relations(:visible_relation).id
|
||||
assert_response :success, "can't update relation for remove all members test"
|
||||
checkrelation = Relation.find(current_relations(:visible_relation).id)
|
||||
assert_not_nil(checkrelation,
|
||||
assert_not_nil(checkrelation,
|
||||
"uploaded relation not found in database after upload")
|
||||
assert_equal(0, checkrelation.members.length,
|
||||
"relation contains members but they should have all been deleted")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# ============================================================
|
||||
# utility functions
|
||||
# ============================================================
|
||||
|
@ -830,7 +830,7 @@ OSM
|
|||
# that the changeset bounding box is +bbox+.
|
||||
def check_changeset_modify(bbox)
|
||||
## First test with the private user to check that you get a forbidden
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
|
||||
# create a new changeset for this operation, so we are assured
|
||||
# that the bounding box will be newly-generated.
|
||||
|
@ -840,10 +840,10 @@ OSM
|
|||
assert_response :forbidden, "shouldn't be able to create changeset for modify test, as should get forbidden"
|
||||
end
|
||||
|
||||
|
||||
|
||||
## Now do the whole thing with the public user
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
||||
|
||||
# create a new changeset for this operation, so we are assured
|
||||
# that the bounding box will be newly-generated.
|
||||
changeset_id = with_controller(ChangesetController.new) do
|
||||
|
@ -886,8 +886,8 @@ OSM
|
|||
end
|
||||
|
||||
##
|
||||
# updates the relation (XML) +rel+ and
|
||||
# yields the new version of that relation into the block.
|
||||
# updates the relation (XML) +rel+ and
|
||||
# yields the new version of that relation into the block.
|
||||
# the parsed XML doc is retured.
|
||||
def with_update(rel)
|
||||
rel_id = rel.find("//osm/relation").first["id"].to_i
|
||||
|
@ -908,7 +908,7 @@ OSM
|
|||
|
||||
##
|
||||
# updates the relation (XML) +rel+ via the diff-upload API and
|
||||
# yields the new version of that relation into the block.
|
||||
# yields the new version of that relation into the block.
|
||||
# the parsed XML doc is retured.
|
||||
def with_update_diff(rel)
|
||||
rel_id = rel.find("//osm/relation").first["id"].to_i
|
||||
|
@ -927,29 +927,29 @@ OSM
|
|||
post :upload, :id => cs_id
|
||||
assert_response :success, "can't upload diff relation: #{@response.body}"
|
||||
version = xml_parse(@response.body).find("//diffResult/relation").first["new_version"].to_i
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# now get the new version
|
||||
get :read, :id => rel_id
|
||||
assert_response :success
|
||||
new_rel = xml_parse(@response.body)
|
||||
|
||||
|
||||
yield new_rel
|
||||
|
||||
|
||||
return version
|
||||
end
|
||||
|
||||
##
|
||||
# returns a k->v hash of tags from an xml doc
|
||||
def get_tags_as_hash(a)
|
||||
def get_tags_as_hash(a)
|
||||
a.find("//osm/relation/tag").sort_by { |v| v['k'] }.inject({}) do |h,v|
|
||||
h[v['k']] = v['v']
|
||||
h
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
##
|
||||
# assert that all tags on relation documents +a+ and +b+
|
||||
# assert that all tags on relation documents +a+ and +b+
|
||||
# are equal
|
||||
def assert_tags_equal(a, b)
|
||||
# turn the XML doc into tags hashes
|
||||
|
@ -958,7 +958,7 @@ OSM
|
|||
|
||||
assert_equal a_tags.keys, b_tags.keys, "Tag keys should be identical."
|
||||
a_tags.each do |k, v|
|
||||
assert_equal v, b_tags[k],
|
||||
assert_equal v, b_tags[k],
|
||||
"Tags which were not altered should be the same. " +
|
||||
"#{a_tags.inspect} != #{b_tags.inspect}"
|
||||
end
|
||||
|
|
|
@ -493,7 +493,7 @@ class TraceControllerTest < ActionController::TestCase
|
|||
basic_authorization(users(:normal_user).display_name, "test")
|
||||
content gpx_files(:anon_trace_file).to_xml
|
||||
put :api_update, :id => gpx_files(:public_trace_file).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"should not be able to update a trace with a different ID from the XML"
|
||||
|
||||
# And finally try an update that should work
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'test_helper'
|
|||
|
||||
class UserControllerTest < ActionController::TestCase
|
||||
fixtures :users
|
||||
|
||||
|
||||
##
|
||||
# test all routes which lead to this controller
|
||||
def test_routes
|
||||
|
@ -269,7 +269,7 @@ class UserControllerTest < ActionController::TestCase
|
|||
assert_template 'new'
|
||||
assert_select "form > fieldset > div.form-row > input.field_with_errors#user_email"
|
||||
end
|
||||
|
||||
|
||||
def test_user_create_submit_duplicate_name
|
||||
user = new_user
|
||||
user.display_name = users(:public_user).display_name
|
||||
|
@ -284,7 +284,7 @@ class UserControllerTest < ActionController::TestCase
|
|||
assert_template 'new'
|
||||
assert_select "form > fieldset > div.form-row > input.field_with_errors#user_display_name"
|
||||
end
|
||||
|
||||
|
||||
def test_user_create_submit_duplicate_name_uppercase
|
||||
user = new_user
|
||||
user.display_name = users(:public_user).display_name.upcase
|
||||
|
@ -556,14 +556,14 @@ class UserControllerTest < ActionController::TestCase
|
|||
assert_equal user.new_email, email.to.first
|
||||
ActionMailer::Base.deliveries.clear
|
||||
end
|
||||
|
||||
|
||||
# Check that the user account page will display and contains some relevant
|
||||
# information for the user
|
||||
def test_user_view_account
|
||||
# Test a non-existent user
|
||||
get :view, {:display_name => "unknown"}
|
||||
assert_response :not_found
|
||||
|
||||
|
||||
# Test a normal user
|
||||
get :view, {:display_name => "test"}
|
||||
assert_response :success
|
||||
|
@ -577,7 +577,7 @@ class UserControllerTest < ActionController::TestCase
|
|||
assert_select "a[href='/user/test/blocks_by']", 0
|
||||
assert_select "a[href='/blocks/new/test']", 0
|
||||
end
|
||||
|
||||
|
||||
# Test a user who has been blocked
|
||||
get :view, {:display_name => "blocked"}
|
||||
assert_response :success
|
||||
|
@ -591,7 +591,7 @@ class UserControllerTest < ActionController::TestCase
|
|||
assert_select "a[href='/user/blocked/blocks_by']", 0
|
||||
assert_select "a[href='/blocks/new/blocked']", 0
|
||||
end
|
||||
|
||||
|
||||
# Test a moderator who has applied blocks
|
||||
get :view, {:display_name => "moderator"}
|
||||
assert_response :success
|
||||
|
@ -691,7 +691,7 @@ class UserControllerTest < ActionController::TestCase
|
|||
# check that nothing is returned when not logged in
|
||||
get :api_details
|
||||
assert_response :unauthorized
|
||||
|
||||
|
||||
# check that we get a response when logged in
|
||||
basic_authorization(users(:normal_user).email, "test")
|
||||
get :api_details
|
||||
|
|
|
@ -45,7 +45,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
|
|||
assert_select "preference", :count => 0
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# authenticate as a user with preferences
|
||||
basic_authorization("test@openstreetmap.org", "test")
|
||||
|
||||
|
|
|
@ -65,11 +65,11 @@ class WayControllerTest < ActionController::TestCase
|
|||
|
||||
# otherwise it should say success
|
||||
assert_response :success
|
||||
|
||||
|
||||
# Check the way is correctly returned
|
||||
assert_select "osm way[id='#{way.id}'][version='#{way.version}'][visible='#{way.visible}']", 1
|
||||
|
||||
# check that each node in the way appears once in the output as a
|
||||
|
||||
# check that each node in the way appears once in the output as a
|
||||
# reference and as the node element.
|
||||
way.nodes.each do |n|
|
||||
count = (way.nodes - (way.nodes - [n])).length
|
||||
|
@ -118,14 +118,14 @@ class WayControllerTest < ActionController::TestCase
|
|||
|
||||
# use the first user's open changeset
|
||||
changeset_id = changesets(:normal_user_first_change).id
|
||||
|
||||
|
||||
# create a way with pre-existing nodes
|
||||
content "<osm><way changeset='#{changeset_id}'>" +
|
||||
"<nd ref='#{nid1}'/><nd ref='#{nid2}'/>" +
|
||||
"<nd ref='#{nid1}'/><nd ref='#{nid2}'/>" +
|
||||
"<tag k='test' v='yes' /></way></osm>"
|
||||
put :create
|
||||
# hope for success
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"way upload did not return success status"
|
||||
# read id of created way and search for it
|
||||
wayid = @response.body
|
||||
|
@ -137,32 +137,32 @@ class WayControllerTest < ActionController::TestCase
|
|||
|
||||
# use the first user's open changeset
|
||||
changeset_id = changesets(:public_user_first_change).id
|
||||
|
||||
|
||||
# create a way with pre-existing nodes
|
||||
content "<osm><way changeset='#{changeset_id}'>" +
|
||||
"<nd ref='#{nid1}'/><nd ref='#{nid2}'/>" +
|
||||
"<nd ref='#{nid1}'/><nd ref='#{nid2}'/>" +
|
||||
"<tag k='test' v='yes' /></way></osm>"
|
||||
put :create
|
||||
# hope for success
|
||||
assert_response :success,
|
||||
assert_response :success,
|
||||
"way upload did not return success status"
|
||||
# read id of created way and search for it
|
||||
wayid = @response.body
|
||||
checkway = Way.find(wayid)
|
||||
assert_not_nil checkway,
|
||||
assert_not_nil checkway,
|
||||
"uploaded way not found in data base after upload"
|
||||
# compare values
|
||||
assert_equal checkway.nds.length, 2,
|
||||
assert_equal checkway.nds.length, 2,
|
||||
"saved way does not contain exactly one node"
|
||||
assert_equal checkway.nds[0], nid1,
|
||||
assert_equal checkway.nds[0], nid1,
|
||||
"saved way does not contain the right node on pos 0"
|
||||
assert_equal checkway.nds[1], nid2,
|
||||
assert_equal checkway.nds[1], nid2,
|
||||
"saved way does not contain the right node on pos 1"
|
||||
assert_equal checkway.changeset_id, changeset_id,
|
||||
"saved way does not belong to the correct changeset"
|
||||
assert_equal users(:public_user).id, checkway.changeset.user_id,
|
||||
assert_equal users(:public_user).id, checkway.changeset.user_id,
|
||||
"saved way does not belong to user that created it"
|
||||
assert_equal true, checkway.visible,
|
||||
assert_equal true, checkway.visible,
|
||||
"saved way is not visible"
|
||||
end
|
||||
|
||||
|
@ -180,11 +180,11 @@ class WayControllerTest < ActionController::TestCase
|
|||
nid1 = current_nodes(:used_node_1).id
|
||||
|
||||
# create a way with non-existing node
|
||||
content "<osm><way changeset='#{open_changeset_id}'>" +
|
||||
content "<osm><way changeset='#{open_changeset_id}'>" +
|
||||
"<nd ref='0'/><tag k='test' v='yes' /></way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"way upload with invalid node using a private user did not return 'forbidden'"
|
||||
|
||||
# create a way with no nodes
|
||||
|
@ -192,7 +192,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"way upload with no node using a private userdid not return 'forbidden'"
|
||||
|
||||
# create a way inside a closed changeset
|
||||
|
@ -200,10 +200,10 @@ class WayControllerTest < ActionController::TestCase
|
|||
"<nd ref='#{nid1}'/></way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :forbidden,
|
||||
"way upload to closed changeset with a private user did not return 'forbidden'"
|
||||
assert_response :forbidden,
|
||||
"way upload to closed changeset with a private user did not return 'forbidden'"
|
||||
|
||||
|
||||
|
||||
## Now test with a public user
|
||||
basic_authorization users(:public_user).email, "test"
|
||||
|
||||
|
@ -213,11 +213,11 @@ class WayControllerTest < ActionController::TestCase
|
|||
nid1 = current_nodes(:used_node_1).id
|
||||
|
||||
# create a way with non-existing node
|
||||
content "<osm><way changeset='#{open_changeset_id}'>" +
|
||||
content "<osm><way changeset='#{open_changeset_id}'>" +
|
||||
"<nd ref='0'/><tag k='test' v='yes' /></way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :precondition_failed,
|
||||
assert_response :precondition_failed,
|
||||
"way upload with invalid node did not return 'precondition failed'"
|
||||
assert_equal "Precondition failed: Way requires the nodes with id in (0), which either do not exist, or are not visible.", @response.body
|
||||
|
||||
|
@ -226,7 +226,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
"<tag k='test' v='yes' /></way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :precondition_failed,
|
||||
assert_response :precondition_failed,
|
||||
"way upload with no node did not return 'precondition failed'"
|
||||
assert_equal "Precondition failed: Cannot create way: data is invalid.", @response.body
|
||||
|
||||
|
@ -235,8 +235,8 @@ class WayControllerTest < ActionController::TestCase
|
|||
"<nd ref='#{nid1}'/></way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :conflict,
|
||||
"way upload to closed changeset did not return 'conflict'"
|
||||
assert_response :conflict,
|
||||
"way upload to closed changeset did not return 'conflict'"
|
||||
|
||||
# create a way with a tag which is too long
|
||||
content "<osm><way changeset='#{open_changeset_id}'>" +
|
||||
|
@ -245,31 +245,31 @@ class WayControllerTest < ActionController::TestCase
|
|||
"</way></osm>"
|
||||
put :create
|
||||
# expect failure
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"way upload to with too long tag did not return 'bad_request'"
|
||||
end
|
||||
|
||||
# -------------------------------------
|
||||
# Test deleting ways.
|
||||
# -------------------------------------
|
||||
|
||||
|
||||
def test_delete
|
||||
# first try to delete way without auth
|
||||
delete :delete, :id => current_ways(:visible_way).id
|
||||
assert_response :unauthorized
|
||||
|
||||
# now set auth using the private user
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
basic_authorization(users(:normal_user).email, "test");
|
||||
|
||||
# this shouldn't work as with the 0.6 api we need pay load to delete
|
||||
delete :delete, :id => current_ways(:visible_way).id
|
||||
assert_response :forbidden
|
||||
|
||||
|
||||
# Now try without having a changeset
|
||||
content "<osm><way id='#{current_ways(:visible_way).id}'/></osm>"
|
||||
delete :delete, :id => current_ways(:visible_way).id
|
||||
assert_response :forbidden
|
||||
|
||||
|
||||
# try to delete with an invalid (closed) changeset
|
||||
content update_changeset(current_ways(:visible_way).to_xml,
|
||||
changesets(:normal_user_closed_change).id)
|
||||
|
@ -300,27 +300,27 @@ class WayControllerTest < ActionController::TestCase
|
|||
# this shouldn't work as the way is used in a relation
|
||||
content current_ways(:used_way).to_xml
|
||||
delete :delete, :id => current_ways(:used_way).id
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"shouldn't be able to delete a way used in a relation (#{@response.body}), when done by a private user"
|
||||
|
||||
# this won't work since the way never existed
|
||||
delete :delete, :id => 0
|
||||
assert_response :forbidden
|
||||
|
||||
|
||||
|
||||
### Now check with a public user
|
||||
# now set auth
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
basic_authorization(users(:public_user).email, "test");
|
||||
|
||||
# this shouldn't work as with the 0.6 api we need pay load to delete
|
||||
delete :delete, :id => current_ways(:visible_way).id
|
||||
assert_response :bad_request
|
||||
|
||||
|
||||
# Now try without having a changeset
|
||||
content "<osm><way id='#{current_ways(:visible_way).id}'/></osm>"
|
||||
delete :delete, :id => current_ways(:visible_way).id
|
||||
assert_response :bad_request
|
||||
|
||||
|
||||
# try to delete with an invalid (closed) changeset
|
||||
content update_changeset(current_ways(:visible_way).to_xml,
|
||||
changesets(:public_user_closed_change).id)
|
||||
|
@ -351,7 +351,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
# this shouldn't work as the way is used in a relation
|
||||
content current_ways(:used_way).to_xml
|
||||
delete :delete, :id => current_ways(:used_way).id
|
||||
assert_response :precondition_failed,
|
||||
assert_response :precondition_failed,
|
||||
"shouldn't be able to delete a way used in a relation (#{@response.body})"
|
||||
assert_equal "Precondition failed: Way 3 is still used by relations 1.", @response.body
|
||||
|
||||
|
@ -383,7 +383,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content way_xml
|
||||
put :update, :id => current_ways(:visible_way).id
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"adding a duplicate tag to a way for a non-public should fail with 'forbidden'"
|
||||
|
||||
## Now try with the public user
|
||||
|
@ -402,7 +402,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content way_xml
|
||||
put :update, :id => current_ways(:visible_way).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"adding a duplicate tag to a way should fail with 'bad request'"
|
||||
assert_equal "Element way/#{current_ways(:visible_way).id} has duplicate tags with key #{current_way_tags(:t1).k}", @response.body
|
||||
end
|
||||
|
@ -428,9 +428,9 @@ class WayControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content way_xml
|
||||
put :update, :id => current_ways(:visible_way).id
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"adding new duplicate tags to a way using a non-public user should fail with 'forbidden'"
|
||||
|
||||
|
||||
## Now test with the public user
|
||||
# setup auth
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
@ -449,10 +449,10 @@ class WayControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content way_xml
|
||||
put :update, :id => current_ways(:visible_way).id
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"adding new duplicate tags to a way should fail with 'bad request'"
|
||||
assert_equal "Element way/#{current_ways(:visible_way).id} has duplicate tags with key i_am_a_duplicate", @response.body
|
||||
|
||||
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -473,9 +473,9 @@ class WayControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content way_str
|
||||
put :create
|
||||
assert_response :forbidden,
|
||||
assert_response :forbidden,
|
||||
"adding new duplicate tags to a way with a non-public user should fail with 'forbidden'"
|
||||
|
||||
|
||||
## Now do it with a public user
|
||||
# setup auth
|
||||
basic_authorization(users(:public_user).email, "test")
|
||||
|
@ -489,7 +489,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
# try and upload it
|
||||
content way_str
|
||||
put :create
|
||||
assert_response :bad_request,
|
||||
assert_response :bad_request,
|
||||
"adding new duplicate tags to a way should fail with 'bad request'"
|
||||
assert_equal "Element way/ has duplicate tags with key addr:housenumber", @response.body
|
||||
end
|
||||
|
@ -498,7 +498,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
# test that a call to ways_for_node returns all ways that contain the node
|
||||
# and none that don't.
|
||||
def test_ways_for_node
|
||||
# in current fixtures ways 1 and 3 all use node 3. ways 2 and 4
|
||||
# in current fixtures ways 1 and 3 all use node 3. ways 2 and 4
|
||||
# *used* to use it but doesn't.
|
||||
get :ways_for_node, :id => current_nodes(:used_node_1).id
|
||||
assert_response :success
|
||||
|
@ -512,7 +512,7 @@ class WayControllerTest < ActionController::TestCase
|
|||
found_way_ids = ways_xml.find("//osm/way").collect { |w| w["id"].to_i }
|
||||
assert_equal expected_way_ids.sort, found_way_ids.sort,
|
||||
"expected ways for node #{current_nodes(:used_node_1).id} did not match found"
|
||||
|
||||
|
||||
# check the full ways to ensure we're not missing anything
|
||||
expected_way_ids.each do |id|
|
||||
way_xml = ways_xml.find("//osm/way[@id='#{id}']").first
|
||||
|
|
|
@ -20,7 +20,7 @@ class ApplicationHelperTest < ActionView::TestCase
|
|||
assert_dom_equal "Test <a href=\"#{link}\" rel=\"nofollow\">#{link}</a> is made into a link", html
|
||||
|
||||
html = linkify(text.html_safe)
|
||||
assert_equal true, html.html_safe?
|
||||
assert_equal true, html.html_safe?
|
||||
assert_dom_equal "Test <a href=\"#{link}\" rel=\"nofollow\">#{link}</a> is made into a link", html
|
||||
end
|
||||
|
||||
|
@ -32,7 +32,7 @@ class ApplicationHelperTest < ActionView::TestCase
|
|||
assert_dom_equal text, html
|
||||
|
||||
html = linkify(text.html_safe)
|
||||
assert_equal true, html.html_safe?
|
||||
assert_equal true, html.html_safe?
|
||||
assert_dom_equal text, html
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,7 +8,7 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
def test_oauth10_web_app
|
||||
client = client_applications(:oauth_web_app)
|
||||
|
||||
post_via_redirect "/login",
|
||||
post_via_redirect "/login",
|
||||
:username => client.user.email, :password => "test"
|
||||
assert_response :success
|
||||
|
||||
|
@ -21,8 +21,8 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
assert_nil token.invalidated_at
|
||||
assert_allowed token, client.permissions
|
||||
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
:allow_read_prefs => true, :allow_write_prefs => true
|
||||
assert_response :redirect
|
||||
assert_redirected_to "http://some.web.app.org/callback?oauth_token=#{token.token}"
|
||||
|
@ -65,9 +65,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
assert_nil token.invalidated_at
|
||||
assert_allowed token, client.permissions
|
||||
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
:oauth_callback => "http://another.web.app.org/callback",
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
:oauth_callback => "http://another.web.app.org/callback",
|
||||
:allow_write_api => true, :allow_read_gpx => true
|
||||
assert_response :redirect
|
||||
assert_redirected_to "http://another.web.app.org/callback?oauth_token=#{token.token}"
|
||||
|
@ -105,7 +105,7 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
def test_oauth10_desktop_app
|
||||
client = client_applications(:oauth_desktop_app)
|
||||
|
||||
post_via_redirect "/login",
|
||||
post_via_redirect "/login",
|
||||
:username => client.user.email, :password => "test"
|
||||
assert_response :success
|
||||
|
||||
|
@ -118,8 +118,8 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
assert_nil token.invalidated_at
|
||||
assert_allowed token, client.permissions
|
||||
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
:allow_read_prefs => true, :allow_write_prefs => true
|
||||
assert_response :success
|
||||
assert_template "authorize_success"
|
||||
|
@ -266,7 +266,7 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
def test_oauth10a_desktop_app
|
||||
client = client_applications(:oauth_desktop_app)
|
||||
|
||||
post_via_redirect "/login",
|
||||
post_via_redirect "/login",
|
||||
:username => client.user.email, :password => "test"
|
||||
assert_response :success
|
||||
|
||||
|
@ -280,8 +280,8 @@ class OAuthTest < ActionDispatch::IntegrationTest
|
|||
assert_nil token.invalidated_at
|
||||
assert_allowed token, client.permissions
|
||||
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
post "/oauth/authorize",
|
||||
:oauth_token => token.token,
|
||||
:allow_read_prefs => true, :allow_write_prefs => true
|
||||
assert_response :success
|
||||
assert_template "authorize_success"
|
||||
|
|
|
@ -7,7 +7,7 @@ class UserChangesetCommentsTest < ActionDispatch::IntegrationTest
|
|||
def test_log_in_message
|
||||
get "/changeset/#{changesets(:normal_user_closed_change).id}"
|
||||
assert_response :success
|
||||
|
||||
|
||||
assert_select "div#content" do
|
||||
assert_select "div#sidebar" do
|
||||
assert_select "div#sidebar_content" do
|
||||
|
@ -30,7 +30,7 @@ class UserChangesetCommentsTest < ActionDispatch::IntegrationTest
|
|||
assert_response :redirect
|
||||
|
||||
get "/changeset/#{changesets(:normal_user_closed_change).id}"
|
||||
|
||||
|
||||
assert_response :success
|
||||
assert_template 'browse/changeset'
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'test_helper'
|
|||
class UserDiariesTest < ActionDispatch::IntegrationTest
|
||||
fixtures :users, :diary_entries
|
||||
|
||||
# Test the creation of a diary entry, making sure that you are redirected to
|
||||
# Test the creation of a diary entry, making sure that you are redirected to
|
||||
# login page when not logged in
|
||||
def test_showing_create_diary_entry
|
||||
get_via_redirect '/diary/new'
|
||||
|
@ -25,13 +25,13 @@ class UserDiariesTest < ActionDispatch::IntegrationTest
|
|||
# http://markmail.org/message/wnslvi5xv5moqg7g
|
||||
@html_document = nil
|
||||
follow_redirect!
|
||||
|
||||
|
||||
assert_response :success
|
||||
assert_template 'diary_entry/edit'
|
||||
#print @response.body
|
||||
#print @html_document.to_yaml
|
||||
|
||||
# We will make sure that the form exists here, full
|
||||
# We will make sure that the form exists here, full
|
||||
# assert testing of the full form should be done in the
|
||||
# functional tests rather than this integration test
|
||||
# There are some things that are specific to the integratio
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue