I’ve noticed that when you include Do::All
module into a class it makes every methods defined in this class publicly available. Is it a bug or intentional behaviour?
Consider following example:
GitHub Gist
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'dry-monads', '1.3.5'
gem 'rspec', '3.9.0'
end
require 'dry-monads'
class Service
include Dry::Monads[:result, :do]
def call
yield fetch_data
end
private
def fetch_data
Success(:data)
end
end
RSpec.describe Service do
subject(:service) { Service.new }
describe '#call' do
it 'returns data' do
expect(service.call).to eq(:data)
end
end
describe '#fetch_data' do
it 'raises NoMethodError' do
expect { service.fetch_data }.to raise_error(NoMethodError)
end
end
end
RSpec::Core::Runner.run(['spec', '--format', 'doc'])
# $ ruby dry_monad_private_issue.rb
#
# Service
# #call
# returns data
# #fetch_data
# raises NoMethodError (FAILED - 1)
#
# Failures:
#
# 1) Service#fetch_data raises NoMethodError
# Failure/Error: expect { service.fetch_data }.to raise_error(NoMethodError)
# expected NoMethodError but nothing was raised
# # dry_monad_private_methods_issue.rb:36:in `block (3 levels) in <main>'
# # dry_monad_private_methods_issue.rb:41:in `<main>'
#
# Finished in 0.01185 seconds (files took 0.13012 seconds to load)
# 2 examples, 1 failure
#
# Failed examples:
#
# rspec dry_monad_private_methods_issue.rb:35 # Service#fetch_data raises NoMethodError