class Albacore::NugetModel::Metadata

the nuget xml metadata element writer

Attributes

set_fields[R]

gets the field symbols that have been set

Public Class Methods

from_xml(node) click to toggle source
# File lib/albacore/nuget_model.rb, line 278
def self.from_xml node
  m = Metadata.new
  node.children.reject { |n| n.text? }.each do |n|
    if n.name == 'dependencies'
      n.children.reject { |n| n.text? }.each do |node|
        if node.name == 'group'
          node.children.reject { |n| n.text? }.each do |dep|
            tfw = node['targetFramework'] || ''
            m.add_dependency dep['id'], dep['version'], tfw, group=true
          end
        else
          m.add_dependency node['id'], node['version'], group=false
        end
      end
    elsif n.name == 'frameworkDependencies'
      n.children.reject { |n| n.text? }.each do |node|
        if node.name == 'group'
          node.children.reject { |n| n.text? }.each do |dep|
            tfw = node['targetFramework'] || ''
            m.add_framework_dependency dep['id'], dep['version'], tfw, group=true
          end
        else
          m.add_framework_dependency node['id'], node['version'], group=false
        end
      end
    else
      # just set the property
      m.send(:"#{underscore n.name}=", n.inner_text)
    end
  end
  m
end
new(dependencies = nil, framework_assemblies = nil) click to toggle source

initialise a new package data object

# File lib/albacore/nuget_model.rb, line 122
def initialize dependencies = nil, framework_assemblies = nil
  @set_fields   = Set.new
  @dependencies = dependencies || Hash.new
  @framework_assemblies = framework_assemblies || Hash.new
  @has_group = false

  debug "creating new metadata with dependencies: #{dependencies} [nuget model: metadata]" unless dependencies.nil?
  debug "creating new metadata (same as prev) with fw asms: #{framework_assemblies} [nuget model: metadata]" unless framework_assemblies.nil?
end
nuspec_field(*syms) click to toggle source
# File lib/albacore/nuget_model.rb, line 43
      def self.nuspec_field *syms
        syms.each do |sym|
          self.class_eval(
%{def #{sym}
  @#{sym}
end})
          self.class_eval(
%{def #{sym}= val
  @#{sym} = val
  @set_fields.add? :#{sym}
end})
        end 
      end
pascal_case(str) click to toggle source
# File lib/albacore/nuget_model.rb, line 311
def self.pascal_case str
  str = str.to_s unless str.respond_to? :split
  str = str.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
  :"#{str}"
end
underscore(str) click to toggle source
# File lib/albacore/nuget_model.rb, line 317
def self.underscore str
  str.gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr("-", "_").
    downcase
end

Public Instance Methods

add_dependency(id, version, target_framework = '', group = true) click to toggle source

add a dependency to the package; id and version

# File lib/albacore/nuget_model.rb, line 133
def add_dependency id, version, target_framework = '', group = true
  guard_groups_or_not group
  extra = (target_framework || '') == '' ? '' : "|#{target_framework}"
  @has_group ||= group
  @dependencies["#{id}#{extra}"] = IdVersion.new id, version, group, target_framework
end
add_framework_dependency(id, version, target_framework = '', group = true) click to toggle source

add a framework dependency for the package

# File lib/albacore/nuget_model.rb, line 141
def add_framework_dependency id, version, target_framework = '', group = true
  guard_groups_or_not group
  @has_group ||= group
  @framework_assemblies[id] = IdVersion.new id, version, group, target_framework
end
merge_with(other) click to toggle source
# File lib/albacore/nuget_model.rb, line 246
def merge_with other
  raise ArgumentError, 'other is nil' if other.nil?
  raise ArgumentError, 'other is wrong type' unless other.is_a? Metadata

  trace { "#{self} merging with #{other} [nuget model: metadata]" }

  deps = @dependencies.clone.merge(other.dependencies)
  fw_asms = @framework_assemblies.clone.merge(other.framework_assemblies)

  m_next = Metadata.new deps, fw_asms

  # set all my fields to the new instance
  @set_fields.each do |field|
    debug "setting field '#{field}' to be '#{send(field)}' [nuget model: metadata]" 
    m_next.send(:"#{field}=", send(field))
  end

  # set all other's fields to the new instance, overriding mine
  other.set_fields.each do |field|
    debug "setting field '#{field}' to be '#{send(field)}' [nuget model: metadata]" 
    m_next.send(:"#{field}=", other.send(field))
  end

  m_next
end
to_s() click to toggle source
# File lib/albacore/nuget_model.rb, line 272
def to_s
  "NugetModel::Metadata(#{ @set_fields.map { |f| "#{f}=#{send(f)}" }.join(', ') })"
end
to_template() click to toggle source
# File lib/albacore/nuget_model.rb, line 147
def to_template
  lines = []
  lines << 'type file'

  # fields
  @set_fields.each do |f|
    key, value = Metadata.pascal_case(f), send(f)
    if value.is_a?(Array)
      lines << "#{key}"
      value.map{ |line| "  #{line}" }.each do |line|
        lines << line
      end
    else
      lines << "#{key} #{value}"
    end
  end

  lines << 'dependencies' unless @dependencies.empty?
  if @has_group
    groups = @dependencies.group_by { |k, d| d.target_framework }
    groups.each do |group|
      fw, deps = group
      if fw == ''
        deps.each do |k, d|
          lines << "  #{d.id} ~> #{d.version}"
        end
      else
        lines << "  framework: #{fw}"
        deps.each do |k, d|
          lines << "    #{d.id} ~> #{d.version}"
        end
      end
    end
  else
    @dependencies.each do |k, d|
      lines << "  #{d.id} ~> #{d.version}"
    end
  end

  if @framework_assemblies.respond_to?(:each) && @framework_assemblies.length > 0
    lines << 'frameworkAssemblies'
    @framework_assemblies.each do |k, d|
      lines << "  #{d.id}"
    end
  end

  lines
end
to_xml() click to toggle source

transform the data structure to the corresponding xml

# File lib/albacore/nuget_model.rb, line 242
def to_xml
  to_xml_builder.to_xml
end
to_xml_builder() click to toggle source
# File lib/albacore/nuget_model.rb, line 196
def to_xml_builder
  # alt: new(encoding: 'utf-8')
  Nokogiri::XML::Builder.new do |x|
    x.metadata do
      @set_fields.each do |f|
        x.send(Metadata.pascal_case(f), send(f))
      end

      x.dependencies do
        if @has_group
          groups = @dependencies.group_by { |k, d| d.target_framework }
          groups.each do |group|
            fw, deps = group
            if fw == ''
              x.group do
                deps.each do |k, d|
                  x.dependency id: d.id, version: d.version
                end
              end
            else
              x.group(targetFramework: fw) do
                deps.each do |k, d|
                  x.dependency id: d.id, version: d.version
                end
              end
            end
          end
        else
          @dependencies.each do |k, d|
            x.dependency id: d.id, version: d.version
          end
        end
      end

      if @framework_assemblies.respond_to?(:each) && @framework_assemblies.length > 0
        x.frameworkAssemblies do
          @framework_assemblies.each do |k, d|
            x.frameworkAssembly assemblyName: d.id, targetFramework: d.version
          end
        end
      end
    end
  end
end

Private Instance Methods

guard_groups_or_not(add_in_group) click to toggle source
# File lib/albacore/nuget_model.rb, line 326
def guard_groups_or_not add_in_group
  if @has_group && ! add_in_group \
     || ! @has_group && @dependencies.length > 0 && add_in_group
    raise ArgumentError.new("If you've added dependencies in group, you must add the rest in groups, too. See https://docs.microsoft.com/en-us/nuget/schema/nuspec#framework-assembly-references")
  end
end