Skip to content

Commit

Permalink
[api] refactor HasAttributes a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
coolo committed Aug 29, 2013
1 parent aa0a692 commit b8ecc41
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 56 deletions.
106 changes: 51 additions & 55 deletions src/api/app/mixins/has_attributes.rb
Expand Up @@ -20,23 +20,7 @@ class SaveError < APIException

def store_attribute_axml(attrib, binary=nil)

raise SaveError, "attribute type without a namespace " if not attrib.namespace
raise SaveError, "attribute type without a name " if not attrib.name

# check attribute type
if (not atype = AttribType.find_by_namespace_and_name(attrib.namespace, attrib.name) or atype.blank?)
raise SaveError, "unknown attribute type '#{attrib.namespace}':'#{attrib.name}'"
end
# verify the number of allowed values
if atype.value_count and attrib.has_element? :value and atype.value_count != attrib.each_value.length
raise SaveError, "attribute '#{attrib.namespace}:#{attrib.name}' has #{attrib.each_value.length} values, but only #{atype.value_count} are allowed"
end
if atype.value_count and atype.value_count > 0 and not attrib.has_element? :value
raise SaveError, "attribute '#{attrib.namespace}:#{attrib.name}' requires #{atype.value_count} values, but none given"
end
if attrib.has_element? :issue and not atype.issue_list
raise SaveError, "attribute '#{attrib.namespace}:#{attrib.name}' has issue elements which are not allowed in this attribute"
end
atype = check_attrib!(attrib)

# verify with allowed values for this attribute definition
unless atype.allowed_values.empty?
Expand Down Expand Up @@ -71,6 +55,27 @@ def store_attribute_axml(attrib, binary=nil)
return changed
end

def check_attrib!(attrib)
raise SaveError, "attribute type without a namespace " if not attrib.namespace
raise SaveError, "attribute type without a name " if not attrib.name

# check attribute type
if (not atype = AttribType.find_by_namespace_and_name(attrib.namespace, attrib.name) or atype.blank?)
raise SaveError, "unknown attribute type '#{attrib.namespace}':'#{attrib.name}'"
end
# verify the number of allowed values
if atype.value_count and attrib.has_element? :value and atype.value_count != attrib.each_value.length
raise SaveError, "attribute '#{attrib.namespace}:#{attrib.name}' has #{attrib.each_value.length} values, but only #{atype.value_count} are allowed"
end
if atype.value_count and atype.value_count > 0 and not attrib.has_element? :value
raise SaveError, "attribute '#{attrib.namespace}:#{attrib.name}' requires #{atype.value_count} values, but none given"
end
if attrib.has_element? :issue and not atype.issue_list
raise SaveError, "attribute '#{attrib.namespace}:#{attrib.name}' has issue elements which are not allowed in this attribute"
end
atype
end

def find_attribute(namespace, name, binary=nil)
logger.debug "find_attribute for #{namespace}:#{name}"
if namespace.nil?
Expand All @@ -96,61 +101,52 @@ def find_attribute(namespace, name, binary=nil)
def render_attribute_axml(params={})
builder = Nokogiri::XML::Builder.new

builder.attributes() do |a|
done={}
attribs.each do |attr|
type_name = attr.attrib_type.attrib_namespace.name+":"+attr.attrib_type.name
next if params[:name] and not attr.attrib_type.name == params[:name]
next if params[:namespace] and not attr.attrib_type.attrib_namespace.name == params[:namespace]
next if params[:binary] and attr.binary != params[:binary]
next if params[:binary] == "" and attr.binary != "" # switch between all and NULL binary
done[type_name]=1 if not attr.binary
p={}
p[:name] = attr.attrib_type.name
p[:namespace] = attr.attrib_type.attrib_namespace.name
p[:binary] = attr.binary if attr.binary
a.attribute(p) do |y|
unless attr.issues.blank?
attr.issues.each do |ai|
y.issue(:name => ai.issue.name, :tracker => ai.issue.issue_tracker.name)
end
end
render_single_attribute(attr, params[:with_default], y)
end
end
builder.attributes do |xml|
render_main_attributes(xml, params)

# show project values as fallback ?
if params[:with_project]
project.attribs.each do |attr|
type_name = attr.attrib_type.attrib_namespace.name+":"+attr.attrib_type.name
next if done[type_name]
next if params[:name] and not attr.attrib_type.name == params[:name]
next if params[:namespace] and not attr.attrib_type.attrib_namespace.name == params[:namespace]
p={}
p[:name] = attr.attrib_type.name
p[:namespace] = attr.attrib_type.attrib_namespace.name
p[:binary] = attr.binary if attr.binary
a.attribute(p) do |y|
render_single_attribute(attr, params[:with_default], y)
end
end
self.project.render_main_attributes(xml, params)
end
end
return builder.doc.to_xml :indent => 2, :encoding => 'UTF-8',
:save_with => Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
Nokogiri::XML::Node::SaveOptions::FORMAT
end

def render_main_attributes(builder, params)
done={}
attribs.each do |attr|
type_name = attr.attrib_type.attrib_namespace.name+":"+attr.attrib_type.name
next if params[:name] and not attr.attrib_type.name == params[:name]
next if params[:namespace] and not attr.attrib_type.attrib_namespace.name == params[:namespace]
next if params[:binary] and attr.binary != params[:binary]
next if params[:binary] == "" and attr.binary != "" # switch between all and NULL binary
done[type_name]=1 if not attr.binary
p={}
p[:name] = attr.attrib_type.name
p[:namespace] = attr.attrib_type.attrib_namespace.name
p[:binary] = attr.binary if attr.binary
builder.attribute(p) do
unless attr.issues.blank?
attr.issues.each do |ai|
builder.issue(:name => ai.issue.name, :tracker => ai.issue.issue_tracker.name)
end
end
render_single_attribute(attr, params[:with_default], builder)
end
end
end

def render_single_attribute(attr, with_default, y)
def render_single_attribute(attr, with_default, builder)
unless attr.values.empty?
attr.values.each do |val|
y.value(val.value)
builder.value(val.value)
end
else
if with_default
attr.attrib_type.default_values.each do |val|
y.value(val.value)
builder.value(val.value)
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion src/api/test/unit/code_quality_test.rb
Expand Up @@ -64,7 +64,7 @@ def setup
flog.flog(*files)

score = flog.average
Current_Score = 23.90
Current_Score = 23.73
assert_operator score, :<=, Current_Score + 0.005

if score < Current_Score - 0.01
Expand Down

0 comments on commit b8ecc41

Please sign in to comment.