safety-pin 0.1.3 → 0.1.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.
- data/lib/safety_pin/jcr.rb +1 -1
- data/lib/safety_pin/node.rb +40 -4
- data/lib/safety_pin/version.rb +1 -1
- data/spec/jcr_spec.rb +2 -2
- data/spec/jcr_sql2_spec.rb +3 -0
- data/spec/node_spec.rb +46 -0
- metadata +2 -2
data/lib/safety_pin/jcr.rb
CHANGED
@@ -36,7 +36,7 @@ module SafetyPin
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def self.dev_login
|
39
|
-
login(:hostname => "http://localhost:4502", :username => "
|
39
|
+
login(:hostname => "http://localhost:4502", :username => ENV["JCR_USERNAME"], :password => ENV["JCR_PASSWORD"])
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/safety_pin/node.rb
CHANGED
@@ -28,7 +28,13 @@ module SafetyPin
|
|
28
28
|
JCR.session
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.build(
|
31
|
+
def self.build(node_blueprint_or_path_string)
|
32
|
+
if node_blueprint_or_path_string.respond_to?(:primary_type, :properties)
|
33
|
+
node_blueprint = node_blueprint_or_path_string
|
34
|
+
else
|
35
|
+
node_blueprint = NodeBlueprint.new(path: node_blueprint_or_path_string)
|
36
|
+
end
|
37
|
+
|
32
38
|
raise NodeError.new("NodeBlueprint is nil") if node_blueprint.nil?
|
33
39
|
raise NodeError.new("NodeBlueprint has non-absolute path") unless node_blueprint.path.to_s.start_with?("/")
|
34
40
|
raise NodeError.new("Node already exists at path: #{node_blueprint.path}") if Node.exists?(node_blueprint.path)
|
@@ -51,8 +57,8 @@ module SafetyPin
|
|
51
57
|
node
|
52
58
|
end
|
53
59
|
|
54
|
-
def self.create(
|
55
|
-
node = self.build(
|
60
|
+
def self.create(node_blueprint_or_path_string)
|
61
|
+
node = self.build(node_blueprint_or_path_string)
|
56
62
|
node.save
|
57
63
|
node
|
58
64
|
end
|
@@ -116,6 +122,10 @@ module SafetyPin
|
|
116
122
|
end
|
117
123
|
child_nodes
|
118
124
|
end
|
125
|
+
|
126
|
+
def descendants
|
127
|
+
children.map {|child| [child, child.descendants] }.flatten
|
128
|
+
end
|
119
129
|
|
120
130
|
def child(relative_path)
|
121
131
|
child_j_node = j_node.get_node(relative_path.to_s)
|
@@ -170,11 +180,25 @@ module SafetyPin
|
|
170
180
|
Time.at(value.date.time.time / 1000)
|
171
181
|
when "Name"
|
172
182
|
value.string # Not sure if these should be handled differently
|
183
|
+
when "Binary"
|
184
|
+
value.binary
|
185
|
+
when "Decimal"
|
186
|
+
value.decimal
|
187
|
+
when "Path"
|
188
|
+
Pathname(value.string)
|
173
189
|
else
|
174
190
|
raise PropertyTypeError.new("Unknown property type: #{property_type}")
|
175
191
|
end
|
176
192
|
end
|
177
193
|
|
194
|
+
def property_single_valued?(name)
|
195
|
+
properties.has_key?(name) and !property_multi_valued?(name)
|
196
|
+
end
|
197
|
+
|
198
|
+
def property_multi_valued?(name)
|
199
|
+
properties.has_key?(name) and properties[name].is_a?(Array)
|
200
|
+
end
|
201
|
+
|
178
202
|
def write_attribute(name, value)
|
179
203
|
raise PropertyError.new("Illegal operation: cannot change jcr:primaryType property") if name == "jcr:primaryType"
|
180
204
|
name = name.to_s
|
@@ -182,8 +206,16 @@ module SafetyPin
|
|
182
206
|
if value.nil? and not j_node.has_property(name)
|
183
207
|
return nil
|
184
208
|
end
|
209
|
+
|
210
|
+
# when going from multi to single value
|
211
|
+
if property_multi_valued?(name) and !value.is_a?(Array)
|
212
|
+
value = [value]
|
213
|
+
end
|
185
214
|
|
186
215
|
if value.is_a? Array
|
216
|
+
if properties.has_key?(name) and property_single_valued?(name) # when going from single to multi value
|
217
|
+
j_node.set_property(name, nil)
|
218
|
+
end
|
187
219
|
values = value
|
188
220
|
val_fact = value_factory
|
189
221
|
j_values = []
|
@@ -195,7 +227,7 @@ module SafetyPin
|
|
195
227
|
calendar_value = Calendar.instance
|
196
228
|
calendar_value.set_time(value.to_java)
|
197
229
|
j_node.set_property(name, calendar_value)
|
198
|
-
elsif value.is_a?
|
230
|
+
elsif value.is_a?(Symbol) or value.is_a?(Pathname)
|
199
231
|
j_node.set_property(name, value.to_s)
|
200
232
|
else
|
201
233
|
begin
|
@@ -384,6 +416,10 @@ module SafetyPin
|
|
384
416
|
def has_property(name)
|
385
417
|
properties.keys.include?(name)
|
386
418
|
end
|
419
|
+
|
420
|
+
def inspect
|
421
|
+
"#<#{self.class} path=#{path}>"
|
422
|
+
end
|
387
423
|
end
|
388
424
|
|
389
425
|
class NodeError < Exception; end
|
data/lib/safety_pin/version.rb
CHANGED
data/spec/jcr_spec.rb
CHANGED
@@ -10,14 +10,14 @@ describe SafetyPin::JCR do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should login to a remote JCR" do
|
13
|
-
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => "
|
13
|
+
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => ENV["JCR_USERNAME"], :password => ENV["JCR_PASSWORD"])
|
14
14
|
SafetyPin::JCR.session.should be_a(Java::JavaxJcr::Session)
|
15
15
|
SafetyPin::JCR.should be_logged_in
|
16
16
|
SafetyPin::JCR.logout
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should logout of a remote SafetyPin::JCR" do
|
20
|
-
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => "
|
20
|
+
SafetyPin::JCR.login(:hostname => "http://localhost:4502", :username => ENV["JCR_USERNAME"], :password => ENV["JCR_PASSWORD"])
|
21
21
|
SafetyPin::JCR.logout
|
22
22
|
SafetyPin::JCR.should be_logged_out
|
23
23
|
end
|
data/spec/jcr_sql2_spec.rb
CHANGED
@@ -2,6 +2,8 @@ require 'spec_helper.rb'
|
|
2
2
|
|
3
3
|
describe "JCR-SQL2 example queries" do
|
4
4
|
before do
|
5
|
+
lingering_node = SafetyPin::Node.find("/content/foo")
|
6
|
+
lingering_node.destroy unless lingering_node.nil?
|
5
7
|
@node = SafetyPin::Node.create("/content/foo")
|
6
8
|
@node.properties = {"bar" => "baz", "qux" => "qax"}
|
7
9
|
@node.save
|
@@ -46,6 +48,7 @@ describe "JCR-SQL2 example queries" do
|
|
46
48
|
end
|
47
49
|
|
48
50
|
it "can lookup a node based on node type" do
|
51
|
+
pending "too slow"
|
49
52
|
nodes = SafetyPin::Query.execute("SELECT * FROM [cq:Page]")
|
50
53
|
nodes.first.primary_type.should eql("cq:Page")
|
51
54
|
end
|
data/spec/node_spec.rb
CHANGED
@@ -266,6 +266,13 @@ describe SafetyPin::Node do
|
|
266
266
|
end
|
267
267
|
end
|
268
268
|
|
269
|
+
context "given a pathname value" do
|
270
|
+
it "coers value to string" do
|
271
|
+
node.write_attribute("foo", Pathname("/content/foo"))
|
272
|
+
node["foo"].should == "/content/foo"
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
269
276
|
context "given another supported value" do
|
270
277
|
it "sets the property" do
|
271
278
|
node.write_attribute("foo", 1)
|
@@ -293,6 +300,30 @@ describe SafetyPin::Node do
|
|
293
300
|
node["foo"].should eql("bar")
|
294
301
|
end
|
295
302
|
end
|
303
|
+
|
304
|
+
context "when changing a property from a single value to a multivalue" do
|
305
|
+
it "should work" do
|
306
|
+
node.write_attribute(:foo, "bar")
|
307
|
+
node.save
|
308
|
+
node.reload
|
309
|
+
node.write_attribute(:foo, ["bar"])
|
310
|
+
node.save
|
311
|
+
node.reload
|
312
|
+
node["foo"].should == ["bar"]
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
context "when changing a property from a multi value to a single value" do
|
317
|
+
it "wraps the value in an array (can't go from multi to single" do
|
318
|
+
node.write_attribute("foo", ["bar"])
|
319
|
+
node.save
|
320
|
+
node.reload
|
321
|
+
node.write_attribute("foo", "not bar")
|
322
|
+
node.save
|
323
|
+
node.reload
|
324
|
+
node["foo"].should == ["not bar"]
|
325
|
+
end
|
326
|
+
end
|
296
327
|
end
|
297
328
|
|
298
329
|
context "given an array of values" do
|
@@ -761,4 +792,19 @@ describe SafetyPin::Node do
|
|
761
792
|
node["bar"].should_not == "BAZ"
|
762
793
|
end
|
763
794
|
end
|
795
|
+
|
796
|
+
describe "#descendants" do
|
797
|
+
before do
|
798
|
+
SafetyPin::Node.create(SafetyPin::NodeBlueprint.new(path: "/content/foo"))
|
799
|
+
SafetyPin::Node.create(SafetyPin::NodeBlueprint.new(path: "/content/foo/bar"))
|
800
|
+
SafetyPin::Node.create(SafetyPin::NodeBlueprint.new(path: "/content/foo/bar/baz"))
|
801
|
+
SafetyPin::Node.create(SafetyPin::NodeBlueprint.new(path: "/content/foo/bar/baz/qux"))
|
802
|
+
SafetyPin::Node.create(SafetyPin::NodeBlueprint.new(path: "/content/foo/baz"))
|
803
|
+
SafetyPin::Node.create(SafetyPin::NodeBlueprint.new(path: "/content/foo/baz/qux"))
|
804
|
+
end
|
805
|
+
|
806
|
+
it "returns all nodes beneath this one" do
|
807
|
+
SafetyPin::Node.find("/content/foo").descendants.should have(5).items
|
808
|
+
end
|
809
|
+
end
|
764
810
|
end
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: safety-pin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jordan Raine
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-19 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: An easy-to-use JCR connector for JRuby
|
15
15
|
email:
|