mab2 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/README.md +13 -0
- data/lib/mab2/document/scope.rb +27 -60
- data/lib/mab2/document.rb +41 -2
- data/lib/mab2/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ddffd930eea7cf17107898031a771fc6dad90be
|
4
|
+
data.tar.gz: b05ecb5a0ac27dfd41c2b6abec9d198a24db5031
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa6d7aac578e249cd39daf51aba91ccacd0430e9950326521637d659703eac0fc0c9733fe65cbe557db5f8b8b8959c792ca216cd1c7cd7bf3469e4fdc3af9dbf
|
7
|
+
data.tar.gz: 4037cb77b8a966576f3e8e7cb0b78fb7393a2410d50b67956392848cb6f03e594e315c52ea640b17754fef00f8bd3c858f42a0d5303a9a2e9c46987b9747b3f2
|
data/README.md
CHANGED
@@ -20,6 +20,19 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
TODO: Write usage instructions here
|
22
22
|
|
23
|
+
## Notes
|
24
|
+
|
25
|
+
The code is slightly optimized for performance.
|
26
|
+
|
27
|
+
### Bang operators
|
28
|
+
Bang (!) operators are used where possible (http://www.skorks.com/2010/04/merging-ruby-hashes-and-bang-method-usage/), because they are faster than their non-bang counterparts.
|
29
|
+
|
30
|
+
### Circumvent attribute accessors internally
|
31
|
+
In order to minimize function calls, instance variables are accessed directly where possible, not through (own) accessors.
|
32
|
+
|
33
|
+
### Shortcuts
|
34
|
+
There are attemps to shortcut execution as soon as possible, e.g. by checking certain 'show stoppers' right in front of a function.
|
35
|
+
|
23
36
|
## Contributing
|
24
37
|
|
25
38
|
1. Fork it
|
data/lib/mab2/document/scope.rb
CHANGED
@@ -1,89 +1,56 @@
|
|
1
1
|
class Mab2::Document::Scope
|
2
2
|
|
3
|
-
attr_accessor :scope_subfields
|
4
|
-
|
5
3
|
def initialize(document)
|
6
4
|
@document = document
|
7
5
|
end
|
8
6
|
|
9
7
|
def controlfield(tag)
|
10
|
-
@document.
|
11
|
-
end
|
12
|
-
|
13
|
-
def datafield(tag, indicators)
|
14
|
-
@scope_datafields = []
|
15
|
-
indicators = sanitize_indicators(indicators)
|
16
|
-
|
17
|
-
selected_datafields = if !(datafields_by_tag = @document.datafields[tag.to_sym]).nil?
|
18
|
-
datafields_by_tag.select do |indicator_one_key, indicator_one_value|
|
19
|
-
indicators[:ind1].nil? || (indicators[:ind1].any? { |ind1| ind1.length > 1 && ind1.to_s.starts_with?('-') } ^ indicators[:ind1].include?(indicator_one_key)) && indicator_one_value.any? do |indicator_two_key, indicator_two_value|
|
20
|
-
indicators[:ind2].nil? || indicators[:ind2].include?(indicator_two_key)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
if !selected_datafields.nil?
|
26
|
-
selected_datafields.each_pair do |indicator_one_key, indicator_one_value|
|
27
|
-
indicator_one_value.each_pair do |indicator_two_key, indicator_two_value|
|
28
|
-
indicator_two_value.each do |subfields|
|
29
|
-
@scope_datafields.push Mab2::Document::Datafield.new(tag, indicators, subfields)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
self
|
8
|
+
@document.controlfields_by(tag: tag)
|
36
9
|
end
|
37
10
|
|
38
|
-
def
|
11
|
+
def datafield(tag, indicators = {})
|
12
|
+
@scope_datafields = @document.datafields_by(tag: tag, indicators: indicators)
|
39
13
|
self
|
40
14
|
end
|
41
15
|
|
42
|
-
def fields
|
43
|
-
@scope_datafields
|
44
|
-
end
|
45
|
-
|
46
|
-
def scope_subfields
|
47
|
-
@scope_subfields || @scope_datafields.map { |datafield| datafield.subfields }.flatten.presence
|
48
|
-
end
|
49
|
-
|
50
16
|
def subfield(subfield_codes)
|
51
|
-
|
52
|
-
subfield_codes = subfield_codes.is_a?(Array) ? subfield_codes : [subfield_codes]
|
17
|
+
subfield_codes = subfield_codes.is_a?(Array) ? subfield_codes : [subfield_codes] # subfield_codes should be an array
|
53
18
|
|
54
|
-
@scope_subfields =
|
55
|
-
|
56
|
-
|
57
|
-
@scope_subfields.push datafield.subfields.select { |subfield| subfield_codes.include? subfield.name.to_s }
|
58
|
-
end
|
59
|
-
|
60
|
-
@scope_subfields.flatten!
|
19
|
+
@scope_subfields = @scope_datafields.map do |datafield|
|
20
|
+
datafield.subfields.select { |subfield| subfield_codes.include? subfield.name.to_s }
|
21
|
+
end.flatten! || []
|
61
22
|
|
62
23
|
self
|
63
24
|
end
|
64
25
|
|
65
|
-
def subfields
|
66
|
-
scope_subfields
|
67
|
-
end
|
68
|
-
|
69
26
|
def value(options = {})
|
70
|
-
|
71
|
-
_values.first
|
72
|
-
end
|
27
|
+
values.first
|
73
28
|
end
|
74
29
|
|
75
30
|
def values(options = {})
|
76
|
-
|
77
|
-
|
78
|
-
@
|
31
|
+
unless @scope_values
|
32
|
+
# if no subfields where specified so far, take all (e.g. doc.datafield('100').values))
|
33
|
+
@scope_subfields ||= (@scope_datafields.map { |datafield| datafield.subfields }).flatten! || []
|
34
|
+
subfield_values = @scope_subfields.map { |subfield| subfield.value }
|
35
|
+
@scope_values = options[:join_subfields] ? subfield_values.join(options[:join_subfields]) : subfield_values
|
36
|
+
else
|
37
|
+
@scope_values
|
79
38
|
end
|
80
39
|
end
|
81
40
|
|
82
|
-
|
41
|
+
#
|
42
|
+
# compatibility
|
43
|
+
#
|
44
|
+
def get
|
45
|
+
self
|
46
|
+
end
|
83
47
|
|
84
|
-
|
85
|
-
|
86
|
-
|
48
|
+
def fields
|
49
|
+
@scope_datafields
|
50
|
+
end
|
51
|
+
|
52
|
+
def subfields
|
53
|
+
@scope_subfields
|
87
54
|
end
|
88
55
|
|
89
56
|
end
|
data/lib/mab2/document.rb
CHANGED
@@ -24,13 +24,52 @@ class Mab2::Document
|
|
24
24
|
@datafields = mab.datafields
|
25
25
|
end
|
26
26
|
|
27
|
+
#
|
28
|
+
# scope functions
|
29
|
+
#
|
27
30
|
def controlfield(tag)
|
31
|
+
tag = tag.to_sym # tag should be a symbol
|
28
32
|
Mab2::Document::Scope.new(self).controlfield(tag)
|
29
33
|
end
|
30
34
|
|
31
35
|
# mabmapper uses field instead of datafield
|
32
|
-
def field(tag,
|
33
|
-
|
36
|
+
def field(tag, indicators = {})
|
37
|
+
tag = tag.to_sym # tag should be a symbol
|
38
|
+
indicators.each_pair { |key, val| indicators[key] = val.is_a?(Array) ? val.map(&:to_sym) : [val.to_sym] } # indicators should be hash of symbol arrays
|
39
|
+
Mab2::Document::Scope.new(self).datafield(tag, indicators)
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# query functions
|
44
|
+
#
|
45
|
+
def controlfields_by(options = {})
|
46
|
+
(result = @controlfields[options[:tag]]).nil? ? [] : result.chars
|
47
|
+
end
|
48
|
+
|
49
|
+
def datafields_by(options = {})
|
50
|
+
indicators = options[:indicators]
|
51
|
+
tag = options[:tag]
|
52
|
+
query_result = []
|
53
|
+
|
54
|
+
return [] if @datafields[tag].nil? # shortcut for 'no datafield with that tag exists'
|
55
|
+
|
56
|
+
matching_datafields = @datafields[tag].select do |indicator_one_key, indicator_one_value|
|
57
|
+
indicators[:ind1].nil? || (indicators[:ind1].any? { |ind1| ind1.length > 1 && ind1.to_s.starts_with?('-') } ^ indicators[:ind1].include?(indicator_one_key)) && indicator_one_value.any? do |indicator_two_key, indicator_two_value|
|
58
|
+
indicators[:ind2].nil? || indicators[:ind2].include?(indicator_two_key)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if !matching_datafields.nil?
|
63
|
+
matching_datafields.each_pair do |indicator_one_key, indicator_one_value|
|
64
|
+
indicator_one_value.each_pair do |indicator_two_key, indicator_two_value|
|
65
|
+
indicator_two_value.each do |subfields|
|
66
|
+
query_result.push Mab2::Document::Datafield.new(tag, indicators, subfields)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
return query_result
|
34
73
|
end
|
35
74
|
|
36
75
|
end
|
data/lib/mab2/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mab2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Sievers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|