Project

General

Profile

Bug #15662

Fix CSV delegation to missing StringIO

Added by gsamokovarov (Genadi Samokovarov) 2 months ago. Updated 2 months ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:91812]

Description

If you create a CSV from raw content like:

  csv = CSV.new("h1,h2")

You'll get method missing when calling csv.path but still, get true when you call csv.respond_to?(:path).

This tricks 3rd party libraries like carrierwave which try to call path on their input if it responds to it.

See https://github.com/carrierwaveuploader/carrierwave/blob/a91ab69fdd8052cdf5a5e48ef8baf40939e441fb/lib/carrierwave/sanitized_file.rb#L109-L123

This stops me from passing CSV objects as StringIO's into carrierwave uploads, for example, but the problem can also be manifested in other 3rd party libraries, as responding to a method and returning a NoMethodError when calling it is still an unexpected behavior.

I have gone through the CSV delegation scheme and made sure that every method that StringIO doesn't respond to returns a meaningful zero value and does not raise a NoMethodError while used through a CSV Instance.

History

Updated by gsamokovarov (Genadi Samokovarov) 2 months ago

I have opened a PR on GitHub's tracker with the changes: https://github.com/ruby/ruby/pull/2094

Updated by kou (Kouhei Sutou) 2 months ago

  • Assignee set to kou (Kouhei Sutou)
  • Status changed from Open to Assigned

Could you use https://github.com/ruby/csv instead of ruby/ruby?
ruby/csv is the upstream repository.

Updated by kou (Kouhei Sutou) 2 months ago

  • Status changed from Assigned to Closed

Thanks!

Also available in: Atom PDF