safety_pin 0.0.4 → 0.0.5
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.
- data/.rspec +1 -1
- data/.rvmrc +1 -1
- data/Gemfile +2 -1
- data/Gemfile.lock +3 -0
- data/bin/console +1 -0
- data/console_loader.rb +4 -0
- data/lib/safety_pin/node.rb +61 -13
- data/lib/safety_pin/version.rb +1 -1
- data/spec/jcr_spec.rb +9 -1
- data/spec/jcr_sql2_spec.rb +1 -13
- data/spec/node_spec.rb +213 -135
- data/spec/query_spec.rb +1 -13
- data/spec/spec_helper.rb +25 -1
- metadata +60 -64
data/.rspec
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--format
|
1
|
+
--format p --color
|
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use --create jruby-1.6.
|
1
|
+
rvm use --create jruby-1.6.6@safety_pin
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,6 +2,7 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.3)
|
5
|
+
nyan-cat-formatter (0.0.7)
|
5
6
|
rspec (2.10.0)
|
6
7
|
rspec-core (~> 2.10.0)
|
7
8
|
rspec-expectations (~> 2.10.0)
|
@@ -12,7 +13,9 @@ GEM
|
|
12
13
|
rspec-mocks (2.10.1)
|
13
14
|
|
14
15
|
PLATFORMS
|
16
|
+
java
|
15
17
|
ruby
|
16
18
|
|
17
19
|
DEPENDENCIES
|
20
|
+
nyan-cat-formatter
|
18
21
|
rspec (~> 2.10.0)
|
data/bin/console
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
irb -r './console_loader' --simple-prompt
|
data/console_loader.rb
ADDED
data/lib/safety_pin/node.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
1
3
|
module SafetyPin
|
2
4
|
class Node
|
3
5
|
include_class 'javax.jcr.PropertyType'
|
@@ -13,13 +15,22 @@ module SafetyPin
|
|
13
15
|
nil
|
14
16
|
end
|
15
17
|
|
18
|
+
def self.find_or_create(path)
|
19
|
+
find(path) || create(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.exists?(path)
|
23
|
+
find(path) != nil
|
24
|
+
end
|
25
|
+
|
16
26
|
def self.session
|
17
27
|
JCR.session
|
18
28
|
end
|
19
29
|
|
20
|
-
def self.build(path, node_type = nil)
|
30
|
+
def self.build(path, node_type = nil, properties = nil)
|
21
31
|
path = path.to_s
|
22
32
|
node_type ||= "nt:unstructured"
|
33
|
+
properties ||= {}
|
23
34
|
rel_path = nil
|
24
35
|
if path.start_with?("/")
|
25
36
|
rel_path = path.sub("/","")
|
@@ -30,18 +41,39 @@ module SafetyPin
|
|
30
41
|
if session.root_node.has_node(rel_path)
|
31
42
|
raise NodeError.new("Node already exists at path: #{path}")
|
32
43
|
else
|
33
|
-
self.new(session.root_node.add_node(rel_path, node_type))
|
44
|
+
node = self.new(session.root_node.add_node(rel_path, node_type))
|
45
|
+
node.properties = properties
|
46
|
+
|
47
|
+
node
|
34
48
|
end
|
35
49
|
rescue javax.jcr.PathNotFoundException => e
|
36
50
|
raise NodeError.new("Cannot add a new node to a non-existing parent at #{path}")
|
37
51
|
end
|
38
52
|
|
39
|
-
def self.create(path, node_type = nil)
|
40
|
-
node = self.build(path, node_type)
|
53
|
+
def self.create(path, node_type = nil, properties = nil)
|
54
|
+
node = self.build(path, node_type, properties)
|
41
55
|
node.save
|
42
56
|
node
|
43
57
|
end
|
44
58
|
|
59
|
+
def self.create_parents(path)
|
60
|
+
intermediate_paths = []
|
61
|
+
|
62
|
+
current_intermediate_path = Pathname(path)
|
63
|
+
while(current_intermediate_path.to_s != "/")
|
64
|
+
current_intermediate_path = current_intermediate_path.parent
|
65
|
+
intermediate_paths.push(current_intermediate_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
results = intermediate_paths.reverse.map do |intermediate_path|
|
69
|
+
create(intermediate_path) unless exists?(intermediate_path)
|
70
|
+
end
|
71
|
+
|
72
|
+
session.save
|
73
|
+
|
74
|
+
results
|
75
|
+
end
|
76
|
+
|
45
77
|
def initialize(j_node)
|
46
78
|
@j_node = j_node
|
47
79
|
end
|
@@ -63,7 +95,7 @@ module SafetyPin
|
|
63
95
|
end
|
64
96
|
|
65
97
|
def child(relative_path)
|
66
|
-
child_j_node = j_node.get_node(relative_path)
|
98
|
+
child_j_node = j_node.get_node(relative_path.to_s)
|
67
99
|
Node.new(child_j_node)
|
68
100
|
rescue javax.jcr.PathNotFoundException
|
69
101
|
nil
|
@@ -140,8 +172,14 @@ module SafetyPin
|
|
140
172
|
calendar_value = Calendar.instance
|
141
173
|
calendar_value.set_time(value.to_java)
|
142
174
|
j_node.set_property(name, calendar_value)
|
175
|
+
elsif value.is_a? Symbol
|
176
|
+
j_node.set_property(name, value.to_s)
|
143
177
|
else
|
144
|
-
|
178
|
+
begin
|
179
|
+
j_node.set_property(name, value)
|
180
|
+
rescue NameError
|
181
|
+
raise SafetyPin::PropertyTypeError.new("Property value type of #{value.class} is unsupported")
|
182
|
+
end
|
145
183
|
end
|
146
184
|
end
|
147
185
|
|
@@ -202,12 +240,13 @@ module SafetyPin
|
|
202
240
|
end
|
203
241
|
|
204
242
|
def properties=(new_props)
|
205
|
-
# props.each do |name, value|
|
206
|
-
# self[name] = value
|
207
|
-
# end
|
208
243
|
property_names = (properties.keys + new_props.keys).uniq
|
209
244
|
property_names.each do |name|
|
210
|
-
|
245
|
+
if new_props[name].is_a?(Hash)
|
246
|
+
build(name, nil, new_props[name])
|
247
|
+
else
|
248
|
+
self[name] = new_props[name]
|
249
|
+
end
|
211
250
|
end
|
212
251
|
end
|
213
252
|
|
@@ -241,10 +280,19 @@ module SafetyPin
|
|
241
280
|
self["jcr:primaryType"]
|
242
281
|
end
|
243
282
|
|
283
|
+
def find_or_create(name, type = nil)
|
284
|
+
child(name) || create(name, type)
|
285
|
+
end
|
286
|
+
|
244
287
|
# Create and return a child node with a given name
|
245
|
-
def create(name, type = nil)
|
246
|
-
path = Pathname(self.path) + name
|
247
|
-
Node.create(path, type)
|
288
|
+
def create(name, type = nil, properties = nil)
|
289
|
+
path = Pathname(self.path) + name.to_s
|
290
|
+
Node.create(path, type, properties)
|
291
|
+
end
|
292
|
+
|
293
|
+
def build(name, type = nil, properties = nil)
|
294
|
+
path = Pathname(self.path) + name.to_s
|
295
|
+
Node.build(path, type, properties)
|
248
296
|
end
|
249
297
|
end
|
250
298
|
|
data/lib/safety_pin/version.rb
CHANGED
data/spec/jcr_spec.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
3
|
describe SafetyPin::JCR do
|
4
|
-
|
4
|
+
before(:all) do
|
5
|
+
SafetyPin::JCR.logout
|
6
|
+
end
|
7
|
+
|
8
|
+
after(:all) do
|
9
|
+
SafetyPin::JCR.dev_login
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should login to a remote JCR" do
|
5
13
|
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => "admin", :password => "admin")
|
6
14
|
SafetyPin::JCR.session.should be_a(Java::JavaxJcr::Session)
|
7
15
|
SafetyPin::JCR.should be_logged_in
|
data/spec/jcr_sql2_spec.rb
CHANGED
@@ -1,18 +1,6 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
|
-
describe "JCR-SQL2 example queries" do
|
4
|
-
before(:all) do
|
5
|
-
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => "admin", :password => "admin")
|
6
|
-
end
|
7
|
-
|
8
|
-
before do
|
9
|
-
SafetyPin::JCR.session.refresh(false)
|
10
|
-
end
|
11
|
-
|
12
|
-
after(:all) do
|
13
|
-
SafetyPin::JCR.logout
|
14
|
-
end
|
15
|
-
|
3
|
+
describe "JCR-SQL2 example queries" do
|
16
4
|
before do
|
17
5
|
@node = SafetyPin::Node.create("/content/foo")
|
18
6
|
@node.properties = {"bar" => "baz", "qux" => "qax"}
|
data/spec/node_spec.rb
CHANGED
@@ -1,19 +1,7 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
|
-
describe SafetyPin::Node do
|
4
|
-
|
5
|
-
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => "admin", :password => "admin")
|
6
|
-
end
|
7
|
-
|
8
|
-
before do
|
9
|
-
SafetyPin::JCR.session.refresh(false)
|
10
|
-
end
|
11
|
-
|
12
|
-
after(:all) do
|
13
|
-
SafetyPin::JCR.logout
|
14
|
-
end
|
15
|
-
|
16
|
-
context ".find" do
|
3
|
+
describe SafetyPin::Node do
|
4
|
+
describe ".find" do
|
17
5
|
context "given a node name" do
|
18
6
|
context "that exists" do
|
19
7
|
it "should return a node with a matching path" do
|
@@ -33,13 +21,40 @@ describe SafetyPin::Node do
|
|
33
21
|
end
|
34
22
|
end
|
35
23
|
|
36
|
-
|
24
|
+
describe ".find_or_create" do
|
25
|
+
context "given a node path that exists" do
|
26
|
+
it "should return the node at that path" do
|
27
|
+
SafetyPin::Node.create("/content/foo")
|
28
|
+
SafetyPin::Node.find_or_create("/content/foo").path.should eql "/content/foo"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "give a node path that doesn't exist" do
|
33
|
+
it "should create a node at the path and return it" do
|
34
|
+
SafetyPin::Node.find("/content/foo").should be_nil
|
35
|
+
SafetyPin::Node.find_or_create("/content/foo").path.should eql "/content/foo"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe ".exists?" do
|
41
|
+
it "returns true if node exists at path" do
|
42
|
+
SafetyPin::Node.create("/content/foo")
|
43
|
+
SafetyPin::Node.exists?("/content/foo").should be_true
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns false if node does not exist" do
|
47
|
+
SafetyPin::Node.exists?("/content/foo").should be_false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe ".session" do
|
37
52
|
it "should return a session" do
|
38
53
|
SafetyPin::Node.session.should be_a(Java::JavaxJcr::Session)
|
39
54
|
end
|
40
55
|
end
|
41
56
|
|
42
|
-
|
57
|
+
describe "#session" do
|
43
58
|
it "should return a session" do
|
44
59
|
SafetyPin::Node.find("/content").session.should be_a(Java::JavaxJcr::Session)
|
45
60
|
end
|
@@ -51,13 +66,13 @@ describe SafetyPin::Node do
|
|
51
66
|
end
|
52
67
|
end
|
53
68
|
|
54
|
-
|
69
|
+
describe "#children" do
|
55
70
|
it "should return an array of child nodes" do
|
56
71
|
SafetyPin::Node.find("/content").children.first.should be_a(SafetyPin::Node)
|
57
72
|
end
|
58
73
|
end
|
59
74
|
|
60
|
-
|
75
|
+
describe "#child" do
|
61
76
|
context "given a node name" do
|
62
77
|
let(:node) { SafetyPin::Node.find("/") }
|
63
78
|
|
@@ -69,9 +84,12 @@ describe SafetyPin::Node do
|
|
69
84
|
it "should return a grandchild node given a relative path" do
|
70
85
|
SafetyPin::Node.create("/content/foo")
|
71
86
|
node.child("content/foo").name.should eql("foo")
|
72
|
-
SafetyPin::Node.find("/content/foo").destroy
|
73
87
|
end
|
74
88
|
end
|
89
|
+
|
90
|
+
it "should coerce non-string name to string and return child" do
|
91
|
+
node.child(:content).name.should == "content"
|
92
|
+
end
|
75
93
|
|
76
94
|
context "that doesn't exist" do
|
77
95
|
it "should return nil" do
|
@@ -81,7 +99,24 @@ describe SafetyPin::Node do
|
|
81
99
|
end
|
82
100
|
end
|
83
101
|
|
84
|
-
|
102
|
+
describe "#find_or_create_child" do
|
103
|
+
let(:parent) { SafetyPin::Node.create("/content/foo") }
|
104
|
+
|
105
|
+
context "an existing node path" do
|
106
|
+
it "should return the child node" do
|
107
|
+
parent.create("bar")
|
108
|
+
parent.find_or_create("bar").path.should eql "/content/foo/bar"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "a non-existing node path" do
|
113
|
+
it "should create a node and return it" do
|
114
|
+
parent.find_or_create("bar").path.should eql "/content/foo/bar"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#name" do
|
85
120
|
it "should return a string name" do
|
86
121
|
SafetyPin::Node.find("/content").name.should eql("content")
|
87
122
|
end
|
@@ -93,8 +128,6 @@ describe SafetyPin::Node do
|
|
93
128
|
@node = SafetyPin::Node.create("/content/foo")
|
94
129
|
@node["bar"] = "baz"
|
95
130
|
end
|
96
|
-
|
97
|
-
after { @node.destroy }
|
98
131
|
|
99
132
|
it "should save the changes to the JCR" do
|
100
133
|
@node.save
|
@@ -112,7 +145,6 @@ describe SafetyPin::Node do
|
|
112
145
|
it "should save the node" do
|
113
146
|
node = SafetyPin::Node.build("/content/foo")
|
114
147
|
node.save.should be_true
|
115
|
-
node.destroy
|
116
148
|
end
|
117
149
|
|
118
150
|
it "should save changes in parent node" do
|
@@ -122,54 +154,51 @@ describe SafetyPin::Node do
|
|
122
154
|
parent_node.should be_changed
|
123
155
|
node.save
|
124
156
|
parent_node.should_not be_changed
|
125
|
-
node.destroy
|
126
|
-
parent_node.destroy
|
127
157
|
end
|
128
158
|
end
|
129
159
|
end
|
130
160
|
|
131
161
|
describe "#read_attribute" do
|
132
162
|
context "on an existing node" do
|
133
|
-
|
134
|
-
after { @node.destroy }
|
163
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
135
164
|
|
136
165
|
it "should return the string value of a string property" do
|
137
|
-
|
138
|
-
|
166
|
+
node["foo"] = "bar"
|
167
|
+
node.read_attribute("foo").should eql("bar")
|
139
168
|
end
|
140
169
|
|
141
170
|
it "should return the boolean value of a boolean property" do
|
142
|
-
|
143
|
-
|
171
|
+
node["foo"] = true
|
172
|
+
node.read_attribute("foo").should eql(true)
|
144
173
|
end
|
145
174
|
|
146
175
|
it "should return the double value of a double (or Ruby float) property" do
|
147
|
-
|
148
|
-
|
176
|
+
node["foo"] = 3.14
|
177
|
+
node.read_attribute("foo").should eql(3.14)
|
149
178
|
end
|
150
179
|
|
151
180
|
it "should return the long value of a long (or Ruby Fixnum) property" do
|
152
|
-
|
153
|
-
|
181
|
+
node["foo"] = 42
|
182
|
+
node.read_attribute("foo").should eql(42)
|
154
183
|
end
|
155
184
|
|
156
185
|
it "should return the time value of a date property" do
|
157
186
|
time = Time.now
|
158
|
-
|
159
|
-
|
187
|
+
node["foo"] = time
|
188
|
+
node.read_attribute("foo").to_s.should eql(time.to_s)
|
160
189
|
end
|
161
190
|
|
162
191
|
context "given a multi-value property" do
|
163
192
|
it "should return an array of values" do
|
164
|
-
|
165
|
-
|
193
|
+
node["foo"] = ["one", "two"]
|
194
|
+
node.read_attribute("foo").should eql(["one", "two"])
|
166
195
|
end
|
167
196
|
end
|
168
197
|
|
169
198
|
context "given a non-string name" do
|
170
199
|
it "should co-erce the name into a string and retrieve the property" do
|
171
|
-
|
172
|
-
|
200
|
+
node["foo"] = "bar"
|
201
|
+
node.read_attribute(:foo).should eql("bar")
|
173
202
|
end
|
174
203
|
end
|
175
204
|
end
|
@@ -184,33 +213,58 @@ describe SafetyPin::Node do
|
|
184
213
|
end
|
185
214
|
|
186
215
|
context "#write_attribute" do
|
187
|
-
|
188
|
-
after { @node.destroy }
|
216
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
189
217
|
|
190
218
|
context "given a single value" do
|
191
219
|
it "should set a string property value" do
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
220
|
+
node.write_attribute("foo", "bar")
|
221
|
+
node.save
|
222
|
+
node.reload
|
223
|
+
node["foo"].should eql("bar")
|
196
224
|
end
|
197
225
|
|
198
|
-
context "given a Time object" do
|
226
|
+
context "given a Time object value" do
|
199
227
|
it "should set a date property value" do
|
200
228
|
time = Time.now
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
229
|
+
node.write_attribute("foo", time)
|
230
|
+
node.save
|
231
|
+
node.reload
|
232
|
+
node["foo"].to_s.should eql(time.to_s)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "given a symbol value" do
|
237
|
+
it "coerces value to string" do
|
238
|
+
node.write_attribute("foo", :bar)
|
239
|
+
node["foo"].should == "bar"
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context "given another supported value" do
|
244
|
+
it "sets the property" do
|
245
|
+
node.write_attribute("foo", 1)
|
246
|
+
node["foo"].should == 1
|
247
|
+
node.write_attribute("foo", 1.1)
|
248
|
+
node["foo"].should == 1.1
|
249
|
+
node.write_attribute("foo", true)
|
250
|
+
node["foo"].should == true
|
251
|
+
node.write_attribute("foo", "bar")
|
252
|
+
node["foo"].should == "bar"
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context "given an unsupported value" do
|
257
|
+
it "raises an error" do
|
258
|
+
lambda { node.write_attribute("foo", {unsupported: :value_type}) }.should raise_error(SafetyPin::PropertyTypeError)
|
205
259
|
end
|
206
260
|
end
|
207
261
|
|
208
262
|
context "given a non-string name" do
|
209
263
|
it "should co-erce name into string before setting property" do
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
264
|
+
node.write_attribute(:foo, "bar")
|
265
|
+
node.save
|
266
|
+
node.reload
|
267
|
+
node["foo"].should eql("bar")
|
214
268
|
end
|
215
269
|
end
|
216
270
|
end
|
@@ -218,51 +272,50 @@ describe SafetyPin::Node do
|
|
218
272
|
context "given an array of values" do
|
219
273
|
context "of the same type" do
|
220
274
|
it "should set a multi-value string array" do
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
275
|
+
node.write_attribute("foo", ["one", "two"])
|
276
|
+
node.save
|
277
|
+
node.reload
|
278
|
+
node["foo"].should eql(["one", "two"])
|
225
279
|
end
|
226
280
|
end
|
227
281
|
end
|
228
282
|
|
229
283
|
context "given a null value" do
|
230
284
|
it "should remove the property" do
|
231
|
-
|
232
|
-
|
233
|
-
lambda {
|
285
|
+
node["foo"] = "bar"
|
286
|
+
node.write_attribute("foo", nil)
|
287
|
+
lambda { node["foo"] }.should raise_error(SafetyPin::NilPropertyError)
|
234
288
|
end
|
235
289
|
|
236
290
|
context "given a non-existent property and a null value" do
|
237
291
|
it "should return nil" do
|
238
|
-
|
292
|
+
node.write_attribute("foo", nil).should be_nil
|
239
293
|
end
|
240
294
|
end
|
241
295
|
end
|
242
296
|
|
243
297
|
context "changing jcr:primaryType property" do
|
244
298
|
it "should raise an error" do
|
245
|
-
lambda {
|
299
|
+
lambda { node.write_attribute("jcr:primaryType", "nt:folder") }.should raise_error(SafetyPin::PropertyError)
|
246
300
|
end
|
247
301
|
end
|
248
302
|
end
|
249
303
|
|
250
304
|
context "#reload" do
|
251
|
-
|
252
|
-
after { @node.destroy }
|
305
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
253
306
|
|
254
307
|
it "should discard pending changes" do
|
255
|
-
|
256
|
-
|
257
|
-
lambda {
|
308
|
+
node["foo"] = "bar"
|
309
|
+
node.reload
|
310
|
+
lambda { node.read_attribute("foo") }.should raise_error(SafetyPin::NilPropertyError)
|
258
311
|
end
|
259
312
|
|
260
313
|
it "should not discard changes for another node" do
|
261
|
-
|
314
|
+
node["bar"] = "baz"
|
262
315
|
another_node = SafetyPin::Node.find("/content")
|
263
316
|
another_node["bar"] = "baz"
|
264
|
-
|
265
|
-
lambda {
|
317
|
+
node.reload
|
318
|
+
lambda { node["bar"] }.should raise_error(SafetyPin::NilPropertyError)
|
266
319
|
another_node["bar"].should eql("baz")
|
267
320
|
end
|
268
321
|
end
|
@@ -273,7 +326,6 @@ describe SafetyPin::Node do
|
|
273
326
|
node.write_attribute("bar","baz")
|
274
327
|
node.save
|
275
328
|
node["bar"].should eql("baz")
|
276
|
-
node.destroy
|
277
329
|
end
|
278
330
|
end
|
279
331
|
|
@@ -317,18 +369,22 @@ describe SafetyPin::Node do
|
|
317
369
|
end
|
318
370
|
|
319
371
|
describe "#properties=" do
|
320
|
-
|
321
|
-
after { @node.destroy }
|
372
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
322
373
|
|
323
374
|
it "should set the properties of a node" do
|
324
|
-
|
325
|
-
|
375
|
+
node.properties = {"foo" => "bar"}
|
376
|
+
node.properties.should == {"foo" => "bar"}
|
326
377
|
end
|
327
378
|
|
328
379
|
it "should set unset properties not specified in hash" do
|
329
|
-
|
330
|
-
|
331
|
-
|
380
|
+
node["foo"] = "bar"
|
381
|
+
node.properties = {"baz" => "qux"}
|
382
|
+
node.properties.should eql({"baz" => "qux"})
|
383
|
+
end
|
384
|
+
|
385
|
+
it "should create child nodes for hash values" do
|
386
|
+
node.properties = {foo: {bar: "baz"}}
|
387
|
+
node.child(:foo).properties.should == {"bar" => "baz"}
|
332
388
|
end
|
333
389
|
end
|
334
390
|
|
@@ -339,55 +395,48 @@ describe SafetyPin::Node do
|
|
339
395
|
end
|
340
396
|
|
341
397
|
describe "#mixin_types" do
|
342
|
-
before do
|
343
|
-
@node = SafetyPin::Node.create("/content/foo")
|
344
|
-
@node.j_node.add_mixin("mix:created")
|
345
|
-
@node.save
|
346
|
-
end
|
347
|
-
|
348
|
-
after { @node.destroy }
|
349
|
-
|
350
398
|
it "should return the mixin types of a node" do
|
351
|
-
|
399
|
+
node = SafetyPin::Node.create("/content/foo")
|
400
|
+
node.j_node.add_mixin("mix:created")
|
401
|
+
node.save
|
402
|
+
node.mixin_types.should eql(["mix:created"])
|
352
403
|
end
|
353
404
|
end
|
354
405
|
|
355
406
|
describe "#add_mixin" do
|
356
|
-
|
357
|
-
after { @node.destroy }
|
407
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
358
408
|
|
359
409
|
it "should add a mixin type to node" do
|
360
|
-
|
361
|
-
|
362
|
-
|
410
|
+
node.add_mixin("mix:created")
|
411
|
+
node.save
|
412
|
+
node.mixin_types.should eql(["mix:created"])
|
363
413
|
end
|
364
414
|
|
365
415
|
it "should require a save before the mixin addition is detected" do
|
366
|
-
|
367
|
-
|
416
|
+
node.add_mixin("mix:created")
|
417
|
+
node.mixin_types.should eql([])
|
368
418
|
end
|
369
419
|
end
|
370
420
|
|
371
421
|
describe "#remove_mixin" do
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
422
|
+
let(:node) do
|
423
|
+
node = SafetyPin::Node.create("/content/foo")
|
424
|
+
node.add_mixin("mix:created")
|
425
|
+
node.save
|
426
|
+
node
|
376
427
|
end
|
377
428
|
|
378
|
-
after { @node.destroy }
|
379
|
-
|
380
429
|
it "should remove a mixin type from a node" do
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
430
|
+
node.mixin_types.should eql(["mix:created"])
|
431
|
+
node.remove_mixin("mix:created")
|
432
|
+
node.save
|
433
|
+
node.mixin_types.should eql([])
|
385
434
|
end
|
386
435
|
|
387
436
|
it "should require a save before the mixin removal is detected" do
|
388
|
-
|
389
|
-
|
390
|
-
|
437
|
+
node.remove_mixin("mix:created")
|
438
|
+
node.mixin_types.should eql(["mix:created"])
|
439
|
+
node.reload
|
391
440
|
end
|
392
441
|
end
|
393
442
|
|
@@ -398,6 +447,15 @@ describe SafetyPin::Node do
|
|
398
447
|
node.should be_new
|
399
448
|
node.properties.should eql({})
|
400
449
|
end
|
450
|
+
|
451
|
+
|
452
|
+
|
453
|
+
context "given properties" do
|
454
|
+
it "should build a node with properties" do
|
455
|
+
node = SafetyPin::Node.build("/content/foo", nil, {foo: "bar"})
|
456
|
+
node.properties.should == {"foo" => "bar"}
|
457
|
+
end
|
458
|
+
end
|
401
459
|
|
402
460
|
context "and a node type string" do
|
403
461
|
it "should create an unsaved node of the given type" do
|
@@ -446,10 +504,16 @@ describe SafetyPin::Node do
|
|
446
504
|
it "should build and save a node of the specified type" do
|
447
505
|
node = SafetyPin::Node.create("/content/foo", "nt:folder")
|
448
506
|
SafetyPin::Node.find("/content/foo").should_not be_nil
|
449
|
-
node.destroy
|
450
507
|
end
|
451
508
|
end
|
452
509
|
end
|
510
|
+
|
511
|
+
describe ".create_parents" do
|
512
|
+
it "creates parent nodes if they do not exist" do
|
513
|
+
SafetyPin::Node.create_parents("/content/foo/bar/baz")
|
514
|
+
SafetyPin::Node.create("/content/foo/bar/baz").should_not be_nil
|
515
|
+
end
|
516
|
+
end
|
453
517
|
|
454
518
|
context "#value_factory" do
|
455
519
|
it "should return a value factory instance" do
|
@@ -464,7 +528,6 @@ describe SafetyPin::Node do
|
|
464
528
|
node.save
|
465
529
|
property = node.j_node.get_property("bar")
|
466
530
|
node.property_is_multi_valued?(property).should be_true
|
467
|
-
node.destroy
|
468
531
|
end
|
469
532
|
|
470
533
|
it "should return false if property is not multi-valued" do
|
@@ -473,7 +536,6 @@ describe SafetyPin::Node do
|
|
473
536
|
node.save
|
474
537
|
property = node.j_node.get_property("bar")
|
475
538
|
node.property_is_multi_valued?(property).should be_false
|
476
|
-
node.destroy
|
477
539
|
end
|
478
540
|
end
|
479
541
|
|
@@ -492,48 +554,64 @@ describe SafetyPin::Node do
|
|
492
554
|
parent_node.should be_changed
|
493
555
|
node.destroy
|
494
556
|
parent_node.should_not be_changed
|
495
|
-
parent_node.destroy
|
496
557
|
end
|
497
558
|
|
498
|
-
context "when it fails" do
|
499
|
-
before do
|
500
|
-
@node = SafetyPin::Node.create("/content/foo")
|
501
|
-
@node.add_mixin("mix:created")
|
502
|
-
@node.save
|
503
|
-
end
|
504
|
-
|
505
|
-
after { @node.reload; @node.destroy }
|
506
|
-
|
559
|
+
context "when it fails" do
|
507
560
|
it "should raise an error" do
|
508
|
-
|
509
|
-
|
561
|
+
node = SafetyPin::Node.create("/content/foo")
|
562
|
+
node.add_mixin("mix:created")
|
563
|
+
node.save
|
564
|
+
node.remove_mixin("mix:created") # make node unremoveable
|
565
|
+
lambda { node.destroy }.should raise_error(SafetyPin::NodeError)
|
510
566
|
end
|
511
567
|
end
|
512
568
|
end
|
513
569
|
|
514
570
|
describe "#primary_type" do
|
515
|
-
|
516
|
-
after { @node.destroy }
|
571
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
517
572
|
|
518
573
|
it "should return the primary type of the node" do
|
519
|
-
|
574
|
+
node.primary_type.should eql("nt:unstructured")
|
520
575
|
end
|
521
576
|
end
|
522
577
|
|
523
|
-
describe "#
|
524
|
-
|
525
|
-
after { @node.destroy }
|
578
|
+
describe "#build" do
|
579
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
526
580
|
|
527
581
|
it "should create a child node with a given name" do
|
528
|
-
|
529
|
-
SafetyPin::Node.find("/content/foo/bar").should be_a(SafetyPin::Node)
|
582
|
+
node.build("bar").path.should == "/content/foo/bar"
|
530
583
|
end
|
531
584
|
|
532
585
|
it "should create a child node with a given name and node type" do
|
533
|
-
|
534
|
-
child_node = SafetyPin::Node.find("/content/foo/bar")
|
586
|
+
child_node = node.build("bar", "nt:folder")
|
535
587
|
child_node.should be_a(SafetyPin::Node)
|
536
588
|
child_node.primary_type.should eql("nt:folder")
|
537
589
|
end
|
590
|
+
|
591
|
+
it "should create a child node with a name, node type, and properties" do
|
592
|
+
node.build("bar", nil, {foo: "bar"}).properties.should == {"foo" => "bar"}
|
593
|
+
end
|
594
|
+
end
|
595
|
+
|
596
|
+
describe "#create" do
|
597
|
+
let(:node) { SafetyPin::Node.create("/content/foo") }
|
598
|
+
|
599
|
+
it "should create a child node with a given name" do
|
600
|
+
child_node = node.create("bar")
|
601
|
+
child_node.path.should == "/content/foo/bar"
|
602
|
+
child_node.should_not
|
603
|
+
end
|
604
|
+
|
605
|
+
it "should create a child node with a given name and node type" do
|
606
|
+
child_node = node.create("bar", "nt:folder")
|
607
|
+
child_node.should_not be_new
|
608
|
+
child_node.primary_type.should eql("nt:folder")
|
609
|
+
end
|
610
|
+
|
611
|
+
it "should create a child node with a name, node type, and properties" do
|
612
|
+
child_node = node.create("bar", nil, {foo: "bar"})
|
613
|
+
child_node.should_not be_new
|
614
|
+
child_node.properties.should == {"foo" => "bar"}
|
615
|
+
end
|
538
616
|
end
|
539
617
|
end
|
data/spec/query_spec.rb
CHANGED
@@ -1,18 +1,6 @@
|
|
1
1
|
require 'spec_helper.rb'
|
2
2
|
|
3
|
-
describe SafetyPin::Query do
|
4
|
-
before(:all) do
|
5
|
-
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => "admin", :password => "admin")
|
6
|
-
end
|
7
|
-
|
8
|
-
before do
|
9
|
-
SafetyPin::JCR.session.refresh(false)
|
10
|
-
end
|
11
|
-
|
12
|
-
after(:all) do
|
13
|
-
SafetyPin::JCR.logout
|
14
|
-
end
|
15
|
-
|
3
|
+
describe SafetyPin::Query do
|
16
4
|
let(:query) { SafetyPin::Query.new }
|
17
5
|
|
18
6
|
describe ".execute" do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,27 @@
|
|
1
1
|
$:<<File.join(File.dirname(__FILE__), '/../lib')
|
2
2
|
|
3
|
-
require 'safety_pin'
|
3
|
+
require 'safety_pin'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.before(:all) do
|
7
|
+
SafetyPin::JCR.dev_login
|
8
|
+
end
|
9
|
+
|
10
|
+
config.before do
|
11
|
+
SafetyPin::JCR.session.refresh(false) if SafetyPin::JCR.logged_in?
|
12
|
+
end
|
13
|
+
|
14
|
+
config.after(:all) do
|
15
|
+
SafetyPin::JCR.logout
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after do
|
19
|
+
if SafetyPin::JCR.logged_in?
|
20
|
+
node = SafetyPin::Node.find("/content/foo")
|
21
|
+
unless node.nil?
|
22
|
+
node.reload if node.changed?
|
23
|
+
node.destroy
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,79 +1,75 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: safety_pin
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
version: 0.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
|
9
|
-
autorequire:
|
7
|
+
authors:
|
8
|
+
- Jordan Raine
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2012-05-18 00:00:00 Z
|
12
|
+
date: 2012-08-23 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
14
|
description: An easy-to-use JCR connector for JRuby
|
17
|
-
email:
|
18
|
-
|
19
|
-
executables:
|
20
|
-
|
15
|
+
email:
|
16
|
+
- jnraine@gmail.com
|
17
|
+
executables:
|
18
|
+
- console
|
21
19
|
extensions: []
|
22
|
-
|
23
20
|
extra_rdoc_files: []
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
21
|
+
files:
|
22
|
+
- .rspec
|
23
|
+
- .rvmrc
|
24
|
+
- Gemfile
|
25
|
+
- Gemfile.lock
|
26
|
+
- LICENSE
|
27
|
+
- README.md
|
28
|
+
- Rakefile
|
29
|
+
- bin/console
|
30
|
+
- console_loader.rb
|
31
|
+
- lib/safety_pin.rb
|
32
|
+
- lib/safety_pin/jcr.rb
|
33
|
+
- lib/safety_pin/node.rb
|
34
|
+
- lib/safety_pin/query.rb
|
35
|
+
- lib/safety_pin/query/where_condition.rb
|
36
|
+
- lib/safety_pin/version.rb
|
37
|
+
- safety_pin.gemspec
|
38
|
+
- spec/jcr_spec.rb
|
39
|
+
- spec/jcr_sql2_spec.rb
|
40
|
+
- spec/node_spec.rb
|
41
|
+
- spec/query_spec.rb
|
42
|
+
- spec/spec_helper.rb
|
43
|
+
- spec/where_condition_spec.rb
|
44
|
+
homepage: ''
|
47
45
|
licenses: []
|
48
|
-
|
49
|
-
post_install_message:
|
46
|
+
post_install_message:
|
50
47
|
rdoc_options: []
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
55
|
none: false
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
61
|
none: false
|
62
|
-
requirements:
|
63
|
-
- - ">="
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: "0"
|
66
62
|
requirements: []
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
signing_key:
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.8.24
|
65
|
+
signing_key:
|
71
66
|
specification_version: 3
|
72
67
|
summary: JCR connector for JRuby
|
73
|
-
test_files:
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
68
|
+
test_files:
|
69
|
+
- spec/jcr_spec.rb
|
70
|
+
- spec/jcr_sql2_spec.rb
|
71
|
+
- spec/node_spec.rb
|
72
|
+
- spec/query_spec.rb
|
73
|
+
- spec/spec_helper.rb
|
74
|
+
- spec/where_condition_spec.rb
|
75
|
+
...
|