ruby-dbus 0.14.0 → 0.17.0

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 (44) hide show
  1. checksums.yaml +5 -5
  2. data/NEWS.md +44 -0
  3. data/README.md +3 -5
  4. data/Rakefile +26 -8
  5. data/VERSION +1 -1
  6. data/doc/Reference.md +84 -1
  7. data/examples/doc/_extract_examples +5 -0
  8. data/examples/gdbus/gdbus +21 -20
  9. data/examples/service/call_service.rb +1 -1
  10. data/lib/dbus/auth.rb +8 -8
  11. data/lib/dbus/bus.rb +23 -11
  12. data/lib/dbus/bus_name.rb +27 -0
  13. data/lib/dbus/core_ext/class/attribute.rb +23 -41
  14. data/lib/dbus/core_ext/module/redefine_method.rb +51 -0
  15. data/lib/dbus/introspect.rb +71 -26
  16. data/lib/dbus/marshall.rb +2 -1
  17. data/lib/dbus/message_queue.rb +17 -14
  18. data/lib/dbus/object.rb +380 -0
  19. data/lib/dbus/object_path.rb +24 -0
  20. data/lib/dbus/proxy_object.rb +11 -2
  21. data/lib/dbus/proxy_object_interface.rb +1 -0
  22. data/lib/dbus/type.rb +18 -0
  23. data/lib/dbus/xml.rb +4 -8
  24. data/lib/dbus.rb +3 -2
  25. data/ruby-dbus.gemspec +11 -9
  26. data/spec/binding_spec.rb +6 -2
  27. data/spec/bus_name_spec.rb +25 -0
  28. data/spec/client_robustness_spec.rb +25 -0
  29. data/spec/introspect_xml_parser_spec.rb +13 -13
  30. data/spec/main_loop_spec.rb +1 -1
  31. data/spec/object_path_spec.rb +23 -0
  32. data/spec/property_spec.rb +53 -3
  33. data/spec/proxy_object_spec.rb +9 -0
  34. data/spec/service_newapi.rb +20 -66
  35. data/spec/session_bus_spec.rb +6 -6
  36. data/spec/signal_spec.rb +33 -18
  37. data/spec/spec_helper.rb +23 -11
  38. data/spec/tools/dbus-limited-session.conf +4 -0
  39. data/spec/type_spec.rb +2 -2
  40. metadata +32 -15
  41. data/lib/dbus/core_ext/array/extract_options.rb +0 -31
  42. data/lib/dbus/core_ext/kernel/singleton_class.rb +0 -8
  43. data/lib/dbus/core_ext/module/remove_method.rb +0 -14
  44. data/lib/dbus/export.rb +0 -130
@@ -70,7 +70,7 @@ describe "MainLoopTest" do
70
70
  @obj.on_signal "LongTaskEnd"
71
71
  end
72
72
 
73
- it "tests loop quit" do
73
+ it "tests loop quit", slow: true do
74
74
  test_loop_quit 1
75
75
  end
76
76
 
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env rspec
2
+ require_relative "spec_helper"
3
+ require "dbus"
4
+
5
+ describe DBus::ObjectPath do
6
+ describe ".valid?" do
7
+ it "recognizes valid paths" do
8
+ expect(described_class.valid?("/")).to be_truthy
9
+ expect(described_class.valid?("/99Numbers/_And_Underscores/anywhere")).to be_truthy
10
+ long_name = "/A23456789" * 42
11
+ # no 255 character limit for object paths
12
+ expect(described_class.valid?(long_name)).to be_truthy
13
+ end
14
+
15
+ it "recognizes invalid paths" do
16
+ expect(described_class.valid?("")).to be_falsey
17
+ expect(described_class.valid?("/Empty//Component")).to be_falsey
18
+ expect(described_class.valid?("/EmptyLastComponent/")).to be_falsey
19
+ expect(described_class.valid?("/Invalid Character")).to be_falsey
20
+ expect(described_class.valid?("/Invalid-Character")).to be_falsey
21
+ end
22
+ end
23
+ end
@@ -4,8 +4,8 @@ require "dbus"
4
4
 
5
5
  describe "PropertyTest" do
6
6
  before(:each) do
7
- session_bus = DBus::ASessionBus.new
8
- @svc = session_bus.service("org.ruby.service")
7
+ @session_bus = DBus::ASessionBus.new
8
+ @svc = @session_bus.service("org.ruby.service")
9
9
  @obj = @svc.object("/org/ruby/MyInstance")
10
10
  @iface = @obj["org.ruby.SampleInterface"]
11
11
  end
@@ -21,6 +21,10 @@ describe "PropertyTest" do
21
21
  expect(iface["ReadMe"]).to eq("READ ME")
22
22
  end
23
23
 
24
+ it "gets an error when reading a property whose implementation raises" do
25
+ expect { @iface["Explosive"] }.to raise_error(DBus::Error, /Something failed/)
26
+ end
27
+
24
28
  it "tests property nonreading" do
25
29
  expect { @iface["WriteMe"] }.to raise_error(DBus::Error, /not readable/)
26
30
  end
@@ -31,7 +35,7 @@ describe "PropertyTest" do
31
35
  end
32
36
 
33
37
  # https://github.com/mvidner/ruby-dbus/pull/19
34
- it "tests service select timeout" do
38
+ it "tests service select timeout", slow: true do
35
39
  @iface["ReadOrWriteMe"] = "VALUE"
36
40
  expect(@iface["ReadOrWriteMe"]).to eq("VALUE")
37
41
  # wait for the service to become idle
@@ -64,4 +68,50 @@ describe "PropertyTest" do
64
68
  it "tests unknown property writing" do
65
69
  expect { @iface["Spoon"] = "FPRK" }.to raise_error(DBus::Error, /not found/)
66
70
  end
71
+
72
+ it "errors for a property on an unknown interface" do
73
+ # our idiomatic way would error out on interface lookup already,
74
+ # so do it the low level way
75
+ prop_if = @obj[DBus::PROPERTY_INTERFACE]
76
+ expect { prop_if.Get("org.ruby.NoSuchInterface", "SomeProperty") }.to raise_error(DBus::Error) do |e|
77
+ expect(e.name).to match(/UnknownProperty/)
78
+ expect(e.message).to match(/no such interface/)
79
+ end
80
+ end
81
+
82
+ it "errors for GetAll on an unknown interface" do
83
+ # no idiomatic way?
84
+ # so do it the low level way
85
+ prop_if = @obj[DBus::PROPERTY_INTERFACE]
86
+ expect { prop_if.GetAll("org.ruby.NoSuchInterface") }.to raise_error(DBus::Error) do |e|
87
+ expect(e.name).to match(/UnknownProperty/)
88
+ expect(e.message).to match(/no such interface/)
89
+ end
90
+ end
91
+
92
+ it "receives a PropertiesChanged signal", slow: true do
93
+ received = {}
94
+
95
+ # TODO: for client side, provide a helper on_properties_changed,
96
+ # or automate it even more in ProxyObject, ProxyObjectInterface
97
+ prop_if = @obj[DBus::PROPERTY_INTERFACE]
98
+ prop_if.on_signal("PropertiesChanged") do |_interface_name, changed_props, _invalidated_props|
99
+ received.merge!(changed_props)
100
+ end
101
+
102
+ @iface["ReadOrWriteMe"] = "VALUE"
103
+
104
+ # loop to process the signal. complicated :-( see signal_spec.rb
105
+ loop = DBus::Main.new
106
+ loop << @session_bus
107
+ quitter = Thread.new do
108
+ sleep 1
109
+ loop.quit
110
+ end
111
+ loop.run
112
+ # quitter has told loop.run to quit
113
+ quitter.join
114
+
115
+ expect(received["ReadOrWriteMe"]).to eq("VALUE")
116
+ end
67
117
  end
@@ -38,5 +38,14 @@ describe DBus::ProxyObject do
38
38
  end
39
39
  end
40
40
  end
41
+
42
+ describe "#[]" do
43
+ it "raises when the interface is not found" do
44
+ obj = svc["/org/ruby/MyInstance"]
45
+ expect { obj["org.ruby.NoSuchInterface"] }.to raise_error(DBus::Error) do |e|
46
+ expect(e.message).to match(/no such interface/)
47
+ end
48
+ end
49
+ end
41
50
  end
42
51
  end
@@ -59,6 +59,26 @@ class Test < DBus::Object
59
59
  dbus_method :mirror_byte_array, "in bytes:ay, out mirrored:ay" do |bytes|
60
60
  [bytes]
61
61
  end
62
+
63
+ # Properties:
64
+ # ReadMe:string, returns "READ ME" at first, then what WriteMe received
65
+ # WriteMe:string
66
+ # ReadOrWriteMe:string, returns "READ OR WRITE ME" at first
67
+ dbus_attr_accessor :read_or_write_me, "s"
68
+ dbus_attr_reader :read_me, "s"
69
+
70
+ def write_me=(value)
71
+ @read_me = value
72
+ end
73
+ dbus_writer :write_me, "s"
74
+
75
+ dbus_attr_writer :password, "s"
76
+
77
+ # a property that raises when client tries to read it
78
+ def explosive
79
+ raise "Something failed"
80
+ end
81
+ dbus_reader :explosive, "s"
62
82
  end
63
83
 
64
84
  # closing and reopening the same interface
@@ -118,72 +138,6 @@ class Test < DBus::Object
118
138
  dbus_signal :LongTaskStart
119
139
  dbus_signal :LongTaskEnd
120
140
  end
121
-
122
- # Properties:
123
- # ReadMe:string, returns "READ ME" at first, then what WriteMe received
124
- # WriteMe:string
125
- # ReadOrWriteMe:string, returns "READ OR WRITE ME" at first
126
- dbus_interface PROPERTY_INTERFACE do
127
- dbus_method :Get, "in interface:s, in propname:s, out value:v" do |interface, propname|
128
- unless interface == INTERFACE
129
- raise DBus.error("org.freedesktop.DBus.Error.UnknownInterface"),
130
- "Interface '#{interface}' not found on object '#{@path}'"
131
- end
132
-
133
- case propname
134
- when "ReadMe"
135
- [@read_me]
136
- when "ReadOrWriteMe"
137
- [@read_or_write_me]
138
- when "WriteMe"
139
- raise DBus.error("org.freedesktop.DBus.Error.InvalidArgs"),
140
- "Property '#{interface}.#{propname}' (on object '#{@path}') is not readable"
141
- else
142
- # what should happen for unknown properties
143
- # plasma: InvalidArgs (propname), UnknownInterface (interface)
144
- raise DBus.error("org.freedesktop.DBus.Error.InvalidArgs"),
145
- "Property '#{interface}.#{propname}' not found on object '#{@path}'"
146
- end
147
- end
148
-
149
- dbus_method :Set, "in interface:s, in propname:s, in value:v" do |interface, propname, value|
150
- unless interface == INTERFACE
151
- raise DBus.error("org.freedesktop.DBus.Error.UnknownInterface"),
152
- "Interface '#{interface}' not found on object '#{@path}'"
153
- end
154
-
155
- case propname
156
- when "ReadMe"
157
- raise DBus.error("org.freedesktop.DBus.Error.InvalidArgs"),
158
- "Property '#{interface}.#{propname}' (on object '#{@path}') is not writable"
159
- when "ReadOrWriteMe"
160
- @read_or_write_me = value
161
- self.PropertiesChanged(interface, { propname => value }, [])
162
- when "WriteMe"
163
- @read_me = value
164
- self.PropertiesChanged(interface, { "ReadMe" => value }, [])
165
- else
166
- raise DBus.error("org.freedesktop.DBus.Error.InvalidArgs"),
167
- "Property '#{interface}.#{propname}' not found on object '#{@path}'"
168
- end
169
- end
170
-
171
- dbus_method :GetAll, "in interface:s, out value:a{sv}" do |interface|
172
- unless interface == INTERFACE
173
- raise DBus.error("org.freedesktop.DBus.Error.UnknownInterface"),
174
- "Interface '#{interface}' not found on object '#{@path}'"
175
- end
176
-
177
- [
178
- {
179
- "ReadMe" => @read_me,
180
- "ReadOrWriteMe" => @read_or_write_me
181
- }
182
- ]
183
- end
184
-
185
- dbus_signal :PropertiesChanged, "interface:s, changed_properties:a{sv}, invalidated_properties:as"
186
- end
187
141
  end
188
142
 
189
143
  class Derived < Test
@@ -37,31 +37,31 @@ describe DBus::ASessionBus do
37
37
 
38
38
  context "when DBUS_SESSION_BUS_ADDRESS from file is surrounded by quotation marks" do
39
39
  it "returns session bus address without single quotation marks" do
40
- expect(File).to receive(:open).with(session_bus_file_path) { <<-EOS.gsub(/^\s*/, "") }
40
+ expect(File).to receive(:open).with(session_bus_file_path) { <<-TEXT.gsub(/^\s*/, "") }
41
41
  DBUS_SESSION_BUS_ADDRESS='#{dbus_session_bus_address}'
42
42
  DBUS_SESSION_BUS_PID=12345
43
43
  DBUS_SESSION_BUS_WINDOWID=12345678
44
- EOS
44
+ TEXT
45
45
  expect(DBus::ASessionBus.address_from_file).to eq(dbus_session_bus_address)
46
46
  end
47
47
 
48
48
  it "returns session bus address without double quotation marks" do
49
- expect(File).to receive(:open).with(session_bus_file_path) { <<-EOS.gsub(/^\s*/, "") }
49
+ expect(File).to receive(:open).with(session_bus_file_path) { <<-TEXT.gsub(/^\s*/, "") }
50
50
  DBUS_SESSION_BUS_ADDRESS="#{dbus_session_bus_address}"
51
51
  DBUS_SESSION_BUS_PID=12345
52
52
  DBUS_SESSION_BUS_WINDOWID=12345678
53
- EOS
53
+ TEXT
54
54
  expect(DBus::ASessionBus.address_from_file).to eq(dbus_session_bus_address)
55
55
  end
56
56
  end
57
57
 
58
58
  context "when DBUS_SESSION_BUS_ADDRESS from file is not surrounded by any quotation marks" do
59
59
  it "returns session bus address as it is" do
60
- expect(File).to receive(:open).with(session_bus_file_path) { <<-EOS.gsub(/^\s*/, "") }
60
+ expect(File).to receive(:open).with(session_bus_file_path) { <<-TEXT.gsub(/^\s*/, "") }
61
61
  DBUS_SESSION_BUS_ADDRESS=#{dbus_session_bus_address}
62
62
  DBUS_SESSION_BUS_PID=12345
63
63
  DBUS_SESSION_BUS_WINDOWID=12345678
64
- EOS
64
+ TEXT
65
65
  expect(DBus::ASessionBus.address_from_file).to eq(dbus_session_bus_address)
66
66
  end
67
67
  end
data/spec/signal_spec.rb CHANGED
@@ -3,6 +3,19 @@
3
3
  require_relative "spec_helper"
4
4
  require "dbus"
5
5
 
6
+ def new_quitter(main_loop)
7
+ Thread.new do
8
+ DBus.logger.debug "sleep before quit"
9
+ # FIXME: if we sleep for too long
10
+ # the socket will be drained and we deadlock in a select.
11
+ # It could be worked around by sending ourselves a Unix signal
12
+ # (with a dummy handler) to interrupt the select
13
+ sleep 1
14
+ DBus.logger.debug "will quit"
15
+ main_loop.quit
16
+ end
17
+ end
18
+
6
19
  describe "SignalHandlerTest" do
7
20
  before(:each) do
8
21
  @session_bus = DBus::ASessionBus.new
@@ -16,7 +29,7 @@ describe "SignalHandlerTest" do
16
29
  end
17
30
 
18
31
  # testing for commit 017c83 (kkaempf)
19
- it "tests overriding a handler" do
32
+ it "tests overriding a handler", slow: true do
20
33
  DBus.logger.debug "Inside test_overriding_a_handler"
21
34
  counter = 0
22
35
 
@@ -32,23 +45,14 @@ describe "SignalHandlerTest" do
32
45
  DBus.logger.debug "will begin"
33
46
  @obj.LongTaskBegin 3
34
47
 
35
- quitter = Thread.new do
36
- DBus.logger.debug "sleep before quit"
37
- # FIXME: if we sleep for too long
38
- # the socket will be drained and we deadlock in a select.
39
- # It could be worked around by sending ourselves a Unix signal
40
- # (with a dummy handler) to interrupt the select
41
- sleep 1
42
- DBus.logger.debug "will quit"
43
- @loop.quit
44
- end
48
+ quitter = new_quitter(@loop)
45
49
  @loop.run
46
50
  quitter.join
47
51
 
48
52
  expect(counter).to eq(1)
49
53
  end
50
54
 
51
- it "tests on signal overload" do
55
+ it "tests on signal overload", slow: true do
52
56
  DBus.logger.debug "Inside test_on_signal_overload"
53
57
  counter = 0
54
58
  started = false
@@ -60,12 +64,7 @@ describe "SignalHandlerTest" do
60
64
  counter += 1
61
65
  end
62
66
  @obj.LongTaskBegin 3
63
- quitter = Thread.new do
64
- DBus.logger.debug "sleep before quit"
65
- sleep 1
66
- DBus.logger.debug "will quit"
67
- @loop.quit
68
- end
67
+ quitter = new_quitter(@loop)
69
68
  @loop.run
70
69
  quitter.join
71
70
 
@@ -75,6 +74,22 @@ describe "SignalHandlerTest" do
75
74
  expect { @intf.on_signal "to", "many", "yarrrrr!" }.to raise_error(ArgumentError)
76
75
  end
77
76
 
77
+ it "is possible to add signal handlers from within handlers", slow: true do
78
+ ended = false
79
+ @intf.on_signal "LongTaskStart" do
80
+ @intf.on_signal "LongTaskEnd" do
81
+ ended = true
82
+ end
83
+ end
84
+
85
+ @obj.LongTaskBegin 3
86
+ quitter = new_quitter(@loop)
87
+ @loop.run
88
+ quitter.join
89
+
90
+ expect(ended).to eq(true)
91
+ end
92
+
78
93
  it "tests too many rules" do
79
94
  100.times do
80
95
  @obj.on_signal "Whichever" do
data/spec/spec_helper.rb CHANGED
@@ -2,8 +2,7 @@ coverage = if ENV["COVERAGE"]
2
2
  ENV["COVERAGE"] == "true"
3
3
  else
4
4
  # heuristics: enable for interactive builds (but not in OBS)
5
- # or in Travis
6
- ENV["DISPLAY"] || ENV["TRAVIS"]
5
+ ENV["DISPLAY"]
7
6
  end
8
7
 
9
8
  if coverage
@@ -15,11 +14,24 @@ if coverage
15
14
  # do not cover the activesupport helpers
16
15
  SimpleCov.add_filter "/core_ext/"
17
16
 
18
- # use coveralls for on-line code coverage reporting at Travis CI
19
- if ENV["TRAVIS"]
20
- require "coveralls"
21
- end
22
17
  SimpleCov.start
18
+
19
+ # additionally use the LCOV format for on-line code coverage reporting at CI
20
+ if ENV["COVERAGE_LCOV"] == "true"
21
+ require "simplecov-lcov"
22
+
23
+ SimpleCov::Formatter::LcovFormatter.config do |c|
24
+ c.report_with_single_file = true
25
+ # this is the default Coveralls GitHub Action location
26
+ # https://github.com/marketplace/actions/coveralls-github-action
27
+ c.single_report_path = "coverage/lcov.info"
28
+ end
29
+
30
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
31
+ SimpleCov::Formatter::HTMLFormatter,
32
+ SimpleCov::Formatter::LcovFormatter
33
+ ]
34
+ end
23
35
  end
24
36
 
25
37
  $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
@@ -92,11 +104,11 @@ def with_service_by_activation(&block)
92
104
  FileUtils.mkdir_p service_dir
93
105
  # file name actually does not need to match the service name
94
106
  File.open("#{service_dir}/#{name}.service", "w") do |f|
95
- s = <<EOS
96
- [D-BUS Service]
97
- Name=#{name}
98
- Exec=#{exec}
99
- EOS
107
+ s = <<-TEXT.gsub(/^\s*/, "")
108
+ [D-BUS Service]
109
+ Name=#{name}
110
+ Exec=#{exec}
111
+ TEXT
100
112
  f.write(s)
101
113
  end
102
114
 
@@ -25,4 +25,8 @@
25
25
  Instead, lower some so that we can test resource leaks. -->
26
26
  <limit name="max_match_rules_per_connection">50</limit><!-- was 512 -->
27
27
 
28
+ <!--
29
+ dbus-daemon[1700]: [session uid=1001 pid=1700] Unable to set up new connection: Failed to get AppArmor confinement information of socket peer: Protocol not available
30
+ -->
31
+ <apparmor mode="disabled"/>
28
32
  </busconfig>
data/spec/type_spec.rb CHANGED
@@ -4,13 +4,13 @@ require "dbus"
4
4
 
5
5
  describe DBus do
6
6
  describe ".type" do
7
- %w{i ai a(ii) aai}.each do |s|
7
+ ["i", "ai", "a(ii)", "aai"].each do |s|
8
8
  it "parses some type #{s}" do
9
9
  expect(DBus.type(s).to_s).to be_eql s
10
10
  end
11
11
  end
12
12
 
13
- %w{aa (ii ii) hrmp}.each do |s|
13
+ ["aa", "(ii", "ii)", "hrmp"].each do |s|
14
14
  it "raises exception for invalid type #{s}" do
15
15
  expect { DBus.type(s).to_s }.to raise_error DBus::Type::SignatureException
16
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.14.0
4
+ version: 0.17.0
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: 2017-10-13 00:00:00.000000000 Z
11
+ date: 2022-02-11 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: 0.50.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: 0.50.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: simplecov
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,8 +94,22 @@ 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
- email: ruby-dbus-devel@lists.luon.net
112
+ email: martin.github@vidner.net
99
113
  executables: []
100
114
  extensions: []
101
115
  extra_rdoc_files: []
@@ -127,18 +141,18 @@ files:
127
141
  - lib/dbus/api_options.rb
128
142
  - lib/dbus/auth.rb
129
143
  - lib/dbus/bus.rb
130
- - lib/dbus/core_ext/array/extract_options.rb
144
+ - lib/dbus/bus_name.rb
131
145
  - lib/dbus/core_ext/class/attribute.rb
132
- - lib/dbus/core_ext/kernel/singleton_class.rb
133
- - lib/dbus/core_ext/module/remove_method.rb
146
+ - lib/dbus/core_ext/module/redefine_method.rb
134
147
  - lib/dbus/error.rb
135
- - lib/dbus/export.rb
136
148
  - lib/dbus/introspect.rb
137
149
  - lib/dbus/logger.rb
138
150
  - lib/dbus/marshall.rb
139
151
  - lib/dbus/matchrule.rb
140
152
  - lib/dbus/message.rb
141
153
  - lib/dbus/message_queue.rb
154
+ - lib/dbus/object.rb
155
+ - lib/dbus/object_path.rb
142
156
  - lib/dbus/proxy_object.rb
143
157
  - lib/dbus/proxy_object_factory.rb
144
158
  - lib/dbus/proxy_object_interface.rb
@@ -149,12 +163,15 @@ files:
149
163
  - spec/binding_spec.rb
150
164
  - spec/bus_and_xml_backend_spec.rb
151
165
  - spec/bus_driver_spec.rb
166
+ - spec/bus_name_spec.rb
152
167
  - spec/bus_spec.rb
153
168
  - spec/byte_array_spec.rb
169
+ - spec/client_robustness_spec.rb
154
170
  - spec/err_msg_spec.rb
155
171
  - spec/introspect_xml_parser_spec.rb
156
172
  - spec/introspection_spec.rb
157
173
  - spec/main_loop_spec.rb
174
+ - spec/object_path_spec.rb
158
175
  - spec/property_spec.rb
159
176
  - spec/proxy_object_spec.rb
160
177
  - spec/server_robustness_spec.rb
@@ -172,9 +189,9 @@ files:
172
189
  - spec/type_spec.rb
173
190
  - spec/value_spec.rb
174
191
  - spec/variant_spec.rb
175
- homepage: https://trac.luon.net/ruby-dbus
192
+ homepage: https://github.com/mvidner/ruby-dbus
176
193
  licenses:
177
- - LGPL v2.1
194
+ - LGPL-2.1
178
195
  metadata: {}
179
196
  post_install_message:
180
197
  rdoc_options: []
@@ -184,7 +201,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
184
201
  requirements:
185
202
  - - ">="
186
203
  - !ruby/object:Gem::Version
187
- version: 2.0.0
204
+ version: 2.1.0
188
205
  required_rubygems_version: !ruby/object:Gem::Requirement
189
206
  requirements:
190
207
  - - ">="
@@ -192,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
192
209
  version: '0'
193
210
  requirements: []
194
211
  rubyforge_project:
195
- rubygems_version: 2.2.5
212
+ rubygems_version: 2.7.6.3
196
213
  signing_key:
197
214
  specification_version: 4
198
215
  summary: Ruby module for interaction with D-Bus
@@ -1,31 +0,0 @@
1
- # copied from activesupport/core_ext from Rails, MIT license
2
- # https://github.com/rails/rails/tree/5aa869861c192daceafe3a3ee50eb93f5a2b7bd2/activesupport/lib/active_support/core_ext
3
- class Hash
4
- # By default, only instances of Hash itself are extractable.
5
- # Subclasses of Hash may implement this method and return
6
- # true to declare themselves as extractable. If a Hash
7
- # is extractable, Array#extract_options! pops it from
8
- # the Array when it is the last element of the Array.
9
- def extractable_options?
10
- instance_of?(Hash)
11
- end
12
- end
13
-
14
- class Array
15
- # Extracts options from a set of arguments. Removes and returns the last
16
- # element in the array if it's a hash, otherwise returns a blank hash.
17
- #
18
- # def options(*args)
19
- # args.extract_options!
20
- # end
21
- #
22
- # options(1, 2) # => {}
23
- # options(1, 2, a: :b) # => {:a=>:b}
24
- def extract_options!
25
- if last.is_a?(Hash) && last.extractable_options?
26
- pop
27
- else
28
- {}
29
- end
30
- end
31
- end
@@ -1,8 +0,0 @@
1
- # copied from activesupport/core_ext from Rails, MIT license
2
- # https://github.com/rails/rails/tree/5aa869861c192daceafe3a3ee50eb93f5a2b7bd2/activesupport/lib/active_support/core_ext
3
- module Kernel
4
- # class_eval on an object acts like singleton_class.class_eval.
5
- def class_eval(*args, &block)
6
- singleton_class.class_eval(*args, &block)
7
- end
8
- end
@@ -1,14 +0,0 @@
1
- # copied from activesupport/core_ext from Rails, MIT license
2
- # https://github.com/rails/rails/tree/5aa869861c192daceafe3a3ee50eb93f5a2b7bd2/activesupport/lib/active_support/core_ext
3
- class Module
4
- def remove_possible_method(method)
5
- if method_defined?(method) || private_method_defined?(method)
6
- undef_method(method)
7
- end
8
- end
9
-
10
- def redefine_method(method, &block)
11
- remove_possible_method(method)
12
- define_method(method, &block)
13
- end
14
- end