From b8ecc41231de0a854e1f46fa6482c1275839b4c5 Mon Sep 17 00:00:00 2001 From: Stephan Kulow Date: Thu, 29 Aug 2013 08:17:24 +0200 Subject: [PATCH] [api] refactor HasAttributes a bit --- src/api/app/mixins/has_attributes.rb | 106 ++++++++++++------------- src/api/test/unit/code_quality_test.rb | 2 +- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/api/app/mixins/has_attributes.rb b/src/api/app/mixins/has_attributes.rb index a9be50d3207..c8901ba7c39 100644 --- a/src/api/app/mixins/has_attributes.rb +++ b/src/api/app/mixins/has_attributes.rb @@ -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? @@ -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? @@ -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 diff --git a/src/api/test/unit/code_quality_test.rb b/src/api/test/unit/code_quality_test.rb index 3725cbaa9d8..45221170cde 100644 --- a/src/api/test/unit/code_quality_test.rb +++ b/src/api/test/unit/code_quality_test.rb @@ -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