ruby-marc-spec 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/build.yml +18 -0
- data/.gitignore +388 -0
- data/.gitmodules +3 -0
- data/.idea/codeStyles/codeStyleConfig.xml +5 -0
- data/.idea/go.imports.xml +6 -0
- data/.idea/inspectionProfiles/Project_Default.xml +23 -0
- data/.idea/marc_spec.iml +102 -0
- data/.idea/misc.xml +6 -0
- data/.idea/modules.xml +8 -0
- data/.idea/templateLanguages.xml +6 -0
- data/.idea/vcs.xml +7 -0
- data/.rubocop.yml +269 -0
- data/.ruby-version +1 -0
- data/.simplecov +8 -0
- data/CHANGES.md +3 -0
- data/Gemfile +6 -0
- data/LICENSE.md +21 -0
- data/README.md +172 -0
- data/Rakefile +20 -0
- data/lib/.rubocop.yml +5 -0
- data/lib/marc/spec/module_info.rb +14 -0
- data/lib/marc/spec/parsing/closed_int_range.rb +28 -0
- data/lib/marc/spec/parsing/closed_lc_alpha_range.rb +28 -0
- data/lib/marc/spec/parsing/parser.rb +213 -0
- data/lib/marc/spec/parsing.rb +1 -0
- data/lib/marc/spec/queries/al_num_range.rb +105 -0
- data/lib/marc/spec/queries/applicable.rb +18 -0
- data/lib/marc/spec/queries/character_spec.rb +81 -0
- data/lib/marc/spec/queries/comparison_string.rb +45 -0
- data/lib/marc/spec/queries/condition.rb +133 -0
- data/lib/marc/spec/queries/condition_context.rb +49 -0
- data/lib/marc/spec/queries/dsl.rb +80 -0
- data/lib/marc/spec/queries/indicator_value.rb +77 -0
- data/lib/marc/spec/queries/operator.rb +129 -0
- data/lib/marc/spec/queries/part.rb +63 -0
- data/lib/marc/spec/queries/position.rb +59 -0
- data/lib/marc/spec/queries/position_or_range.rb +27 -0
- data/lib/marc/spec/queries/query.rb +94 -0
- data/lib/marc/spec/queries/query_executor.rb +52 -0
- data/lib/marc/spec/queries/selector.rb +12 -0
- data/lib/marc/spec/queries/subfield.rb +88 -0
- data/lib/marc/spec/queries/subfield_value.rb +63 -0
- data/lib/marc/spec/queries/tag.rb +107 -0
- data/lib/marc/spec/queries/transform.rb +154 -0
- data/lib/marc/spec/queries.rb +1 -0
- data/lib/marc/spec.rb +32 -0
- data/rakelib/.rubocop.yml +19 -0
- data/rakelib/bundle.rake +8 -0
- data/rakelib/coverage.rake +11 -0
- data/rakelib/gem.rake +54 -0
- data/rakelib/parser_specs/formatter.rb +31 -0
- data/rakelib/parser_specs/parser_specs.rb.txt.erb +35 -0
- data/rakelib/parser_specs/rule.rb +95 -0
- data/rakelib/parser_specs/suite.rb +91 -0
- data/rakelib/parser_specs/test.rb +97 -0
- data/rakelib/parser_specs.rb +1 -0
- data/rakelib/rubocop.rake +18 -0
- data/rakelib/spec.rake +27 -0
- data/ruby-marc-spec.gemspec +42 -0
- data/spec/.rubocop.yml +46 -0
- data/spec/README.md +16 -0
- data/spec/data/b23161018-sru.xml +182 -0
- data/spec/data/sandburg.xml +82 -0
- data/spec/generated/char_indicator_spec.rb +174 -0
- data/spec/generated/char_spec.rb +113 -0
- data/spec/generated/comparison_string_spec.rb +74 -0
- data/spec/generated/field_tag_spec.rb +156 -0
- data/spec/generated/index_char_spec.rb +669 -0
- data/spec/generated/index_indicator_spec.rb +174 -0
- data/spec/generated/index_spec.rb +113 -0
- data/spec/generated/index_sub_spec_spec.rb +1087 -0
- data/spec/generated/indicators_spec.rb +75 -0
- data/spec/generated/position_or_range_spec.rb +110 -0
- data/spec/generated/sub_spec_spec.rb +208 -0
- data/spec/generated/sub_spec_sub_spec_spec.rb +1829 -0
- data/spec/generated/subfield_char_spec.rb +405 -0
- data/spec/generated/subfield_range_range_spec.rb +48 -0
- data/spec/generated/subfield_range_spec.rb +87 -0
- data/spec/generated/subfield_range_sub_spec_spec.rb +214 -0
- data/spec/generated/subfield_tag_range_spec.rb +477 -0
- data/spec/generated/subfield_tag_sub_spec_spec.rb +3216 -0
- data/spec/generated/subfield_tag_tag_spec.rb +5592 -0
- data/spec/marc/spec/parsing/closed_int_range_spec.rb +49 -0
- data/spec/marc/spec/parsing/closed_lc_alpha_range_spec.rb +49 -0
- data/spec/marc/spec/parsing/parser_spec.rb +545 -0
- data/spec/marc/spec/queries/al_num_range_spec.rb +114 -0
- data/spec/marc/spec/queries/character_spec_spec.rb +28 -0
- data/spec/marc/spec/queries/comparison_string_spec.rb +28 -0
- data/spec/marc/spec/queries/indicator_value_spec.rb +28 -0
- data/spec/marc/spec/queries/query_spec.rb +200 -0
- data/spec/marc/spec/queries/subfield_spec.rb +92 -0
- data/spec/marc/spec/queries/subfield_value_spec.rb +31 -0
- data/spec/marc/spec/queries/tag_spec.rb +144 -0
- data/spec/marc/spec/queries/transform_spec.rb +459 -0
- data/spec/marc_spec_spec.rb +247 -0
- data/spec/scratch_spec.rb +112 -0
- data/spec/spec_helper.rb +23 -0
- 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>
|