enhanced_marc 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ad98f5c0586a829731494c6607834f40172ecaa
4
+ data.tar.gz: 66b1336d2b53c0d3e961369afb600cd9c19f68d2
5
+ SHA512:
6
+ metadata.gz: 01f621f5eed7ccca3d200284d9c0241c65122a134e545837262d78074fe4126388f18b0697fec18c17f8cc6769fdbb70df105be880ea4192c21c540a8ce845b2
7
+ data.tar.gz: 6c065bbd2ff56ffff49b31630614252ca302238d0a18753295d506822e0c26b4da12801cc51878a8a69f156ce04a682f25ddaeb0680eb0fa0df5f9d0df09fcf5
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [*.{sh,markdown}]
12
+ indent_size = 4
@@ -0,0 +1,2 @@
1
+
2
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0
4
+ - 2.2
5
+ - 2.3
6
+ - jruby
7
+ script: bundle exec rspec spec
data/Changes CHANGED
@@ -1 +1,2 @@
1
- 2009-08-07: Refactored to monkeypatch ruby-marc rather than replace it.
1
+ 2017-05-20: Fixed a bug with how leader was parsed from MARC::Reader, added some specs, style changes
2
+ 2009-08-07: Refactored to monkeypatch ruby-marc rather than replace it.
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ source "https://rubygems.org"
3
+
4
+ gem 'marc'
5
+ gem 'locale'
6
+
7
+ group :test do
8
+ gem 'rspec'
9
+ end
@@ -0,0 +1,59 @@
1
+ Enhanced MARC is a set of classes, modules and methods that sit on top of ruby-marc (http://rubyforge.org/projects/marc) to help parse the contents of MARC records more easily and conveniently.
2
+
3
+ [![Build Status](https://travis-ci.org/rsinger/enhanced-marc.svg?branch=master)](https://travis-ci.org/rsinger/enhanced-marc)
4
+
5
+ Installation:
6
+ sudo gem install enhanced_marc
7
+
8
+ Usage:
9
+ ```
10
+ require 'enhanced_marc'
11
+
12
+ reader = MARC::Reader.new('marc.dat')
13
+
14
+ records = []
15
+
16
+ reader.each do | record |
17
+ records << record
18
+ end
19
+ ```
20
+ Note: enhanced-marc only works directly with `MARC::Reader`. If you want to use it with MARCXML or MARC-JSON, etc.
21
+ you'll need to do something like:
22
+ ```
23
+ reader.each do | record |
24
+ records << record.to_typed_record
25
+ end
26
+ ```
27
+ for the same effect
28
+ ```
29
+ >> records[0].class
30
+ => MARC::BookRecord
31
+
32
+ >> records[0].is_conference?
33
+ => false
34
+
35
+ >> records[0].is_manuscript?
36
+ => false
37
+
38
+ # Send a boolean true if you want human readable forms, rather than MARC codes.
39
+ >> records[0].literary_form(true)
40
+ => "Non-fiction"
41
+
42
+ >> records[0].nature_of_contents(true)
43
+ => ["Bibliography", "Catalog"]
44
+
45
+ >> records[1].class
46
+ => MARC::SoundRecord
47
+
48
+ >> records[1].composition_form(true)
49
+ => "Jazz"
50
+
51
+ >> records[2].class
52
+ => MARC::MapRecord
53
+
54
+ >> records[2].projection(true)
55
+ => ["Cylindrical", "Mercator"]
56
+
57
+ >> records[2].relief(true)
58
+ => ["Color"]
59
+ ```
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- RUBY_ENHANCED_MARC_VERSION = '0.1'
1
+ RUBY_ENHANCED_MARC_VERSION = '0.3.0'
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rake'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
@@ -1,11 +1,6 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
1
  Gem::Specification.new do |s|
7
2
  s.name = %q{enhanced_marc}
8
- s.version = "0.2.3"
3
+ s.version = "0.3.0"
9
4
 
10
5
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
6
  s.authors = ["Ross Singer"]
@@ -14,40 +9,9 @@ Gem::Specification.new do |s|
14
9
  s.email = %q{rossfsinger@gmail.com}
15
10
  s.extra_rdoc_files = [
16
11
  "LICENSE",
17
- "README"
18
- ]
19
- s.files = [
20
- "Changes",
21
- "LICENSE",
22
- "README",
23
- "Rakefile",
24
- "VERSION",
25
- "enhanced_marc.gemspec",
26
- "lib/enhanced_marc.rb",
27
- "lib/enhanced_marc/book_record.rb",
28
- "lib/enhanced_marc/book_type.rb",
29
- "lib/enhanced_marc/computer_record.rb",
30
- "lib/enhanced_marc/computer_type.rb",
31
- "lib/enhanced_marc/leader.rb",
32
- "lib/enhanced_marc/leftovers.rb",
33
- "lib/enhanced_marc/map_record.rb",
34
- "lib/enhanced_marc/map_type.rb",
35
- "lib/enhanced_marc/mixed_record.rb",
36
- "lib/enhanced_marc/mixed_type.rb",
37
- "lib/enhanced_marc/reader.rb",
38
- "lib/enhanced_marc/record.rb",
39
- "lib/enhanced_marc/record_type.rb",
40
- "lib/enhanced_marc/score_record.rb",
41
- "lib/enhanced_marc/score_type.rb",
42
- "lib/enhanced_marc/serial_record.rb",
43
- "lib/enhanced_marc/serial_type.rb",
44
- "lib/enhanced_marc/sound_record.rb",
45
- "lib/enhanced_marc/sound_type.rb",
46
- "lib/enhanced_marc/visual_record.rb",
47
- "lib/enhanced_marc/visual_type.rb",
48
- "lib/enhanced_marc/xmlreader.rb",
49
- "test/ts_enhanced_marc.rb"
12
+ "README.md"
50
13
  ]
14
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
51
15
  s.homepage = %q{http://github.com/rsinger/enhanced-marc/tree}
52
16
  s.rdoc_options = ["--charset=UTF-8"]
53
17
  s.require_paths = ["lib"]
@@ -2,7 +2,6 @@ require 'marc'
2
2
  require 'locale/info'
3
3
  require File.dirname(__FILE__) + '/enhanced_marc/reader'
4
4
  require File.dirname(__FILE__) + '/enhanced_marc/record'
5
- require File.dirname(__FILE__) + '/enhanced_marc/xmlreader'
6
5
  require File.dirname(__FILE__) + '/enhanced_marc/leader'
7
6
  require File.dirname(__FILE__) + '/enhanced_marc/book_record'
8
7
  require File.dirname(__FILE__) + '/enhanced_marc/serial_record'
@@ -1,37 +1,42 @@
1
1
  module MARC
2
2
 
3
3
  # A class that represents an individual MARC record. Every record
4
- # is made up of a collection of MARC::Field objects.
5
-
4
+ # is made up of a collection of MARC::Field objects.
6
5
  class BookRecord < Record
7
6
 
8
7
  def initialize
9
8
  super
10
- @leader[6] = 'a' if @leader[6,1] == ' '
11
- @leader[7] = 'm' if @leader[7,1] == ' '
12
- @record_type = 'BKS'
9
+ @leader[6] = 'a' if @leader[6, 1] == ' '
10
+ @leader[7] = 'm' if @leader[7, 1] == ' '
11
+ @record_type = 'BKS'
13
12
  @bibliographic_level = @leader.get_blvl
14
- self.extend BookType
15
- self.inspect_fixed_fields
13
+ extend BookType
14
+ inspect_fixed_fields
16
15
  end
17
-
18
- def is_valid_type?
19
- return false unless @leader[6,1].match(/[at]{1}/)
20
- return true
16
+
17
+ def valid_type?
18
+ return false unless @leader[6, 1] =~ /[at]{1}/
19
+ true
21
20
  end
22
- def is_valid_blvl?
23
- return false unless @leader[7,1].match(/[acdm]{1}/)
24
- return true
21
+ alias is_valid_type? valid_type?
22
+
23
+ def valid_blvl?
24
+ return false unless @leader[7, 1] =~ /[acdm]{1}/
25
+ true
25
26
  end
27
+ alias is_valid_blvl? valid_blvl?
28
+
26
29
  def self.new_from_record(record)
27
30
  rec = BookRecord.new
28
- record.instance_variables.each { | var |
31
+ record.instance_variables.each do |var|
29
32
  rec.instance_variable_set(var, record.instance_variable_get(var))
30
- }
31
- return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
32
- return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
33
- return rec
34
- end
35
-
33
+ end
34
+ error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
35
+ if !error && !rec.valid_blvl?
36
+ error = 'Incorrect bibliographic declaration in leader'
37
+ end
38
+ return Exception.new(error) if error
39
+ rec
40
+ end
36
41
  end
37
42
  end
@@ -1,87 +1,101 @@
1
+ # Methods for Book records
1
2
  module BookType
2
3
  include RecordType
3
- public :is_govdoc?, :nature_of_contents, :is_conference?, :audience_level, :form, :has_index?
4
- # Checks the leader and any 006 fields to
4
+ public :is_govdoc?, :nature_of_contents, :is_conference?, :audience_level,
5
+ :form, :has_index?, :govdoc?, :conference?
6
+ # Checks the leader and any 006 fields to
5
7
  # determine if the record is a manuscript.
6
8
  # Returns a boolean.
7
- def is_manuscript?
9
+ def manuscript?
8
10
  return true if @leader[6,1] == 't'
9
- @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
10
- return true if fxd_fld.value[0,1] == 't'
11
- }
12
- return false
11
+ @fields.each_by_tag('006') do |fxd_fld|
12
+ return true if fxd_fld.value[0, 1] == 't'
13
+ end
14
+ false
13
15
  end
14
-
15
- def set_manuscript(value=false, field=nil)
16
+
17
+ alias is_manuscript? manuscript?
18
+
19
+ def set_manuscript(value = false, field = nil)
16
20
  if field
17
- return Exception.new("Field is not an 006") unless field.tag == '006'
18
- if value
19
- field.value[0] = 't'
20
- else
21
- field.value[0] = 'a'
22
- end
23
- else
24
- if value
25
- @leader[6] = 't'
26
- else
27
- @leader[6] = 'a'
28
- end
21
+ return Exception.new('Field is not an 006') unless field.tag == '006'
22
+ field.value[0] = value ? 't' : 'a'
23
+ else
24
+ @leader[6] = value ? 't' : 'a'
29
25
  end
30
26
  end
31
-
32
- def literary_form(human_readable=false)
33
- lit_map={'0'=>'Non-fiction', '1'=>'Fiction', 'c'=>'Comic',
34
- 'd'=>'Drama', 'e'=>'Essay', 'f'=>'Novel', 'h'=>'Humor/satire', 'i'=>'Letter', 'j'=>'Short story',
35
- 'm'=>'Mixed', 'p'=>'Poetry', 's'=>'Speech', 'u'=>'Unknown'}
27
+
28
+ def literary_form(human_readable = false)
29
+ lit_map = { '0' => 'Non-fiction', '1' => 'Fiction', 'c' => 'Comic',
30
+ 'd' => 'Drama', 'e' => 'Essay', 'f' => 'Novel',
31
+ 'h' => 'Humor/satire', 'i' => 'Letter', 'j' => 'Short story',
32
+ 'm' => 'Mixed', 'p' => 'Poetry', 's' => 'Speech',
33
+ 'u' => 'Unknown' }
36
34
  human_readable = lit_map if human_readable
37
- return self.field_parser({:match=>'BKS', :start=>33,:end=>1}, {:match=>/[at]{1}/, :start=>16,:end=>1}, human_readable)
38
- end
39
-
40
- def is_biography?(human_readable=false)
41
- biog_map = {'a'=>'Autobiography', 'b'=>'Individual biography',
42
- 'c'=>'Collective biography', 'd'=>'Contains biographical information'}
35
+ field_parser({ match: 'BKS', start: 33, end: 1 },
36
+ { match: /[at]{1}/, start: 16, end: 1 },
37
+ human_readable)
38
+ end
39
+
40
+ def biography?(human_readable = false)
41
+ biog_map = { 'a' => 'Autobiography', 'b' => 'Individual biography',
42
+ 'c' => 'Collective biography',
43
+ 'd' => 'Contains biographical information' }
43
44
  human_readable = biog_map if human_readable
44
- return self.field_parser({:match=>'BKS', :start=>34,:end=>1}, {:match=>/[at]{1}/, :start=>17,:end=>1}, human_readable)
45
- end
46
-
47
- def is_festschrift?
48
- return true if self['008'].value[30,1] == "1" and @record_type == "BKS"
49
- @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
50
- next unless fxd_fld.value[0,1].match(/[at]{1}/) and fxd_fld.value[13,1] == "1"
45
+ field_parser({ match: 'BKS', start: 34, end: 1},
46
+ { match: /[at]{1}/, start: 17, end: 1},
47
+ human_readable)
48
+ end
49
+
50
+ alias is_biography? biography?
51
+
52
+ def festschrift?
53
+ return true if self['008'].value[30, 1] == '1' && @record_type == 'BKS'
54
+ @fields.each_by_tag('006') do |fxd_fld|
55
+ if fxd_fld.value[0, 1].match(/[at]{1}/) && fxd_fld.value[13, 1] == '1'
56
+ next
57
+ end
51
58
  return true
52
- }
53
- return false
54
- end
55
-
56
- def is_illustrated?(human_readable=false)
57
- ills_map = {'a'=>'Illustrations','b'=>'Maps','c'=>'Portraits','d'=>'Charts',
58
- 'e'=>'Plans', 'f'=>'Plates', 'g'=>'Music', 'h'=>'Facsimilies', 'i'=>'Coats of arms',
59
- 'j'=>'Genealogical tables', 'k'=>'Forms', 'l'=>'Samples',
60
- 'm'=>'Phonodisc', 'o'=>'Photographs', 'p'=>'Illuminations'}
61
-
59
+ end
60
+ false
61
+ end
62
+
63
+ alias is_festchrift? festschrift?
64
+
65
+ # TODO: simplify this method
66
+ def illustrated?(human_readable = false)
67
+ ills_map = { 'a' => 'Illustrations', 'b' => 'Maps', 'c' => 'Portraits',
68
+ 'd' => 'Charts', 'e' => 'Plans', 'f' => 'Plates',
69
+ 'g' => 'Music', 'h' => 'Facsimilies', 'i' => 'Coats of arms',
70
+ 'j' => 'Genealogical tables', 'k' => 'Forms', 'l' => 'Samples',
71
+ 'm' => 'Phonodisc', 'o' => 'Photographs',
72
+ 'p' => 'Illuminations' }
73
+
62
74
  contents = []
63
- if self.record_type == 'BKS'
64
- self['008'].value[18,4].split(//).each { | char |
65
- next if char == " "
75
+ if record_type == 'BKS'
76
+ self['008'].value[18, 4].split(//).each do |char|
77
+ next if char == ' '
66
78
  if human_readable
67
79
  contents << ills_map[char] if ills_map[char]
68
80
  else
69
81
  contents << char
70
82
  end
71
- }
83
+ end
72
84
  end
73
- @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
74
- next unless fxd_fld.value[0,1].match(/[at]{1}/)
75
- fxd_fld.value[1,4].split(//).each { | char |
76
- next if char == " "
85
+ @fields.each_by_tag('006') do |fxd_fld|
86
+ next unless fxd_fld.value[0, 1] =~ /[at]{1}/
87
+ fxd_fld.value[1, 4].split(//).each do |char|
88
+ next if char == ' '
77
89
  if human_readable
78
90
  contents << ills_map[char] if ills_map[char]
79
91
  else
80
92
  contents << char
81
93
  end
82
- }
83
- }
94
+ end
95
+ end
84
96
  return false if contents.empty?
85
- return contents
86
- end
87
- end
97
+ contents
98
+ end
99
+
100
+ alias is_illustrated? illustrated?
101
+ end
@@ -1,37 +1,42 @@
1
1
  module MARC
2
2
 
3
3
  # A class that represents an individual MARC record. Every record
4
- # is made up of a collection of MARC::Field objects.
5
-
4
+ # is made up of a collection of MARC::Field objects.
6
5
  class ComputerRecord < Record
7
-
6
+
8
7
  def initialize
9
8
  super
10
9
  @leader[6] = 'm' if @leader[6,1] == ' '
11
- @leader[7] = 'm' if @leader[7,1] == ' '
12
- @record_type = 'COM'
10
+ @leader[7] = 'm' if @leader[7,1] == ' '
11
+ @record_type = 'COM'
13
12
  @bibliographic_level = @leader.get_blvl
14
- self.extend ComputerType
15
- self.inspect_fixed_fields
13
+ extend ComputerType
14
+ inspect_fixed_fields
16
15
  end
17
-
18
- def is_valid_type?
19
- return false unless @leader[6,1].match('m')
20
- return true
16
+
17
+ def valid_type?
18
+ return false unless @leader[6, 1] == 'm'
19
+ true
21
20
  end
22
- def is_valid_blvl?
23
- return false unless @leader[7,1].match(/[abcdims]{1}/)
24
- return true
21
+ alias is_valid_type? valid_type?
22
+
23
+ def valid_blvl?
24
+ return false unless @leader[7, 1] =~ /[abcdims]{1}/
25
+ true
25
26
  end
27
+ alias is_valid_blvl? valid_blvl?
28
+
26
29
  def self.new_from_record(record)
27
30
  rec = ComputerRecord.new
28
- record.instance_variables.each { | var |
31
+ record.instance_variables.each do |var|
29
32
  rec.instance_variable_set(var, record.instance_variable_get(var))
30
- }
31
- return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
32
- return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
33
- return rec
34
- end
35
-
33
+ end
34
+ error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
35
+ if !error && !rec.valid_blvl?
36
+ error = 'Incorrect bibliographic declaration in leader'
37
+ end
38
+ return Exception.new(error) if error
39
+ rec
40
+ end
36
41
  end
37
- end
42
+ end