json-logic-ruby icon indicating copy to clipboard operation
json-logic-ruby copied to clipboard

Fix bug where add_operation manipulates the Object class

Open PeterLanglois opened this issue 6 months ago • 0 comments

Problem

The add_operation is manipulating the Object class. It can add new methods to object as well as overwrite existing methods.

Object.sum
# Traceback (most recent call last):
#         4: from /Users/peterlanglois/.rvm/rubies/ruby-2.6.7/bin/irb:23:in `<main>'
#         3: from /Users/peterlanglois/.rvm/rubies/ruby-2.6.7/bin/irb:23:in `load'
#         2: from /Users/peterlanglois/.rvm/rubies/ruby-2.6.7/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
#         1: from (irb):40
# NoMethodError (undefined method `sum' for Object:Class)
JSONLogic.add_operation('sum', ->(v, _d) { v.sum })
Object.sum([1,2,3], {}) 
# 6

Solution

Replace define_method with define_singleton_method.

Object.sum
# Traceback (most recent call last):
#         4: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `<main>'
#         3: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `load'
#         2: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
#         1: from (irb):2:in `<main>'
# NoMethodError (undefined method `sum' for Object:Class)
JSONLogic.add_operation('sum', ->(v, _d) { v.sum })
Object.sum([1,2,3], {})
# Traceback (most recent call last):
#         4: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `<main>'
#         3: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `load'
#         2: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
#         1: from (irb):4:in `<main>'
# NoMethodError (undefined method `sum' for Object:Class)
JSONLogic.apply({ sum: [1,2,3] }, {})
# 6

PeterLanglois avatar Aug 23 '24 14:08 PeterLanglois