ruby-marc-spec 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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>