ruby-dbus 0.18.0.beta4 → 0.18.0.beta7
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 +40 -0
- data/VERSION +1 -1
- data/doc/Reference.md +13 -4
- data/lib/dbus/data.rb +229 -152
- data/lib/dbus/introspect.rb +13 -3
- data/lib/dbus/marshall.rb +12 -6
- data/lib/dbus/proxy_object_factory.rb +2 -0
- data/lib/dbus/proxy_object_interface.rb +37 -9
- data/lib/dbus/type.rb +146 -16
- data/lib/dbus/xml.rb +4 -0
- data/spec/data_spec.rb +367 -47
- data/spec/packet_unmarshaller_spec.rb +2 -16
- data/spec/property_spec.rb +50 -3
- data/spec/service_newapi.rb +4 -0
- data/spec/type_spec.rb +145 -0
- metadata +6 -7
data/spec/property_spec.rb
CHANGED
@@ -60,7 +60,7 @@ describe "PropertyTest" do
|
|
60
60
|
|
61
61
|
it "tests get all" do
|
62
62
|
all = @iface.all_properties
|
63
|
-
expect(all.keys.sort).to eq(["MyArray", "MyDict", "MyStruct", "MyVariant", "ReadMe", "ReadOrWriteMe"])
|
63
|
+
expect(all.keys.sort).to eq(["MyArray", "MyByte", "MyDict", "MyStruct", "MyVariant", "ReadMe", "ReadOrWriteMe"])
|
64
64
|
end
|
65
65
|
|
66
66
|
it "tests get all on a V1 object" do
|
@@ -68,7 +68,7 @@ describe "PropertyTest" do
|
|
68
68
|
iface = obj["org.ruby.SampleInterface"]
|
69
69
|
|
70
70
|
all = iface.all_properties
|
71
|
-
expect(all.keys.sort).to eq(["MyArray", "MyDict", "MyStruct", "MyVariant", "ReadMe", "ReadOrWriteMe"])
|
71
|
+
expect(all.keys.sort).to eq(["MyArray", "MyByte", "MyDict", "MyStruct", "MyVariant", "ReadMe", "ReadOrWriteMe"])
|
72
72
|
end
|
73
73
|
|
74
74
|
it "tests unknown property reading" do
|
@@ -163,7 +163,7 @@ describe "PropertyTest" do
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
|
-
context "
|
166
|
+
context "a dict-typed property" do
|
167
167
|
it "gets read as a hash" do
|
168
168
|
val = @iface["MyDict"]
|
169
169
|
expect(val).to eq({
|
@@ -172,6 +172,23 @@ describe "PropertyTest" do
|
|
172
172
|
"three" => [3, 3, 3]
|
173
173
|
})
|
174
174
|
end
|
175
|
+
|
176
|
+
it "Get returns the correctly typed value (check with dbus-send)" do
|
177
|
+
cmd = "dbus-send --print-reply " \
|
178
|
+
"--dest=org.ruby.service " \
|
179
|
+
"/org/ruby/MyInstance " \
|
180
|
+
"org.freedesktop.DBus.Properties.Get " \
|
181
|
+
"string:org.ruby.SampleInterface " \
|
182
|
+
"string:MyDict"
|
183
|
+
reply = `#{cmd}`
|
184
|
+
# a bug about variant nesting lead to a "variant variant int32 1" value
|
185
|
+
match_rx = /variant \s+ array \s \[ \s+
|
186
|
+
dict \s entry\( \s+
|
187
|
+
string \s "one" \s+
|
188
|
+
variant \s+ int32 \s 1 \s+
|
189
|
+
\)/x
|
190
|
+
expect(reply).to match(match_rx)
|
191
|
+
end
|
175
192
|
end
|
176
193
|
|
177
194
|
context "a variant-typed property" do
|
@@ -183,6 +200,36 @@ describe "PropertyTest" do
|
|
183
200
|
end
|
184
201
|
end
|
185
202
|
|
203
|
+
context "a byte-typed property" do
|
204
|
+
# Slightly advanced RSpec:
|
205
|
+
# https://rspec.info/documentation/3.9/rspec-expectations/RSpec/Matchers.html#satisfy-instance_method
|
206
|
+
let(:a_byte_in_a_variant) do
|
207
|
+
satisfying { |x| x.is_a?(DBus::Data::Variant) && x.member_type.to_s == DBus::Type::BYTE }
|
208
|
+
# ^ This formatting keeps the matcher on a single line
|
209
|
+
# which enables RSpect to cite it if it fails, instead of saying "block".
|
210
|
+
end
|
211
|
+
|
212
|
+
let(:prop_iface) { @obj[DBus::PROPERTY_INTERFACE] }
|
213
|
+
|
214
|
+
it "gets set with a correct type (#108)" do
|
215
|
+
expect(prop_iface).to receive(:Set).with(
|
216
|
+
"org.ruby.SampleInterface",
|
217
|
+
"MyByte",
|
218
|
+
a_byte_in_a_variant
|
219
|
+
)
|
220
|
+
@iface["MyByte"] = 1
|
221
|
+
end
|
222
|
+
|
223
|
+
it "gets set with a correct type (#108), when using the DBus.variant workaround" do
|
224
|
+
expect(prop_iface).to receive(:Set).with(
|
225
|
+
"org.ruby.SampleInterface",
|
226
|
+
"MyByte",
|
227
|
+
a_byte_in_a_variant
|
228
|
+
)
|
229
|
+
@iface["MyByte"] = DBus.variant("y", 1)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
186
233
|
context "marshall.yaml round-trip via a VARIANT property" do
|
187
234
|
marshall_yaml.each do |test|
|
188
235
|
t = OpenStruct.new(test)
|
data/spec/service_newapi.rb
CHANGED
@@ -28,6 +28,8 @@ class Test < DBus::Object
|
|
28
28
|
"three" => [3, 3, 3]
|
29
29
|
}
|
30
30
|
@my_variant = @my_array.dup
|
31
|
+
# 201 is a RET instruction for ZX Spectrum which has turned 40 recently
|
32
|
+
@my_byte = 201
|
31
33
|
@main_loop = nil
|
32
34
|
end
|
33
35
|
|
@@ -111,6 +113,8 @@ class Test < DBus::Object
|
|
111
113
|
dbus_attr_accessor :my_array, "aq"
|
112
114
|
dbus_attr_accessor :my_dict, "a{sv}"
|
113
115
|
dbus_attr_accessor :my_variant, "v"
|
116
|
+
|
117
|
+
dbus_attr_accessor :my_byte, "y"
|
114
118
|
end
|
115
119
|
|
116
120
|
# closing and reopening the same interface
|
data/spec/type_spec.rb
CHANGED
@@ -45,6 +45,7 @@ describe DBus do
|
|
45
45
|
["a{vs}", "DICT_ENTRY key must be basic (non-container)"],
|
46
46
|
["{sv}", "DICT_ENTRY not an immediate child of an ARRAY"],
|
47
47
|
["a({sv})", "DICT_ENTRY not an immediate child of an ARRAY"],
|
48
|
+
["a{s", "DICT_ENTRY not closed"],
|
48
49
|
["a{sv", "DICT_ENTRY not closed"],
|
49
50
|
["}", "DICT_ENTRY unexpectedly closed"],
|
50
51
|
|
@@ -79,4 +80,148 @@ describe DBus do
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
end
|
83
|
+
|
84
|
+
describe DBus::Type do
|
85
|
+
let(:as1) { DBus.type("as") }
|
86
|
+
let(:as2) { DBus.type("as") }
|
87
|
+
let(:aas) { DBus.type("aas") }
|
88
|
+
|
89
|
+
describe "#==" do
|
90
|
+
it "is true for same types" do
|
91
|
+
expect(as1).to eq(as2)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "is true for a type and its string representation" do
|
95
|
+
expect(as1).to eq("as")
|
96
|
+
end
|
97
|
+
|
98
|
+
it "is false for different types" do
|
99
|
+
expect(as1).to_not eq(aas)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "is false for a type and a different string" do
|
103
|
+
expect(as1).to_not eq("aas")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#eql?" do
|
108
|
+
it "is true for same types" do
|
109
|
+
expect(as1).to eql(as2)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "is false for a type and its string representation" do
|
113
|
+
expect(as1).to_not eql("as")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "is false for different types" do
|
117
|
+
expect(as1).to_not eql(aas)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "is false for a type and a different string" do
|
121
|
+
expect(as1).to_not eql("aas")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#<<" do
|
126
|
+
it "raises if the argument is not a Type" do
|
127
|
+
t = DBus::Type.new(DBus::Type::ARRAY)
|
128
|
+
expect { t << "s" }.to raise_error(ArgumentError)
|
129
|
+
end
|
130
|
+
|
131
|
+
# TODO: the following raise checks do not occur in practice, as there are
|
132
|
+
# parallel checks in the parses. The code could be simplified?
|
133
|
+
it "raises if adding too much to an array" do
|
134
|
+
t = DBus::Type.new(DBus::Type::ARRAY)
|
135
|
+
b = DBus::Type.new(DBus::Type::BOOLEAN)
|
136
|
+
t << b
|
137
|
+
expect { t << b }.to raise_error(DBus::Type::SignatureException)
|
138
|
+
end
|
139
|
+
|
140
|
+
it "raises if adding too much to a dict_entry" do
|
141
|
+
t = DBus::Type.new(DBus::Type::DICT_ENTRY, abstract: true)
|
142
|
+
b = DBus::Type.new(DBus::Type::BOOLEAN)
|
143
|
+
t << b
|
144
|
+
t << b
|
145
|
+
expect { t << b }.to raise_error(DBus::Type::SignatureException)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "raises if adding to a non-container" do
|
149
|
+
t = DBus::Type.new(DBus::Type::STRING)
|
150
|
+
b = DBus::Type.new(DBus::Type::BOOLEAN)
|
151
|
+
expect { t << b }.to raise_error(DBus::Type::SignatureException)
|
152
|
+
|
153
|
+
t = DBus::Type.new(DBus::Type::VARIANT)
|
154
|
+
expect { t << b }.to raise_error(DBus::Type::SignatureException)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe DBus::Type::Array do
|
159
|
+
describe ".[]" do
|
160
|
+
it "takes Type argument" do
|
161
|
+
t = DBus::Type::Array[DBus::Type.new("s")]
|
162
|
+
expect(t.to_s).to eq "as"
|
163
|
+
end
|
164
|
+
|
165
|
+
it "takes 's':String argument" do
|
166
|
+
t = DBus::Type::Array["s"]
|
167
|
+
expect(t.to_s).to eq "as"
|
168
|
+
end
|
169
|
+
|
170
|
+
it "takes String:Class argument" do
|
171
|
+
t = DBus::Type::Array[String]
|
172
|
+
expect(t.to_s).to eq "as"
|
173
|
+
end
|
174
|
+
|
175
|
+
it "rejects Integer:Class argument" do
|
176
|
+
expect { DBus::Type::Array[Integer] }.to raise_error(ArgumentError)
|
177
|
+
end
|
178
|
+
|
179
|
+
it "rejects /./:Regexp argument" do
|
180
|
+
expect { DBus::Type::Array[/./] }.to raise_error(ArgumentError)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe DBus::Type::Hash do
|
186
|
+
describe ".[]" do
|
187
|
+
it "takes Type arguments" do
|
188
|
+
t = DBus::Type::Hash[DBus::Type.new("s"), DBus::Type.new("v")]
|
189
|
+
expect(t.to_s).to eq "a{sv}"
|
190
|
+
end
|
191
|
+
|
192
|
+
it "takes 's':String arguments" do
|
193
|
+
t = DBus::Type::Hash["s", "v"]
|
194
|
+
expect(t.to_s).to eq "a{sv}"
|
195
|
+
end
|
196
|
+
|
197
|
+
it "takes String:Class argument" do
|
198
|
+
t = DBus::Type::Hash[String, DBus::Type::VARIANT]
|
199
|
+
expect(t.to_s).to eq "a{sv}"
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe DBus::Type::Struct do
|
205
|
+
describe ".[]" do
|
206
|
+
it "takes Type arguments" do
|
207
|
+
t = DBus::Type::Struct[DBus::Type.new("s"), DBus::Type.new("v")]
|
208
|
+
expect(t.to_s).to eq "(sv)"
|
209
|
+
end
|
210
|
+
|
211
|
+
it "takes 's':String arguments" do
|
212
|
+
t = DBus::Type::Struct["s", "v"]
|
213
|
+
expect(t.to_s).to eq "(sv)"
|
214
|
+
end
|
215
|
+
|
216
|
+
it "takes String:Class argument" do
|
217
|
+
t = DBus::Type::Struct[String, DBus::Type::VARIANT]
|
218
|
+
expect(t.to_s).to eq "(sv)"
|
219
|
+
end
|
220
|
+
|
221
|
+
it "raises on no arguments" do
|
222
|
+
expect { DBus::Type::Struct[] }.to raise_error(ArgumentError)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
82
227
|
end
|
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.18.0.
|
4
|
+
version: 0.18.0.beta7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruby DBus Team
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rexml
|
@@ -202,7 +202,7 @@ homepage: https://github.com/mvidner/ruby-dbus
|
|
202
202
|
licenses:
|
203
203
|
- LGPL-2.1
|
204
204
|
metadata: {}
|
205
|
-
post_install_message:
|
205
|
+
post_install_message:
|
206
206
|
rdoc_options: []
|
207
207
|
require_paths:
|
208
208
|
- lib
|
@@ -217,9 +217,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
217
217
|
- !ruby/object:Gem::Version
|
218
218
|
version: 1.3.1
|
219
219
|
requirements: []
|
220
|
-
|
221
|
-
|
222
|
-
signing_key:
|
220
|
+
rubygems_version: 3.3.0.dev
|
221
|
+
signing_key:
|
223
222
|
specification_version: 4
|
224
223
|
summary: Ruby module for interaction with D-Bus
|
225
224
|
test_files: []
|