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.
- checksums.yaml +7 -0
- data/.editorconfig +12 -0
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Changes +2 -1
- data/Gemfile +9 -0
- data/README.md +59 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/enhanced_marc.gemspec +3 -39
- data/lib/enhanced_marc.rb +0 -1
- data/lib/enhanced_marc/book_record.rb +26 -21
- data/lib/enhanced_marc/book_type.rb +76 -62
- data/lib/enhanced_marc/computer_record.rb +27 -22
- data/lib/enhanced_marc/computer_type.rb +14 -11
- data/lib/enhanced_marc/leader.rb +99 -101
- data/lib/enhanced_marc/map_record.rb +31 -23
- data/lib/enhanced_marc/map_type.rb +27 -23
- data/lib/enhanced_marc/record.rb +5 -2
- data/lib/enhanced_marc/record_type.rb +87 -96
- data/lib/enhanced_marc/score_type.rb +3 -2
- data/lib/enhanced_marc/serial_type.rb +19 -19
- data/lib/enhanced_marc/sound_type.rb +3 -2
- data/lib/enhanced_marc/visual_type.rb +9 -9
- data/pkg/enhanced_marc-0.1.5.gem +0 -0
- data/pkg/enhanced_marc-0.1.gem +0 -0
- data/pkg/enhanced_marc-0.1.tgz +0 -0
- data/pkg/enhanced_marc-0.1.zip +0 -0
- data/pkg/enhanced_marc-0.1/Changes +1 -0
- data/pkg/enhanced_marc-0.1/LICENSE +21 -0
- data/{README → pkg/enhanced_marc-0.1/README} +2 -2
- data/pkg/enhanced_marc-0.1/Rakefile +23 -0
- data/pkg/enhanced_marc-0.1/test/ts_enhanced_marc.rb +5 -0
- metadata +61 -67
- data/lib/enhanced_marc/xmlreader.rb +0 -58
checksums.yaml
ADDED
@@ -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
|
data/.editorconfig
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Changes
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
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
data/README.md
ADDED
@@ -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
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/enhanced_marc.gemspec
CHANGED
@@ -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.
|
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
|
-
|
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"]
|
data/lib/enhanced_marc.rb
CHANGED
@@ -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
|
-
|
15
|
-
|
13
|
+
extend BookType
|
14
|
+
inspect_fixed_fields
|
16
15
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
return false unless @leader[6,1]
|
20
|
-
|
16
|
+
|
17
|
+
def valid_type?
|
18
|
+
return false unless @leader[6, 1] =~ /[at]{1}/
|
19
|
+
true
|
21
20
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
31
|
+
record.instance_variables.each do |var|
|
29
32
|
rec.instance_variable_set(var, record.instance_variable_get(var))
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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,
|
4
|
-
|
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
|
9
|
+
def manuscript?
|
8
10
|
return true if @leader[6,1] == 't'
|
9
|
-
@fields.
|
10
|
-
return true if fxd_fld.value[0,1] == 't'
|
11
|
-
|
12
|
-
|
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
|
-
|
16
|
+
|
17
|
+
alias is_manuscript? manuscript?
|
18
|
+
|
19
|
+
def set_manuscript(value = false, field = nil)
|
16
20
|
if field
|
17
|
-
return Exception.new(
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
35
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
64
|
-
self['008'].value[18,4].split(//).each
|
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.
|
74
|
-
next unless fxd_fld.value[0,1]
|
75
|
-
fxd_fld.value[1,4].split(//).each
|
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
|
-
|
86
|
-
end
|
87
|
-
|
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
|
-
|
15
|
-
|
13
|
+
extend ComputerType
|
14
|
+
inspect_fixed_fields
|
16
15
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
return false unless @leader[6,1]
|
20
|
-
|
16
|
+
|
17
|
+
def valid_type?
|
18
|
+
return false unless @leader[6, 1] == 'm'
|
19
|
+
true
|
21
20
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
31
|
+
record.instance_variables.each do |var|
|
29
32
|
rec.instance_variable_set(var, record.instance_variable_get(var))
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|