ruby-marc-spec 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 54b13628142e544532fa38aff52eae04766e17c1bdfbfab6736c1ad1d6aa9a38
4
- data.tar.gz: 498bd3f6ee88e2c41ef1ae95de9fabc1f5987d59944128f6853f54ec205168a8
3
+ metadata.gz: a7c07c75f4d7301b6a165724f8753630010c0df3b468b81c2debcc6ad38fb4d1
4
+ data.tar.gz: 36e1a57d33df1a5fe2553ec3fce562e08e58d2664c55262a644eeb49fecad4e4
5
5
  SHA512:
6
- metadata.gz: 2c4cc664defc35600518fef9eb9ee1c8a3241b654cee78e114b8284399e965d9d4e09de4ea7232579198032b54a93543292d5c5cbc5697bfd10462b0ff4f816a
7
- data.tar.gz: 0c8891024722e38dbc4a1f776f356b8d4411cb2f439f01904dad5b9ec8c0a12692147fb86805a38edea376fb8ac25d7159c75c5762f1e1b59fd492367539fe34
6
+ metadata.gz: b08b4c373d701cf2e0a2e43c45fbb7081893f257437e7b8e6e6c4583e0cf4440869b3e25f0f31006f2c8be8a63953468ec39af8c94d9a03dc6bb1ccedbc4baef
7
+ data.tar.gz: b49627593b4e74361e443f4536145cc365d3ace763f87ee312263a968b65002f1696c389b14fc45376ac168950ae3293746f0435723080c98b51a26029931094
data/.idea/marc-spec.iml CHANGED
@@ -6,53 +6,53 @@
6
6
  <component name="NewModuleRootManager" inherit-compiler-output="true">
7
7
  <exclude-output />
8
8
  <content url="file://$MODULE_DIR$" />
9
- <orderEntry type="jdk" jdkName="RVM: ruby-2.7.4" jdkType="RUBY_SDK" />
9
+ <orderEntry type="jdk" jdkName="RVM: ruby-2.7.5" jdkType="RUBY_SDK" />
10
10
  <orderEntry type="sourceFolder" forTests="false" />
11
- <orderEntry type="library" scope="PROVIDED" name="ast (v2.4.2, RVM: ruby-2.7.4) [gem]" level="application" />
12
- <orderEntry type="library" scope="PROVIDED" name="builder (v3.2.4, RVM: ruby-2.7.4) [gem]" level="application" />
13
- <orderEntry type="library" scope="PROVIDED" name="bundle-audit (v0.1.0, RVM: ruby-2.7.4) [gem]" level="application" />
14
- <orderEntry type="library" scope="PROVIDED" name="bundler (v2.2.14, RVM: ruby-2.7.4) [gem]" level="application" />
15
- <orderEntry type="library" scope="PROVIDED" name="bundler-audit (v0.9.0.1, RVM: ruby-2.7.4) [gem]" level="application" />
16
- <orderEntry type="library" scope="PROVIDED" name="ci_reporter (v2.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
17
- <orderEntry type="library" scope="PROVIDED" name="ci_reporter_rspec (v1.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
18
- <orderEntry type="library" scope="PROVIDED" name="colorize (v0.8.1, RVM: ruby-2.7.4) [gem]" level="application" />
19
- <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.4.4, RVM: ruby-2.7.4) [gem]" level="application" />
20
- <orderEntry type="library" scope="PROVIDED" name="docile (v1.4.0, RVM: ruby-2.7.4) [gem]" level="application" />
21
- <orderEntry type="library" scope="PROVIDED" name="dotenv (v2.7.6, RVM: ruby-2.7.4) [gem]" level="application" />
22
- <orderEntry type="library" scope="PROVIDED" name="ffi (v1.15.4, RVM: ruby-2.7.4) [gem]" level="application" />
23
- <orderEntry type="library" scope="PROVIDED" name="io-console (v0.5.9, RVM: ruby-2.7.4) [gem]" level="application" />
24
- <orderEntry type="library" scope="PROVIDED" name="irb (v1.3.7, RVM: ruby-2.7.4) [gem]" level="application" />
25
- <orderEntry type="library" scope="PROVIDED" name="json (v2.5.1, RVM: ruby-2.7.4) [gem]" level="application" />
26
- <orderEntry type="library" scope="PROVIDED" name="listen (v3.1.5, RVM: ruby-2.7.4) [gem]" level="application" />
27
- <orderEntry type="library" scope="PROVIDED" name="marc (v1.1.1@335a02, RVM: ruby-2.7.4) [gem]" level="application" />
28
- <orderEntry type="library" scope="PROVIDED" name="parallel (v1.21.0, RVM: ruby-2.7.4) [gem]" level="application" />
29
- <orderEntry type="library" scope="PROVIDED" name="parser (v3.0.2.0, RVM: ruby-2.7.4) [gem]" level="application" />
30
- <orderEntry type="library" scope="PROVIDED" name="parslet (v2.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
31
- <orderEntry type="library" scope="PROVIDED" name="rainbow (v3.0.0, RVM: ruby-2.7.4) [gem]" level="application" />
32
- <orderEntry type="library" scope="PROVIDED" name="rake (v13.0.6, RVM: ruby-2.7.4) [gem]" level="application" />
33
- <orderEntry type="library" scope="PROVIDED" name="rb-fsevent (v0.11.0, RVM: ruby-2.7.4) [gem]" level="application" />
34
- <orderEntry type="library" scope="PROVIDED" name="rb-inotify (v0.10.1, RVM: ruby-2.7.4) [gem]" level="application" />
35
- <orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.1.1, RVM: ruby-2.7.4) [gem]" level="application" />
36
- <orderEntry type="library" scope="PROVIDED" name="reline (v0.2.7, RVM: ruby-2.7.4) [gem]" level="application" />
37
- <orderEntry type="library" scope="PROVIDED" name="rexml (v3.2.5, RVM: ruby-2.7.4) [gem]" level="application" />
38
- <orderEntry type="library" scope="PROVIDED" name="rspec (v3.10.0, RVM: ruby-2.7.4) [gem]" level="application" />
39
- <orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.10.1, RVM: ruby-2.7.4) [gem]" level="application" />
40
- <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.10.1, RVM: ruby-2.7.4) [gem]" level="application" />
41
- <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.10.2, RVM: ruby-2.7.4) [gem]" level="application" />
42
- <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.10.2, RVM: ruby-2.7.4) [gem]" level="application" />
43
- <orderEntry type="library" scope="PROVIDED" name="rubocop (v0.91.1, RVM: ruby-2.7.4) [gem]" level="application" />
44
- <orderEntry type="library" scope="PROVIDED" name="rubocop-ast (v0.8.0, RVM: ruby-2.7.4) [gem]" level="application" />
45
- <orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.11.0, RVM: ruby-2.7.4) [gem]" level="application" />
46
- <orderEntry type="library" scope="PROVIDED" name="ruby_dep (v1.5.0, RVM: ruby-2.7.4) [gem]" level="application" />
47
- <orderEntry type="library" scope="PROVIDED" name="scrub_rb (v1.0.1, RVM: ruby-2.7.4) [gem]" level="application" />
48
- <orderEntry type="library" scope="PROVIDED" name="simplecov (v0.16.1, RVM: ruby-2.7.4) [gem]" level="application" />
49
- <orderEntry type="library" scope="PROVIDED" name="simplecov-html (v0.10.2, RVM: ruby-2.7.4) [gem]" level="application" />
50
- <orderEntry type="library" scope="PROVIDED" name="simplecov-rcov (v0.2.3, RVM: ruby-2.7.4) [gem]" level="application" />
51
- <orderEntry type="library" scope="PROVIDED" name="thor (v1.1.0, RVM: ruby-2.7.4) [gem]" level="application" />
52
- <orderEntry type="library" scope="PROVIDED" name="typesafe_enum (v0.3.0, RVM: ruby-2.7.4) [gem]" level="application" />
53
- <orderEntry type="library" scope="PROVIDED" name="unf (v0.1.4, RVM: ruby-2.7.4) [gem]" level="application" />
54
- <orderEntry type="library" scope="PROVIDED" name="unf_ext (v0.0.8, RVM: ruby-2.7.4) [gem]" level="application" />
55
- <orderEntry type="library" scope="PROVIDED" name="unicode-display_width (v1.8.0, RVM: ruby-2.7.4) [gem]" level="application" />
11
+ <orderEntry type="library" scope="PROVIDED" name="ast (v2.4.2, RVM: ruby-2.7.5) [gem]" level="application" />
12
+ <orderEntry type="library" scope="PROVIDED" name="builder (v3.2.4, RVM: ruby-2.7.5) [gem]" level="application" />
13
+ <orderEntry type="library" scope="PROVIDED" name="bundle-audit (v0.1.0, RVM: ruby-2.7.5) [gem]" level="application" />
14
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v2.2.31, RVM: ruby-2.7.5) [gem]" level="application" />
15
+ <orderEntry type="library" scope="PROVIDED" name="bundler-audit (v0.9.0.1, RVM: ruby-2.7.5) [gem]" level="application" />
16
+ <orderEntry type="library" scope="PROVIDED" name="ci_reporter (v2.0.0, RVM: ruby-2.7.5) [gem]" level="application" />
17
+ <orderEntry type="library" scope="PROVIDED" name="ci_reporter_rspec (v1.0.0, RVM: ruby-2.7.5) [gem]" level="application" />
18
+ <orderEntry type="library" scope="PROVIDED" name="colorize (v0.8.1, RVM: ruby-2.7.5) [gem]" level="application" />
19
+ <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.5.0, RVM: ruby-2.7.5) [gem]" level="application" />
20
+ <orderEntry type="library" scope="PROVIDED" name="docile (v1.4.0, RVM: ruby-2.7.5) [gem]" level="application" />
21
+ <orderEntry type="library" scope="PROVIDED" name="dotenv (v2.7.6, RVM: ruby-2.7.5) [gem]" level="application" />
22
+ <orderEntry type="library" scope="PROVIDED" name="ffi (v1.15.5, RVM: ruby-2.7.5) [gem]" level="application" />
23
+ <orderEntry type="library" scope="PROVIDED" name="io-console (v0.5.11, RVM: ruby-2.7.5) [gem]" level="application" />
24
+ <orderEntry type="library" scope="PROVIDED" name="irb (v1.4.1, RVM: ruby-2.7.5) [gem]" level="application" />
25
+ <orderEntry type="library" scope="PROVIDED" name="listen (v3.1.5, RVM: ruby-2.7.5) [gem]" level="application" />
26
+ <orderEntry type="library" scope="PROVIDED" name="marc (v1.1.1@335a02, RVM: ruby-2.7.5) [gem]" level="application" />
27
+ <orderEntry type="library" scope="PROVIDED" name="parallel (v1.21.0, RVM: ruby-2.7.5) [gem]" level="application" />
28
+ <orderEntry type="library" scope="PROVIDED" name="parser (v3.1.0.0, RVM: ruby-2.7.5) [gem]" level="application" />
29
+ <orderEntry type="library" scope="PROVIDED" name="parslet (v2.0.0, RVM: ruby-2.7.5) [gem]" level="application" />
30
+ <orderEntry type="library" scope="PROVIDED" name="rainbow (v3.1.1, RVM: ruby-2.7.5) [gem]" level="application" />
31
+ <orderEntry type="library" scope="PROVIDED" name="rake (v13.0.6, RVM: ruby-2.7.5) [gem]" level="application" />
32
+ <orderEntry type="library" scope="PROVIDED" name="rb-fsevent (v0.11.0, RVM: ruby-2.7.5) [gem]" level="application" />
33
+ <orderEntry type="library" scope="PROVIDED" name="rb-inotify (v0.10.1, RVM: ruby-2.7.5) [gem]" level="application" />
34
+ <orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.2.0, RVM: ruby-2.7.5) [gem]" level="application" />
35
+ <orderEntry type="library" scope="PROVIDED" name="reline (v0.3.1, RVM: ruby-2.7.5) [gem]" level="application" />
36
+ <orderEntry type="library" scope="PROVIDED" name="rexml (v3.2.5, RVM: ruby-2.7.5) [gem]" level="application" />
37
+ <orderEntry type="library" scope="PROVIDED" name="rspec (v3.10.0, RVM: ruby-2.7.5) [gem]" level="application" />
38
+ <orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.10.2, RVM: ruby-2.7.5) [gem]" level="application" />
39
+ <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.10.2, RVM: ruby-2.7.5) [gem]" level="application" />
40
+ <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.10.3, RVM: ruby-2.7.5) [gem]" level="application" />
41
+ <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.10.3, RVM: ruby-2.7.5) [gem]" level="application" />
42
+ <orderEntry type="library" scope="PROVIDED" name="rubocop (v0.91.1, RVM: ruby-2.7.5) [gem]" level="application" />
43
+ <orderEntry type="library" scope="PROVIDED" name="rubocop-ast (v0.8.0, RVM: ruby-2.7.5) [gem]" level="application" />
44
+ <orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.11.0, RVM: ruby-2.7.5) [gem]" level="application" />
45
+ <orderEntry type="library" scope="PROVIDED" name="ruby_dep (v1.5.0, RVM: ruby-2.7.5) [gem]" level="application" />
46
+ <orderEntry type="library" scope="PROVIDED" name="scrub_rb (v1.0.1, RVM: ruby-2.7.5) [gem]" level="application" />
47
+ <orderEntry type="library" scope="PROVIDED" name="simplecov (v0.21.2, RVM: ruby-2.7.5) [gem]" level="application" />
48
+ <orderEntry type="library" scope="PROVIDED" name="simplecov-html (v0.12.3, RVM: ruby-2.7.5) [gem]" level="application" />
49
+ <orderEntry type="library" scope="PROVIDED" name="simplecov-rcov (v0.2.3, RVM: ruby-2.7.5) [gem]" level="application" />
50
+ <orderEntry type="library" scope="PROVIDED" name="simplecov_json_formatter (v0.1.3, RVM: ruby-2.7.5) [gem]" level="application" />
51
+ <orderEntry type="library" scope="PROVIDED" name="thor (v1.2.1, RVM: ruby-2.7.5) [gem]" level="application" />
52
+ <orderEntry type="library" scope="PROVIDED" name="typesafe_enum (v0.3.0, RVM: ruby-2.7.5) [gem]" level="application" />
53
+ <orderEntry type="library" scope="PROVIDED" name="unf (v0.1.4, RVM: ruby-2.7.5) [gem]" level="application" />
54
+ <orderEntry type="library" scope="PROVIDED" name="unf_ext (v0.0.8, RVM: ruby-2.7.5) [gem]" level="application" />
55
+ <orderEntry type="library" scope="PROVIDED" name="unicode-display_width (v1.8.0, RVM: ruby-2.7.5) [gem]" level="application" />
56
56
  </component>
57
57
  <component name="RModuleSettingsStorage">
58
58
  <LOAD_PATH number="2" string0="$MODULE_DIR$/lib" string1="$MODULE_DIR$/spec" />
@@ -69,7 +69,7 @@
69
69
  </RakeTaskImpl>
70
70
  <RakeTaskImpl description="Run all specs in spec directory, with coverage" fullCommand="coverage" id="coverage" />
71
71
  <RakeTaskImpl description="Run tests, check test coverage, check code style" fullCommand="default" id="default" />
72
- <RakeTaskImpl description="Build ruby-marc-spec.gemspec as ruby-marc-spec-0.1.0.gem" fullCommand="gem" id="gem" />
72
+ <RakeTaskImpl description="Build ruby-marc-spec.gemspec as ruby-marc-spec-0.1.1.gem" fullCommand="gem" id="gem" />
73
73
  <RakeTaskImpl description="Run RuboCop with auto-correct, and output results to console" fullCommand="ra" id="ra" />
74
74
  <RakeTaskImpl description="Run rubocop with HTML output" fullCommand="rubocop" id="rubocop" />
75
75
  <RakeTaskImpl id="rubocop">
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.7
1
+ 2.7.5
data/.simplecov CHANGED
@@ -1,7 +1,9 @@
1
1
  require 'simplecov-rcov'
2
2
 
3
- SimpleCov.start 'rails' do
3
+ SimpleCov.start do
4
+ add_filter %r{^/spec/}
4
5
  add_filter 'module_info.rb'
6
+
5
7
  coverage_dir 'artifacts'
6
8
  formatter SimpleCov::Formatter::RcovFormatter
7
9
  minimum_coverage 100
data/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.1.2 (2022-02-01)
2
+
3
+ - Adds `MARC::Spec#exists?` to check if a MARC record has data matching a
4
+ query, without actually retrieving the data. This is slightly more efficient
5
+ than using `MARC::Spec#find` with `any?`, as it will return early when it
6
+ finds the first result.
7
+
1
8
  # 0.1.1 (2021-10-18)
2
9
 
3
10
  - `MARC::Spec` methods now raise an `ArgumentError` for invalid query strings
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # The MIT License (MIT)
2
2
 
3
- Copyright © 2021 The Regents of the University of California
3
+ Copyright © 2022 The Regents of the University of California
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a
6
6
  copy of this software and associated documentation files (the “Software”),
data/README.md CHANGED
@@ -170,3 +170,21 @@ MARC::Spec.find('260$b/0-7{$a~\San\sDiego}{050$b~008/7-10}', marc_record)
170
170
  ```
171
171
 
172
172
  For further examples, see the MARCSpec [documentation](http://marcspec.github.io/MARCspec/marc-spec.html#marcspec-explained).
173
+
174
+ ## For developers
175
+
176
+ ### Generated tests
177
+
178
+ The tests for this gem include a set generated from the [MARCSpec-Test-Suite](https://github.com/MARCspec/MARCspec-Test-Suite)
179
+ project, which is provided as a [Git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules)
180
+ under `spec/suite`.
181
+
182
+ The tests themselves are in [`spec/suite/generated`](spec/suite/generated). It's not necessary to fetch the submodule in order
183
+ to run these tests, but it is necessary if you need to regenerate them. To fetch the submodule, from the project root, run:
184
+
185
+ ```sh
186
+ git submodule init
187
+ git submodule update
188
+ ```
189
+
190
+ To regenerate the tests, run `rake spec:generate`.
@@ -7,7 +7,7 @@ module MARC
7
7
  SUMMARY = 'MARCspec for Ruby'.freeze
8
8
  DESCRIPTION = 'An implementation of the MARCspec query language for Ruby and ruby-marc'.freeze
9
9
  LICENSE = 'MIT'.freeze
10
- VERSION = '0.1.1'.freeze
10
+ VERSION = '0.1.2'.freeze
11
11
  HOMEPAGE = 'https://github.com/BerkeleyLibrary/marc-spec'.freeze
12
12
  end
13
13
  end
@@ -1,3 +1,4 @@
1
+ require 'marc/spec/parsing/parser'
1
2
  require 'marc/spec/queries/part'
2
3
 
3
4
  module MARC
@@ -33,18 +34,17 @@ module MARC
33
34
 
34
35
  # TODO: don't support nested subqueries
35
36
  def execute(executor, context_fields, context_result = nil)
36
- fields = tag ? executor.apply_tag(tag) : context_fields
37
+ fields = tag_or_context_fields(executor, context_fields)
37
38
  return [] if fields.empty?
38
39
 
39
- field_results = root_results(fields, executor, context_result)
40
- return field_results if subqueries.empty?
40
+ field_results(executor, fields, context_result)
41
+ end
41
42
 
42
- fields.each_with_object([]) do |field, results|
43
- subqueries.each do |subquery|
44
- subquery_results = subquery.execute(executor, [field])
45
- results.concat(subquery_results)
46
- end
47
- end
43
+ def any_results?(executor, context_fields, context_result = nil)
44
+ fields = tag_or_context_fields(executor, context_fields)
45
+ return false if fields.empty?
46
+
47
+ any_field_results?(executor, fields, context_result)
48
48
  end
49
49
 
50
50
  protected
@@ -66,6 +66,16 @@ module MARC
66
66
 
67
67
  private
68
68
 
69
+ def tag_or_context_fields(executor, context_fields)
70
+ tag ? executor.apply_tag(tag) : context_fields
71
+ end
72
+
73
+ def field_results(executor, fields, context_result)
74
+ return root_results(fields, executor, context_result) if subqueries.empty?
75
+
76
+ subquery_results(executor, fields)
77
+ end
78
+
69
79
  def root_results(fields, executor, context_result)
70
80
  field_results = results_for_fields(executor, fields)
71
81
  # TODO: something less ridiculous
@@ -74,6 +84,19 @@ module MARC
74
84
  selector.apply(context_result)
75
85
  end
76
86
 
87
+ def subquery_results(executor, fields)
88
+ # NOTE: we do this one field at a time so that results are grouped
89
+ # by field, rather than by subfield code. Which isn't part of
90
+ # the MARCSpec spec, but it seems more in the spirit of MARC
91
+ # to preserve order wherever possible.
92
+ fields.each_with_object([]) do |field, results|
93
+ subqueries.each do |subquery|
94
+ subquery_results = subquery.execute(executor, [field])
95
+ results.concat(subquery_results)
96
+ end
97
+ end
98
+ end
99
+
77
100
  def select_from_context?(context_result)
78
101
  tag.nil? && context_result && selector.can_apply?(context_result)
79
102
  end
@@ -92,6 +115,21 @@ module MARC
92
115
  results.select { |result| executor.condition_met?(condition, field, result) }
93
116
  end
94
117
 
118
+ def any_field_results?(executor, fields, context_result)
119
+ return any_root_results?(executor, fields, context_result) if subqueries.empty?
120
+
121
+ any_subfield_results?(executor, fields)
122
+ end
123
+
124
+ def any_root_results?(executor, fields, context_result)
125
+ root_results(fields, executor, context_result).any?
126
+ end
127
+
128
+ def any_subfield_results?(executor, fields)
129
+ fields.any? do |field|
130
+ subqueries.any? { |sq| sq.any_results?(executor, [field]) }
131
+ end
132
+ end
95
133
  end
96
134
  end
97
135
  end
@@ -7,21 +7,30 @@ module MARC
7
7
  class QueryExecutor
8
8
  include Part
9
9
 
10
- attr_reader :marc_record, :root_query, :root_tag, :root_fields
10
+ attr_reader :marc_record, :root_query
11
11
 
12
- def initialize(marc_record, root, cache = {})
12
+ def initialize(marc_record, root_query, cache = {})
13
13
  @marc_record = ensure_type(marc_record, MARC::Record)
14
- @root_query = as_query(root)
14
+ @root_query = root_query
15
15
  @cache = cache
16
+ end
17
+
18
+ def root_tag
19
+ @root_tag ||= root_query.tag || Tag.new('...')
20
+ end
16
21
 
17
- @root_tag = root_query.tag || Tag.new('...')
18
- @root_fields = apply_tag(root_tag)
22
+ def root_fields
23
+ @root_fields ||= apply_tag(root_tag)
19
24
  end
20
25
 
21
26
  def execute
22
27
  root_query.execute(self, root_fields)
23
28
  end
24
29
 
30
+ def any_results?
31
+ root_query.any_results?(self, root_fields)
32
+ end
33
+
25
34
  def apply_tag(tag)
26
35
  cache[tag] ||= tag.apply(marc_record)
27
36
  end
@@ -40,12 +49,6 @@ module MARC
40
49
 
41
50
  private
42
51
 
43
- def as_query(root)
44
- # TODO: unify these?
45
- return root if root.is_a?(Query)
46
- return Query.new(tag: root) if root.is_a?(Tag)
47
- end
48
-
49
52
  attr_reader :cache
50
53
  end
51
54
  end
data/lib/marc/spec.rb CHANGED
@@ -9,6 +9,12 @@ module MARC
9
9
  execute_query(root, marc_record)
10
10
  end
11
11
 
12
+ def exists?(query_string, marc_record)
13
+ root = parse_query(query_string)
14
+ executor = executor_for(root, marc_record)
15
+ executor.any_results?
16
+ end
17
+
12
18
  def parse_query(query_string)
13
19
  parse_tree = parser.parse(query_string, reporter: reporter)
14
20
  xform_result = xform.apply(parse_tree)
@@ -19,7 +25,7 @@ module MARC
19
25
  end
20
26
 
21
27
  def execute_query(query, marc_record)
22
- executor = Queries::QueryExecutor.new(marc_record, query)
28
+ executor = executor_for(query, marc_record)
23
29
  executor.execute
24
30
  end
25
31
 
@@ -36,6 +42,10 @@ module MARC
36
42
  def reporter
37
43
  @reporter ||= Parslet::ErrorReporter::Contextual.new
38
44
  end
45
+
46
+ def executor_for(query, marc_record)
47
+ Queries::QueryExecutor.new(marc_record, query)
48
+ end
39
49
  end
40
50
  end
41
51
  end
@@ -37,6 +37,6 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'rake', '~> 13.0'
38
38
  spec.add_development_dependency 'rspec', '~> 3.9'
39
39
  spec.add_development_dependency 'rubocop', '~> 0.91.0'
40
- spec.add_development_dependency 'simplecov', '~> 0.16.1'
40
+ spec.add_development_dependency 'simplecov', '~> 0.21.1'
41
41
  spec.add_development_dependency 'simplecov-rcov', '~> 0.2'
42
42
  end
@@ -34,6 +34,10 @@ describe MARC::Spec do
34
34
  expected = [expected] unless expected.is_a?(Array)
35
35
  actual = MARC::Spec.find(query_str, marc_record)
36
36
  expect(actual).to eq(expected), -> { failure_msg_for(query_str, actual, expected) }
37
+
38
+ should_exist = expected.any?
39
+ exists = MARC::Spec.exists?(query_str, marc_record)
40
+ expect(exists).to eq(should_exist), "Expected exists?(#{query_str.inspect}) to return #{should_exist}, was #{exists}"
37
41
  end
38
42
  end
39
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-marc-spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Moles
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-18 00:00:00.000000000 Z
11
+ date: 2022-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: marc
@@ -190,14 +190,14 @@ dependencies:
190
190
  requirements:
191
191
  - - "~>"
192
192
  - !ruby/object:Gem::Version
193
- version: 0.16.1
193
+ version: 0.21.1
194
194
  type: :development
195
195
  prerelease: false
196
196
  version_requirements: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
- version: 0.16.1
200
+ version: 0.21.1
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: simplecov-rcov
203
203
  requirement: !ruby/object:Gem::Requirement
@@ -327,14 +327,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
327
327
  requirements:
328
328
  - - ">="
329
329
  - !ruby/object:Gem::Version
330
- version: '2.7'
330
+ version: 2.7.5
331
331
  required_rubygems_version: !ruby/object:Gem::Requirement
332
332
  requirements:
333
333
  - - ">="
334
334
  - !ruby/object:Gem::Version
335
335
  version: '0'
336
336
  requirements: []
337
- rubygems_version: 3.1.4
337
+ rubygems_version: 3.1.6
338
338
  signing_key:
339
339
  specification_version: 4
340
340
  summary: MARCspec for Ruby