Skip to content

Commit c5fe432

Browse files
committed
fix
- relative reference of Path Item Object - #53
1 parent 265eabd commit c5fe432

File tree

7 files changed

+48
-9
lines changed

7 files changed

+48
-9
lines changed

pyswagger/scanner/cycle_detector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import six
1212

1313
def _out(app, prefix, path):
14-
obj = app.resolve(normalize_jr(path, prefix))
14+
obj = app.resolve(normalize_jr(path, prefix, app.url))
1515
r = getattr(obj, 'norm_ref')
1616
return [r] if r else []
1717

pyswagger/scanner/v2_0/resolve.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def _resolve(obj, app, prefix, parser):
2323
return
2424

2525
r = getattr(obj, '$ref')
26-
ro = app.resolve(normalize_jr(r, prefix), parser)
26+
ro = app.resolve(normalize_jr(r, prefix, app.url), parser)
2727

2828
if not ro:
2929
raise ReferenceError('Unable to resolve: {0}'.format(r))
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
{
22
"get":{
33
"response":{
4-
"description":"path_item, get, response"
4+
"default":{
5+
"description":"path_item, get, response"
6+
}
57
}
68
},
79
"put":{
810
"response":{
9-
"description":"path_item, put, response"
11+
"default":{
12+
"description":"path_item, put, response"
13+
}
1014
}
1115
}
12-
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"get":{
3+
"responses":{
4+
"default":{
5+
"description":"relative, path_item, get, response"
6+
}
7+
}
8+
},
9+
"put":{
10+
"responses":{
11+
"default":{
12+
"description":"relative, path_item, put, response"
13+
}
14+
}
15+
}
16+
}

pyswagger/tests/data/v2_0/ex/root/swagger.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
},
1919
"/partial":{
2020
"$ref":"file:///partial/path_item/swagger.json"
21+
},
22+
"/relative":{
23+
"$ref":"path_item.json"
2124
}
2225
},
2326
"definitions":{
@@ -37,4 +40,4 @@
3740
}
3841
}
3942
}
40-
}
43+
}

pyswagger/tests/v2_0/test_ex.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,14 @@ def test_partial_schema(self):
9090
p_ = self.app.resolve('#/definitions/s3')
9191
self.assertEqual(p_.__repr__(), original_p.items.ref_obj.__repr__())
9292

93+
def test_relative_path_item(self):
94+
""" make sure that relative file schema works
95+
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#relative-schema-file-example
96+
"""
97+
def chk(obj):
98+
self.assertEqual(obj.get.responses['default'].description, 'relative, path_item, get, response')
99+
self.assertEqual(obj.put.responses['default'].description, 'relative, path_item, put, response')
100+
101+
chk(self.app.s('relative'))
102+
chk(self.app.resolve('file:///root/path_item.json'))
103+

pyswagger/utils.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,15 @@ def normalize_jr(jr, prefix, url=None):
320320
if p.scheme != '':
321321
return jr
322322

323+
# fix implicit reference,
323324
# it's a JSON reference without url
324-
325-
# fix implicit reference
326-
jr = jp_compose(jr, base=prefix) if jr.find('#') == -1 else jr
325+
if jr.find('#') == -1:
326+
if prefix == '#/paths':
327+
# relative reference to files next to this one
328+
p = six.moves.urllib.parse.urlparse(url)
329+
return six.moves.urllib.parse.urlunparse(p[:2]+(os.path.join(os.path.dirname(p.path), jr),)+p[3:])
330+
else:
331+
jr = jp_compose(jr, base=prefix)
327332

328333
# prepend url
329334
if url:

0 commit comments

Comments
 (0)