ruby-dbus 0.16.0 → 0.18.1

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +160 -0
  3. data/README.md +3 -5
  4. data/Rakefile +18 -8
  5. data/VERSION +1 -1
  6. data/doc/Reference.md +106 -7
  7. data/examples/doc/_extract_examples +7 -0
  8. data/examples/gdbus/gdbus +31 -24
  9. data/examples/no-introspect/nm-test.rb +2 -0
  10. data/examples/no-introspect/tracker-test.rb +3 -1
  11. data/examples/rhythmbox/playpause.rb +2 -1
  12. data/examples/service/call_service.rb +2 -1
  13. data/examples/service/complex-property.rb +21 -0
  14. data/examples/service/service_newapi.rb +1 -1
  15. data/examples/simple/call_introspect.rb +1 -0
  16. data/examples/simple/get_id.rb +2 -1
  17. data/examples/simple/properties.rb +2 -0
  18. data/examples/utils/listnames.rb +1 -0
  19. data/examples/utils/notify.rb +1 -0
  20. data/lib/dbus/api_options.rb +9 -0
  21. data/lib/dbus/auth.rb +20 -15
  22. data/lib/dbus/bus.rb +123 -75
  23. data/lib/dbus/bus_name.rb +12 -8
  24. data/lib/dbus/core_ext/class/attribute.rb +1 -1
  25. data/lib/dbus/data.rb +821 -0
  26. data/lib/dbus/emits_changed_signal.rb +83 -0
  27. data/lib/dbus/error.rb +4 -2
  28. data/lib/dbus/introspect.rb +132 -31
  29. data/lib/dbus/logger.rb +3 -1
  30. data/lib/dbus/marshall.rb +247 -296
  31. data/lib/dbus/matchrule.rb +16 -16
  32. data/lib/dbus/message.rb +44 -37
  33. data/lib/dbus/message_queue.rb +16 -10
  34. data/lib/dbus/object.rb +358 -24
  35. data/lib/dbus/object_path.rb +11 -6
  36. data/lib/dbus/proxy_object.rb +22 -1
  37. data/lib/dbus/proxy_object_factory.rb +13 -7
  38. data/lib/dbus/proxy_object_interface.rb +63 -30
  39. data/lib/dbus/raw_message.rb +91 -0
  40. data/lib/dbus/type.rb +318 -86
  41. data/lib/dbus/xml.rb +32 -17
  42. data/lib/dbus.rb +14 -7
  43. data/ruby-dbus.gemspec +7 -3
  44. data/spec/async_spec.rb +2 -0
  45. data/spec/binding_spec.rb +2 -0
  46. data/spec/bus_and_xml_backend_spec.rb +2 -0
  47. data/spec/bus_driver_spec.rb +2 -0
  48. data/spec/bus_name_spec.rb +3 -1
  49. data/spec/bus_spec.rb +2 -0
  50. data/spec/byte_array_spec.rb +2 -0
  51. data/spec/client_robustness_spec.rb +4 -2
  52. data/spec/data/marshall.yaml +1667 -0
  53. data/spec/data_spec.rb +673 -0
  54. data/spec/emits_changed_signal_spec.rb +58 -0
  55. data/spec/err_msg_spec.rb +2 -0
  56. data/spec/introspect_xml_parser_spec.rb +2 -0
  57. data/spec/introspection_spec.rb +2 -0
  58. data/spec/main_loop_spec.rb +3 -1
  59. data/spec/node_spec.rb +23 -0
  60. data/spec/object_path_spec.rb +3 -0
  61. data/spec/object_spec.rb +138 -0
  62. data/spec/packet_marshaller_spec.rb +41 -0
  63. data/spec/packet_unmarshaller_spec.rb +248 -0
  64. data/spec/property_spec.rb +192 -5
  65. data/spec/proxy_object_spec.rb +2 -0
  66. data/spec/server_robustness_spec.rb +2 -0
  67. data/spec/server_spec.rb +2 -0
  68. data/spec/service_newapi.rb +70 -70
  69. data/spec/session_bus_spec.rb +3 -1
  70. data/spec/session_bus_spec_manual.rb +2 -0
  71. data/spec/signal_spec.rb +5 -3
  72. data/spec/spec_helper.rb +37 -9
  73. data/spec/thread_safety_spec.rb +2 -0
  74. data/spec/tools/dbus-limited-session.conf +4 -0
  75. data/spec/type_spec.rb +214 -6
  76. data/spec/value_spec.rb +16 -1
  77. data/spec/variant_spec.rb +4 -2
  78. data/spec/zzz_quit_spec.rb +16 -0
  79. metadata +34 -8
data/spec/type_spec.rb CHANGED
@@ -1,18 +1,226 @@
1
1
  #!/usr/bin/env rspec
2
+ # frozen_string_literal: true
3
+
2
4
  require_relative "spec_helper"
3
5
  require "dbus"
4
6
 
5
7
  describe DBus do
6
8
  describe ".type" do
7
- ["i", "ai", "a(ii)", "aai"].each do |s|
8
- it "parses some type #{s}" do
9
- expect(DBus.type(s).to_s).to be_eql s
9
+ good = [
10
+ "i",
11
+ "ai",
12
+ "a(ii)",
13
+ "aai"
14
+ ]
15
+
16
+ context "valid single types" do
17
+ good.each do |s|
18
+ it "#{s.inspect} is parsed" do
19
+ expect(DBus.type(s).to_s).to eq(s)
20
+ end
21
+ end
22
+ end
23
+
24
+ bad = [
25
+ ["\x00", "Unknown type code"],
26
+ ["!", "Unknown type code"],
27
+
28
+ # ARRAY related
29
+ ["a", "Empty ARRAY"],
30
+ ["aa", "Empty ARRAY"],
31
+
32
+ # STRUCT related
33
+ ["r", "Abstract STRUCT"],
34
+ ["()", "Empty STRUCT"],
35
+ ["(ii", "STRUCT not closed"],
36
+ ["a{i)", "STRUCT unexpectedly closed"],
37
+
38
+ # TODO: deep nesting arrays, structs, combined
39
+
40
+ # DICT_ENTRY related
41
+ ["e", "Abstract DICT_ENTRY"],
42
+ ["a{}", "DICT_ENTRY must have 2 subtypes, found 0"],
43
+ ["a{s}", "DICT_ENTRY must have 2 subtypes, found 1"],
44
+ ["a{sss}", "DICT_ENTRY must have 2 subtypes, found 3"],
45
+ ["a{vs}", "DICT_ENTRY key must be basic (non-container)"],
46
+ ["{sv}", "DICT_ENTRY not an immediate child of an ARRAY"],
47
+ ["a({sv})", "DICT_ENTRY not an immediate child of an ARRAY"],
48
+ ["a{s", "DICT_ENTRY not closed"],
49
+ ["a{sv", "DICT_ENTRY not closed"],
50
+ ["}", "DICT_ENTRY unexpectedly closed"],
51
+
52
+ # Too long
53
+ ["(#{"y" * 254})", "longer than 255"],
54
+
55
+ # not Single Complete Types
56
+ ["", "expecting a Single Complete Type"],
57
+ ["ii", "more than a Single Complete Type"]
58
+ ]
59
+ context "invalid single types" do
60
+ bad.each.each do |s, msg|
61
+ it "#{s.inspect} raises an exception mentioning: #{msg}" do
62
+ rx = Regexp.new(Regexp.quote(msg))
63
+ expect { DBus.type(s) }.to raise_error(DBus::Type::SignatureException, rx)
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ describe ".types" do
70
+ good = [
71
+ "",
72
+ "ii"
73
+ ]
74
+
75
+ context "valid signatures" do
76
+ good.each do |s|
77
+ it "#{s.inspect} is parsed" do
78
+ expect(DBus.types(s).map(&:to_s).join).to eq(s)
79
+ end
10
80
  end
11
81
  end
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
12
220
 
13
- ["aa", "(ii", "ii)", "hrmp"].each do |s|
14
- it "raises exception for invalid type #{s}" do
15
- expect { DBus.type(s).to_s }.to raise_error DBus::Type::SignatureException
221
+ it "raises on no arguments" do
222
+ expect { DBus::Type::Struct[] }.to raise_error(ArgumentError)
223
+ end
16
224
  end
17
225
  end
18
226
  end
data/spec/value_spec.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env rspec
2
- # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
3
+
3
4
  require_relative "spec_helper"
4
5
  require "dbus"
5
6
 
@@ -91,4 +92,18 @@ describe "ValueTest" do
91
92
  it "aligns short integers correctly" do
92
93
  expect(@obj.i16_plus(10, -30)[0]).to eq(-20)
93
94
  end
95
+
96
+ context "structs" do
97
+ it "they are returned as FROZEN arrays" do
98
+ struct = @obj.Coordinates[0]
99
+ expect(struct).to be_an(Array)
100
+ expect(struct).to be_frozen
101
+ end
102
+
103
+ it "they are returned also from structs" do
104
+ struct = @obj.Coordinates2[0]
105
+ expect(struct).to be_an(Array)
106
+ expect(struct).to be_frozen
107
+ end
108
+ end
94
109
  end
data/spec/variant_spec.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env rspec
2
+ # frozen_string_literal: true
3
+
2
4
  # Test marshalling variants according to ruby types
3
5
  require_relative "spec_helper"
4
6
  require "dbus"
@@ -9,8 +11,8 @@ describe "VariantTest" do
9
11
  @svc = @bus.service("org.ruby.service")
10
12
  end
11
13
 
12
- def make_variant(a)
13
- DBus::PacketMarshaller.make_variant(a)
14
+ def make_variant(val)
15
+ DBus::PacketMarshaller.make_variant(val)
14
16
  end
15
17
 
16
18
  it "tests make variant scalar" do
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env rspec
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "spec_helper"
5
+ require "dbus"
6
+
7
+ describe "Quit the service" do
8
+ it "Tells the service to quit and waits, to collate coverage data" do
9
+ session_bus = DBus::ASessionBus.new
10
+ @svc = session_bus.service("org.ruby.service")
11
+ @obj = @svc.object("/org/ruby/MyInstance")
12
+ @obj.default_iface = "org.ruby.SampleInterface"
13
+ @obj.quit
14
+ sleep 3
15
+ end
16
+ end
metadata CHANGED
@@ -1,23 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-dbus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.18.1
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: 2019-10-15 00:00:00.000000000 Z
11
+ date: 2022-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: coveralls
14
+ name: rexml
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
- type: :development
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 0.41.2
75
+ version: '1.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 0.41.2
82
+ version: '1.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov-lcov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: Pure Ruby module for interaction with D-Bus IPC system
98
112
  email: martin.github@vidner.net
99
113
  executables: []
@@ -117,6 +131,7 @@ files:
117
131
  - examples/no-introspect/tracker-test.rb
118
132
  - examples/rhythmbox/playpause.rb
119
133
  - examples/service/call_service.rb
134
+ - examples/service/complex-property.rb
120
135
  - examples/service/service_newapi.rb
121
136
  - examples/simple/call_introspect.rb
122
137
  - examples/simple/get_id.rb
@@ -130,6 +145,8 @@ files:
130
145
  - lib/dbus/bus_name.rb
131
146
  - lib/dbus/core_ext/class/attribute.rb
132
147
  - lib/dbus/core_ext/module/redefine_method.rb
148
+ - lib/dbus/data.rb
149
+ - lib/dbus/emits_changed_signal.rb
133
150
  - lib/dbus/error.rb
134
151
  - lib/dbus/introspect.rb
135
152
  - lib/dbus/logger.rb
@@ -142,6 +159,7 @@ files:
142
159
  - lib/dbus/proxy_object.rb
143
160
  - lib/dbus/proxy_object_factory.rb
144
161
  - lib/dbus/proxy_object_interface.rb
162
+ - lib/dbus/raw_message.rb
145
163
  - lib/dbus/type.rb
146
164
  - lib/dbus/xml.rb
147
165
  - ruby-dbus.gemspec
@@ -153,11 +171,18 @@ files:
153
171
  - spec/bus_spec.rb
154
172
  - spec/byte_array_spec.rb
155
173
  - spec/client_robustness_spec.rb
174
+ - spec/data/marshall.yaml
175
+ - spec/data_spec.rb
176
+ - spec/emits_changed_signal_spec.rb
156
177
  - spec/err_msg_spec.rb
157
178
  - spec/introspect_xml_parser_spec.rb
158
179
  - spec/introspection_spec.rb
159
180
  - spec/main_loop_spec.rb
181
+ - spec/node_spec.rb
160
182
  - spec/object_path_spec.rb
183
+ - spec/object_spec.rb
184
+ - spec/packet_marshaller_spec.rb
185
+ - spec/packet_unmarshaller_spec.rb
161
186
  - spec/property_spec.rb
162
187
  - spec/proxy_object_spec.rb
163
188
  - spec/server_robustness_spec.rb
@@ -175,6 +200,7 @@ files:
175
200
  - spec/type_spec.rb
176
201
  - spec/value_spec.rb
177
202
  - spec/variant_spec.rb
203
+ - spec/zzz_quit_spec.rb
178
204
  homepage: https://github.com/mvidner/ruby-dbus
179
205
  licenses:
180
206
  - LGPL-2.1
@@ -187,7 +213,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
213
  requirements:
188
214
  - - ">="
189
215
  - !ruby/object:Gem::Version
190
- version: 2.0.0
216
+ version: 2.4.0
191
217
  required_rubygems_version: !ruby/object:Gem::Requirement
192
218
  requirements:
193
219
  - - ">="
@@ -195,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
221
  version: '0'
196
222
  requirements: []
197
223
  rubyforge_project:
198
- rubygems_version: 2.7.6
224
+ rubygems_version: 2.7.6.3
199
225
  signing_key:
200
226
  specification_version: 4
201
227
  summary: Ruby module for interaction with D-Bus