ruby-dbus 0.23.0.beta1 → 0.23.0.beta2
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/NEWS.md +28 -3
- data/VERSION +1 -1
- data/doc/Reference.md +1 -1
- data/examples/no-bus/pulseaudio.rb +50 -0
- data/lib/dbus/bus.rb +42 -436
- data/lib/dbus/connection.rb +350 -0
- data/lib/dbus/object.rb +22 -12
- data/lib/dbus/object_manager.rb +5 -1
- data/lib/dbus/object_server.rb +44 -14
- data/lib/dbus/org.freedesktop.DBus.xml +97 -0
- data/lib/dbus/proxy_service.rb +14 -2
- data/lib/dbus.rb +1 -0
- data/ruby-dbus.gemspec +1 -1
- data/spec/bus_connection_spec.rb +7 -8
- data/spec/connection_spec.rb +37 -0
- data/spec/dbus_spec.rb +22 -0
- data/spec/mock-service/spaghetti-monster.rb +3 -4
- data/spec/object_server_spec.rb +58 -24
- data/spec/object_spec.rb +16 -0
- data/spec/proxy_service_spec.rb +12 -7
- data/spec/tools/dbus-limited-session.conf +3 -0
- metadata +8 -3
data/ruby-dbus.gemspec
CHANGED
@@ -9,7 +9,7 @@ GEMSPEC = Gem::Specification.new do |s|
|
|
9
9
|
s.summary = "Ruby module for interaction with D-Bus"
|
10
10
|
s.description = "Pure Ruby module for interaction with D-Bus IPC system"
|
11
11
|
s.version = File.read("VERSION").strip
|
12
|
-
s.license = "LGPL-2.1"
|
12
|
+
s.license = "LGPL-2.1-or-later"
|
13
13
|
s.author = "Ruby DBus Team"
|
14
14
|
s.email = "martin.github@vidner.net"
|
15
15
|
s.homepage = "https://github.com/mvidner/ruby-dbus"
|
data/spec/bus_connection_spec.rb
CHANGED
@@ -36,10 +36,10 @@ describe DBus::BusConnection do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
name = "org.rubygems.ruby_dbus.
|
39
|
+
# This only works with our special bus setup
|
40
|
+
context "when we're not allowed to own the name", tag_limited_bus: true do
|
41
|
+
it "raises an error... too late" do
|
42
|
+
name = "org.rubygems.ruby_dbus.NobodyCanOwnThisName"
|
43
43
|
expect do
|
44
44
|
bus.request_service(name)
|
45
45
|
_unrelated_call = bus.proxy.GetId.first
|
@@ -68,10 +68,9 @@ describe DBus::BusConnection do
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
context "when we're not allowed to own the name",
|
72
|
-
|
73
|
-
|
74
|
-
name = "org.rubygems.ruby_dbus.NotAllowedToOwnThisNameAnyway"
|
71
|
+
context "when we're not allowed to own the name", tag_limited_bus: true do
|
72
|
+
it "raises an error" do
|
73
|
+
name = "org.rubygems.ruby_dbus.NobodyCanOwnThisName"
|
75
74
|
expect do
|
76
75
|
bus.request_name(name)
|
77
76
|
end.to raise_error(DBus::Error, /not allowed to own the service/)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative "spec_helper"
|
5
|
+
require "dbus"
|
6
|
+
|
7
|
+
describe DBus::PeerConnection do
|
8
|
+
let(:address) { ENV["DBUS_SESSION_BUS_ADDRESS"] }
|
9
|
+
subject { described_class.new(address) }
|
10
|
+
|
11
|
+
describe "#peer_service" do
|
12
|
+
it "returns a PeerService with a nil name" do
|
13
|
+
svc = subject.peer_service
|
14
|
+
expect(svc).to be_a(DBus::ProxyService)
|
15
|
+
expect(svc.name).to be_nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#add_match, #remove_match" do
|
20
|
+
it "doesn't crash trying to call AddMatch, RemoveMatch" do
|
21
|
+
mr = DBus::MatchRule.new
|
22
|
+
mr.member = "StateUpdated"
|
23
|
+
mr.interface = "org.PulseAudio.Core1.Device"
|
24
|
+
handler = ->(_msg) {}
|
25
|
+
|
26
|
+
# Cheating a bit with the mocking:
|
27
|
+
# a PulseAudio peer connection would error with
|
28
|
+
# > DBus::Error: Method "AddMatch" with signature "s" on interface
|
29
|
+
# > "org.freedesktop.DBus" doesn't exist
|
30
|
+
# but here we do have a bus at the other end, which replies with
|
31
|
+
# > DBus::Error: Client tried to send a message other than Hello without being registered
|
32
|
+
# where "registering" is a libdbus-1 thing meaning "internal bookkeeping and send Hello"
|
33
|
+
expect { subject.add_match(mr, &handler) }.to_not raise_error
|
34
|
+
expect { subject.remove_match(mr) }.to_not raise_error
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/dbus_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env rspec
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative "spec_helper"
|
5
|
+
require "dbus"
|
6
|
+
|
7
|
+
describe DBus do
|
8
|
+
describe ".session_bus", tag_bus: true do
|
9
|
+
it "returns a BusConnection" do
|
10
|
+
expect(DBus.session_bus).to be_a(DBus::BusConnection)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".system_bus" do
|
15
|
+
# coverage obsession: mock it out,
|
16
|
+
# system bus may not exist during RPM builds
|
17
|
+
it "calls SystemBus.instance" do
|
18
|
+
expect(DBus::SystemBus).to receive(:instance)
|
19
|
+
DBus.system_bus
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -183,16 +183,14 @@ class Test < DBus::Object
|
|
183
183
|
dbus_interface "org.ruby.TestParent" do
|
184
184
|
dbus_method :New, "in name:s, out opath:o" do |name|
|
185
185
|
child = TestChild.new("#{path}/#{name}")
|
186
|
-
|
186
|
+
object_server.export(child)
|
187
187
|
[child.path]
|
188
188
|
end
|
189
189
|
|
190
190
|
dbus_method :Delete, "in opath:o" do |opath|
|
191
191
|
raise ArgumentError unless opath.start_with?(path)
|
192
192
|
|
193
|
-
|
194
|
-
obj = svr.get_node(opath)&.object
|
195
|
-
svr.unexport(obj)
|
193
|
+
object_server.unexport(opath)
|
196
194
|
end
|
197
195
|
end
|
198
196
|
|
@@ -200,6 +198,7 @@ class Test < DBus::Object
|
|
200
198
|
dbus_method :the_answer, "out answer:i" do
|
201
199
|
[0]
|
202
200
|
end
|
201
|
+
|
203
202
|
dbus_method :interfaces, "out answer:i" do
|
204
203
|
# 'Shadowed' from the Ruby side, meaning ProxyObject#interfaces
|
205
204
|
# will return the list of interfaces rather than calling this method.
|
data/spec/object_server_spec.rb
CHANGED
@@ -55,26 +55,9 @@ describe DBus::ObjectServer do
|
|
55
55
|
o
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
# current behavior
|
60
|
-
it "a) silently uses the new object" do
|
58
|
+
it "raises an error" do
|
61
59
|
server.export(obj1)
|
62
|
-
server.export(obj2)
|
63
|
-
|
64
|
-
expect(server).to_not receive(:unexport).with(obj1)
|
65
|
-
expect(server[path].which).to eq 2
|
66
|
-
end
|
67
|
-
|
68
|
-
xit "b) unexports the other object first" do
|
69
|
-
server.export(obj1)
|
70
|
-
|
71
|
-
expect(server).to receive(:unexport).with(obj1)
|
72
|
-
server.export(obj2)
|
73
|
-
end
|
74
|
-
|
75
|
-
xit "c) raises an error" do
|
76
|
-
server.export(obj1)
|
77
|
-
expect { server.export(obj2) }.to raise_error(RuntimeError)
|
60
|
+
expect { server.export(obj2) }.to raise_error(RuntimeError, /there is already an object/)
|
78
61
|
end
|
79
62
|
end
|
80
63
|
end
|
@@ -85,10 +68,20 @@ describe DBus::ObjectServer do
|
|
85
68
|
@svc = bus.object_server
|
86
69
|
end
|
87
70
|
|
88
|
-
it "returns the unexported object" do
|
71
|
+
it "returns the unexported leaf object" do
|
89
72
|
obj = DBus::Object.new "/org/ruby/Foo"
|
90
73
|
@svc.export obj
|
91
|
-
expect(@svc.unexport(obj)).to
|
74
|
+
expect(@svc.unexport(obj)).to be_equal(obj)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns the unexported leaf object, if specified by its path" do
|
78
|
+
obj = DBus::Object.new "/org/ruby/Foo"
|
79
|
+
@svc.export obj
|
80
|
+
expect(@svc.unexport(obj.path)).to be_equal(obj)
|
81
|
+
|
82
|
+
obj = DBus::Object.new "/org/ruby/Foo"
|
83
|
+
@svc.export obj
|
84
|
+
expect(@svc.unexport(DBus::ObjectPath.new(obj.path))).to be_equal(obj)
|
92
85
|
end
|
93
86
|
|
94
87
|
it "returns false if the object was never exported" do
|
@@ -96,9 +89,50 @@ describe DBus::ObjectServer do
|
|
96
89
|
expect(@svc.unexport(obj)).to be false
|
97
90
|
end
|
98
91
|
|
99
|
-
it "raises
|
100
|
-
|
101
|
-
|
92
|
+
it "raises false if the path has no node" do
|
93
|
+
obj = DBus::Object.new "/org/ruby/Foo"
|
94
|
+
@svc.export obj
|
95
|
+
expect { @svc.unexport("/org/ruby/NotFoo") }.to raise_error(ArgumentError)
|
96
|
+
@svc.unexport obj
|
97
|
+
end
|
98
|
+
|
99
|
+
it "raises false if the path has no object" do
|
100
|
+
obj = DBus::Object.new "/org/ruby/Foo"
|
101
|
+
@svc.export obj
|
102
|
+
expect { @svc.unexport("/org/ruby") }.to raise_error(ArgumentError)
|
103
|
+
@svc.unexport obj
|
104
|
+
end
|
105
|
+
|
106
|
+
it "raises when argument is not usable" do
|
107
|
+
expect { @svc.unexport(:foo) }.to raise_error(ArgumentError)
|
108
|
+
end
|
109
|
+
|
110
|
+
context "/child_of_root" do
|
111
|
+
it "returns the unexported object" do
|
112
|
+
obj = DBus::Object.new "/child_of_root"
|
113
|
+
@svc.export obj
|
114
|
+
expect(@svc.unexport(obj)).to be_equal(obj)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context "/ (root)" do
|
119
|
+
it "returns the unexported object" do
|
120
|
+
obj = DBus::Object.new "/"
|
121
|
+
@svc.export obj
|
122
|
+
expect(@svc.unexport(obj)).to be_equal(obj)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "not a leaf object" do
|
127
|
+
it "maintains objects on child paths" do
|
128
|
+
obj = DBus::Object.new "/org/ruby"
|
129
|
+
@svc.export obj
|
130
|
+
obj2 = DBus::Object.new "/org/ruby/Foo"
|
131
|
+
@svc.export obj2
|
132
|
+
|
133
|
+
@svc.unexport(obj)
|
134
|
+
expect(@svc.object("/org/ruby/Foo")).to be_a DBus::Object
|
135
|
+
end
|
102
136
|
end
|
103
137
|
end
|
104
138
|
end
|
data/spec/object_spec.rb
CHANGED
@@ -175,4 +175,20 @@ describe DBus::Object do
|
|
175
175
|
expect { obj.dispatch(msg) }.to_not raise_error
|
176
176
|
end
|
177
177
|
end
|
178
|
+
|
179
|
+
describe "#emit" do
|
180
|
+
context "before the object has been exported" do
|
181
|
+
it "raises an explanatory error" do
|
182
|
+
obj = ObjectTest.new("/test")
|
183
|
+
|
184
|
+
intf = DBus::Interface.new("org.example.Test")
|
185
|
+
signal = DBus::Signal.new("Ring")
|
186
|
+
expect { obj.emit(intf, signal) }
|
187
|
+
.to raise_error(
|
188
|
+
RuntimeError,
|
189
|
+
%r{Cannot emit signal org.example.Test.Ring before /test is exported}
|
190
|
+
)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
178
194
|
end
|
data/spec/proxy_service_spec.rb
CHANGED
@@ -5,13 +5,7 @@ require_relative "spec_helper"
|
|
5
5
|
require "dbus"
|
6
6
|
|
7
7
|
describe DBus::ProxyService do
|
8
|
-
context "when a private bus is set up" do
|
9
|
-
around(:each) do |example|
|
10
|
-
with_private_bus do
|
11
|
-
with_service_by_activation(&example)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
8
|
+
context "when a private bus is set up", tag_service: true do
|
15
9
|
let(:bus) { DBus::ASessionBus.new }
|
16
10
|
|
17
11
|
describe "#exists?" do
|
@@ -26,5 +20,16 @@ describe DBus::ProxyService do
|
|
26
20
|
expect(svc.exists?).to be false
|
27
21
|
end
|
28
22
|
end
|
23
|
+
|
24
|
+
# This method is used by dbus-gui-gtk.
|
25
|
+
# Deprecate it? In favor of introspecting the tree gradually
|
26
|
+
# or move it to the application code?
|
27
|
+
describe "#introspect" do
|
28
|
+
it "creates the whole node tree" do
|
29
|
+
svc = bus.service("org.ruby.service")
|
30
|
+
expect { svc.introspect }.to_not raise_error
|
31
|
+
expect(svc.root.dig("org", "ruby", "MyInstance")).to be_a DBus::Node
|
32
|
+
end
|
33
|
+
end
|
29
34
|
end
|
30
35
|
end
|
@@ -43,6 +43,9 @@
|
|
43
43
|
<allow eavesdrop="true"/>
|
44
44
|
<!-- Allow anyone to own anything -->
|
45
45
|
<allow own="*"/>
|
46
|
+
|
47
|
+
<!-- To test how request_name handles bus errors -->
|
48
|
+
<deny own="org.rubygems.ruby_dbus.NobodyCanOwnThisName"/>
|
46
49
|
</policy>
|
47
50
|
|
48
51
|
<!-- Do not increase the limits.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-dbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.23.0.
|
4
|
+
version: 0.23.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruby DBus Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rexml
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- doc/Tutorial.md
|
125
125
|
- examples/doc/README.md
|
126
126
|
- examples/doc/_extract_examples
|
127
|
+
- examples/no-bus/pulseaudio.rb
|
127
128
|
- examples/no-introspect/nm-test.rb
|
128
129
|
- examples/no-introspect/tracker-test.rb
|
129
130
|
- examples/rhythmbox/playpause.rb
|
@@ -140,6 +141,7 @@ files:
|
|
140
141
|
- lib/dbus/auth.rb
|
141
142
|
- lib/dbus/bus.rb
|
142
143
|
- lib/dbus/bus_name.rb
|
144
|
+
- lib/dbus/connection.rb
|
143
145
|
- lib/dbus/core_ext/class/attribute.rb
|
144
146
|
- lib/dbus/core_ext/module/redefine_method.rb
|
145
147
|
- lib/dbus/data.rb
|
@@ -157,6 +159,7 @@ files:
|
|
157
159
|
- lib/dbus/object_manager.rb
|
158
160
|
- lib/dbus/object_path.rb
|
159
161
|
- lib/dbus/object_server.rb
|
162
|
+
- lib/dbus/org.freedesktop.DBus.xml
|
160
163
|
- lib/dbus/platform.rb
|
161
164
|
- lib/dbus/proxy_object.rb
|
162
165
|
- lib/dbus/proxy_object_factory.rb
|
@@ -175,9 +178,11 @@ files:
|
|
175
178
|
- spec/bus_spec.rb
|
176
179
|
- spec/byte_array_spec.rb
|
177
180
|
- spec/client_robustness_spec.rb
|
181
|
+
- spec/connection_spec.rb
|
178
182
|
- spec/coverage_helper.rb
|
179
183
|
- spec/data/marshall.yaml
|
180
184
|
- spec/data_spec.rb
|
185
|
+
- spec/dbus_spec.rb
|
181
186
|
- spec/emits_changed_signal_spec.rb
|
182
187
|
- spec/err_msg_spec.rb
|
183
188
|
- spec/introspect_xml_parser_spec.rb
|
@@ -217,7 +222,7 @@ files:
|
|
217
222
|
- spec/zzz_quit_spec.rb
|
218
223
|
homepage: https://github.com/mvidner/ruby-dbus
|
219
224
|
licenses:
|
220
|
-
- LGPL-2.1
|
225
|
+
- LGPL-2.1-or-later
|
221
226
|
metadata: {}
|
222
227
|
post_install_message:
|
223
228
|
rdoc_options: []
|