Commit ca63fd93380ae6afc7ef40705bf32a799d033bb2

Authored by Victor Costa
1 parent 14b5363d

virtuoso: refactoring dublin core metadata

plugins/virtuoso/lib/virtuoso_plugin/dublin_core_metadata.rb
... ... @@ -2,19 +2,27 @@ class VirtuosoPlugin::DublinCoreMetadata
2 2  
3 3 include OAI::XPath
4 4  
5   - attr_accessor :date, :title, :creator, :subject, :description, :date, :type, :identifier, :language, :rights, :format
  5 + FIELDS = ['title', 'creator', 'subject', 'description', 'date',
  6 + 'type', 'identifier', 'language', 'rights', 'format']
6 7  
7 8 def initialize(element)
8   - @title = xpath(element, './/dc:title')
9   - @creator = xpath(element, './/dc:creator')
10   - @subject = xpath_all(element, './/dc:subject').map(&:text)
11   - @description = xpath(element, './/dc:description')
12   - @date = xpath(element, './/dc:date')
13   - @type = xpath(element, './/dc:type')
14   - @identifier = xpath(element, './/dc:identifier')
15   - @language = xpath(element, './/dc:language')
16   - @rights = xpath_all(element, './/dc:rights').map(&:text)
17   - @format = xpath(element, './/dc:format')
  9 + @element = element
  10 + FIELDS.each do |field|
  11 + self.class.send(:attr_accessor, field)
  12 + self.send("#{field}=", extract_field("dc:#{field}"))
  13 + end
  14 + end
  15 +
  16 + def extract_field(name)
  17 + value = xpath_all(@element, ".//#{name}")
  18 + case value.size
  19 + when 0
  20 + nil
  21 + when 1
  22 + value.first.text
  23 + else
  24 + value.map(&:text)
  25 + end
18 26 end
19 27  
20 28 end
... ...
plugins/virtuoso/test/unit/dublin_core_metadata_test.rb 0 → 100644
... ... @@ -0,0 +1,51 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class DublinCoreMetadataTest < ActiveSupport::TestCase
  4 +
  5 + should 'parse default dublin core fields' do
  6 + dc = VirtuosoPlugin::DublinCoreMetadata.new(metadata)
  7 + assert_equal "Title", dc.title
  8 + assert_equal "Creator", dc.creator
  9 + assert_equal ["Subject", "Other Subject"], dc.subject
  10 + assert_equal "Description", dc.description
  11 + assert_equal "2014", dc.date
  12 + assert_equal "Type", dc.type
  13 + assert_equal "Identifier", dc.identifier
  14 + assert_equal "Language", dc.language
  15 + assert_equal "Rights", dc.rights
  16 + assert_equal "Format", dc.format
  17 + end
  18 +
  19 + should 'extract fields' do
  20 + dc = VirtuosoPlugin::DublinCoreMetadata.new(metadata)
  21 + assert_equal "Title", dc.extract_field('dc:title')
  22 + assert_equal "Creator", dc.extract_field('dc:creator')
  23 + assert_equal ["Subject", "Other Subject"], dc.extract_field('dc:subject')
  24 + end
  25 +
  26 + should 'return nil when field do not exists' do
  27 + dc = VirtuosoPlugin::DublinCoreMetadata.new(metadata)
  28 + assert_equal nil, dc.extract_field('dc:undefinedField')
  29 + end
  30 +
  31 + def metadata
  32 + REXML::Document.new('
  33 + <metadata>
  34 + <oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  35 + <dc:title>Title</dc:title>
  36 + <dc:creator>Creator</dc:creator>
  37 + <dc:subject>Subject</dc:subject>
  38 + <dc:subject>Other Subject</dc:subject>
  39 + <dc:description>Description</dc:description>
  40 + <dc:date>2014</dc:date>
  41 + <dc:type>Type</dc:type>
  42 + <dc:identifier>Identifier</dc:identifier>
  43 + <dc:language>Language</dc:language>
  44 + <dc:rights>Rights</dc:rights>
  45 + <dc:format>Format</dc:format>
  46 + </oai_dc:dc>
  47 + </metadata>
  48 + ')
  49 + end
  50 +
  51 +end
... ...