berkeley_library-marc 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build.yml +18 -0
  3. data/.gitignore +388 -0
  4. data/.idea/inspectionProfiles/Project_Default.xml +20 -0
  5. data/.idea/marc.iml +101 -0
  6. data/.idea/misc.xml +4 -0
  7. data/.idea/modules.xml +8 -0
  8. data/.idea/vcs.xml +6 -0
  9. data/.rubocop.yml +334 -0
  10. data/.ruby-version +1 -0
  11. data/.simplecov +8 -0
  12. data/.yardopts +1 -0
  13. data/CHANGES.md +12 -0
  14. data/Dockerfile +57 -0
  15. data/Gemfile +3 -0
  16. data/Jenkinsfile +18 -0
  17. data/LICENSE.md +21 -0
  18. data/README.md +4 -0
  19. data/Rakefile +20 -0
  20. data/berkeley_library-marc.gemspec +42 -0
  21. data/docker-compose.yml +15 -0
  22. data/lib/.rubocop.yml +6 -0
  23. data/lib/berkeley_library/marc.rb +3 -0
  24. data/lib/berkeley_library/marc/field_info.rb +1 -0
  25. data/lib/berkeley_library/marc/field_info/ctrl_fields/data/ctrl_fields_standard.txt +2143 -0
  26. data/lib/berkeley_library/marc/field_info/leader/data/leader_standard.txt +87 -0
  27. data/lib/berkeley_library/marc/field_info/var_fields.rb +46 -0
  28. data/lib/berkeley_library/marc/field_info/var_fields/data.rb +4 -0
  29. data/lib/berkeley_library/marc/field_info/var_fields/data/mapping-orig.tsv +265 -0
  30. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx.txt +53 -0
  31. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_berkeley_9xx_parsed.rb +51 -0
  32. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard.txt +5458 -0
  33. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard_parsed.rb +6577 -0
  34. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved.txt +44 -0
  35. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_tind_reserved_parsed.rb +30 -0
  36. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind.txt +105 -0
  37. data/lib/berkeley_library/marc/field_info/var_fields/data/var_fields_ucblit_tind_parsed.rb +114 -0
  38. data/lib/berkeley_library/marc/field_info/var_fields/ind_def.rb +39 -0
  39. data/lib/berkeley_library/marc/field_info/var_fields/ind_val_def.rb +27 -0
  40. data/lib/berkeley_library/marc/field_info/var_fields/instrument_or_voices_code.rb +26 -0
  41. data/lib/berkeley_library/marc/field_info/var_fields/obsolescible.rb +55 -0
  42. data/lib/berkeley_library/marc/field_info/var_fields/section.rb +50 -0
  43. data/lib/berkeley_library/marc/field_info/var_fields/subfield_def.rb +50 -0
  44. data/lib/berkeley_library/marc/field_info/var_fields/subfield_val.rb +24 -0
  45. data/lib/berkeley_library/marc/field_info/var_fields/var_field_def.rb +62 -0
  46. data/lib/berkeley_library/marc/field_info/var_fields/var_field_list.rb +43 -0
  47. data/lib/berkeley_library/marc/field_info/var_fields/var_field_parser.rb +136 -0
  48. data/lib/berkeley_library/marc/field_info/var_fields/var_field_transform.rb +160 -0
  49. data/lib/berkeley_library/marc/module_info.rb +14 -0
  50. data/lib/marc_extensions.rb +1 -0
  51. data/lib/marc_extensions/data_field.rb +29 -0
  52. data/lib/marc_extensions/field_map.rb +63 -0
  53. data/lib/marc_extensions/record.rb +100 -0
  54. data/lib/marc_extensions/subfield.rb +21 -0
  55. data/lib/marc_extensions/xml_reader.rb +19 -0
  56. data/rakelib/bundle.rake +8 -0
  57. data/rakelib/coverage.rake +11 -0
  58. data/rakelib/gem.rake +54 -0
  59. data/rakelib/rubocop.rake +18 -0
  60. data/rakelib/spec.rake +2 -0
  61. data/spec/.rubocop.yml +37 -0
  62. data/spec/berkeley_library/marc/field_info/var_fields/var_field_def_spec.rb +26 -0
  63. data/spec/berkeley_library/marc/field_info/var_fields/var_field_parser_spec.rb +596 -0
  64. data/spec/berkeley_library/marc/field_info/var_fields/var_field_transform_spec.rb +173 -0
  65. data/spec/berkeley_library/marc/field_info/var_fields_spec.rb +112 -0
  66. data/spec/data/field_info/vf_046.txt +32 -0
  67. data/spec/data/field_info/vf_048.txt +112 -0
  68. data/spec/data/record-187888.xml +78 -0
  69. data/spec/marc_extensions/data_field_spec.rb +13 -0
  70. data/spec/marc_extensions/record_spec.rb +211 -0
  71. data/spec/spec_helper.rb +27 -0
  72. metadata +354 -0
@@ -0,0 +1,173 @@
1
+ require 'spec_helper'
2
+
3
+ module BerkeleyLibrary
4
+ module Marc
5
+ module FieldInfo
6
+ module VarFields
7
+ describe VarFieldTransform do
8
+ let(:parse_tree) do
9
+ {
10
+ doc_comments: [
11
+ { comment: 'A doc comment' },
12
+ { comment: 'TODO: a TODO' }
13
+ ],
14
+ sections: [
15
+ {
16
+ desc: 'Number and Code Fields (01X-04X)',
17
+ var_fields: [
18
+ {
19
+ tag: '010',
20
+ desc: 'LIBRARY OF CONGRESS CONTROL NUMBER (NR)',
21
+ indicators: [
22
+ {
23
+ desc: 'Undefined',
24
+ ind1: [{ val: '#', desc: 'Undefined' }]
25
+ },
26
+ {
27
+ desc: 'Undefined',
28
+ ind2: [{ val: '#', desc: 'Undefined' }]
29
+ }
30
+ ],
31
+ subfield_codes: [
32
+ { code: 'a', desc: 'LC control number (NR)', values: [] },
33
+ { code: '8', desc: 'Field link and sequence number (R)', values: [] }
34
+ ]
35
+ },
36
+ {
37
+ tag: '034',
38
+ desc: 'CODED CARTOGRAPHIC MATHEMATICAL DATA (R)',
39
+ indicators: [
40
+ { desc: 'Type of scale',
41
+ ind1: [
42
+ { val: '0', desc: 'Scale indeterminable/No scale recorded' },
43
+ { val: '1', desc: 'Single scale' }
44
+ ] },
45
+ {
46
+ desc: 'Type of ring',
47
+ ind2: [
48
+ { val: '0', desc: 'Outer ring' },
49
+ { val: '1', desc: 'Exclusion ring' }
50
+ ]
51
+ }
52
+ ],
53
+ subfield_codes: [
54
+ {
55
+ code: 'a',
56
+ desc: 'Category of scale (NR)',
57
+ values: [
58
+ { val: 'a', desc: 'Linear scale' },
59
+ { val: 'b', desc: 'Angular scale' }
60
+ ]
61
+ },
62
+ { code: 'b', desc: 'Constant ratio linear horizontal scale (R)', values: [] },
63
+ { code: 'c', desc: 'Constant ratio linear vertical scale (R)', values: [] },
64
+ { code: 'd', desc: 'Coordinates--westernmost longitude (NR)', values: [] }
65
+ ]
66
+ },
67
+ {
68
+ tag: '048',
69
+ desc: 'NUMBER OF MUSICAL INSTRUMENTS OR VOICES CODE (R)',
70
+ indicators: [
71
+ {
72
+ desc: 'Undefined',
73
+ ind1: [{ val: '#', desc: 'Undefined' }]
74
+ },
75
+ {
76
+ desc: 'Source of code',
77
+ ind2: [{ val: '7', desc: 'Source specified in subfield $2' }]
78
+ }
79
+ ],
80
+ subfield_codes: [
81
+ { code: 'a', desc: 'Performer or ensemble (R)', values: [] },
82
+ { code: '8', desc: 'Field link and sequence number (R)', values: [] }
83
+ ],
84
+ inst_or_voices_codes: [
85
+ { val: 'bc', desc: 'Brass--Cornet' },
86
+ { val: 'bd', desc: 'Brass--Trombone' }
87
+ ]
88
+ }
89
+ ]
90
+ },
91
+ {
92
+ desc: 'Classification and Call Number Fields (05X-08X)',
93
+ var_fields: [
94
+ {
95
+ tag: '050',
96
+ desc: 'LIBRARY OF CONGRESS CALL NUMBER (R)',
97
+ indicators: [
98
+ {
99
+ desc: 'Existence in LC collection',
100
+ ind1: [
101
+ { val: '0', desc: 'Item is in LC' },
102
+ { val: '1', desc: 'Item is not in LC' }
103
+ ]
104
+ },
105
+ {
106
+ desc: 'Source of call number',
107
+ ind2: [
108
+ { val: '0', desc: 'Assigned by LC' },
109
+ { val: '4', desc: 'Assigned by agency other than LC' }
110
+ ]
111
+ },
112
+ {
113
+ desc: 'Series call number (SE) [OBSOLETE]',
114
+ ind2: [
115
+ { val: '0', desc: 'No series involved' },
116
+ { val: '1', desc: 'Main series' }
117
+ ]
118
+ }
119
+ ],
120
+ subfield_codes: [
121
+ { code: 'a', desc: 'Classification number (R)', values: [] },
122
+ { code: 'b', desc: 'Item number (NR)', values: [] }
123
+ ]
124
+ }
125
+ ]
126
+ }
127
+ ]
128
+ }
129
+ end
130
+ let(:xform) { VarFieldTransform.new }
131
+
132
+ it 'transforms a comment' do
133
+ comment = { comment: 'A doc comment' }
134
+ expect(xform.apply(comment)).to eq(comment[:comment])
135
+ end
136
+
137
+ it 'transforms a value' do
138
+ ind_val = { val: '1', desc: 'Main series' }
139
+ expect(xform.apply(ind_val)).to be_a(VarFieldTransform::AnyValue)
140
+ end
141
+
142
+ it 'transforms an indicator definition' do
143
+ ind_def = {
144
+ desc: 'Source of call number',
145
+ ind2: [
146
+ { val: '0', desc: 'Assigned by LC' },
147
+ { val: '4', desc: 'Assigned by agency other than LC' }
148
+ ]
149
+ }
150
+ expect(xform.apply(ind_def)).to be_a(IndDef)
151
+ end
152
+
153
+ # TODO: test range
154
+ it 'transforms a subfield definition' do
155
+ sf_code_def = { code: 'a', desc: 'Performer or ensemble (R)', values: [] }
156
+ expect(xform.apply(sf_code_def)).to be_a(SubfieldDef)
157
+ end
158
+
159
+ it 'transforms a section' do
160
+ section = parse_tree[:sections][0]
161
+ result = xform.apply(section)
162
+ expect(result).to be_a(Section)
163
+ end
164
+
165
+ it 'transforms a complete parse tree' do
166
+ result = xform.apply(parse_tree)
167
+ expect(result).to be_a(VarFieldList)
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+ require 'berkeley_library/marc/field_info/var_fields'
3
+
4
+ module BerkeleyLibrary
5
+ module Marc
6
+ module FieldInfo
7
+ describe VarFields do
8
+
9
+ describe :standard do
10
+ let(:standard) { VarFields.standard }
11
+
12
+ it 'loads all standard fields' do
13
+ expect(standard).to be_a(VarFields::VarFieldList)
14
+ expect(standard.size).to eq(239) # TODO: more assertions
15
+ end
16
+
17
+ it 'defines each tag only once' do
18
+ by_tag = {}
19
+ standard.each { |vf| (by_tag[vf.tag] ||= []) << vf }
20
+ aggregate_failures 'duplicate tags' do
21
+ by_tag.each do |tag, ff|
22
+ expect(ff.size).to eq(1), "Expected 1 definition for tag #{tag}, got #{ff.map { |vf| vf.to_s.inspect }.join(', ')}"
23
+ end
24
+ end
25
+ end
26
+
27
+ it 'by default, includes no obsolete anything' do
28
+ aggregate_failures 'obsolete stuff' do
29
+ standard.each do |vf|
30
+ expect(vf).not_to be_obsolete
31
+ expect(vf.desc).not_to include('OBSOLETE')
32
+
33
+ vf.indicators.each do |ind|
34
+ expect(ind).not_to be_obsolete
35
+ expect(ind.desc).not_to include('OBSOLETE')
36
+
37
+ ind.val_defs.each do |v|
38
+ expect(v).not_to be_obsolete
39
+ expect(v.desc).not_to include('OBSOLETE')
40
+ end
41
+ end
42
+
43
+ vf.subfield_codes.each do |sf|
44
+ expect(sf).not_to be_obsolete
45
+ expect(sf.desc).not_to include('OBSOLETE')
46
+
47
+ sf.each_value do |v|
48
+ expect(v).not_to be_obsolete
49
+ expect(v.desc).not_to include('OBSOLETE')
50
+ end
51
+ end
52
+
53
+ vf.inst_or_voices_codes.each do |c|
54
+ expect(c).not_to be_obsolete
55
+ expect(c.desc).not_to include('OBSOLETE')
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ it 'returns obsolete fields with a flag' do
62
+ lines_actual = VarFields.standard(obsolete: true).to_s.lines(chomp: true).map(&:strip)
63
+
64
+ var_fields_standard_txt = File.read('lib/berkeley_library/marc/field_info/var_fields/data/var_fields_standard.txt')
65
+ lines_expected = var_fields_standard_txt
66
+ .lines(chomp: true)
67
+ .map(&:strip)
68
+ .reject { |line| line.empty? || line.start_with?('//') }
69
+
70
+ expect(lines_actual.size).to eq(lines_expected.size)
71
+ lines_expected.each_with_index do |l_ex, i|
72
+ # typo in standard.txt definition of 880 subfields
73
+ l_ex = l_ex.sub('Same', '- Same') if i >= 5052 && i <= 5056
74
+ expect(lines_actual[i]).to eq(l_ex), "Wrong value at line #{i}:\n\texpected: #{l_ex}, actual: #{lines_actual[i]}"
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ describe 'custom fields' do
81
+ describe :berkeley_9xx do
82
+ let(:berkeley_9xx) { VarFields.berkeley_9xx }
83
+
84
+ it 'loads all berkeley_9xx fields' do
85
+ expect(berkeley_9xx).to be_a(VarFields::VarFieldList)
86
+ expect(berkeley_9xx.size).to eq(25) # TODO: more assertions
87
+ end
88
+ end
89
+
90
+ # TODO: get these working
91
+ xdescribe :tind_reserved do
92
+ let(:tind_reserved) { VarFields.tind_reserved }
93
+
94
+ it 'loads all tind_reserved fields' do
95
+ expect(tind_reserved).to be_a(VarFields::VarFieldList)
96
+ expect(tind_reserved.size).to eq(4) # TODO: more assertions
97
+ end
98
+ end
99
+
100
+ xdescribe :berkeley_tind do
101
+ let(:berkeley_tind) { VarFields.berkeley_tind }
102
+
103
+ it 'loads all berkeley_tind fields' do
104
+ expect(berkeley_tind).to be_a(VarFields::VarFieldList)
105
+ expect(berkeley_tind.size).to eq(9) # TODO: more assertions
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,32 @@
1
+ 046 - SPECIAL CODED DATES (R)
2
+ Indicators
3
+ First - Undefined
4
+ # - Undefined
5
+ Second - Undefined
6
+ # - Undefined
7
+ Subfield Codes
8
+ $a - Type of date code (NR)
9
+ i - Inclusive dates of collection
10
+ k - Bulk of collection
11
+ m - Multiple dates
12
+ n - Unknown dates
13
+ p - Distribution/release/issue and production/recording session dates
14
+ q - Questionable date
15
+ r - Reissue and originaldates
16
+ s - Single known/probable date
17
+ t - Publication date and copyright dates
18
+ x - Incorrect dates
19
+ $b - Date 1 (B.C.E. date) (NR)
20
+ $c - Date 1 (C.E. date) (NR)
21
+ $d - Date 2 (B.C.E. date) (NR)
22
+ $e - Date 2 (C.E. date) (NR)
23
+ $j - Date resource modified (NR)
24
+ $k - Beginning or single date created (NR)
25
+ $l - Ending date created (NR)
26
+ $m - Beginning of date valid (NR)
27
+ $o - Single or starting date for aggregated content (NR)
28
+ $p - Ending date for aggregated content (NR)
29
+ $n - End of date valid (NR)
30
+ $2 - Source of date (NR)
31
+ $6 - Linkage (NR)
32
+ $8 - Field link and sequence number (R)
@@ -0,0 +1,112 @@
1
+ 048 - NUMBER OF MUSICAL INSTRUMENTS OR VOICES CODE (R)
2
+ Indicators
3
+ First - Undefined
4
+ # - Undefined
5
+ Second - Source of code
6
+ # - MARC code
7
+ 7 - Source specified in subfield $2
8
+ Subfield Codes
9
+ $a - Performer or ensemble (R)
10
+ $b - Soloist (R)
11
+ $2 - Source of code (NR)
12
+ $8 - Field link and sequence number (R)
13
+ Instrument or Voices Codes
14
+ ba - Brass - Horn
15
+ bb - Brass--Trumpet
16
+ bc - Brass--Cornet
17
+ bd - Brass--Trombone
18
+ be - Brass--Tuba
19
+ bf - Brass--Baritone
20
+ bn - Brass--Unspecified
21
+ bu - Brass--Unknown
22
+ by - Brass--Ethnic
23
+ bz - Brass--Other
24
+ ca - Choruses--Mixed
25
+ cb - Choruses--Women's
26
+ cc - Choruses--Men's
27
+ cd - Choruses--Children's
28
+ cn - Choruses--Unspecified
29
+ cu - Choruses--Unknown
30
+ cy - Choruses--Ethnic
31
+ ea - Electronic--Synthesizer
32
+ eb - Electronic--Tape
33
+ ec - Electronic--Computer
34
+ ed - Electronic--Ondes Martinot
35
+ en - Electronic--Unspecified
36
+ eu - Electronic--Unknown
37
+ ez - Electronic--Other
38
+ ka - Keyboard--Piano
39
+ kb - Keyboard--Organ
40
+ kc - Keyboard--Harpsichord
41
+ kd - Keyboard--Clavichord
42
+ ke - Keyboard--Continuo
43
+ kf - Keyboard--Celeste
44
+ kn - Keyboard--Unspecified
45
+ ku - Keyboard--Unknown
46
+ ky - Keyboard--Ethnic
47
+ kz - Keyboard--Other
48
+ oa - Larger ensemble--Full orchestra
49
+ ob - Larger ensemble--Chamber orch.
50
+ oc - Larger ensemble--String orchestra
51
+ od - Larger ensemble--Band
52
+ oe - Larger ensemble--Dance orchestra
53
+ of - Larger ensemble--Brass band
54
+ on - Larger ensemble--Unspecified
55
+ ou - Larger ensemble--Unknown
56
+ oy - Larger ensemble--Ethnic
57
+ oz - Larger ensemble--Other
58
+ pa - Percussion--Timpani
59
+ pb - Percussion--Xylophone
60
+ pc - Percussion--Marimba
61
+ pd - Percussion--Drum
62
+ pn - Percussion--Unspecified
63
+ pu - Percussion--Unknown
64
+ py - Percussion--Ethnic
65
+ pz - Percussion--Other
66
+ sa - Strings, bowed--Violin
67
+ sb - Strings, bowed--Viola
68
+ sc - Strings, bowed--Violoncello
69
+ sd - Strings, bowed--Double bass
70
+ se - Strings, bowed--Viol
71
+ sf - Strings, bowed--Viola d'amore
72
+ sg - Strings, bowed--Viola da gamba
73
+ sn - Strings, bowed--Unspecified
74
+ su - Strings, bowed--Unknown
75
+ sy - Strings, bowed--Ethnic
76
+ sz - Strings, bowed--Other
77
+ ta - Strings, plucked--Harp
78
+ tb - Strings, plucked--Guitar
79
+ tc - Strings, plucked--Lute
80
+ td - Strings, plucked--Mandolin
81
+ tn - Strings, plucked--Unspecified
82
+ tu - Strings, plucked--Unknown
83
+ ty - Strings, plucked--Ethnic
84
+ tz - Strings, plucked--Other
85
+ va - Voices--Soprano
86
+ vb - Voices--Mezzo Soprano
87
+ vc - Voices--Alto
88
+ vd - Voices--Tenor
89
+ ve - Voices--Baritone
90
+ vf - Voices--Bass
91
+ vg - Voices--Counter tenor
92
+ vh - Voices--High voice
93
+ vi - Voices--Medium voice
94
+ vj - Voices--Low voice
95
+ vn - Voices--Unspecified
96
+ vu - Voices--Unknown
97
+ vy - Voices--Ethnic
98
+ wa - Woodwinds--Flute
99
+ wb - Woodwinds--Oboe
100
+ wc - Woodwinds--Clarinet
101
+ wd - Woodwinds--Bassoon
102
+ we - Woodwinds--Piccolo
103
+ wf - Woodwinds--English horn
104
+ wg - Woodwinds--Bass clarinet
105
+ wh - Woodwinds--Recorder
106
+ wi - Woodwinds--Saxophone
107
+ wn - Woodwinds--Unspecified
108
+ wu - Woodwinds--Unknown
109
+ wy - Woodwinds--Ethnic
110
+ wz - Woodwinds--Other
111
+ zn - Unspecified instruments
112
+ zu - Unknown
@@ -0,0 +1,78 @@
1
+
2
+ <?xml version="1.0" encoding="UTF-8"?>
3
+ <collection xmlns="http://www.loc.gov/MARC21/slim">
4
+ <record>
5
+ <controlfield tag="001">187888</controlfield>
6
+ <controlfield tag="005">20201109133856.0</controlfield>
7
+ <datafield tag="024" ind1="8" ind2="0">
8
+ <subfield code="a">BANC FILM 2216: 82.3</subfield>
9
+ </datafield>
10
+ <datafield tag="035" ind1=" " ind2=" ">
11
+ <subfield code="a">ethnodocs_cubanc_57_1_00188380</subfield>
12
+ </datafield>
13
+ <datafield tag="245" ind1=" " ind2=" ">
14
+ <subfield code="a">Notes on Cupeño grammar, II (198 pp.). &lt;ref actuate="onrequest" show="replace" target="fnote120">[Note 120]&lt;/ref></subfield>
15
+ </datafield>
16
+
17
+ <datafield tag="336" ind1=" " ind2=" ">
18
+ <subfield code="a">Text</subfield>
19
+ </datafield>
20
+ <datafield tag="505" ind1=" " ind2=" ">
21
+ <subfield code="a">PDF 1: Grammar notes</subfield>
22
+ </datafield>
23
+ <datafield tag="505" ind1=" " ind2=" ">
24
+ <subfield code="a">PDF 1: Filename: cubanc82_3_1.pdf</subfield>
25
+ </datafield>
26
+ <datafield tag="505" ind1=" " ind2=" ">
27
+ <subfield code="a">PDF 1: BANC FILM 2216: 82.3.1</subfield>
28
+ </datafield>
29
+ <datafield tag="505" ind1=" " ind2=" ">
30
+ <subfield code="a">PDF 2: Grammar notes</subfield>
31
+ </datafield>
32
+ <datafield tag="505" ind1=" " ind2=" ">
33
+ <subfield code="a">PDF 2: Filename: cubanc82_3_2.pdf</subfield>
34
+ </datafield>
35
+ <datafield tag="505" ind1=" " ind2=" ">
36
+ <subfield code="a">PDF 2: BANC FILM 2216: 82.3.2</subfield>
37
+ </datafield>
38
+ <datafield tag="540" ind1=" " ind2=" ">
39
+ <subfield code="a">Researchers may make free and open use of the UC Berkeley Library’s digitized public domain materials. However, some materials in our online collections may be protected by U.S. copyright law (Title 17, U.S.C.). Use or reproduction of materials protected by copyright beyond that allowed by fair use (Title 17, U.S.C. § 107) requires permission from the copyright owners. The use or reproduction of some materials may also be restricted by terms of University of California gift or purchase agreements, privacy and publicity rights, or trademark law. Responsibility for determining rights status and permissibility of any use or reproduction rests exclusively with the researcher. To learn more or make inquiries, please see our permissions policies (https://www.lib.berkeley.edu/about/permissions-policies).</subfield>
40
+ </datafield>
41
+ <datafield tag="852" ind1=" " ind2=" ">
42
+ <subfield code="c">The Bancroft Library</subfield>
43
+ </datafield>
44
+ <datafield tag="856" ind1="4" ind2=" ">
45
+ <subfield code="y">PDF 1: Grammar notes</subfield>
46
+ <subfield code="9">4a939fe2-2665-4c67-832b-b0e5267db449</subfield>
47
+ <subfield code="s">46606766</subfield>
48
+ <subfield code="u">http://digicoll.lib.berkeley.edu/record/187888/files/cubanc82_3_1.pdf</subfield>
49
+ </datafield>
50
+ <datafield tag="856" ind1="4" ind2=" ">
51
+ <subfield code="y">PDF 2: Grammar notes</subfield>
52
+ <subfield code="9">0aacdd29-b467-4c5c-93ab-415069f431c0</subfield>
53
+ <subfield code="s">56588923</subfield>
54
+ <subfield code="u">http://digicoll.lib.berkeley.edu/record/187888/files/cubanc82_3_2.pdf</subfield>
55
+ </datafield>
56
+ <datafield tag="901" ind1=" " ind2=" ">
57
+ <subfield code="a">ark:/28722/bk00153517n</subfield>
58
+ <subfield code="g">57:1</subfield>
59
+ </datafield>
60
+ <datafield tag="902" ind1=" " ind2=" ">
61
+ <subfield code="n">DZ</subfield>
62
+ <subfield code="d">2020-11-09 13:28:11</subfield>
63
+ </datafield>
64
+ <datafield tag="902" ind1=" " ind2=" ">
65
+ <subfield code="f">cubanc_57_1_00188380.xml</subfield>
66
+ </datafield>
67
+ <datafield tag="980" ind1=" " ind2=" ">
68
+ <subfield code="a">EthnoDocs: Ethno Docs</subfield>
69
+ </datafield>
70
+ <datafield tag="982" ind1=" " ind2=" ">
71
+ <subfield code="a">Ethnological Documents</subfield>
72
+ <subfield code="b">Ethnological Documents of the Department and Museum of Anthropology, University of California, Berkeley, 1875-1958</subfield>
73
+ </datafield>
74
+ <datafield tag="991" ind1=" " ind2=" ">
75
+ <subfield code="a">Restricted2Bancroft</subfield>
76
+ </datafield>
77
+ </record>
78
+ </collection>