ldpath 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/.rubocop_hound.yml +1063 -0
- data/.rubocop_todo.yml +36 -0
- data/Gemfile +0 -1
- data/Rakefile +1 -1
- data/bin/ldpath +3 -3
- data/lib/ldpath.rb +3 -3
- data/lib/ldpath/field_mapping.rb +1 -2
- data/lib/ldpath/functions.rb +80 -73
- data/lib/ldpath/parser.rb +323 -258
- data/lib/ldpath/program.rb +23 -24
- data/lib/ldpath/selectors.rb +42 -43
- data/lib/ldpath/tests.rb +28 -31
- data/lib/ldpath/transform.rb +45 -47
- data/lib/ldpath/version.rb +1 -1
- data/spec/ldpath_parser_spec.rb +132 -72
- data/spec/ldpath_program_spec.rb +19 -25
- data/spec/ldpath_transform_spec.rb +114 -36
- data/spec/lib/functions/list_spec.rb +61 -0
- data/spec/spec_helper.rb +1 -1
- metadata +8 -3
@@ -5,67 +5,145 @@ describe Ldpath::Transform do
|
|
5
5
|
it "should transform literals" do
|
6
6
|
subject.apply(literal: "xyz")
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
it "should transform uris" do
|
10
|
-
subject.apply(
|
11
|
-
|
12
|
-
|
13
|
-
it "should transform nested uris" do
|
14
|
-
subject.apply(uri: { uri: "info:a"})
|
10
|
+
actual = subject.apply(iri: "info:a")
|
11
|
+
expect(actual).to eq RDF::URI.new("info:a")
|
15
12
|
end
|
16
|
-
|
13
|
+
|
17
14
|
it "should transform prefix + localNames" do
|
18
|
-
subject.apply(prefix: "
|
15
|
+
actual = subject.apply(prefix: "rdf", localName: "type")
|
16
|
+
expect(actual).to eq RDF.type
|
19
17
|
end
|
20
|
-
|
18
|
+
|
21
19
|
it "should transform mappings" do
|
22
|
-
subject.apply parser.parse("x = . ;")
|
20
|
+
actual = subject.apply parser.parse("x = . ;")
|
21
|
+
expect(actual.length).to eq 1
|
22
|
+
mapping = actual.first
|
23
|
+
expect(mapping).to be_a_kind_of Ldpath::FieldMapping
|
24
|
+
expect(mapping.name).to eq "x"
|
25
|
+
expect(mapping.selector).to be_a_kind_of Ldpath::SelfSelector
|
23
26
|
end
|
24
|
-
|
27
|
+
|
25
28
|
it "should transform wildcards" do
|
26
|
-
subject.apply parser.parse("xyz = * ;\n")
|
29
|
+
actual = subject.apply parser.parse("xyz = * ;\n")
|
30
|
+
|
31
|
+
mapping = actual.first
|
32
|
+
expect(mapping).to be_a_kind_of Ldpath::FieldMapping
|
33
|
+
expect(mapping.name).to eq "xyz"
|
34
|
+
expect(mapping.selector).to be_a_kind_of Ldpath::WildcardSelector
|
27
35
|
end
|
28
|
-
|
36
|
+
|
29
37
|
it "should transform reverse properties" do
|
30
|
-
subject.apply parser.parse("xyz = ^info:a ;\n")
|
38
|
+
actual = subject.apply parser.parse("xyz = ^info:a ;\n")
|
39
|
+
|
40
|
+
mapping = actual.first
|
41
|
+
expect(mapping).to be_a_kind_of Ldpath::FieldMapping
|
42
|
+
expect(mapping.name).to eq "xyz"
|
43
|
+
expect(mapping.selector).to be_a_kind_of Ldpath::ReversePropertySelector
|
44
|
+
expect(mapping.selector.property).to eq RDF::URI.new("info:a")
|
31
45
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
46
|
+
|
47
|
+
describe "recursive properties" do
|
48
|
+
it "is a zero-or-one matcher" do
|
49
|
+
actual = subject.apply parser.parse("xyz = (info:a)? ;\n")
|
50
|
+
selector = actual.first.selector
|
51
|
+
expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
|
52
|
+
expect(selector.property.property).to eq RDF::URI.new("info:a")
|
53
|
+
expect(selector.repeat).to eq 0..1
|
54
|
+
end
|
55
|
+
|
56
|
+
it "is a 0-to-infinity matcher" do
|
57
|
+
actual = subject.apply parser.parse("xyz = (info:a)* ;\n")
|
58
|
+
|
59
|
+
selector = actual.first.selector
|
60
|
+
expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
|
61
|
+
expect(selector.property.property).to eq RDF::URI.new("info:a")
|
62
|
+
expect(selector.repeat).to eq 0..Ldpath::Transform::Infinity
|
63
|
+
end
|
64
|
+
|
65
|
+
it "is a 1-to-infinity matcher" do
|
66
|
+
actual = subject.apply parser.parse("xyz = (info:a)+ ;\n")
|
67
|
+
|
68
|
+
selector = actual.first.selector
|
69
|
+
expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
|
70
|
+
expect(selector.property.property).to eq RDF::URI.new("info:a")
|
71
|
+
expect(selector.repeat).to eq 1..Ldpath::Transform::Infinity
|
72
|
+
end
|
73
|
+
|
74
|
+
it "is a 0 to 5 matcher" do
|
75
|
+
actual = subject.apply parser.parse("xyz = (info:a){,5} ;\n")
|
76
|
+
|
77
|
+
selector = actual.first.selector
|
78
|
+
expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
|
79
|
+
expect(selector.property.property).to eq RDF::URI.new("info:a")
|
80
|
+
expect(selector.repeat).to eq 0..5
|
81
|
+
end
|
82
|
+
|
83
|
+
it "is a 2 to 5 matcher" do
|
84
|
+
actual = subject.apply parser.parse("xyz = (info:a){2,5} ;\n")
|
85
|
+
|
86
|
+
selector = actual.first.selector
|
87
|
+
expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
|
88
|
+
expect(selector.property.property).to eq RDF::URI.new("info:a")
|
89
|
+
expect(selector.repeat).to eq 2..5
|
90
|
+
end
|
91
|
+
|
92
|
+
it "is a 2 to infinity matcher" do
|
93
|
+
actual = subject.apply parser.parse("xyz = (info:a){2,} ;\n")
|
94
|
+
|
95
|
+
selector = actual.first.selector
|
96
|
+
expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
|
97
|
+
expect(selector.property.property).to eq RDF::URI.new("info:a")
|
98
|
+
expect(selector.repeat).to eq 2..Ldpath::Transform::Infinity
|
99
|
+
end
|
39
100
|
end
|
40
|
-
|
101
|
+
|
41
102
|
it "should transform tap selectors" do
|
42
|
-
subject.apply parser.parse("xyz = ?<x>info:a ;\n")
|
103
|
+
actual = subject.apply parser.parse("xyz = ?<x>info:a ;\n")
|
104
|
+
|
105
|
+
selector = actual.first.selector
|
106
|
+
expect(selector).to be_a_kind_of Ldpath::TapSelector
|
107
|
+
expect(selector.identifier).to eq "x"
|
108
|
+
expect(selector.tap).to be_a_kind_of Ldpath::PropertySelector
|
43
109
|
end
|
44
|
-
|
110
|
+
|
45
111
|
it "should transform loose property selectors" do
|
46
|
-
subject.apply parser.parse("xyz = ~info:a ;\n")
|
47
|
-
end
|
112
|
+
actual = subject.apply parser.parse("xyz = ~info:a ;\n")
|
48
113
|
|
114
|
+
selector = actual.first.selector
|
115
|
+
expect(selector).to be_a_kind_of Ldpath::LoosePropertySelector
|
116
|
+
expect(selector.property).to eq RDF::URI.new("info:a")
|
117
|
+
end
|
49
118
|
|
50
119
|
it "should transform namespaces" do
|
51
|
-
subject.apply parser.parse("@prefix
|
120
|
+
subject.apply parser.parse("@prefix xyz: <info:xyz>")
|
121
|
+
expect(subject.prefixes).to include "xyz"
|
122
|
+
expect(subject.prefixes["xyz"].to_s).to eq "info:xyz"
|
52
123
|
end
|
53
|
-
|
124
|
+
|
54
125
|
it "should transform path selectors" do
|
55
|
-
subject.apply parser.parse("x =
|
126
|
+
actual = subject.apply parser.parse("x = info:a / . ;")
|
127
|
+
|
128
|
+
selector = actual.first.selector
|
129
|
+
expect(selector).to be_a_kind_of Ldpath::PathSelector
|
130
|
+
expect(selector.left).to be_a_kind_of Ldpath::PropertySelector
|
131
|
+
expect(selector.right).to be_a_kind_of Ldpath::SelfSelector
|
56
132
|
end
|
57
|
-
|
133
|
+
|
58
134
|
it "should transform functions" do
|
59
|
-
subject.apply parser.function_selector.parse("fn:concat(foaf:givename,\" \",foaf:surname)")
|
135
|
+
selector = subject.apply parser.function_selector.parse("fn:concat(foaf:givename,\" \",foaf:surname)")
|
136
|
+
|
137
|
+
expect(selector).to be_a_kind_of Ldpath::FunctionSelector
|
138
|
+
expect(selector.fname).to eq "concat"
|
139
|
+
expect(selector.arguments.length).to eq 3
|
60
140
|
end
|
61
|
-
|
141
|
+
|
62
142
|
it "should transform the foaf example" do
|
63
|
-
subject.apply parser.parse(File.read(File.expand_path(File.join(__FILE__, "..", "fixtures", "foaf_example.program")))
|
64
|
-
)
|
143
|
+
subject.apply parser.parse(File.read(File.expand_path(File.join(__FILE__, "..", "fixtures", "foaf_example.program"))))
|
65
144
|
end
|
66
|
-
|
145
|
+
|
67
146
|
it "should parse the program.ldpath" do
|
68
147
|
subject.apply parser.parse File.read(File.expand_path(File.join(__FILE__, "..", "fixtures", "program.ldpath")))
|
69
148
|
end
|
70
|
-
|
71
149
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "LDPath list functions" do
|
4
|
+
let(:object) { RDF::URI.new("info:a") }
|
5
|
+
|
6
|
+
let(:graph) do
|
7
|
+
graph = RDF::Graph.new
|
8
|
+
l = RDF::List[1, 2, 3]
|
9
|
+
graph << [object, RDF::URI.new("http://example.com/list"), l]
|
10
|
+
graph << l
|
11
|
+
graph
|
12
|
+
end
|
13
|
+
|
14
|
+
subject do
|
15
|
+
program.evaluate object, graph
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "fn:flatten" do
|
19
|
+
let(:program) do
|
20
|
+
Ldpath::Program.parse <<-EOF
|
21
|
+
@prefix ex : <http://example.com/> ;
|
22
|
+
list_items = fn:flatten(ex:list) :: xsd:string ;
|
23
|
+
EOF
|
24
|
+
end
|
25
|
+
|
26
|
+
it "collapses the RDF list into individual values" do
|
27
|
+
expect(subject["list_items"]).to match_array ["1", "2", "3"]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "fn:flatten" do
|
32
|
+
let(:program) do
|
33
|
+
Ldpath::Program.parse <<-EOF
|
34
|
+
@prefix ex : <http://example.com/> ;
|
35
|
+
list_item = fn:get(ex:list, "1") :: xsd:string ;
|
36
|
+
EOF
|
37
|
+
end
|
38
|
+
|
39
|
+
it "extracts a single term by position from the RDF list" do
|
40
|
+
expect(subject["list_item"]).to eq ["2"]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "fn:subList" do
|
45
|
+
let(:program) do
|
46
|
+
Ldpath::Program.parse <<-EOF
|
47
|
+
@prefix ex : <http://example.com/> ;
|
48
|
+
list_items = fn:subList(ex:list, "1") :: xsd:string ;
|
49
|
+
list_items_by_range = fn:subList(ex:list, "0", "1") :: xsd:string ;
|
50
|
+
EOF
|
51
|
+
end
|
52
|
+
|
53
|
+
it "extracts a list of terms by index" do
|
54
|
+
expect(subject["list_items"]).to eq ["2", "3"]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "selects the range, inclusively" do
|
58
|
+
expect(subject["list_items_by_range"]).to eq ["1", "2"]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ldpath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Beer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04
|
11
|
+
date: 2015-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|
@@ -104,6 +104,9 @@ extra_rdoc_files: []
|
|
104
104
|
files:
|
105
105
|
- ".gitignore"
|
106
106
|
- ".rspec"
|
107
|
+
- ".rubocop.yml"
|
108
|
+
- ".rubocop_hound.yml"
|
109
|
+
- ".rubocop_todo.yml"
|
107
110
|
- ".travis.yml"
|
108
111
|
- Gemfile
|
109
112
|
- LICENSE.txt
|
@@ -127,6 +130,7 @@ files:
|
|
127
130
|
- spec/ldpath_program_spec.rb
|
128
131
|
- spec/ldpath_spec.rb
|
129
132
|
- spec/ldpath_transform_spec.rb
|
133
|
+
- spec/lib/functions/list_spec.rb
|
130
134
|
- spec/spec_helper.rb
|
131
135
|
homepage: https://github.com/cbeer/ldpath.rb
|
132
136
|
licenses:
|
@@ -148,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
152
|
version: '0'
|
149
153
|
requirements: []
|
150
154
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.4.
|
155
|
+
rubygems_version: 2.4.5
|
152
156
|
signing_key:
|
153
157
|
specification_version: 4
|
154
158
|
summary: Ruby implementation of LDPath
|
@@ -160,4 +164,5 @@ test_files:
|
|
160
164
|
- spec/ldpath_program_spec.rb
|
161
165
|
- spec/ldpath_spec.rb
|
162
166
|
- spec/ldpath_transform_spec.rb
|
167
|
+
- spec/lib/functions/list_spec.rb
|
163
168
|
- spec/spec_helper.rb
|