ruby-marc-spec 0.1.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.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build.yml +18 -0
  3. data/.gitignore +388 -0
  4. data/.gitmodules +3 -0
  5. data/.idea/codeStyles/codeStyleConfig.xml +5 -0
  6. data/.idea/go.imports.xml +6 -0
  7. data/.idea/inspectionProfiles/Project_Default.xml +23 -0
  8. data/.idea/marc_spec.iml +102 -0
  9. data/.idea/misc.xml +6 -0
  10. data/.idea/modules.xml +8 -0
  11. data/.idea/templateLanguages.xml +6 -0
  12. data/.idea/vcs.xml +7 -0
  13. data/.rubocop.yml +269 -0
  14. data/.ruby-version +1 -0
  15. data/.simplecov +8 -0
  16. data/CHANGES.md +3 -0
  17. data/Gemfile +6 -0
  18. data/LICENSE.md +21 -0
  19. data/README.md +172 -0
  20. data/Rakefile +20 -0
  21. data/lib/.rubocop.yml +5 -0
  22. data/lib/marc/spec/module_info.rb +14 -0
  23. data/lib/marc/spec/parsing/closed_int_range.rb +28 -0
  24. data/lib/marc/spec/parsing/closed_lc_alpha_range.rb +28 -0
  25. data/lib/marc/spec/parsing/parser.rb +213 -0
  26. data/lib/marc/spec/parsing.rb +1 -0
  27. data/lib/marc/spec/queries/al_num_range.rb +105 -0
  28. data/lib/marc/spec/queries/applicable.rb +18 -0
  29. data/lib/marc/spec/queries/character_spec.rb +81 -0
  30. data/lib/marc/spec/queries/comparison_string.rb +45 -0
  31. data/lib/marc/spec/queries/condition.rb +133 -0
  32. data/lib/marc/spec/queries/condition_context.rb +49 -0
  33. data/lib/marc/spec/queries/dsl.rb +80 -0
  34. data/lib/marc/spec/queries/indicator_value.rb +77 -0
  35. data/lib/marc/spec/queries/operator.rb +129 -0
  36. data/lib/marc/spec/queries/part.rb +63 -0
  37. data/lib/marc/spec/queries/position.rb +59 -0
  38. data/lib/marc/spec/queries/position_or_range.rb +27 -0
  39. data/lib/marc/spec/queries/query.rb +94 -0
  40. data/lib/marc/spec/queries/query_executor.rb +52 -0
  41. data/lib/marc/spec/queries/selector.rb +12 -0
  42. data/lib/marc/spec/queries/subfield.rb +88 -0
  43. data/lib/marc/spec/queries/subfield_value.rb +63 -0
  44. data/lib/marc/spec/queries/tag.rb +107 -0
  45. data/lib/marc/spec/queries/transform.rb +154 -0
  46. data/lib/marc/spec/queries.rb +1 -0
  47. data/lib/marc/spec.rb +32 -0
  48. data/rakelib/.rubocop.yml +19 -0
  49. data/rakelib/bundle.rake +8 -0
  50. data/rakelib/coverage.rake +11 -0
  51. data/rakelib/gem.rake +54 -0
  52. data/rakelib/parser_specs/formatter.rb +31 -0
  53. data/rakelib/parser_specs/parser_specs.rb.txt.erb +35 -0
  54. data/rakelib/parser_specs/rule.rb +95 -0
  55. data/rakelib/parser_specs/suite.rb +91 -0
  56. data/rakelib/parser_specs/test.rb +97 -0
  57. data/rakelib/parser_specs.rb +1 -0
  58. data/rakelib/rubocop.rake +18 -0
  59. data/rakelib/spec.rake +27 -0
  60. data/ruby-marc-spec.gemspec +42 -0
  61. data/spec/.rubocop.yml +46 -0
  62. data/spec/README.md +16 -0
  63. data/spec/data/b23161018-sru.xml +182 -0
  64. data/spec/data/sandburg.xml +82 -0
  65. data/spec/generated/char_indicator_spec.rb +174 -0
  66. data/spec/generated/char_spec.rb +113 -0
  67. data/spec/generated/comparison_string_spec.rb +74 -0
  68. data/spec/generated/field_tag_spec.rb +156 -0
  69. data/spec/generated/index_char_spec.rb +669 -0
  70. data/spec/generated/index_indicator_spec.rb +174 -0
  71. data/spec/generated/index_spec.rb +113 -0
  72. data/spec/generated/index_sub_spec_spec.rb +1087 -0
  73. data/spec/generated/indicators_spec.rb +75 -0
  74. data/spec/generated/position_or_range_spec.rb +110 -0
  75. data/spec/generated/sub_spec_spec.rb +208 -0
  76. data/spec/generated/sub_spec_sub_spec_spec.rb +1829 -0
  77. data/spec/generated/subfield_char_spec.rb +405 -0
  78. data/spec/generated/subfield_range_range_spec.rb +48 -0
  79. data/spec/generated/subfield_range_spec.rb +87 -0
  80. data/spec/generated/subfield_range_sub_spec_spec.rb +214 -0
  81. data/spec/generated/subfield_tag_range_spec.rb +477 -0
  82. data/spec/generated/subfield_tag_sub_spec_spec.rb +3216 -0
  83. data/spec/generated/subfield_tag_tag_spec.rb +5592 -0
  84. data/spec/marc/spec/parsing/closed_int_range_spec.rb +49 -0
  85. data/spec/marc/spec/parsing/closed_lc_alpha_range_spec.rb +49 -0
  86. data/spec/marc/spec/parsing/parser_spec.rb +545 -0
  87. data/spec/marc/spec/queries/al_num_range_spec.rb +114 -0
  88. data/spec/marc/spec/queries/character_spec_spec.rb +28 -0
  89. data/spec/marc/spec/queries/comparison_string_spec.rb +28 -0
  90. data/spec/marc/spec/queries/indicator_value_spec.rb +28 -0
  91. data/spec/marc/spec/queries/query_spec.rb +200 -0
  92. data/spec/marc/spec/queries/subfield_spec.rb +92 -0
  93. data/spec/marc/spec/queries/subfield_value_spec.rb +31 -0
  94. data/spec/marc/spec/queries/tag_spec.rb +144 -0
  95. data/spec/marc/spec/queries/transform_spec.rb +459 -0
  96. data/spec/marc_spec_spec.rb +247 -0
  97. data/spec/scratch_spec.rb +112 -0
  98. data/spec/spec_helper.rb +23 -0
  99. metadata +341 -0
@@ -0,0 +1,91 @@
1
+ require_relative 'formatter'
2
+ require_relative 'test'
3
+
4
+ module ParserSpecs
5
+ class Suite
6
+ include Formatter
7
+ include Comparable
8
+
9
+ attr_reader :description, :rule, :parse_method, :json_path
10
+
11
+ # rubocop:disable Metrics/ParameterLists
12
+ def initialize(description, rule, wild, parse_method, json_path, tests = {})
13
+ @description = normalize_description(description)
14
+ @rule = rule
15
+ @wild = wild
16
+ @parse_method = parse_method
17
+ @json_path = json_path
18
+ tests.each { |t| add_test(t) }
19
+ end
20
+ # rubocop:enable Metrics/ParameterLists
21
+
22
+ def wild?
23
+ @wild
24
+ end
25
+
26
+ def tests_by_group
27
+ @tests_by_group ||= {}
28
+ end
29
+
30
+ def each_test(&block)
31
+ return to_enum(:each_test) unless block_given?
32
+
33
+ tests_by_group.each_value { |tests| tests.each(&block) }
34
+ end
35
+
36
+ def add_test(t)
37
+ tests_for_group = (tests_by_group[t.group] ||= [])
38
+ return (tests_for_group << t) unless (existing = tests_for_group.find { |t1| t1.merge?(t) })
39
+
40
+ existing.merge(t)
41
+ end
42
+
43
+ def merge?(o)
44
+ return false unless o.class == self.class
45
+ raise ArgumentError, "Can't merge #{quote(description)} with self" if o.equal?(self)
46
+
47
+ o.description == description && o.parse_method == parse_method
48
+ end
49
+
50
+ def merge(o)
51
+ o.each_test { |t| add_test(t) }
52
+ end
53
+
54
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
55
+ def <=>(other)
56
+ return unless other.class == self.class
57
+ return 0 if other.equal?(self)
58
+
59
+ order = description <=> other.description
60
+ return order if order != 0
61
+
62
+ order = parse_method <=> other.parse_method
63
+ return order if order != 0
64
+
65
+ order = tests.size <=> other.tests.size
66
+ return order if order != 0
67
+
68
+ tests.zip(other.tests).each do |t1, t2|
69
+ order = t1 <=> t2
70
+ return order if order != 0
71
+ end
72
+
73
+ 0
74
+ end
75
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
76
+
77
+ class << self
78
+ def from_ostruct(ostr, rule, wild, json_path)
79
+ parse_method = wild ? 'marc_spec' : rule
80
+ tests = ostr.tests.map { |t| Test.from_ostruct(t, parse_method, json_path) }
81
+ Suite.new(ostr.description, rule, wild, parse_method, json_path, tests)
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ def normalize_description(desc)
88
+ desc.sub(/^wild combination of /, 'marc_spec: ')
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,97 @@
1
+ require_relative 'formatter'
2
+
3
+ module ParserSpecs
4
+ class Test
5
+ include Formatter
6
+ include Comparable
7
+
8
+ GROUP_RE = /^(?<group>[^&]+) (?<detail>&& .*)$/.freeze
9
+
10
+ attr_reader :description
11
+ attr_reader :valid
12
+ attr_reader :parse_method
13
+ attr_reader :group
14
+ attr_reader :detail
15
+ attr_reader :json_path
16
+
17
+ def initialize(description, valid, parse_method, json_path, assertions = {})
18
+ @description = normalize_description(description)
19
+ @valid = valid
20
+ @parse_method = parse_method
21
+ @group, @detail = group_and_detail_from(@description)
22
+ @json_path = json_path
23
+ assertions.each { |d, v| add_assertion(d, v) }
24
+ end
25
+
26
+ def assertions
27
+ @assertions ||= {}
28
+ end
29
+
30
+ def rspec_assertions
31
+ assertions.map do |data, valid|
32
+ "expect(parser.#{parse_method}).#{valid ? 'to' : 'not_to'} parse(#{quote(data)}, trace: true, reporter: reporter)"
33
+ end
34
+ end
35
+
36
+ def add_assertion(data, valid)
37
+ raise ArgumentError, "#{quote(description)}: #{quote(data)}: #{valid} != #{self.valid}" if valid != self.valid
38
+
39
+ assertions[data] = valid
40
+ end
41
+
42
+ def merge?(o)
43
+ return false unless o.class == self.class
44
+ raise ArgumentError, "Can't merge #{quote(description)} with self" if o.equal?(self)
45
+
46
+ o.description == description && o.valid == valid && o.parse_method == parse_method
47
+ end
48
+
49
+ def merge(o)
50
+ o.assertions.each { |d, v| add_assertion(d, v) }
51
+ end
52
+
53
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
54
+ def <=>(other)
55
+ return unless other.class == self.class
56
+ return 0 if other.equal?(self)
57
+
58
+ order = description <=> other.description
59
+ return order if order != 0
60
+
61
+ order = valid <=> other.valid
62
+ return order if order != 0
63
+
64
+ order = parse_method <=> other.parse_method
65
+ return order if order != 0
66
+
67
+ order = assertions.size <=> other.assertions.size
68
+ return order if order != 0
69
+
70
+ assertions.keys.zip(other.assertions.keys).each do |d1, d2|
71
+ order = d1 <=> d2
72
+ return order if order != 0
73
+ end
74
+
75
+ 0
76
+ end
77
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
78
+
79
+ class << self
80
+ def from_ostruct(ostr, parse_method, json_path)
81
+ Test.new(ostr.description, ostr.valid, parse_method, json_path, { ostr.data => ostr.valid })
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ def group_and_detail_from(desc)
88
+ return unless (match_data = GROUP_RE.match(desc))
89
+
90
+ [match_data[:group], match_data[:detail]]
91
+ end
92
+
93
+ def normalize_description(desc)
94
+ desc.sub(/^.* wild combination: /, '').to_s
95
+ end
96
+ end
97
+ end
@@ -0,0 +1 @@
1
+ Dir.glob(File.expand_path('parser_specs/*.rb', __dir__)).sort.each(&method(:require))
@@ -0,0 +1,18 @@
1
+ require 'rubocop'
2
+ require 'rubocop/rake_task'
3
+
4
+ desc 'Run rubocop with HTML output'
5
+ RuboCop::RakeTask.new(:rubocop) do |cop|
6
+ output = ENV['RUBOCOP_OUTPUT'] || 'artifacts/rubocop/index.html'
7
+ puts "Writing RuboCop inspection report to #{output}"
8
+
9
+ cop.verbose = false
10
+ cop.formatters = ['html']
11
+ cop.options = ['--out', output]
12
+ end
13
+
14
+ desc 'Run RuboCop with auto-correct, and output results to console'
15
+ task :ra do
16
+ # b/c we want console output, we can't just use `rubocop:auto_correct`
17
+ RuboCop::CLI.new.run(['--auto-correct'])
18
+ end
data/rakelib/spec.rake ADDED
@@ -0,0 +1,27 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'pathname'
3
+
4
+ # TODO: generate comprehensive transform specs if possible
5
+ namespace :spec do
6
+ specs_dir = File.expand_path('../spec', __dir__)
7
+ generated_specs_dir = 'generated'
8
+
9
+ desc "regenerates spec/#{generated_specs_dir} from MARCSpec-Test-Suite"
10
+ task :generate do
11
+ require_relative 'parser_specs'
12
+
13
+ in_dir = File.join(specs_dir, 'suite')
14
+ out_dir = File.join(specs_dir, generated_specs_dir)
15
+
16
+ ParserSpecs::Rule.all_from_json(in_dir).each do |rule|
17
+ rule.write_rspec_to(out_dir)
18
+ end
19
+
20
+ RuboCop::CLI.new.run([out_dir])
21
+ end
22
+ end
23
+
24
+ RSpec::Core::RakeTask.new do |task|
25
+ task.rspec_opts = %w[--color --format documentation --order default]
26
+ task.pattern = 'spec/**/*_spec.rb'
27
+ end
@@ -0,0 +1,42 @@
1
+ File.expand_path('lib', __dir__).tap do |lib|
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ end
4
+
5
+ ruby_version = begin
6
+ ruby_version_file = File.expand_path('.ruby-version', __dir__)
7
+ File.read(ruby_version_file).strip
8
+ end
9
+
10
+ require 'marc/spec/module_info'
11
+
12
+ Gem::Specification.new do |spec|
13
+ spec.name = MARC::Spec::ModuleInfo::NAME
14
+ spec.author = MARC::Spec::ModuleInfo::AUTHOR
15
+ spec.email = MARC::Spec::ModuleInfo::AUTHOR_EMAIL
16
+ spec.summary = MARC::Spec::ModuleInfo::SUMMARY
17
+ spec.description = MARC::Spec::ModuleInfo::DESCRIPTION
18
+ spec.license = MARC::Spec::ModuleInfo::LICENSE
19
+ spec.version = MARC::Spec::ModuleInfo::VERSION
20
+ spec.homepage = MARC::Spec::ModuleInfo::HOMEPAGE
21
+
22
+ spec.files = `git ls-files -z`.split("\x0")
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.required_ruby_version = ">= #{ruby_version}"
26
+
27
+ spec.add_dependency 'marc', '~> 1.1'
28
+ spec.add_dependency 'parslet', '~> 2.0'
29
+ spec.add_dependency 'typesafe_enum', '~> 0.3'
30
+
31
+ spec.add_development_dependency 'bundle-audit', '~> 0.1'
32
+ spec.add_development_dependency 'ci_reporter_rspec', '~> 1.0'
33
+ spec.add_development_dependency 'colorize', '~> 0.8'
34
+ spec.add_development_dependency 'dotenv', '~> 2.7'
35
+ spec.add_development_dependency 'irb', '~> 1.2' # workaroundfor https://github.com/bundler/bundler/issues/6929
36
+ spec.add_development_dependency 'listen', '>= 3.0.5', '< 3.2'
37
+ spec.add_development_dependency 'rake', '~> 13.0'
38
+ spec.add_development_dependency 'rspec', '~> 3.9'
39
+ spec.add_development_dependency 'rubocop', '~> 0.91.0'
40
+ spec.add_development_dependency 'simplecov', '~> 0.16.1'
41
+ spec.add_development_dependency 'simplecov-rcov', '~> 0.2'
42
+ end
data/spec/.rubocop.yml ADDED
@@ -0,0 +1,46 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ AllCops:
4
+ # Exclude generated files
5
+ Exclude:
6
+ - 'suite/**/*'
7
+
8
+ Style/ClassAndModuleChildren:
9
+ Enabled: false
10
+
11
+ Style/ParallelAssignment:
12
+ Enabled: false
13
+
14
+ Layout/LineLength:
15
+ Enabled: false
16
+
17
+ Lint/UnderscorePrefixedVariableName:
18
+ Enabled: false
19
+
20
+ Metrics/AbcSize:
21
+ Enabled: false
22
+
23
+ Metrics/BlockLength:
24
+ Enabled: false
25
+
26
+ Metrics/ClassLength:
27
+ Enabled: false
28
+
29
+ Metrics/CyclomaticComplexity:
30
+ Enabled: false
31
+
32
+ Metrics/ModuleLength:
33
+ Enabled: false
34
+
35
+ Metrics/MethodLength:
36
+ Enabled: false
37
+
38
+ Metrics/PerceivedComplexity:
39
+ Enabled: false
40
+
41
+ ############################################################
42
+ # Added in Rubocop 0.89
43
+
44
+ # Sometimes we're testing the operator
45
+ Lint/BinaryOperatorWithIdenticalOperands:
46
+ Enabled: false
data/spec/README.md ADDED
@@ -0,0 +1,16 @@
1
+ # suite
2
+
3
+ The `suite` directory is a Git [submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) cloned from
4
+ [MARCspec/MARCspec-Test-Suite](https://github.com/MARCspec/MARCspec-Test-Suite). Specs in
5
+ [generated](generated) are generated based on the JSON in this suite via the
6
+ [spec::generate](../rakelib/spec.rake) rake task.
7
+
8
+ Note that after cloning this project for the first time you’ll need to initialize and pull
9
+ the submodule:
10
+
11
+ ```sh
12
+ git submodule init
13
+ git submodule update
14
+ ```
15
+
16
+ See the [Git submodule docs](https://git-scm.com/book/en/v2/Git-Tools-Submodules) for more information.
@@ -0,0 +1,182 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/">
2
+ <version>1.2</version>
3
+ <numberOfRecords>1</numberOfRecords>
4
+ <records>
5
+ <record>
6
+ <recordSchema>marcxml</recordSchema>
7
+ <recordPacking>xml</recordPacking>
8
+ <recordData>
9
+ <record xmlns="http://www.loc.gov/MARC21/slim">
10
+ <leader>01139njm a22002775a 4500</leader>
11
+ <controlfield tag="001">991033920629706532</controlfield>
12
+ <controlfield tag="005">20210907132140.0</controlfield>
13
+ <controlfield tag="007">cr |||||||||||</controlfield>
14
+ <controlfield tag="008">151210q19601969enk o d</controlfield>
15
+ <datafield ind1=" " ind2=" " tag="035">
16
+ <subfield code="a">(CUY)UCB-b23161018x-01ucs_ber</subfield>
17
+ </datafield>
18
+ <datafield ind1=" " ind2=" " tag="035">
19
+ <subfield code="a">(OCoLC)932121906</subfield>
20
+ <subfield code="9">ExL</subfield>
21
+ </datafield>
22
+ <datafield ind1=" " ind2=" " tag="035">
23
+ <subfield code="a">(EXLNZ-01UCS_NETWORK)9913574292606531</subfield>
24
+ </datafield>
25
+ <datafield ind1=" " ind2=" " tag="040">
26
+ <subfield code="a">CUY</subfield>
27
+ <subfield code="c">CUY</subfield>
28
+ </datafield>
29
+ <datafield ind1="1" ind2="0" tag="100">
30
+ <subfield code="a">MacLeod, Donald,</subfield>
31
+ <subfield code="d">1916-1982.</subfield>
32
+ </datafield>
33
+ <datafield ind1="1" ind2="0" tag="245">
34
+ <subfield code="a">Instructional tape</subfield>
35
+ <subfield code="h">[electronic resource] :</subfield>
36
+ <subfield code="b">piobareachd /</subfield>
37
+ <subfield code="c">Donald MacLeod.</subfield>
38
+ </datafield>
39
+ <datafield ind1=" " ind2=" " tag="260">
40
+ <subfield code="a">[Britain :</subfield>
41
+ <subfield code="b">s.n.,</subfield>
42
+ <subfield code="c">196-?]</subfield>
43
+ </datafield>
44
+ <datafield ind1=" " ind2=" " tag="300">
45
+ <subfield code="a">20 streaming audio files.</subfield>
46
+ </datafield>
47
+ <datafield ind1=" " ind2=" " tag="500">
48
+ <subfield code="a">Lessons and demonstrations in playing Scottish bagpipe music.</subfield>
49
+ </datafield>
50
+ <datafield ind1=" " ind2=" " tag="500">
51
+ <subfield code="a">Reels 1 and 5, 7 in.; reel 1, 3 3/4 ips.</subfield>
52
+ </datafield>
53
+ <datafield ind1=" " ind2=" " tag="500">
54
+ <subfield code="a">Includes table of contents (manuscript) in each container.</subfield>
55
+ </datafield>
56
+ <datafield ind1=" " ind2=" " tag="533">
57
+ <subfield code="a">Electronic reproduction.</subfield>
58
+ <subfield code="b">San Francisco, Calif. :</subfield>
59
+ <subfield code="c">Digital Revolution,</subfield>
60
+ <subfield code="d">2014.</subfield>
61
+ </datafield>
62
+ <datafield ind1=" " ind2=" " tag="534">
63
+ <subfield code="p">Original version:</subfield>
64
+ <subfield code="e">20 sound tape reels : analog, 7 1/2 ips ; 5-7 in.</subfield>
65
+ </datafield>
66
+ <datafield ind1=" " ind2=" " tag="538">
67
+ <subfield code="a">System requirements: Streaming audio player and an internet connection.</subfield>
68
+ </datafield>
69
+ <datafield ind1=" " ind2=" " tag="538">
70
+ <subfield code="a">Mode of access: World Wide Web.</subfield>
71
+ </datafield>
72
+ <datafield ind1=" " ind2=" " tag="588">
73
+ <subfield code="a">Description based on sound recording record.</subfield>
74
+ </datafield>
75
+ <datafield ind1=" " ind2="0" tag="650">
76
+ <subfield code="a">Pibrochs.</subfield>
77
+ </datafield>
78
+ <datafield ind1=" " ind2="0" tag="650">
79
+ <subfield code="a">Music</subfield>
80
+ <subfield code="z">Scotland.</subfield>
81
+ </datafield>
82
+ <datafield ind1=" " ind2=" " tag="955">
83
+ <subfield code="a">20151210</subfield>
84
+ <subfield code="b">Music Audio Tapes MUSI_Project_Bib_Records.out.marc</subfield>
85
+ <subfield code="9">LOCAL</subfield>
86
+ </datafield>
87
+ <datafield ind1="4" ind2="0" tag="956">
88
+ <subfield code="z">Music Library Audio Tapes. Freely available for streaming.</subfield>
89
+ <subfield code="u">https://avplayer.lib.berkeley.edu/music/b23161018</subfield>
90
+ <subfield code="9">LOCAL</subfield>
91
+ </datafield>
92
+ <datafield ind1="0" ind2=" " tag="973">
93
+ <subfield code="a">Music Library audio tapes.</subfield>
94
+ <subfield code="5">CU</subfield>
95
+ <subfield code="9">LOCAL</subfield>
96
+ </datafield>
97
+ <datafield ind1=" " ind2=" " tag="996">
98
+ <subfield code="a">b23161018x</subfield>
99
+ <subfield code="b">Updated: 02-02-20</subfield>
100
+ <subfield code="c">Created: 12-10-15</subfield>
101
+ <subfield code="d">CatDate: 12-10-15</subfield>
102
+ <subfield code="9">LOCAL</subfield>
103
+ </datafield>
104
+ <datafield ind1=" " ind2=" " tag="998">
105
+ <subfield code="a">00:47:49</subfield>
106
+ <subfield code="t">reel 1, part 1</subfield>
107
+ <subfield code="g">C040790863_1.mp3</subfield>
108
+ <subfield code="a">00:23:29</subfield>
109
+ <subfield code="t">reel 2, part 1</subfield>
110
+ <subfield code="g">C040790960_1.mp3</subfield>
111
+ <subfield code="a">00:22:56</subfield>
112
+ <subfield code="t">reel 3, part 1</subfield>
113
+ <subfield code="g">C040791061_1.mp3</subfield>
114
+ <subfield code="a">00:21:46</subfield>
115
+ <subfield code="t">reel 4, part 1</subfield>
116
+ <subfield code="g">C040791168_1.mp3</subfield>
117
+ <subfield code="a">00:24:19</subfield>
118
+ <subfield code="t">reel 5, part 1</subfield>
119
+ <subfield code="g">C040790872_1.mp3</subfield>
120
+ <subfield code="a">00:24:18</subfield>
121
+ <subfield code="t">reel 6, part 1</subfield>
122
+ <subfield code="g">C040790979_1.mp3</subfield>
123
+ <subfield code="a">00:24:18</subfield>
124
+ <subfield code="t">reel 7, part 1</subfield>
125
+ <subfield code="g">C040791070_1.mp3</subfield>
126
+ <subfield code="a">00:23:23</subfield>
127
+ <subfield code="t">reel 8, part 1</subfield>
128
+ <subfield code="g">C040791177_1.mp3</subfield>
129
+ <subfield code="a">00:20:01</subfield>
130
+ <subfield code="t">reel 9, part 1</subfield>
131
+ <subfield code="g">C040790881_1.mp3</subfield>
132
+ <subfield code="a">00:22:38</subfield>
133
+ <subfield code="t">reel 10</subfield>
134
+ <subfield code="g">C040790988.mp3</subfield>
135
+ <subfield code="a">00:23:44</subfield>
136
+ <subfield code="t">reel 11</subfield>
137
+ <subfield code="g">C040791089.mp3</subfield>
138
+ <subfield code="a">00:22:27</subfield>
139
+ <subfield code="t">reel 12</subfield>
140
+ <subfield code="g">C040791186.mp3</subfield>
141
+ <subfield code="a">00:21:57</subfield>
142
+ <subfield code="t">reel 13, part 1</subfield>
143
+ <subfield code="g">C040790890_1.mp3</subfield>
144
+ <subfield code="a">00:44:28</subfield>
145
+ <subfield code="t">reel 14, part 1</subfield>
146
+ <subfield code="g">C040790997_1.mp3</subfield>
147
+ <subfield code="a">00:44:33</subfield>
148
+ <subfield code="t">reel 15, part 1</subfield>
149
+ <subfield code="g">C040791098_1.mp3</subfield>
150
+ <subfield code="a">00:44:01</subfield>
151
+ <subfield code="t">reel 16, part 1</subfield>
152
+ <subfield code="g">C040790906_1.mp3</subfield>
153
+ <subfield code="a">00:46:58</subfield>
154
+ <subfield code="t">reel 17, part 1</subfield>
155
+ <subfield code="g">C040791007_1.mp3</subfield>
156
+ <subfield code="a">00:42:49</subfield>
157
+ <subfield code="t">reel 18, part 1</subfield>
158
+ <subfield code="g">C040791104_1.mp3</subfield>
159
+ <subfield code="a">00:44:35</subfield>
160
+ <subfield code="t">reel 19, part 1</subfield>
161
+ <subfield code="g">C040791195_1.mp3</subfield>
162
+ <subfield code="a">00:40:12</subfield>
163
+ <subfield code="t">reel 20, part 1</subfield>
164
+ <subfield code="g">C040791201_1.mp3</subfield>
165
+ <subfield code="9">LOCAL</subfield>
166
+ </datafield>
167
+ <datafield ind1=" " ind2=" " tag="AVE">
168
+ <subfield code="8">531002912470006532</subfield>
169
+ <subfield code="e">Available</subfield>
170
+ <subfield code="n">Music Library Audio Tapes. Freely available for streaming.</subfield>
171
+ </datafield>
172
+ </record>
173
+ </recordData>
174
+ <recordIdentifier>991033920629706532</recordIdentifier>
175
+ <recordPosition>1</recordPosition>
176
+ </record>
177
+ </records>
178
+ <extraResponseData xmlns:xb="http://www.exlibris.com/repository/search/xmlbeans/">
179
+ <xb:exact>true</xb:exact>
180
+ <xb:responseDate>2021-09-23T13:14:41-0700</xb:responseDate>
181
+ </extraResponseData>
182
+ </searchRetrieveResponse>
@@ -0,0 +1,82 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- from https://www.loc.gov/standards/marcxml/Sandburg/sandburg.xml -->
3
+ <collection xmlns="http://www.loc.gov/MARC21/slim">
4
+ <record>
5
+ <leader>01142cam 2200301 a 4500</leader>
6
+ <controlfield tag="001"> 92005291 </controlfield>
7
+ <controlfield tag="003">DLC</controlfield>
8
+ <controlfield tag="005">19930521155141.9</controlfield>
9
+ <controlfield tag="008">920219s1993 caua j 000 0 eng </controlfield>
10
+ <datafield tag="010" ind1=" " ind2=" ">
11
+ <subfield code="a"> 92005291 </subfield>
12
+ </datafield>
13
+ <datafield tag="020" ind1=" " ind2=" ">
14
+ <subfield code="a">0152038655 :</subfield>
15
+ <subfield code="c">$15.95</subfield>
16
+ </datafield>
17
+ <datafield tag="040" ind1=" " ind2=" ">
18
+ <subfield code="a">DLC</subfield>
19
+ <subfield code="c">DLC</subfield>
20
+ <subfield code="d">DLC</subfield>
21
+ </datafield>
22
+ <datafield tag="042" ind1=" " ind2=" ">
23
+ <subfield code="a">lcac</subfield>
24
+ </datafield>
25
+ <datafield tag="050" ind1="0" ind2="0">
26
+ <subfield code="a">PS3537.A618</subfield>
27
+ <subfield code="b">A88 1993</subfield>
28
+ </datafield>
29
+ <datafield tag="082" ind1="0" ind2="0">
30
+ <subfield code="a">811/.52</subfield>
31
+ <subfield code="2">20</subfield>
32
+ </datafield>
33
+ <datafield tag="100" ind1="1" ind2=" ">
34
+ <subfield code="a">Sandburg, Carl,</subfield>
35
+ <subfield code="d">1878-1967.</subfield>
36
+ </datafield>
37
+ <datafield tag="245" ind1="1" ind2="0">
38
+ <subfield code="a">Arithmetic /</subfield>
39
+ <subfield code="c">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.</subfield>
40
+ </datafield>
41
+ <datafield tag="250" ind1=" " ind2=" ">
42
+ <subfield code="a">1st ed.</subfield>
43
+ </datafield>
44
+ <datafield tag="260" ind1=" " ind2=" ">
45
+ <subfield code="a">San Diego :</subfield>
46
+ <subfield code="b">Harcourt Brace Jovanovich,</subfield>
47
+ <subfield code="c">c1993.</subfield>
48
+ </datafield>
49
+ <datafield tag="300" ind1=" " ind2=" ">
50
+ <subfield code="a">1 v. (unpaged) :</subfield>
51
+ <subfield code="b">ill. (some col.) ;</subfield>
52
+ <subfield code="c">26 cm.</subfield>
53
+ </datafield>
54
+ <datafield tag="500" ind1=" " ind2=" ">
55
+ <subfield code="a">One Mylar sheet included in pocket.</subfield>
56
+ </datafield>
57
+ <datafield tag="520" ind1=" " ind2=" ">
58
+ <subfield code="a">A poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone.</subfield>
59
+ </datafield>
60
+ <datafield tag="650" ind1=" " ind2="0">
61
+ <subfield code="a">Arithmetic</subfield>
62
+ <subfield code="x">Juvenile poetry.</subfield>
63
+ </datafield>
64
+ <datafield tag="650" ind1=" " ind2="0">
65
+ <subfield code="a">Children's poetry, American.</subfield>
66
+ </datafield>
67
+ <datafield tag="650" ind1=" " ind2="1">
68
+ <subfield code="a">Arithmetic</subfield>
69
+ <subfield code="x">Poetry.</subfield>
70
+ </datafield>
71
+ <datafield tag="650" ind1=" " ind2="1">
72
+ <subfield code="a">American poetry.</subfield>
73
+ </datafield>
74
+ <datafield tag="650" ind1=" " ind2="1">
75
+ <subfield code="a">Visual perception.</subfield>
76
+ </datafield>
77
+ <datafield tag="700" ind1="1" ind2=" ">
78
+ <subfield code="a">Rand, Ted,</subfield>
79
+ <subfield code="e">ill.</subfield>
80
+ </datafield>
81
+ </record>
82
+ </collection>