diff --git a/Rakefile b/Rakefile index 3858827..115e6eb 100644 --- a/Rakefile +++ b/Rakefile @@ -1,41 +1,10 @@ -RUBY_ENHANCED_MARC_VERSION = '0.3.0' - require 'rubygems' require 'rake' -require 'rake/testtask' require 'rake/rdoctask' -require 'rake/packagetask' -require 'rake/gempackagetask' - -task :default => [:test] -Rake::TestTask.new('test') do |t| - t.libs << 'lib' - t.pattern = 'test/tc_*.rb' - t.verbose = true - t.ruby_opts = ['-r marc', '-r test/unit'] -end Rake::RDocTask.new('doc') do |rd| rd.rdoc_files.include("enhanced_marc/**/*.rb") rd.main = 'MARC::Record' rd.rdoc_dir = 'doc' end - -begin - require 'jeweler' - Jeweler::Tasks.new do |s| - - s.add_dependency('marc') - s.add_dependency('locale') - s.name = 'enhanced_marc' - s.author = 'Ross Singer' - s.email = 'rossfsinger@gmail.com' - s.homepage = 'http://github.com/rsinger/enhanced-marc/tree' - s.summary = 'A DSL for MARC data' - s.description = 'A set of enhancements to ruby-marc to make parsing MARC data easier' - end -rescue LoadError - puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com" -end - diff --git a/VERSION b/VERSION index 0d91a54..d15723f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.0 +0.3.2 diff --git a/enhanced_marc.gemspec b/enhanced_marc.gemspec index b603502..43ebfe7 100644 --- a/enhanced_marc.gemspec +++ b/enhanced_marc.gemspec @@ -1,6 +1,10 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'enhanced_marc/version' Gem::Specification.new do |s| s.name = %q{enhanced_marc} - s.version = "0.3.1" + s.version = MARC::EnhancedMARC::VERSION s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Ross Singer"] diff --git a/lib/enhanced_marc.rb b/lib/enhanced_marc.rb index f8db683..06043df 100644 --- a/lib/enhanced_marc.rb +++ b/lib/enhanced_marc.rb @@ -20,3 +20,4 @@ require File.dirname(__FILE__) + '/enhanced_marc/serial_type' require File.dirname(__FILE__) + '/enhanced_marc/sound_type' require File.dirname(__FILE__) + '/enhanced_marc/visual_type' +require File.dirname(__FILE__) + '/enhanced_marc/version' diff --git a/lib/enhanced_marc/leader.rb b/lib/enhanced_marc/leader.rb index b20fa9b..47025cf 100644 --- a/lib/enhanced_marc/leader.rb +++ b/lib/enhanced_marc/leader.rb @@ -73,7 +73,7 @@ def type_translator(type_code, blvl_code) rec_types = { 'BKS' => { type: /[at]{1}/, blvl: /[acdm]{1}/ }, - 'SER' => { type: /[a]{1}/, blvl: /[bs]{1}/ }, + 'SER' => { type: /[a]{1}/, blvl: /[bis]{1}/ }, 'VIS' => { type: /[gkro]{1}/, blvl: /[abcdims]{1}/ }, 'MIX' => { type: /[p]{1}/, blvl: /[cd]{1}/ }, 'MAP' => { type: /[ef]{1}/, blvl: /[abcdims]{1}/ }, diff --git a/lib/enhanced_marc/serial_record.rb b/lib/enhanced_marc/serial_record.rb index cac25f2..7de2103 100644 --- a/lib/enhanced_marc/serial_record.rb +++ b/lib/enhanced_marc/serial_record.rb @@ -1,37 +1,43 @@ module MARC + # TODO: rename to ContinuingResource # A class that represents an individual MARC record. Every record - # is made up of a collection of MARC::Field objects. - + # is made up of a collection of MARC::Field objects. class SerialRecord < Record def initialize super @leader[6] = 'a' if @leader[6,1] == ' ' - @leader[7] = 's' if @leader[7,1] == ' ' - @record_type = 'SER' + @leader[7] = 's' if @leader[7,1] == ' ' + @record_type = 'SER' @bibliographic_level = @leader.get_blvl - self.extend SerialType - self.inspect_fixed_fields + extend SerialType + inspect_fixed_fields end - - def is_valid_type? - return false unless @leader[6,1].match('a') - return true + + def valid_type? + return false unless @leader[6, 1] == 'a' + true end - def is_valid_blvl? - return false unless @leader[7,1].match(/[bis]{1}/) - return true + alias is_valid_type? valid_type? + def valid_blvl? + return false unless @leader[7, 1] =~ /[bis]{1}/ + true end + alias is_valid_blvl? valid_blvl? + def self.new_from_record(record) rec = SerialRecord.new record.instance_variables.each { | var | rec.instance_variable_set(var, record.instance_variable_get(var)) } - return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type? - return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl? - return rec - end - + error = rec.valid_type? ? nil : 'Incorrect type declaration in leader' + if !error && !rec.valid_blvl? + error = 'Incorrect bibliographic declaration in leader' + end + return Exception.new(error) if error + rec + end + end -end \ No newline at end of file +end diff --git a/lib/enhanced_marc/sound_record.rb b/lib/enhanced_marc/sound_record.rb index 03ca3f1..5a30698 100644 --- a/lib/enhanced_marc/sound_record.rb +++ b/lib/enhanced_marc/sound_record.rb @@ -1,37 +1,42 @@ module MARC # A class that represents an individual MARC record. Every record - # is made up of a collection of MARC::Field objects. + # is made up of a collection of MARC::Field objects. class SoundRecord < Record def initialize super - @leader[6] = 'i' if @leader[6,1] == ' ' - @leader[7] = 'm' if @leader[7,1] == ' ' - @record_type = 'REC' + @leader[6] = 'i' if @leader[6, 1] == ' ' + @leader[7] = 'm' if @leader[7, 1] == ' ' + @record_type = 'REC' @bibliographic_level = @leader.get_blvl - self.extend SoundType - self.inspect_fixed_fields + extend SoundType + inspect_fixed_fields end - - def is_valid_type? - return false unless @leader[6,1].match(/[ij]{1}/) - return true + + def valid_type? + return false unless @leader[6, 1] =~ /[ij]{1}/ + true end - def is_valid_blvl? - return false unless @leader[7,1].match(/[abcdims]{1}/) - return true + alias is_valid_type? valid_type? + + def valid_blvl? + return false unless @leader[7, 1] =~ /[abcdims]{1}/ + true end + alias is_valid_blvl? valid_blvl? def self.new_from_record(record) rec = SoundRecord.new record.instance_variables.each { | var | rec.instance_variable_set(var, record.instance_variable_get(var)) } - return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type? - return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl? - return rec - end - + error = rec.valid_type? ? nil : 'Incorrect type declaration in leader' + if !error && !rec.valid_blvl? + error = 'Incorrect bibliographic declaration in leader' + end + return Exception.new(error) if error + rec + end end -end \ No newline at end of file +end diff --git a/lib/enhanced_marc/version.rb b/lib/enhanced_marc/version.rb new file mode 100644 index 0000000..2b669d3 --- /dev/null +++ b/lib/enhanced_marc/version.rb @@ -0,0 +1,5 @@ +module MARC + module EnhancedMARC + VERSION = '0.3.2'.freeze + end +end diff --git a/lib/enhanced_marc/visual_record.rb b/lib/enhanced_marc/visual_record.rb index 33b7079..09d9295 100644 --- a/lib/enhanced_marc/visual_record.rb +++ b/lib/enhanced_marc/visual_record.rb @@ -1,37 +1,43 @@ module MARC # A class that represents an individual MARC record. Every record - # is made up of a collection of MARC::Field objects. - + # is made up of a collection of MARC::Field objects. class VisualRecord < Record def initialize super @leader[6] = 'g' if @leader[6,1] == ' ' - @leader[7] = 'm' if @leader[7,1] == ' ' - @record_type = 'VIS' + @leader[7] = 'm' if @leader[7,1] == ' ' + @record_type = 'VIS' @bibliographic_level = @leader.get_blvl - self.extend VisualType - self.inspect_fixed_fields + extend VisualType + inspect_fixed_fields end - - def is_valid_type? - return false unless @leader[6,1].match(/[gkro]{1}/) - return true + + def valid_type? + return false unless @leader[6, 1] =~ /[gkro]{1}/ + true end - def is_valid_blvl? - return false unless @leader[7,1].match(/[abcdims]{1}/) - return true + alias is_valid_type? valid_type? + + def valid_blvl? + return false unless @leader[7, 1] =~ /[abcdims]{1}/ + true end + alias is_valid_blvl? valid_blvl? + def self.new_from_record(record) rec = VisualRecord.new record.instance_variables.each { | var | rec.instance_variable_set(var, record.instance_variable_get(var)) } - return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type? - return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl? - return rec - end - + error = rec.valid_type? ? nil : 'Incorrect type declaration in leader' + if !error && !rec.valid_blvl? + error = 'Incorrect bibliographic declaration in leader' + end + return Exception.new(error) if error + rec + end + end -end \ No newline at end of file +end diff --git a/spec/continuing_resources_spec.rb b/spec/continuing_resources_spec.rb new file mode 100644 index 0000000..0aafed1 --- /dev/null +++ b/spec/continuing_resources_spec.rb @@ -0,0 +1,26 @@ +require 'enhanced_marc' + +RSpec.describe MARC::SerialRecord do + context 'resource identification from MARC records' do + it "should recognize type 'a' and blvl 'i' as an integrating resource" do + reader = load_marc('text_web_resource.mrc') + rec = reader.first + expect(rec).to be_instance_of(MARC::SerialRecord) + expect(rec).to be_kind_of(MARC::Record) + expect(rec.record_type).to eq('SER') + expect(rec.bibliographic_level).to eq('Integrating resource') + end + it "should recognize type 'a' and blvl 's' as a serial" do + reader = load_marc('ejournal.mrc') + rec = reader.first + expect(rec).to be_instance_of(MARC::SerialRecord) + expect(rec).to be_kind_of(MARC::Record) + expect(rec.record_type).to eq('SER') + expect(rec.bibliographic_level).to eq('Serial') + end + # TODO: add serial component part if example can be found + end + def load_marc(file_name) + MARC::Reader.new(File.dirname(__FILE__) + '/fixtures/' + file_name) + end +end