enhanced_marc 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
@@ -1,14 +1,17 @@
|
|
1
|
+
# Methods for Computer records
|
1
2
|
module ComputerType
|
2
3
|
include RecordType
|
3
|
-
public :form, :audience_level, :is_govdoc?
|
4
|
-
def file_type(human_readable=false)
|
5
|
-
return false unless
|
6
|
-
file_map = {'a'=>'Numeric data', 'b'=>'Computer program',
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
public :form, :audience_level, :is_govdoc?, :govdoc?, :conference?
|
5
|
+
def file_type(human_readable = false)
|
6
|
+
return false unless contains_type?('COM')
|
7
|
+
file_map = { 'a' => 'Numeric data', 'b' => 'Computer program',
|
8
|
+
'c' => 'Representational', 'd' => 'Document',
|
9
|
+
'e' => 'Bibliographic data', 'f' => 'Font', 'g' => 'Game',
|
10
|
+
'h' => 'Sounds', 'i' => 'Interactive multimedia',
|
11
|
+
'j' => 'Online', 'm' => 'Combination', 'u' => 'Unknown',
|
12
|
+
'z' => 'Other' }
|
10
13
|
human_readable = file_map if human_readable
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
14
|
+
field_parser({ match: 'COM', start: 26, end: 1 },
|
15
|
+
{ match: 'm', start: 9, end: 1 }, human_readable)
|
16
|
+
end
|
17
|
+
end
|
data/lib/enhanced_marc/leader.rb
CHANGED
@@ -1,132 +1,130 @@
|
|
1
1
|
module MARC
|
2
|
-
|
2
|
+
|
3
3
|
# A class for accessing the MARC Leader
|
4
4
|
class Leader < String
|
5
|
-
attr_reader :leader, :
|
5
|
+
attr_reader :leader, :fixed_fields
|
6
6
|
def initialize(leader)
|
7
|
-
super
|
7
|
+
super
|
8
8
|
# leader defaults:
|
9
9
|
# http://www.loc.gov/marc/bibliographic/ecbdldrd.html
|
10
10
|
self[10..11] = '22'
|
11
|
-
self[20..23] = '4500'
|
12
|
-
end
|
13
|
-
|
14
|
-
def parse_leader
|
15
|
-
self.get_type
|
16
|
-
self.get_blvl
|
17
|
-
self.get_elvl
|
11
|
+
self[20..23] = '4500'
|
18
12
|
end
|
19
|
-
|
20
|
-
def
|
21
|
-
|
13
|
+
|
14
|
+
def type_code
|
15
|
+
self[6, 1]
|
22
16
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
|
18
|
+
alias get_type_code type_code
|
19
|
+
|
20
|
+
def blvl_code
|
21
|
+
self[7, 1]
|
26
22
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
|
24
|
+
alias get_blvl_code blvl_code
|
25
|
+
|
26
|
+
def record_type
|
27
|
+
type_translator(get_type_code, get_blvl_code)
|
30
28
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
|
30
|
+
alias get_type record_type
|
31
|
+
|
32
|
+
def archival?
|
33
|
+
return true if self[8, 1] == 'a'
|
34
|
+
false
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
alias is_archival? archival?
|
38
|
+
|
39
|
+
def blvl
|
38
40
|
blvls = {
|
39
|
-
'a'=>'Monographic component part',
|
40
|
-
'b'=>'Serial component part',
|
41
|
-
'c'=>'Collection',
|
42
|
-
'd'=>'Subunit',
|
43
|
-
'i'=>'Integrating resource',
|
44
|
-
'm'=>'Monograph/Item',
|
45
|
-
's'=>'Serial'
|
41
|
+
'a' => 'Monographic component part',
|
42
|
+
'b' => 'Serial component part',
|
43
|
+
'c' => 'Collection',
|
44
|
+
'd' => 'Subunit',
|
45
|
+
'i' => 'Integrating resource',
|
46
|
+
'm' => 'Monograph/Item',
|
47
|
+
's' => 'Serial'
|
46
48
|
}
|
47
|
-
|
49
|
+
blvls[get_blvl_code]
|
48
50
|
end
|
49
51
|
|
50
|
-
|
52
|
+
alias bibliographic_level blvl
|
53
|
+
alias get_blvl blvl
|
54
|
+
|
55
|
+
def record_type=(type)
|
51
56
|
if type.length == 1
|
52
|
-
translated_type =
|
53
|
-
raise ArgumentError,
|
57
|
+
translated_type = types(type)
|
58
|
+
raise ArgumentError, 'Invalid Type' if translated_type.nil?
|
54
59
|
elsif type.length > 1
|
55
|
-
|
56
|
-
|
57
|
-
raise ArgumentError, "Invalid Type" if type.nil?
|
60
|
+
type = types(type)
|
61
|
+
raise ArgumentError, 'Invalid Type' if type.nil?
|
58
62
|
else
|
59
|
-
raise ArgumentError,
|
60
|
-
end
|
61
|
-
self[6] = type
|
63
|
+
raise ArgumentError, 'Invalid Type'
|
64
|
+
end
|
65
|
+
self[6] = type
|
62
66
|
end
|
63
|
-
|
67
|
+
|
68
|
+
alias set_type record_type=
|
69
|
+
|
64
70
|
def type_translator(type_code, blvl_code)
|
65
|
-
valid_types = [
|
66
|
-
unless valid_types.index(type_code)
|
67
|
-
|
68
|
-
return
|
69
|
-
end
|
71
|
+
valid_types = %w[a t g k r o p e f c d i j m]
|
72
|
+
raise ArgumentError, 'Invalid Type!' unless valid_types.index(type_code)
|
73
|
+
|
70
74
|
rec_types = {
|
71
|
-
'BKS' => { :
|
72
|
-
|
73
|
-
'VIS' => { :
|
74
|
-
'MIX' => { :
|
75
|
-
'MAP' => { :
|
76
|
-
'SCO' => { :
|
77
|
-
'REC' => { :
|
78
|
-
'COM' => { :
|
79
|
-
}
|
80
|
-
|
81
|
-
rec_types.each_key { | type |
|
82
|
-
return type if type_code.match(rec_types[type][:type]) and blvl_code.match(rec_types[type][:blvl])
|
83
|
-
}
|
84
|
-
raise ArgumentError, "Invalid BLvl!"
|
85
|
-
return nil
|
86
|
-
end
|
87
|
-
|
88
|
-
def get_elvl_code
|
89
|
-
return self[17,1]
|
90
|
-
end
|
91
|
-
|
92
|
-
def get_elvl
|
93
|
-
elvls = {
|
94
|
-
' '=>'Full',
|
95
|
-
'1'=>'Full, not examined',
|
96
|
-
'2'=>'Less-than-full',
|
97
|
-
'3'=>'Abbreviated',
|
98
|
-
'4'=>'Core',
|
99
|
-
'5'=>'Partial',
|
100
|
-
'7'=>'Minimal',
|
101
|
-
'8'=>'Prepublication',
|
102
|
-
'I'=>'Full-level input by OCLC participants',
|
103
|
-
'K'=>'Less-than-full input by OCLC participants',
|
104
|
-
'L'=>'Full-level input added from a batch process',
|
105
|
-
'M'=>'Less-than-full added from a batch process',
|
106
|
-
'E'=>'System-identified MARC error in batchloaded record',
|
107
|
-
'J'=>'Deleted record'
|
75
|
+
'BKS' => { type: /[at]{1}/, blvl: /[acdm]{1}/ },
|
76
|
+
'SER' => { type: /[a]{1}/, blvl: /[bs]{1}/ },
|
77
|
+
'VIS' => { type: /[gkro]{1}/, blvl: /[abcdims]{1}/ },
|
78
|
+
'MIX' => { type: /[p]{1}/, blvl: /[cd]{1}/ },
|
79
|
+
'MAP' => { type: /[ef]{1}/, blvl: /[abcdims]{1}/ },
|
80
|
+
'SCO' => { type: /[cd]{1}/, blvl: /[abcdims]{1}/ },
|
81
|
+
'REC' => { type: /[ij]{1}/, blvl: /[abcdims]{1}/ },
|
82
|
+
'COM' => { type: /[m]{1}/, blvl: /[abcdims]{1}/ }
|
108
83
|
}
|
109
|
-
|
84
|
+
|
85
|
+
rec_types.each_key do |type|
|
86
|
+
if type_code.match(rec_types[type][:type]) && blvl_code.match(rec_types[type][:blvl])
|
87
|
+
return type
|
88
|
+
end
|
89
|
+
end
|
90
|
+
raise ArgumentError, 'Invalid BLvl!'
|
110
91
|
end
|
111
|
-
|
112
|
-
def
|
113
|
-
self
|
114
|
-
return @encoding_level
|
92
|
+
|
93
|
+
def elvl_code
|
94
|
+
self[17, 1]
|
115
95
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
96
|
+
alias get_elvl_code elvl_code
|
97
|
+
|
98
|
+
def elvl
|
99
|
+
elvls = { ' ' => 'Full', '1' => 'Full, not examined',
|
100
|
+
'2' => 'Less-than-full', '3' => 'Abbreviated',
|
101
|
+
'4' => 'Core', '5' => 'Partial', '7' => 'Minimal',
|
102
|
+
'8' => 'Prepublication', 'J' => 'Deleted record',
|
103
|
+
'I' => 'Full-level input by OCLC participants',
|
104
|
+
'K' => 'Less-than-full input by OCLC participants',
|
105
|
+
'L' => 'Full-level input added from a batch process',
|
106
|
+
'M' => 'Less-than-full added from a batch process',
|
107
|
+
'E' => 'System-identified MARC error in batchloaded record' }
|
108
|
+
elvls[get_elvl_code]
|
119
109
|
end
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
110
|
+
alias encoding_level elvl
|
111
|
+
alias ELvl elvl
|
112
|
+
alias get_elvl elvl
|
113
|
+
|
114
|
+
def desc_code
|
115
|
+
self[18, 1]
|
124
116
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
117
|
+
|
118
|
+
alias get_desc_code desc_code
|
119
|
+
|
120
|
+
def desc
|
121
|
+
codes = {
|
122
|
+
' ' => 'Non-ISBD', 'a' => 'AACR2', 'i' => 'ISBD', 'u' => 'Unknown'
|
123
|
+
}
|
124
|
+
codes[get_desc_code]
|
129
125
|
end
|
130
|
-
|
126
|
+
alias descriptive_cataloging_form desc
|
127
|
+
alias Desc desc
|
128
|
+
alias get_desc desc
|
131
129
|
end
|
132
130
|
end
|
@@ -1,38 +1,46 @@
|
|
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 MapRecord < Record
|
7
6
|
|
8
7
|
def initialize
|
9
8
|
super
|
10
|
-
@leader[6] = 'e' if @leader[6,1] == ' '
|
11
|
-
@leader[7] = 'm' if @leader[7,1] == ' '
|
12
|
-
@record_type = 'MAP'
|
9
|
+
@leader[6] = 'e' if @leader[6, 1] == ' '
|
10
|
+
@leader[7] = 'm' if @leader[7, 1] == ' '
|
11
|
+
@record_type = 'MAP'
|
13
12
|
@bibliographic_level = @leader.get_blvl
|
14
|
-
|
15
|
-
|
13
|
+
extend MapType
|
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] =~ /[ef]{1}/
|
19
|
+
true
|
21
20
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
alias is_valid_type? valid_type?
|
22
|
+
def valid_blvl?
|
23
|
+
if @leader[7, 1] =~ /[acdim]{1}/ && @leader[6, 1] == 'f'
|
24
|
+
true
|
25
|
+
elsif @leader[7, 1] =~ /[abcdims]{1}/ && @leader[6, 1] == 'e'
|
26
|
+
true
|
27
|
+
else
|
28
|
+
false
|
29
|
+
end
|
26
30
|
end
|
31
|
+
alias is_valid_blvl? valid_blvl?
|
27
32
|
def self.new_from_record(record)
|
28
33
|
rec = MapRecord.new
|
29
|
-
record.instance_variables.each
|
34
|
+
record.instance_variables.each do |var|
|
30
35
|
rec.instance_variable_set(var, record.instance_variable_get(var))
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
end
|
37
|
+
error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
|
38
|
+
if !error && !rec.valid_blvl?
|
39
|
+
error = 'Incorrect bibliographic declaration in leader'
|
40
|
+
end
|
41
|
+
return Exception.new(error) if error
|
42
|
+
rec
|
43
|
+
end
|
44
|
+
|
37
45
|
end
|
38
|
-
end
|
46
|
+
end
|
@@ -1,22 +1,26 @@
|
|
1
|
+
# Methods for Map records
|
1
2
|
module MapType
|
2
3
|
include RecordType
|
3
|
-
public :is_govdoc?, :form, :has_index?
|
4
|
-
def cartographic_type(human_readable=false)
|
5
|
-
crtp_map = {'a'=>'Map', 'b'=>'Map series', 'c'=>'Map serial',
|
6
|
-
|
4
|
+
public :is_govdoc?, :form, :has_index?, :govdoc?, :conference?
|
5
|
+
def cartographic_type(human_readable = false)
|
6
|
+
crtp_map = { 'a' => 'Map', 'b' => 'Map series', 'c' => 'Map serial',
|
7
|
+
'd' => 'Globe', 'e' => 'Atlas', 'f' => 'Supplement',
|
8
|
+
'g' => 'Bound as part of another work', 'u' => 'Unknown',
|
9
|
+
'z' => 'Other' }
|
7
10
|
human_readable = crtp_map if human_readable
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
field_parser({ match: 'MAP', start: 25, end:1 },
|
12
|
+
{ match: /[ef]{1}/, start: 8, end: 1 }, human_readable)
|
13
|
+
end
|
14
|
+
|
15
|
+
def relief(human_readable = false)
|
12
16
|
relief_map = {'a'=>'Contours', 'b'=>'Shading', 'c'=>'Grading and bathymetric tints',
|
13
17
|
'd'=>'Hachures', 'e'=>'Bathymetry, soundings', 'f'=>'Form lines', 'g'=>'Spot heights',
|
14
|
-
'h'=>'Color', 'i'=>'Pictorially', 'j'=>'Land forms', 'k'=>'Bathymetry, isolines',
|
18
|
+
'h'=>'Color', 'i'=>'Pictorially', 'j'=>'Land forms', 'k'=>'Bathymetry, isolines',
|
15
19
|
'm'=>'Rock drawings', 'z'=>'Other'
|
16
20
|
}
|
17
21
|
contents = []
|
18
22
|
if self.record_type == 'MAP'
|
19
|
-
self['008'].value[18,4].split(//).each { | char |
|
23
|
+
self['008'].value[18,4].split(//).each { | char |
|
20
24
|
next if char == " "
|
21
25
|
if human_readable
|
22
26
|
contents << relief_map[char]
|
@@ -26,8 +30,8 @@ module MapType
|
|
26
30
|
}
|
27
31
|
end
|
28
32
|
@fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
|
29
|
-
next unless fxd_fld.value[0,1].match(/[ef]{1}/)
|
30
|
-
fxd_fld.value[1,4].split(//).each { | char |
|
33
|
+
next unless fxd_fld.value[0,1].match(/[ef]{1}/)
|
34
|
+
fxd_fld.value[1,4].split(//).each { | char |
|
31
35
|
next if char == " "
|
32
36
|
if human_readable
|
33
37
|
contents << relief_map[char]
|
@@ -35,11 +39,11 @@ module MapType
|
|
35
39
|
contents << char
|
36
40
|
end
|
37
41
|
}
|
38
|
-
}
|
42
|
+
}
|
39
43
|
return false if contents.empty?
|
40
|
-
|
44
|
+
contents
|
41
45
|
end
|
42
|
-
|
46
|
+
|
43
47
|
def projection(human_readable=false)
|
44
48
|
proj_map = {'Azimuthal'=>{'aa'=>'Aitoff','ab'=>'Gnomic','ac'=>"Lambert's equal area",
|
45
49
|
'ad'=>'Orthographic','ae'=>'Azithumal equidistant', 'af'=>'Stereographic',
|
@@ -56,7 +60,7 @@ module MapType
|
|
56
60
|
},
|
57
61
|
'Other'=>{'da'=>'Armadillo','db'=>'Butterfly','dc'=>'Eckert','dd'=>"Goode's homolosine",
|
58
62
|
'de'=>"Miller's bipolar oblique conformal conic",'df'=>'Van Der Grinten',
|
59
|
-
'dg'=>'Dymaxion','dh'=>'Cordiform','dl'=>'Lambert conformal','zz'=>'Other'
|
63
|
+
'dg'=>'Dymaxion','dh'=>'Cordiform','dl'=>'Lambert conformal','zz'=>'Other'
|
60
64
|
}
|
61
65
|
}
|
62
66
|
if @record_type == "MAP"
|
@@ -70,7 +74,7 @@ module MapType
|
|
70
74
|
return self['008'].value[22,2]
|
71
75
|
end
|
72
76
|
end
|
73
|
-
end
|
77
|
+
end
|
74
78
|
@fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
|
75
79
|
next unless fxd_fld.value[0,1].match(/[ef]{1}/)
|
76
80
|
unless fxd_fld.value[5,2] == ' '
|
@@ -78,15 +82,15 @@ module MapType
|
|
78
82
|
proj_map.each_key { | general |
|
79
83
|
next unless proj_map[general].keys.index(fxd_fld.value[5,2])
|
80
84
|
return [general,proj_map[general][fxd_fld.value[5,2]]]
|
81
|
-
}
|
85
|
+
}
|
82
86
|
else
|
83
87
|
return fxd_fld.value[5,2]
|
84
88
|
end
|
85
89
|
end
|
86
|
-
}
|
87
|
-
|
90
|
+
}
|
91
|
+
false
|
88
92
|
end
|
89
|
-
|
93
|
+
|
90
94
|
def special_format(human_readable=false)
|
91
95
|
spfm_map = {'a'=>'Blueprint photocopy','b'=>'Other photocopy','c'=>'Negative photocopy',
|
92
96
|
'd'=>'Film negative','f'=>'Facsimile','g'=>'Relief model','h'=>'Rare (pre-1800)',
|
@@ -94,6 +98,6 @@ module MapType
|
|
94
98
|
'm'=>'Braille, tactile','n'=>'Game','o'=>'Wall map','p'=>'Playing cards',
|
95
99
|
'q'=>'Loose-leaf','z'=>'Other'}
|
96
100
|
human_readable = spfm_map if human_readable
|
97
|
-
return self.field_parser({:match=>'MAP', :start=>33,:end=>2}, {:match=>/[ef]{1}/, :start=>16,:end=>2}, human_readable)
|
101
|
+
return self.field_parser({:match=>'MAP', :start=>33,:end=>2}, {:match=>/[ef]{1}/, :start=>16,:end=>2}, human_readable)
|
98
102
|
end
|
99
|
-
end
|
103
|
+
end
|
data/lib/enhanced_marc/record.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module MARC
|
2
2
|
class Record
|
3
3
|
|
4
|
-
attr_reader :record_type
|
4
|
+
attr_reader :record_type
|
5
5
|
|
6
6
|
# Creates a new MARC::Record using MARC::Leader
|
7
7
|
# to work with the leader, rather than a string
|
@@ -33,7 +33,7 @@ module MARC
|
|
33
33
|
when 'SCO' then MARC::ScoreRecord.new_from_record(record)
|
34
34
|
when 'REC' then MARC::SoundRecord.new_from_record(record)
|
35
35
|
when 'COM' then MARC::ComputerRecord.new_from_record(record)
|
36
|
-
end
|
36
|
+
end
|
37
37
|
typed_record.fields.reindex
|
38
38
|
typed_record
|
39
39
|
end
|
@@ -50,6 +50,9 @@ module MARC
|
|
50
50
|
def composition_form(human_readable=false)
|
51
51
|
end
|
52
52
|
|
53
|
+
def bibliographic_level
|
54
|
+
@leader.get_blvl
|
55
|
+
end
|
53
56
|
|
54
57
|
def publication_country
|
55
58
|
return self['008'].value[15,3].strip unless self['008'].value[15,3] == ' '
|