| Name | Total Lines | Lines of Code | Total Coverage | Code Coverage | 
|---|---|---|---|---|
| /home/masa/ywesee/oddb.org/ext/export/src/oddbdat.rb | 674 | 658 | 54.75% | 55.02% | 
Code reported as executed by Ruby looks like this...and this: this line is also marked as covered.Lines considered as run by rcov, but not reported by Ruby, look like this,and this: these lines were inferred by rcov (using simple heuristics).Finally, here's a line marked as not executed.
| 1 #!/usr/bin/env ruby | 
| 2 # OddbDat -- oddb -- 09.12.2004 -- hwyss@ywesee.com | 
| 3 | 
| 4 require 'encoding/character/utf-8' | 
| 5 | 
| 6 module ODDB | 
| 7 module OdbaExporter | 
| 8 class Table | 
| 9 CRLF = "\r\n" | 
| 10 def filename | 
| 11 self::class::FILENAME | 
| 12 end | 
| 13 end | 
| 14 class AcTable < Table | 
| 15 FILENAME = 's01x' | 
| 16 def lines(package) | 
| 17 [AcLine.new(package)] | 
| 18 end | 
| 19 end | 
| 20 class AccompTable < Table | 
| 21 FILENAME = 's19x' | 
| 22 def lines(package) | 
| 23 [AccompLine.new(package)] | 
| 24 end | 
| 25 end | 
| 26 class AcLimTable < Table | 
| 27 FILENAME = 's09x' | 
| 28 def lines(package) | 
| 29 lines = [] | 
| 30 unless((sl = package.sl_entry).nil?) | 
| 31 if(lim = sl.limitation_text) | 
| 32 chap = lim.descriptions.values.first | 
| 33 chap.paragraphs.each_with_index { |par, idx| | 
| 34 pack = package.oid | 
| 35 line = idx | 
| 36 lim = (pack.to_s + sprintf('%03i', line).to_s).to_i | 
| 37 lines << AcLimLine.new(pack, line, lim) | 
| 38 } | 
| 39 end | 
| 40 end | 
| 41 lines | 
| 42 end | 
| 43 end | 
| 44 class AcmedTable < Table | 
| 45 FILENAME = 's02x' | 
| 46 def lines(package) | 
| 47 [AcmedLine.new(package)] | 
| 48 end | 
| 49 end | 
| 50 class AcnamTable < Table | 
| 51 FILENAME = 's03x' | 
| 52 def lines(package) | 
| 53 [AcnamLine.new(package)] | 
| 54 end | 
| 55 end | 
| 56 class AcOddbTable < Table | 
| 57 FILENAME = 's99x' | 
| 58 def lines(package) | 
| 59 lines = [] | 
| 60 if(package.pharmacode) | 
| 61 lines << AcOddbLine.new(package) | 
| 62 end | 
| 63 lines | 
| 64 end | 
| 65 end | 
| 66 class AcpricealgTable < Table | 
| 67 FILENAME = 's07x' | 
| 68 def lines(package) | 
| 69 lines = [ | 
| 70 AcpricealgPublicLine.new(package), | 
| 71 AcpricealgExfactoryLine.new(package), | 
| 72 ] | 
| 73 lines.delete_if { |line| line.empty? } | 
| 74 lines | 
| 75 end | 
| 76 end | 
| 77 class AcscTable < Table | 
| 78 FILENAME = 's41x' | 
| 79 def lines(package) | 
| 80 lines = [] | 
| 81 package.active_agents.each_with_index { |act, idx| | 
| 82 lines.push(AcscLine.new(package, act, idx)) | 
| 83 } | 
| 84 lines | 
| 85 end | 
| 86 end | 
| 87 class LimitationTable < Table | 
| 88 FILENAME = 's16x' | 
| 89 def lines(package) | 
| 90 lines = [] | 
| 91 unless((sl = package.sl_entry).nil?) | 
| 92 if(lim = sl.limitation_text) | 
| 93 chap = lim.descriptions.values.first | 
| 94 chap.paragraphs.each_with_index { |par, idx| | 
| 95 pack = package.oid | 
| 96 line = idx | 
| 97 lim = (pack.to_s + sprintf('%03i', line).to_s).to_i | 
| 98 lines << LimitationLine.new(lim) | 
| 99 } | 
| 100 end | 
| 101 end | 
| 102 lines | 
| 103 end | 
| 104 end | 
| 105 class LimTxtTable < Table | 
| 106 FILENAME = 's10x' | 
| 107 def lines(package) | 
| 108 lines = [] | 
| 109 unless((sl = package.sl_entry).nil?) | 
| 110 if(lim = sl.limitation_text) | 
| 111 lim.descriptions.each { |lang, value| | 
| 112 value.paragraphs.each_with_index { |par, idx| | 
| 113 language = lang[0,1].upcase | 
| 114 lim = (package.oid.to_s + sprintf('%03i', idx).to_s).to_i | 
| 115 txt = par.text | 
| 116 lines << LimTxtLine.new(lim, language, txt) | 
| 117 } | 
| 118 } | 
| 119 end | 
| 120 end | 
| 121 lines | 
| 122 end | 
| 123 end | 
| 124 class EanTable < Table | 
| 125 FILENAME = 's06x' | 
| 126 def lines(package) | 
| 127 [EanLine.new(package)] | 
| 128 end | 
| 129 end | 
| 130 class MCMTable < Table | 
| 131 FILENAME = 's31x' | 
| 132 def lines(fi) | 
| 133 lines = [] | 
| 134 fi.descriptions.each { |lang, doc| | 
| 135 line = 1 | 
| 136 doc.each_chapter { |chap| | 
| 137 text = format_line(chap) | 
| 138 while(text.size > 220) | 
| 139 pos = text.rindex(' ', 220) | 
| 140 if(pos.nil?) | 
| 141 pos = text.rindex('<P>', 220)-1 | 
| 142 end | 
| 143 txt = text.slice!(0..pos) | 
| 144 lines << MCMLine.new(fi.oid, line, lang, txt) | 
| 145 line = line.next | 
| 146 end | 
| 147 lines << MCMLine.new(fi.oid, line, lang, text) | 
| 148 line = line.next | 
| 149 } | 
| 150 } | 
| 151 lines | 
| 152 end | 
| 153 def format_line(chapter) | 
| 154 string = String.new | 
| 155 unless((head = chapter.heading).empty?) | 
| 156 string << '<BI>' << head.to_s << '<E><P>' | 
| 157 end | 
| 158 chapter.sections.each { |sec| | 
| 159 unless((subhead = sec.subheading).empty?) | 
| 160 subhead = subhead.gsub(/\n/u, "<P>") | 
| 161 string << '<I>' << subhead.to_s << '<E>' | 
| 162 end | 
| 163 sec.paragraphs.each { |par| | 
| 164 case par | 
| 165 when ODDB::Text::ImageLink | 
| 166 string << "<IMG src='http://#{SERVER_NAME}#{par.src}'/>" | 
| 167 when ODDB::Text::Table | 
| 168 string << '<N>' << par.to_s << '<E>' | 
| 169 else | 
| 170 text = u par.text | 
| 171 par.formats.each { |format| | 
| 172 start_tag = "" | 
| 173 end_tag = "" | 
| 174 if(format.italic?) | 
| 175 start_tag = "<I>" | 
| 176 end_tag = "<E>" | 
| 177 elsif(format.bold?) | 
| 178 start_tag = "<B>" | 
| 179 end_tag = "<E>" | 
| 180 end | 
| 181 if formatted = text[format.range] | 
| 182 string << start_tag << formatted << end_tag | 
| 183 end | 
| 184 } | 
| 185 string << "<P>" | 
| 186 if(par.preformatted?) | 
| 187 string.gsub!(/ /, '_') | 
| 188 string.gsub!(/\n/, "<P>") | 
| 189 end | 
| 190 end | 
| 191 } | 
| 192 } | 
| 193 string.gsub(/\n/u, ' ') | 
| 194 end | 
| 195 end | 
| 196 class CodesTable < Table | 
| 197 FILENAME = 's11x' | 
| 198 def lines(item) | 
| 199 case item | 
| 200 when AtcClass | 
| 201 atclines(item) | 
| 202 when GalenicForm | 
| 203 gallines(item) | 
| 204 end | 
| 205 end | 
| 206 def atclines(atcclass) | 
| 207 [AtcLine.new(atcclass)] | 
| 208 end | 
| 209 def gallines(galform) | 
| 210 [GalenicFormLine.new(galform)] | 
| 211 end | 
| 212 end | 
| 213 class ScTable < Table | 
| 214 FILENAME = 's40x' | 
| 215 def lines(substance) | 
| 216 [ScLine.new(nil, substance)] | 
| 217 end | 
| 218 end | 
| 219 class CompTable < Table | 
| 220 FILENAME = 's12x' | 
| 221 def lines(company) | 
| 222 [CompLine.new(company)] | 
| 223 end | 
| 224 end | 
| 225 class Readme < Table | 
| 226 FILENAME = 'README' | 
| 227 def lines | 
| 228 <<-EOS | 
| 229 oddbdat.tar.gz und oddbdat.zip enthalten die täglich aktualisierten Artikelstammdaten der ODDB. Die Daten werden von ywesee in das OddbDat-Format umgewandelt und allen gewünschten Systemlieferanten von Schweizer Spitälern zur Verfügung gestellt. | 
| 230 | 
| 231 Feedback bitte an zdavatz@ywesee.com | 
| 232 | 
| 233 -AC (Tabelle 1) - ODDB-Code | 
| 234 -ACMED (Tabelle 2) - Weitere Produktinformationen | 
| 235 -ACNAM (Tabelle 3) - Sprachen | 
| 236 -ACBARCODE (Tabelle 6) - EAN-Artikelcode | 
| 237 -ACPRICEALG (Tabelle 7) - Preise | 
| 238 -ACLIM (Tabelle 9) - Limitationen | 
| 239 -LIMTXT (Tabelle 10) - Limitationstexte | 
| 240 -CODES (Tabelle 11) - Codebeschreibungen (ATC-Beschreibung, Galenische Form) | 
| 241 -COMP (Tabelle 12) - Hersteller | 
| 242 -LIMITATION (Tabelle 16) - Limitationen der SL | 
| 243 -ACCOMP (Tabelle 19) - Verbindungstabelle zwischen AC und COMP | 
| 244 -SC (Tabelle 40) - Substanzen | 
| 245 -ACSC (Tabelle 41) - Verbindungstabelle zwischen AC und SC | 
| 246 -ACODDB (Tabelle 99) - Verbindungstabelle zwischen ODDB-ID und Pharmacode | 
| 247 | 
| 248 Folgende Tabelle mit den Fachinformationen steht wegen ihrer Grösse separat als tar.gz- oder zip-Download zur Verfügung. | 
| 249 | 
| 250 -MCM (Tabelle 31) - Fachinformationen | 
| 251 | 
| 252 Die Daten werden als oddbdat.tar.gz und oddbdat.zip auf unserem Server bereitgestellt - Vorzugsweise benutzen Sie einen der folgenden direkten Links. | 
| 253 | 
| 254 Ganze Packages (ohne Fachinformationen): | 
| 255 http://www.oddb.org/resources/downloads/oddbdat.tar.gz | 
| 256 http://www.oddb.org/resources/downloads/oddbdat.zip | 
| 257 | 
| 258 Nur Fachinformationen (sehr grosse Dateien): | 
| 259 http://www.oddb.org/resources/downloads/s31x.tar.gz | 
| 260 http://www.oddb.org/resources/downloads/s31x.zip | 
| 261 | 
| 262 | 
| 263 EOS | 
| 264 end | 
| 265 end | 
| 266 class Line | 
| 267 def initialize(*args) | 
| 268 @date = Date.today.strftime("%Y%m%d%H%M%S") | 
| 269 @structure = structure | 
| 270 end | 
| 271 def content(structure) | 
| 272 return [] if structure.nil? | 
| 273 fields = Array.new(self::class::LENGTH) | 
| 274 structure.each_pair { |place, field| | 
| 275 # schlüssel in structure entsprechen der OddbDat-Doku | 
| 276 fields[place-1] = field | 
| 277 } | 
| 278 fields | 
| 279 end | 
| 280 def empty? | 
| 281 @structure.nil? | 
| 282 end | 
| 283 def structure | 
| 284 end | 
| 285 def to_s | 
| 286 content(@structure).join('|').gsub("\000", "") | 
| 287 end | 
| 288 end | 
| 289 class PackageLine < Line | 
| 290 def initialize(package, *args) | 
| 291 @package = package | 
| 292 super | 
| 293 end | 
| 294 end | 
| 295 class SubstanceLine < PackageLine | 
| 296 def initialize(package, substance, *args) | 
| 297 @substance = substance | 
| 298 super | 
| 299 end | 
| 300 end | 
| 301 class AcLine < PackageLine | 
| 302 LENGTH = 55 | 
| 303 def structure | 
| 304 { | 
| 305 1 => '01', | 
| 306 2 => @date, | 
| 307 3 => '1', | 
| 308 4 => @package.oid, | 
| 309 5 => '4', | 
| 310 7 => ikskey, | 
| 311 14 => @package.ikscat, | 
| 312 # @package hat immer eine registration, da | 
| 313 # Registration::create_package die Verknüpfung erstellt | 
| 314 20 => generic_code(@package.registration), | 
| 315 22 => iks_date(@package.registration), | 
| 316 29 => (@package.sl_entry) ? '3' : nil, | 
| 317 32 => (@package.public?) ? nil : 'H', | 
| 318 39 => inscode, | 
| 319 40 => limitation, | 
| 320 41 => limitation_points, | 
| 321 47 => (@package.narcotics.empty?) ? nil : 'y', | 
| 322 } | 
| 323 end | 
| 324 def generic_code(registration) | 
| 325 if registration.generic_type == :generic | 
| 326 'Y' | 
| 327 end | 
| 328 end | 
| 329 def iks_date(registration) | 
| 330 if(date = registration.registration_date) | 
| 331 date.strftime("%Y%m%d") | 
| 332 end | 
| 333 end | 
| 334 def ikskey | 
| 335 ikskey = @package.iksnr.dup | 
| 336 ikskey << @package.ikscd | 
| 337 ikskey | 
| 338 end | 
| 339 def inscode | 
| 340 if @package.sl_entry | 
| 341 '1' | 
| 342 end | 
| 343 end | 
| 344 def limitation | 
| 345 if((sl = @package.sl_entry) && (sl.limitation)) | 
| 346 'Y' | 
| 347 end | 
| 348 end | 
| 349 def limitation_points | 
| 350 if(sl = @package.sl_entry) | 
| 351 sl.limitation_points | 
| 352 end | 
| 353 end | 
| 354 end | 
| 355 class AccompLine < PackageLine | 
| 356 LENGTH = 8 | 
| 357 def structure | 
| 358 if(comp = @package.registration.company) | 
| 359 { | 
| 360 1 => '19', | 
| 361 2 => @date, | 
| 362 3 => @package.oid, | 
| 363 4 => comp.oid, | 
| 364 5 => 'H', | 
| 365 6 => '4', | 
| 366 } | 
| 367 end | 
| 368 end | 
| 369 end | 
| 370 class AcLimLine < PackageLine | 
| 371 LENGTH = 8 | 
| 372 def initialize(package_oid, line_oid, lim_oid) | 
| 373 @package_oid = package_oid | 
| 374 @line_oid = line_oid | 
| 375 @lim_oid = lim_oid | 
| 376 super | 
| 377 end | 
| 378 def structure | 
| 379 { | 
| 380 1 => '09', | 
| 381 2 => @date, | 
| 382 3 => @package_oid, | 
| 383 4 => @lim_oid, | 
| 384 5 => @line_oid, | 
| 385 6 => '4', | 
| 386 } | 
| 387 end | 
| 388 end | 
| 389 class AcnamLine < PackageLine | 
| 390 LENGTH = 26 | 
| 391 def structure | 
| 392 seq = @package.sequence | 
| 393 galform = if(gf = seq.galenic_forms.first) | 
| 394 gf.to_s | 
| 395 end | 
| 396 conc, unit = if((dose = seq.dose) && dose.is_a?(Quanty)) | 
| 397 [dose.qty, dose.unit] | 
| 398 end | 
| 399 measures = @package.parts.collect { |part| part.measure }.compact | 
| 400 measure, munit = unless(measures.empty?) | 
| 401 ms = measures.inject { |a, b| a + b } | 
| 402 [ms.qty, ms.unit] if ms.is_a?(Quanty) | 
| 403 end | 
| 404 comform = @package.commercial_forms.first | 
| 405 qty, qty_unit = if(munit && !munit.empty?) | 
| 406 [measure, munit] | 
| 407 else | 
| 408 [@package.comparable_size.qty, comform] | 
| 409 end | 
| 410 { | 
| 411 1 => '03', | 
| 412 2 => @date, | 
| 413 3 => '1', | 
| 414 4 => @package.oid, | 
| 415 5 => 'D', | 
| 416 6 => '4', | 
| 417 7 => seq.name, | 
| 418 8 => seq.name_base, | 
| 419 9 => seq.name_descr, | 
| 420 11 => galform, | 
| 421 12 => conc, | 
| 422 13 => unit, | 
| 423 16 => @package.parts.first ? @package.parts.first.multi : '', | 
| 424 17 => comform, | 
| 425 18 => qty, | 
| 426 19 => qty_unit, | 
| 427 } | 
| 428 end | 
| 429 end | 
| 430 class AcmedLine < PackageLine | 
| 431 LENGTH = 27 | 
| 432 def structure | 
| 433 atccd = if(atc = @package.sequence.atc_class) | 
| 434 atc.code | 
| 435 end | 
| 436 gfid = if(galform = @package.galenic_forms.first) | 
| 437 galform.oid | 
| 438 end | 
| 439 fioid = if(fachinfo = @package.fachinfo) | 
| 440 fachinfo.oid | 
| 441 end | 
| 442 atc = @package.sequence.atc_class | 
| 443 { | 
| 444 1 => '02', | 
| 445 2 => @date, | 
| 446 3 => '1', | 
| 447 4 => @package.oid, | 
| 448 5 => '4', | 
| 449 7 => fioid, | 
| 450 10 => atccd, | 
| 451 12 => gfid, | 
| 452 } | 
| 453 end | 
| 454 end | 
| 455 class AcOddbLine < PackageLine | 
| 456 LENGTH = 2 | 
| 457 def structure | 
| 458 { | 
| 459 1 => @package.oid, | 
| 460 2 => @package.pharmacode, | 
| 461 } | 
| 462 end | 
| 463 end | 
| 464 class AcpricealgPublicLine < PackageLine | 
| 465 LENGTH = 9 | 
| 466 def structure | 
| 467 if(ppub = @package.price_public) | 
| 468 { | 
| 469 1 => '07', | 
| 470 2 => @date, | 
| 471 3 => @package.oid, | 
| 472 4 => price_public_type, | 
| 473 5 => '4', | 
| 474 6 => sprintf('%2.2f', ppub.to_f), | 
| 475 } | 
| 476 end | 
| 477 end | 
| 478 def price_public_type | 
| 479 if @package.sl_entry | 
| 480 'PSL2' | 
| 481 else | 
| 482 'PPUB' | 
| 483 end | 
| 484 end | 
| 485 end | 
| 486 class AcpricealgExfactoryLine < PackageLine | 
| 487 LENGTH = 9 | 
| 488 def structure | 
| 489 if(pexf = @package.price_exfactory) | 
| 490 { | 
| 491 1 => '07', | 
| 492 2 => @date, | 
| 493 3 => @package.oid, | 
| 494 4 => 'PSL1', | 
| 495 5 => '4', | 
| 496 6 => sprintf('%2.2f', pexf.to_f), | 
| 497 } | 
| 498 end | 
| 499 end | 
| 500 end | 
| 501 class AcscLine < SubstanceLine | 
| 502 LENGTH = 10 | 
| 503 def initialize(package, active_agent, count) | 
| 504 @count = count | 
| 505 super | 
| 506 end | 
| 507 def structure | 
| 508 return if @substance.nil? | 
| 509 qty, unit = if((dose = @substance.dose) && dose.is_a?(Quanty)) | 
| 510 [dose.qty, dose.unit] | 
| 511 end | 
| 512 { | 
| 513 1 => '41', | 
| 514 2 => @date, | 
| 515 3 => @package.oid, | 
| 516 4 => @count, | 
| 517 5 => '4', | 
| 518 6 => @substance.substance.oid, | 
| 519 7 => qty, | 
| 520 8 => unit, | 
| 521 9 => 'W', | 
| 522 } | 
| 523 end | 
| 524 end | 
| 525 class AtcLine < Line | 
| 526 LENGTH = 9 | 
| 527 def initialize(atcclass) | 
| 528 @atcclass = atcclass | 
| 529 super | 
| 530 end | 
| 531 def structure | 
| 532 return if @atcclass.nil? | 
| 533 { | 
| 534 1 => '11', | 
| 535 2 => @date, | 
| 536 3 => '8', | 
| 537 4 => @atcclass.code, | 
| 538 5 => 'D', | 
| 539 6 => '4', | 
| 540 7 => @atcclass.description, | 
| 541 } | 
| 542 end | 
| 543 end | 
| 544 class CompLine < Line | 
| 545 LENGTH = 19 | 
| 546 def initialize(company) | 
| 547 @company = company | 
| 548 super | 
| 549 end | 
| 550 def structure | 
| 551 addr = @company.address(0) | 
| 552 { | 
| 553 1 => '12', | 
| 554 2 => @date, | 
| 555 3 => @company.oid, | 
| 556 4 => '4', | 
| 557 5 => @company.ean13, | 
| 558 7 => @company.name, | 
| 559 8 => addr.address, | 
| 560 9 => 'CH', | 
| 561 10 => addr.plz, | 
| 562 11 => addr.city, | 
| 563 13 => addr.fon.first, | 
| 564 15 => addr.fax.first, | 
| 565 16 => @company.address_email, | 
| 566 17 => @company.url, | 
| 567 } | 
| 568 end | 
| 569 end | 
| 570 class EanLine < PackageLine | 
| 571 LENGTH = 8 | 
| 572 def structure | 
| 573 { | 
| 574 1 => '06', | 
| 575 2 => @date, | 
| 576 3 => @package.oid, | 
| 577 4 => 'E13', | 
| 578 5 => barcode, | 
| 579 6 => '4', | 
| 580 } | 
| 581 end | 
| 582 def barcode | 
| 583 @package.barcode | 
| 584 end | 
| 585 end | 
| 586 class GalenicFormLine < Line | 
| 587 LENGTH = 9 | 
| 588 def initialize(galenic_form) | 
| 589 @galenic_form = galenic_form | 
| 590 super | 
| 591 end | 
| 592 def structure | 
| 593 { | 
| 594 1 => '11', | 
| 595 2 => @date, | 
| 596 3 => '5', | 
| 597 4 => @galenic_form.oid, | 
| 598 5 => 'D', | 
| 599 6 => '4', | 
| 600 7 => @galenic_form.to_s, | 
| 601 } | 
| 602 end | 
| 603 end | 
| 604 class ScLine < SubstanceLine | 
| 605 LENGTH = 8 | 
| 606 def structure | 
| 607 { | 
| 608 1 => '40', | 
| 609 2 => @date, | 
| 610 3 => @substance.oid, | 
| 611 4 => 'L', | 
| 612 5 => '4', | 
| 613 6 => @substance, | 
| 614 } | 
| 615 end | 
| 616 end | 
| 617 class LimitationLine < PackageLine | 
| 618 LENGTH = 10 | 
| 619 def initialize(lim_oid) | 
| 620 @lim_oid = lim_oid | 
| 621 super | 
| 622 end | 
| 623 def structure | 
| 624 { | 
| 625 1 => '16', | 
| 626 2 => @date, | 
| 627 3 => @lim_oid, | 
| 628 5 => '4', | 
| 629 6 => 'COM', | 
| 630 } | 
| 631 end | 
| 632 end | 
| 633 class LimTxtLine < Line | 
| 634 LENGTH = 8 | 
| 635 def initialize(lim_oid, language, txt) | 
| 636 @lim_oid = lim_oid | 
| 637 @language = language | 
| 638 @txt = txt | 
| 639 super | 
| 640 end | 
| 641 def structure | 
| 642 { | 
| 643 1 => '10', | 
| 644 2 => @date, | 
| 645 3 => @lim_oid, | 
| 646 4 => @language, | 
| 647 5 => '4', | 
| 648 6 => @txt, | 
| 649 } | 
| 650 end | 
| 651 end | 
| 652 class MCMLine < Line | 
| 653 LENGTH = 7 | 
| 654 def initialize(fi_oid, line_nr, language, text) | 
| 655 @fi_oid = fi_oid | 
| 656 @line_nr = line_nr | 
| 657 @language = language | 
| 658 @text = text | 
| 659 super | 
| 660 end | 
| 661 def structure | 
| 662 { | 
| 663 1 => '31', | 
| 664 2 => @date, | 
| 665 3 => @fi_oid, | 
| 666 4 => @language.to_s[0,1].upcase, | 
| 667 5 => @line_nr, | 
| 668 6 => '4', | 
| 669 7 => @text, | 
| 670 } | 
| 671 end | 
| 672 end | 
| 673 end | 
| 674 end | 
Generated on Fri Feb 04 07:44:50 +0100 2011 with rcov 0.9.8