ruby-dbus 0.14.1 → 0.15.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ca1c79fb320bdde63e80e01a065481bbb705b75
4
- data.tar.gz: 3a85e1c88c87d352fc2e838f64df72ccf90e4ddf
3
+ metadata.gz: 06e7540fb8468a14731fd8d988828dfe349e687a
4
+ data.tar.gz: 86dbf9d6e8c1947bb87ef4f1ef1a4aefa337f1f6
5
5
  SHA512:
6
- metadata.gz: cced70bcf377786b5e5b28d29fbccdc0513e9535af05dcc2b0580b5eb860fbe0f1822c46aedc910c4c8479ba0f21e5b3927df48d283fd121fc980a49bd015d9b
7
- data.tar.gz: e38930b71af6c62a9dad723001ccdd8bb059d1130b7089b210c1e35334faa3e6d413823abdf70ccaf2af6d49a9116b0afa4fc68135ff7f1936504f7b77d729cf
6
+ metadata.gz: 9347931528a1e83c9b4747b232c3f6e9f8da3968efa7f5fe4a473d6333783a0643823973e91efb35f1c7676a6da0ee6a16eade4176842de6fb4e7aa58c6d5304
7
+ data.tar.gz: c814265c6472dc3b715a0f99ca5c6ea920d26a08dcde3eff573a889779320dc00292d637f976067ba3f6e5ae86cbccc099e56430adf8109147e910169f59e44a
data/NEWS.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## Ruby D-Bus 0.15.0 - 2018-04-30
6
+
7
+ API:
8
+ * Accessing an unknown interface will raise instead of returning nil ([#74]).
9
+
10
+ Bug fixes:
11
+ * Fixed a conflict with activesupport 5.2 ([#71])
12
+
13
+ [#71]: https://github.com/mvidner/ruby-dbus/issues/71
14
+ [#74]: https://github.com/mvidner/ruby-dbus/pull/74
15
+
5
16
  ## Ruby D-Bus 0.14.1 - 2018-01-05
6
17
 
7
18
  Bug fixes:
data/README.md CHANGED
@@ -18,7 +18,7 @@ Ruby D-Bus is a pure Ruby library for writing clients and services for D-Bus.
18
18
  [Coverage Status]: https://coveralls.io/r/mvidner/ruby-dbus
19
19
 
20
20
  [GV img]: https://badge.fury.io/rb/ruby-dbus.png
21
- [BS img]: https://travis-ci.org/mvidner/ruby-dbus.png
21
+ [BS img]: https://travis-ci.org/mvidner/ruby-dbus.png?branch=master
22
22
  [DS img]: https://gemnasium.com/mvidner/ruby-dbus.png
23
23
  [CC img]: https://codeclimate.com/github/mvidner/ruby-dbus.png
24
24
  [CS img]: https://coveralls.io/repos/mvidner/ruby-dbus/badge.png?branch=master
data/Rakefile CHANGED
@@ -29,7 +29,7 @@ task test: :spec
29
29
 
30
30
  RSpec::Core::RakeTask.new("bare:spec")
31
31
 
32
- %w(spec).each do |tname|
32
+ ["spec"].each do |tname|
33
33
  desc "Run bare:#{tname} in the proper environment"
34
34
  task tname do |_t|
35
35
  cd "spec/tools" do
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.14.1
1
+ 0.15.0
@@ -226,7 +226,7 @@ class DBusUI
226
226
 
227
227
  def introspect_services(model, bus)
228
228
  el = @introspect_array.shift
229
- if !(el =~ /^:/)
229
+ if el !~ /^:/
230
230
  iter = model.append(nil)
231
231
  iter[0] = el
232
232
  puts "introspecting: #{el}"
@@ -11,7 +11,6 @@
11
11
  require_relative "dbus/api_options"
12
12
  require_relative "dbus/auth"
13
13
  require_relative "dbus/bus"
14
- require_relative "dbus/core_ext/class/attribute"
15
14
  require_relative "dbus/error"
16
15
  require_relative "dbus/export"
17
16
  require_relative "dbus/introspect"
@@ -73,7 +73,7 @@ module DBus
73
73
  path = File.join(ENV["HOME"], ".dbus-keyrings", context)
74
74
  DBus.logger.debug "path: #{path.inspect}"
75
75
  File.foreach(path) do |line|
76
- if line.index(id) == 0
76
+ if line.index(id).zero?
77
77
  # Right line of file, read cookie
78
78
  cookie = line.split(" ")[2].chomp
79
79
  DBus.logger.debug "cookie: #{cookie.inspect}"
@@ -387,7 +387,7 @@ module DBus
387
387
  # introspect in synchronous !
388
388
  data = introspect_data(dest, path)
389
389
  pof = DBus::ProxyObjectFactory.new(data, self, dest, path)
390
- return pof.build
390
+ pof.build
391
391
  else
392
392
  introspect_data(dest, path) do |async_data|
393
393
  yield(DBus::ProxyObjectFactory.new(async_data, self, dest, path).build)
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
1
2
  # copied from activesupport/core_ext from Rails, MIT license
2
- # https://github.com/rails/rails/tree/5aa869861c192daceafe3a3ee50eb93f5a2b7bd2/activesupport/lib/active_support/core_ext
3
- require 'dbus/core_ext/kernel/singleton_class'
4
- require 'dbus/core_ext/module/remove_method'
5
- require 'dbus/core_ext/array/extract_options'
3
+ # https://github.com/rails/rails/tree/9794e85351243cac6d4e78adaba634b8e4ecad0a/activesupport/lib/active_support/core_ext
4
+
5
+ require "dbus/core_ext/module/redefine_method"
6
6
 
7
7
  class Class
8
8
  # Declare a class-level attribute whose value is inheritable by subclasses.
9
9
  # Subclasses can change their own value and it will not impact parent class.
10
10
  #
11
+ # ==== Examples
12
+ #
11
13
  # class Base
12
- # class_attribute :setting
14
+ # my_class_attribute :setting
13
15
  # end
14
16
  #
15
17
  # class Subclass < Base
@@ -22,14 +24,14 @@ class Class
22
24
  # Base.setting # => true
23
25
  #
24
26
  # In the above case as long as Subclass does not assign a value to setting
25
- # by performing <tt>Subclass.setting = _something_ </tt>, <tt>Subclass.setting</tt>
27
+ # by performing <tt>Subclass.setting = _something_</tt>, <tt>Subclass.setting</tt>
26
28
  # would read value assigned to parent class. Once Subclass assigns a value then
27
29
  # the value assigned by Subclass would be returned.
28
30
  #
29
31
  # This matches normal Ruby method inheritance: think of writing an attribute
30
32
  # on a subclass as overriding the reader method. However, you need to be aware
31
33
  # when using +class_attribute+ with mutable structures as +Array+ or +Hash+.
32
- # In such cases, you don't want to do changes in places but use setters:
34
+ # In such cases, you don't want to do changes in place. Instead use setters:
33
35
  #
34
36
  # Base.setting = []
35
37
  # Base.setting # => []
@@ -59,39 +61,25 @@ class Class
59
61
  # object.setting = false
60
62
  # object.setting # => false
61
63
  # Base.setting # => true
62
- #
63
- # To opt out of the instance reader method, pass <tt>instance_reader: false</tt>.
64
- #
65
- # object.setting # => NoMethodError
66
- # object.setting? # => NoMethodError
67
- #
68
- # To opt out of the instance writer method, pass <tt>instance_writer: false</tt>.
69
- #
70
- # object.setting = false # => NoMethodError
71
- #
72
- # To opt out of both instance methods, pass <tt>instance_accessor: false</tt>.
73
- def class_attribute(*attrs)
74
- options = attrs.extract_options!
75
- instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
76
- instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
77
- instance_predicate = options.fetch(:instance_predicate, true)
64
+ def my_class_attribute(*attrs)
65
+ instance_reader = true
66
+ instance_writer = true
78
67
 
79
68
  attrs.each do |name|
69
+ singleton_class.silence_redefinition_of_method(name)
80
70
  define_singleton_method(name) { nil }
81
- define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
82
71
 
83
- ivar = "@#{name}"
72
+ ivar = "@#{name}".to_sym
84
73
 
74
+ singleton_class.silence_redefinition_of_method("#{name}=")
85
75
  define_singleton_method("#{name}=") do |val|
86
76
  singleton_class.class_eval do
87
- remove_possible_method(name)
88
- define_method(name) { val }
77
+ redefine_method(name) { val }
89
78
  end
90
79
 
91
80
  if singleton_class?
92
81
  class_eval do
93
- remove_possible_method(name)
94
- define_method(name) do
82
+ redefine_method(name) do
95
83
  if instance_variable_defined? ivar
96
84
  instance_variable_get ivar
97
85
  else
@@ -104,26 +92,20 @@ class Class
104
92
  end
105
93
 
106
94
  if instance_reader
107
- remove_possible_method name
108
- define_method(name) do
95
+ redefine_method(name) do
109
96
  if instance_variable_defined?(ivar)
110
97
  instance_variable_get ivar
111
98
  else
112
99
  self.class.public_send name
113
100
  end
114
101
  end
115
- define_method("#{name}?") { !!public_send(name) } if instance_predicate
116
102
  end
117
103
 
118
- attr_writer name if instance_writer
119
- end
120
- end
121
-
122
- private
123
-
124
- unless respond_to?(:singleton_class?)
125
- def singleton_class?
126
- ancestors.first != self
104
+ if instance_writer
105
+ redefine_method("#{name}=") do |val|
106
+ instance_variable_set ivar, val
107
+ end
127
108
  end
128
109
  end
110
+ end
129
111
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+ # copied from activesupport/core_ext from Rails, MIT license
3
+ # https://github.com/rails/rails/tree/a713fdae4eb4f7ccd34932edc61561a96b8d9f35/activesupport/lib/active_support/core_ext/module
4
+
5
+ class Module
6
+ if RUBY_VERSION >= "2.3"
7
+ # Marks the named method as intended to be redefined, if it exists.
8
+ # Suppresses the Ruby method redefinition warning. Prefer
9
+ # #redefine_method where possible.
10
+ def silence_redefinition_of_method(method)
11
+ if method_defined?(method) || private_method_defined?(method)
12
+ # This suppresses the "method redefined" warning; the self-alias
13
+ # looks odd, but means we don't need to generate a unique name
14
+ alias_method method, method
15
+ end
16
+ end
17
+ else
18
+ def silence_redefinition_of_method(method)
19
+ if method_defined?(method) || private_method_defined?(method)
20
+ alias_method :__rails_redefine, method
21
+ remove_method :__rails_redefine
22
+ end
23
+ end
24
+ end
25
+
26
+ # Replaces the existing method definition, if there is one, with the passed
27
+ # block as its body.
28
+ def redefine_method(method, &block)
29
+ visibility = method_visibility(method)
30
+ silence_redefinition_of_method(method)
31
+ define_method(method, &block)
32
+ send(visibility, method)
33
+ end
34
+
35
+ # Replaces the existing singleton method definition, if there is one, with
36
+ # the passed block as its body.
37
+ def redefine_singleton_method(method, &block)
38
+ singleton_class.redefine_method(method, &block)
39
+ end
40
+
41
+ def method_visibility(method) # :nodoc:
42
+ case
43
+ when private_method_defined?(method)
44
+ :private
45
+ when protected_method_defined?(method)
46
+ :protected
47
+ else
48
+ :public
49
+ end
50
+ end
51
+ end
@@ -9,6 +9,7 @@
9
9
  # See the file "COPYING" for the exact licensing terms.
10
10
 
11
11
  require "thread"
12
+ require "dbus/core_ext/class/attribute"
12
13
 
13
14
  module DBus
14
15
  # Exported object type
@@ -20,7 +21,7 @@ module DBus
20
21
  # The path of the object.
21
22
  attr_reader :path
22
23
  # The interfaces that the object supports. Hash: String => Interface
23
- class_attribute :intfs
24
+ my_class_attribute :intfs
24
25
  self.intfs = {}
25
26
 
26
27
  # The service that the object is exported by.
@@ -50,9 +50,9 @@ module DBus
50
50
  raise InvalidIntrospectionData if name.bytesize > 255
51
51
  raise InvalidIntrospectionData if name =~ /^\./ || name =~ /\.$/
52
52
  raise InvalidIntrospectionData if name =~ /\.\./
53
- raise InvalidIntrospectionData if !(name =~ /\./)
53
+ raise InvalidIntrospectionData if name !~ /\./
54
54
  name.split(".").each do |element|
55
- raise InvalidIntrospectionData if !(element =~ INTERFACE_ELEMENT_RE)
55
+ raise InvalidIntrospectionData if element !~ INTERFACE_ELEMENT_RE
56
56
  end
57
57
  end
58
58
 
@@ -69,6 +69,7 @@ module DBus
69
69
  def align(a)
70
70
  case a
71
71
  when 1
72
+ nil
72
73
  when 2, 4, 8
73
74
  bits = a - 1
74
75
  @idx = @idx + bits & ~bits
@@ -54,7 +54,9 @@ module DBus
54
54
  # @return [ProxyObjectInterface]
55
55
  def [](intfname)
56
56
  introspect unless introspected
57
- @interfaces[intfname]
57
+ ifc = @interfaces[intfname]
58
+ raise DBus::Error, "no such interface `#{intfname}' on object `#{@path}'" unless ifc
59
+ ifc
58
60
  end
59
61
 
60
62
  # Maps the given interface name _intfname_ to the given interface _intf.
@@ -41,21 +41,17 @@ module DBus
41
41
 
42
42
  # required methods
43
43
  # returns node attribute value
44
- def [](key)
45
- end
44
+ def [](key); end
46
45
 
47
46
  # yields child nodes which match xpath of type AbstractXML::Node
48
- def each(xpath)
49
- end
47
+ def each(xpath); end
50
48
  end
51
49
  # required methods
52
50
  # initialize parser with xml string
53
- def initialize(xml)
54
- end
51
+ def initialize(xml); end
55
52
 
56
53
  # yields nodes which match xpath of type AbstractXML::Node
57
- def each(xpath)
58
- end
54
+ def each(xpath); end
59
55
  end
60
56
 
61
57
  class NokogiriParser < AbstractXML
@@ -9,8 +9,8 @@ GEMSPEC = Gem::Specification.new do |s|
9
9
  s.version = File.read("VERSION").strip
10
10
  s.license = "LGPL v2.1"
11
11
  s.author = "Ruby DBus Team"
12
- s.email = "ruby-dbus-devel@lists.luon.net"
13
- s.homepage = "https://trac.luon.net/ruby-dbus"
12
+ s.email = "martin.github@vidner.net"
13
+ s.homepage = "https://github.com/mvidner/ruby-dbus"
14
14
  s.files = Dir[
15
15
  "{doc,examples,lib,spec}/**/*",
16
16
  "COPYING", "NEWS.md", "Rakefile", "README.md",
@@ -28,10 +28,14 @@ describe "BindingTest" do
28
28
  # it should have its own interface
29
29
  expect(test2["org.ruby.Test2"]).not_to be_nil
30
30
  # but not an interface of the Test class
31
- expect(test2["org.ruby.SampleInterface"]).to be_nil
31
+ expect { test2["org.ruby.SampleInterface"] }.to raise_error(DBus::Error) do |e|
32
+ expect(e.message).to match(/no such interface/)
33
+ end
32
34
 
33
35
  # and the parent should not get polluted by the child
34
- expect(@base["org.ruby.Test2"]).to be_nil
36
+ expect { @base["org.ruby.Test2"] }.to raise_error(DBus::Error) do |e|
37
+ expect(e.message).to match(/no such interface/)
38
+ end
35
39
  end
36
40
 
37
41
  it "tests translating errors into exceptions" do
@@ -4,19 +4,19 @@ require "dbus"
4
4
 
5
5
  describe "IntrospectXMLParserTest" do
6
6
  it "tests split interfaces" do
7
- xml = <<EOS
8
- <node>
9
- <interface name="org.example.Foo">
10
- <method name="Dwim"/>
11
- </interface>
12
- <interface name="org.example.Bar">
13
- <method name="Drink"/>
14
- </interface>
15
- <interface name="org.example.Foo">
16
- <method name="Smurf"/>
17
- </interface>
18
- </node>
19
- EOS
7
+ xml = <<-XML
8
+ <node>
9
+ <interface name="org.example.Foo">
10
+ <method name="Dwim"/>
11
+ </interface>
12
+ <interface name="org.example.Bar">
13
+ <method name="Drink"/>
14
+ </interface>
15
+ <interface name="org.example.Foo">
16
+ <method name="Smurf"/>
17
+ </interface>
18
+ </node>
19
+ XML
20
20
 
21
21
  interfaces, _subnodes = DBus::IntrospectXMLParser.new(xml).parse
22
22
 
@@ -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
@@ -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
@@ -92,11 +92,11 @@ def with_service_by_activation(&block)
92
92
  FileUtils.mkdir_p service_dir
93
93
  # file name actually does not need to match the service name
94
94
  File.open("#{service_dir}/#{name}.service", "w") do |f|
95
- s = <<EOS
96
- [D-BUS Service]
97
- Name=#{name}
98
- Exec=#{exec}
99
- EOS
95
+ s = <<-TEXT.gsub(/^\s*/, "")
96
+ [D-BUS Service]
97
+ Name=#{name}
98
+ Exec=#{exec}
99
+ TEXT
100
100
  f.write(s)
101
101
  end
102
102
 
@@ -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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-dbus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.1
4
+ version: 0.15.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: 2018-01-05 00:00:00.000000000 Z
11
+ date: 2018-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coveralls
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description: Pure Ruby module for interaction with D-Bus IPC system
98
- email: ruby-dbus-devel@lists.luon.net
98
+ email: martin.github@vidner.net
99
99
  executables: []
100
100
  extensions: []
101
101
  extra_rdoc_files: []
@@ -127,10 +127,8 @@ files:
127
127
  - lib/dbus/api_options.rb
128
128
  - lib/dbus/auth.rb
129
129
  - lib/dbus/bus.rb
130
- - lib/dbus/core_ext/array/extract_options.rb
131
130
  - 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
131
+ - lib/dbus/core_ext/module/redefine_method.rb
134
132
  - lib/dbus/error.rb
135
133
  - lib/dbus/export.rb
136
134
  - lib/dbus/introspect.rb
@@ -172,7 +170,7 @@ files:
172
170
  - spec/type_spec.rb
173
171
  - spec/value_spec.rb
174
172
  - spec/variant_spec.rb
175
- homepage: https://trac.luon.net/ruby-dbus
173
+ homepage: https://github.com/mvidner/ruby-dbus
176
174
  licenses:
177
175
  - LGPL v2.1
178
176
  metadata: {}
@@ -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