safety_pin 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
...
|