Class: Albacore::NugetModel::Metadata

Inherits:
Object
  • Object
show all
Extended by:
Logging
Includes:
Logging
Defined in:
lib/albacore/nuget_model.rb

Overview

the nuget xml metadata element writer

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

debug, err, error, fatal, info, puts, trace, warn

Constructor Details

#initialize(dependencies = nil, framework_assemblies = nil) ⇒ Metadata

initialise a new package data object



122
123
124
125
126
127
128
129
130
# 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

Instance Attribute Details

#set_fieldsObject (readonly)

gets the field symbols that have been set



119
120
121
# File 'lib/albacore/nuget_model.rb', line 119

def set_fields
  @set_fields
end

Class Method Details

.from_xml(node) ⇒ Object



278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
# 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

.nuspec_field(*syms) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
# 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) ⇒ Object



311
312
313
314
315
# 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) ⇒ Object



317
318
319
320
321
322
323
# 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

Instance Method Details

#add_dependency(id, version, target_framework = '', group = true) ⇒ Object

add a dependency to the package; id and version



133
134
135
136
137
138
# 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) ⇒ Object

add a framework dependency for the package



141
142
143
144
145
# 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) ⇒ Object

Raises:

  • (ArgumentError)


246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# 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_sObject



272
273
274
# File 'lib/albacore/nuget_model.rb', line 272

def to_s
  "NugetModel::Metadata(#{ @set_fields.map { |f| "#{f}=#{send(f)}" }.join(', ') })"
end

#to_templateObject



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# 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_xmlObject

transform the data structure to the corresponding xml



242
243
244
# File 'lib/albacore/nuget_model.rb', line 242

def to_xml
  to_xml_builder.to_xml
end

#to_xml_builderObject



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/albacore/nuget_model.rb', line 196

def to_xml_builder
  # alt: new(encoding: 'utf-8')
  Nokogiri::XML::Builder.new do |x|
    x. 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