Skip to content

Commit ac89c4c

Browse files
committed
Fix Psych disallowed class error by permitting Date in YAML.safe_load.
1 parent 099958e commit ac89c4c

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

lib/rspec/openapi/schema_file.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'fileutils'
44
require 'yaml'
55
require 'json'
6+
require 'date'
67

78
# TODO: Support JSON
89
class RSpec::OpenAPI::SchemaFile
@@ -24,7 +25,12 @@ def edit(&block)
2425
def read
2526
return {} unless File.exist?(@path)
2627

27-
RSpec::OpenAPI::KeyTransformer.symbolize(YAML.safe_load(File.read(@path))) # this can also parse JSON
28+
RSpec::OpenAPI::KeyTransformer.symbolize(
29+
YAML.safe_load(
30+
File.read(@path),
31+
permitted_classes: [Date],
32+
),
33+
) # this can also parse JSON
2834
end
2935

3036
# @param [Hash] spec

spec/rspec/schema_file_spec.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
require 'date'
5+
6+
RSpec.describe RSpec::OpenAPI::SchemaFile do
7+
describe '#read' do
8+
let(:schema_content) do
9+
<<~YAML
10+
openapi: 3.0.0
11+
info:
12+
title: My API
13+
version: 1.0.0
14+
paths:
15+
/:
16+
get:
17+
summary: A test endpoint
18+
parameters:
19+
- name: date
20+
in: query
21+
schema:
22+
type: string
23+
example: 2020-01-02 # Unquoted date
24+
YAML
25+
end
26+
27+
it 'deserializes unquoted dates as Date objects when Date is permitted' do
28+
schema_file = RSpec::OpenAPI::SchemaFile.new('nonexistant/schema.yaml')
29+
30+
expect(File).to receive(:read).and_return(schema_content)
31+
expect(File).to receive(:exist?).and_return(true)
32+
33+
data = nil
34+
expect do
35+
data = schema_file.send(:read)
36+
end.not_to raise_error(Psych::DisallowedClass)
37+
expect(data.dig(:paths, :/, :get, :parameters, 0, :schema, :example).to_s).to eq('2020-01-02')
38+
end
39+
end
40+
end

0 commit comments

Comments
 (0)