Skip to content

Commit 3e1b02c

Browse files
committed
Merge commit '6ac559ed62780091eb0cfff914018ed101ef46ef' into scoped-ref-and-typedsl
2 parents 68a5c6c + 6ac559e commit 3e1b02c

File tree

12 files changed

+376
-174
lines changed

12 files changed

+376
-174
lines changed

draft-4/salad/schema_salad/main.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
def printrdf(workflow, wf, ctx, sr):
26-
# type: (str, Union[Dict[Any, Any], str, unicode], Dict[str, Any], str) -> None
26+
# type: (str, Union[List, Dict[Any, Any], str, unicode], Dict[unicode, Any], str) -> None
2727
g = Graph().parse(data=json.dumps(wf), format='json-ld',
2828
location=workflow, context=ctx)
2929
print(g.serialize(format=sr))
@@ -140,7 +140,12 @@ def main(argsl=None): # type: (List[str]) -> int
140140

141141
# Make the Avro validation that will be used to validate the target
142142
# document
143-
(avsc_names, avsc_obj) = schema.make_avro_schema(schema_doc, document_loader)
143+
if isinstance(schema_doc, list):
144+
(avsc_names, avsc_obj) = schema.make_avro_schema(
145+
schema_doc, document_loader)
146+
else:
147+
_logger.error("Schema `%s` must be a list.", args.schema)
148+
return 1
144149

145150
if isinstance(avsc_names, Exception):
146151
_logger.error("Schema `%s` error:\n%s", args.schema,

draft-4/salad/schema_salad/makedoc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ def extendsfrom(item, ex):
383383

384384

385385
def avrold_doc(j, outdoc, renderlist, redirects, brand, brandlink):
386-
# type: (List[Dict[str, Any]], IO[Any], str, Dict, str, str) -> None
386+
# type: (List[Dict[unicode, Any]], IO[Any], str, Dict, str, str) -> None
387387
toc = ToC()
388388
toc.start_numbering = False
389389

@@ -475,7 +475,7 @@ def avrold_doc(j, outdoc, renderlist, redirects, brand, brandlink):
475475

476476
args = parser.parse_args()
477477

478-
s = [] # type: List[Dict[str, Any]]
478+
s = [] # type: List[Dict[unicode, Any]]
479479
a = args.schema
480480
with open(a) as f:
481481
if a.endswith("md"):

draft-4/salad/schema_salad/ref_resolver.py

Lines changed: 168 additions & 138 deletions
Large diffs are not rendered by default.

draft-4/salad/schema_salad/schema.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def get_metaschema():
168168

169169

170170
def load_schema(schema_ref, cache=None):
171-
# type: (Union[unicode, Dict[str, Any]], Dict) -> Tuple[ref_resolver.Loader, Union[avro.schema.Names, avro.schema.SchemaParseException], Dict[unicode, Any], ref_resolver.Loader]
171+
# type: (Union[unicode, Dict[unicode, Any]], Dict) -> Tuple[ref_resolver.Loader, Union[avro.schema.Names, avro.schema.SchemaParseException], Dict[unicode, Any], ref_resolver.Loader]
172172
metaschema_names, metaschema_doc, metaschema_loader = get_metaschema()
173173
if cache is not None:
174174
metaschema_loader.cache = cache
@@ -193,7 +193,7 @@ def load_schema(schema_ref, cache=None):
193193
return document_loader, avsc_names, schema_metadata, metaschema_loader
194194

195195
def load_and_validate(document_loader, avsc_names, document, strict):
196-
# type: (ref_resolver.Loader, avro.schema.Names, Union[Dict[unicode, Any], unicode], bool) -> Tuple[Any, Dict[str, Any]]
196+
# type: (ref_resolver.Loader, avro.schema.Names, Union[Dict[unicode, Any], unicode], bool) -> Tuple[Any, Dict[unicode, Any]]
197197
if isinstance(document, dict):
198198
data, metadata = document_loader.resolve_all(document, document["id"])
199199
else:
@@ -204,11 +204,11 @@ def load_and_validate(document_loader, avsc_names, document, strict):
204204

205205

206206
def validate_doc(schema_names, doc, loader, strict):
207-
# type: (avro.schema.Names, Union[Dict[str, Any], List[Dict[str, Any]], str, unicode], ref_resolver.Loader, bool) -> None
207+
# type: (avro.schema.Names, Union[Dict[unicode, Any], List[Dict[unicode, Any]], unicode], ref_resolver.Loader, bool) -> None
208208
has_root = False
209209
for r in schema_names.names.values():
210-
if ((hasattr(r, 'get_prop') and r.get_prop("documentRoot")) or (
211-
"documentRoot" in r.props)):
210+
if ((hasattr(r, 'get_prop') and r.get_prop(u"documentRoot")) or (
211+
u"documentRoot" in r.props)):
212212
has_root = True
213213
break
214214

@@ -228,16 +228,16 @@ def validate_doc(schema_names, doc, loader, strict):
228228
errors = []
229229
success = False
230230
for r in schema_names.names.values():
231-
if ((hasattr(r, "get_prop") and r.get_prop("documentRoot")) or (
232-
"documentRoot" in r.props)):
231+
if ((hasattr(r, "get_prop") and r.get_prop(u"documentRoot")) or (
232+
u"documentRoot" in r.props)):
233233
try:
234234
validate.validate_ex(
235235
r, item, loader.identifiers, strict, foreign_properties=loader.foreign_properties)
236236
success = True
237237
break
238238
except validate.ValidationException as e:
239239
if hasattr(r, "get_prop"):
240-
name = r.get_prop("name")
240+
name = r.get_prop(u"name")
241241
elif hasattr(r, "name"):
242242
name = r.name
243243
errors.append("Could not validate as `%s` because\n%s" % (
@@ -417,6 +417,10 @@ def extend_and_specialize(items, loader):
417417
add_dictlist(extended_by, ex, ex_types[t["name"]])
418418
add_dictlist(extended_by, avro_name(ex), ex_types[ex])
419419

420+
for t in n:
421+
if t.get("abstract") and t["name"] not in extended_by:
422+
raise validate.ValidationException("%s is abstract but missing a concrete subtype" % t["name"])
423+
420424
for t in n:
421425
if "fields" in t:
422426
t["fields"] = replace_type(t["fields"], extended_by, loader, set())

draft-4/salad/schema_salad/validate.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class ValidationException(Exception):
88
pass
99

1010
def validate(expected_schema, datum, identifiers=set(), strict=False, foreign_properties=set()):
11-
# type: (avro.schema.Schema, Any, Set[str], bool, Set[str]) -> bool
11+
# type: (avro.schema.Schema, Any, Set[unicode], bool, Set[unicode]) -> bool
1212
try:
1313
return validate_ex(expected_schema, datum, identifiers, strict=strict, foreign_properties=foreign_properties)
1414
except ValidationException:
@@ -51,7 +51,7 @@ def vpformat(datum): # type: (Any) -> str
5151

5252
def validate_ex(expected_schema, datum, identifiers=None, strict=False,
5353
foreign_properties=None):
54-
# type: (avro.schema.Schema, Any, Set[str], bool, Set[str]) -> bool
54+
# type: (avro.schema.Schema, Any, Set[unicode], bool, Set[unicode]) -> bool
5555
"""Determine if a python datum is an instance of a schema."""
5656

5757
if not identifiers:

draft-4/salad/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
extras_require = {} # TODO: to be removed when the above is added
4242

4343
setup(name='schema-salad',
44-
version='1.11',
44+
version='1.12',
4545
description='Schema Annotations for Linked Avro Data (SALAD)',
4646
long_description=open(README).read(),
4747
author='Common workflow language working group',

draft-4/salad/tests/Process.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
$base: "https://w3id.org/cwl/cwl#"
2+
3+
$namespaces:
4+
cwl: "https://w3id.org/cwl/cwl#"
5+
sld: "https://w3id.org/cwl/salad#"
6+
7+
$graph:
8+
9+
- $import: "../schema_salad/metaschema/metaschema_base.yml"
10+
11+
- name: InputBinding
12+
type: record
13+
abstract: true
14+
fields:
15+
- name: loadContents
16+
type:
17+
- "null"
18+
- boolean
19+
jsonldPredicate: "cwl:loadContents"
20+
doc: |
21+
Only valid when `type: File` or is an array of `items: File`.
22+
23+
Read up to the first 64 KiB of text from the file and place it in the
24+
"contents" field of the file object for use by expressions.
25+
26+
- name: InputRecordField
27+
type: record
28+
extends: "sld:RecordField"
29+
fields:
30+
- name: inputBinding
31+
type: [ "null", "#InputBinding" ]
32+
jsonldPredicate: "cwl:inputBinding"
33+
34+
- name: Blurb
35+
type: record
36+
extends: InputBinding

draft-4/salad/tests/test_examples.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ def test_schemas(self):
1515
l = schema_salad.ref_resolver.Loader({})
1616

1717
ra, _ = l.resolve_all({
18-
"$schemas": ["tests/EDAM.owl"],
19-
"$namespaces": {"edam": "http://edamontology.org/"},
20-
"edam:has_format": "edam:format_1915"
18+
u"$schemas": [u"tests/EDAM.owl"],
19+
u"$namespaces": {u"edam": u"http://edamontology.org/"},
20+
u"edam:has_format": u"edam:format_1915"
2121
}, "")
2222

23-
self.assertEqual(ra, {
24-
"$schemas": ["tests/EDAM.owl"],
25-
"$namespaces": {"edam": "http://edamontology.org/"},
26-
'http://edamontology.org/has_format': 'http://edamontology.org/format_1915'
27-
})
23+
self.assertEqual({
24+
u"$schemas": [u"tests/EDAM.owl"],
25+
u"$namespaces": {u"edam": u"http://edamontology.org/"},
26+
u'http://edamontology.org/has_format': u'http://edamontology.org/format_1915'
27+
}, ra)
2828

2929
# def test_domain(self):
3030
# l = schema_salad.ref_resolver.Loader({})
@@ -46,9 +46,12 @@ def test_schemas(self):
4646
# })
4747

4848
def test_self_validate(self):
49-
schema_salad.main.main(argsl=["schema_salad/metaschema/metaschema.yml"])
50-
schema_salad.main.main(argsl=["schema_salad/metaschema/metaschema.yml",
51-
"schema_salad/metaschema/metaschema.yml"])
49+
self.assertEqual(0, schema_salad.main.main(argsl=["schema_salad/metaschema/metaschema.yml"]))
50+
self.assertEqual(0, schema_salad.main.main(argsl=["schema_salad/metaschema/metaschema.yml",
51+
"schema_salad/metaschema/metaschema.yml"]))
52+
53+
def test_avro_regression(self):
54+
self.assertEqual(0, schema_salad.main.main(argsl=["tests/Process.yml"]))
5255

5356
def test_jsonld_ctx(self):
5457
ldr, _, _, _ = schema_salad.schema.load_schema({

draft-4/salad/typeshed/2.7/argparse.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class _ActionsContainer:
123123
def set_defaults(self, **kwargs): ...
124124
def get_default(self, dest): ...
125125
def add_argument(self,
126-
*args: str,
126+
*args: Union[str, unicode],
127127
action: Union[str, Action] = ...,
128128
nargs: str = ...,
129129
const: Any = ...,

draft-4/salad/typeshed/2.7/rdflib/graph.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#
33
# NOTE: This dynamically typed stub was automatically generated by stubgen.
44

5-
from typing import Any, Union, IO, Tuple, Iterator
5+
from typing import Any, AnyStr, Union, IO, Tuple, Iterator
66
from StringIO import StringIO as BytesIO
77
from rdflib.term import Node, URIRef
88
from rdflib.store import Store
@@ -26,7 +26,7 @@ class Graph(Node):
2626
def add(self, __tuple_arg_2: Tuple[Node, Node, Node]) -> None: ...
2727
def addN(self, quads): ...
2828
def remove(self, __tuple_arg_2): ...
29-
def triples(self, __tuple_arg_2: Tuple[Union[str, URIRef], str, Union[str, URIRef]]) -> Iterator[Tuple[str, str, str]]: ...
29+
def triples(self, __tuple_arg_2: Tuple[Union[AnyStr, URIRef], AnyStr, Union[AnyStr, URIRef]]) -> Iterator[Tuple[AnyStr, AnyStr, AnyStr]]: ...
3030
def __getitem__(self, item): ...
3131
def __len__(self): ...
3232
def __iter__(self): ...

draft-4/salad/typeshed/2.7/re.pyi

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# Stubs for re
2+
# Ron Murawski <[email protected]>
3+
# 'bytes' support added by Jukka Lehtosalo
4+
5+
# based on: http://docs.python.org/2.7/library/re.html
6+
7+
from typing import (
8+
List, Iterator, overload, Callable, Tuple, Sequence, Dict,
9+
Generic, AnyStr, Match, Pattern, Any
10+
)
11+
12+
# ----- re variables and constants -----
13+
DEBUG = 0
14+
I = 0
15+
IGNORECASE = 0
16+
L = 0
17+
LOCALE = 0
18+
M = 0
19+
MULTILINE = 0
20+
S = 0
21+
DOTALL = 0
22+
X = 0
23+
VERBOSE = 0
24+
U = 0
25+
UNICODE = 0
26+
T = 0
27+
TEMPLATE = 0
28+
29+
class error(Exception): ...
30+
31+
@overload
32+
def compile(pattern: AnyStr, flags: int = ...) -> Pattern[AnyStr]: ...
33+
@overload
34+
def compile(pattern: Pattern[AnyStr], flags: int = ...) -> Pattern[AnyStr]: ...
35+
36+
@overload
37+
def search(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
38+
@overload
39+
def search(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
40+
41+
@overload
42+
def match(pattern: AnyStr, string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
43+
@overload
44+
def match(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> Match[AnyStr]: ...
45+
46+
@overload
47+
def split(pattern: AnyStr, string: AnyStr,
48+
maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
49+
@overload
50+
def split(pattern: Pattern[AnyStr], string: AnyStr,
51+
maxsplit: int = ..., flags: int = ...) -> List[AnyStr]: ...
52+
53+
@overload
54+
def findall(pattern: AnyStr, string: AnyStr, flags: int = ...) -> List[Any]: ...
55+
@overload
56+
def findall(pattern: Pattern[AnyStr], string: AnyStr, flags: int = ...) -> List[Any]: ...
57+
58+
# Return an iterator yielding match objects over all non-overlapping matches
59+
# for the RE pattern in string. The string is scanned left-to-right, and
60+
# matches are returned in the order found. Empty matches are included in the
61+
# result unless they touch the beginning of another match.
62+
@overload
63+
def finditer(pattern: AnyStr, string: AnyStr,
64+
flags: int = ...) -> Iterator[Match[AnyStr]]: ...
65+
@overload
66+
def finditer(pattern: Pattern[AnyStr], string: AnyStr,
67+
flags: int = ...) -> Iterator[Match[AnyStr]]: ...
68+
69+
@overload
70+
def sub(pattern: AnyStr, repl: AnyStr, string: AnyStr, count: int = ...,
71+
flags: int = ...) -> AnyStr: ...
72+
@overload
73+
def sub(pattern: AnyStr, repl: Callable[[Match[AnyStr]], AnyStr],
74+
string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
75+
@overload
76+
def sub(pattern: Pattern[AnyStr], repl: AnyStr, string: AnyStr, count: int = ...,
77+
flags: int = ...) -> AnyStr: ...
78+
@overload
79+
def sub(pattern: Pattern[AnyStr], repl: Callable[[Match[AnyStr]], AnyStr],
80+
string: AnyStr, count: int = ..., flags: int = ...) -> AnyStr: ...
81+
82+
@overload
83+
def subn(pattern: AnyStr, repl: AnyStr, string: AnyStr, count: int = ...,
84+
flags: int = ...) -> Tuple[AnyStr, int]: ...
85+
@overload
86+
def subn(pattern: AnyStr, repl: Callable[[Match[AnyStr]], AnyStr],
87+
string: AnyStr, count: int = ...,
88+
flags: int = ...) -> Tuple[AnyStr, int]: ...
89+
@overload
90+
def subn(pattern: Pattern[AnyStr], repl: AnyStr, string: AnyStr, count: int = ...,
91+
flags: int = ...) -> Tuple[AnyStr, int]: ...
92+
@overload
93+
def subn(pattern: Pattern[AnyStr], repl: Callable[[Match[AnyStr]], AnyStr],
94+
string: AnyStr, count: int = ...,
95+
flags: int = ...) -> Tuple[AnyStr, int]: ...
96+
97+
def escape(string: AnyStr) -> AnyStr: ...
98+
99+
def purge() -> None: ...

draft-4/salad/typeshed/2.7/urlparse.pyi

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Stubs for urlparse (Python 2)
22

3-
from typing import Dict, List, NamedTuple, Tuple, Sequence, Union, overload
3+
from typing import AnyStr, Dict, List, NamedTuple, Tuple, Sequence, Union, overload
44

55
uses_relative = [] # type: List[str]
66
uses_netloc = [] # type: List[str]
@@ -28,22 +28,47 @@ class SplitResult(NamedTuple('SplitResult', [
2828
]), ResultMixin):
2929
def geturl(self) -> str: ...
3030

31+
class SplitResultU(NamedTuple('SplitResultU', [
32+
('scheme', unicode),
33+
('netloc', unicode),
34+
('path', unicode),
35+
('query', unicode),
36+
('fragment', unicode)
37+
]), ResultMixin):
38+
def geturl(self) -> unicode: ...
39+
3140
class ParseResult(NamedTuple('ParseResult', [
3241
('scheme', str), ('netloc', str), ('path', str), ('params', str), ('query', str),
3342
('fragment', str)
3443
]), ResultMixin):
3544
def geturl(self) -> str: ...
3645

37-
def urlparse(url: Union[str, unicode], scheme: str = ..., allow_fragments: bool = ...) -> ParseResult: ...
38-
def urlsplit(url: Union[str, unicode], scheme: str = ..., allow_fragments: bool = ...) -> SplitResult: ...
46+
class ParseResultU(NamedTuple('ParseResultU', [
47+
('scheme', unicode),
48+
('netloc', unicode),
49+
('path', unicode),
50+
('params', unicode),
51+
('query', unicode),
52+
('fragment', unicode)
53+
]), ResultMixin):
54+
def geturl(self) -> unicode: ...
55+
56+
@overload
57+
def urlparse(url: str, scheme: str = ..., allow_fragments: bool = ...) -> ParseResult: ...
58+
@overload
59+
def urlparse(url: unicode, scheme: unicode = ..., allow_fragments: bool = ...) -> ParseResultU: ...
60+
@overload
61+
def urlsplit(url: str, scheme: str = ..., allow_fragments: bool = ...) -> SplitResult: ...
62+
@overload
63+
def urlsplit(url: unicode, scheme: unicode = ..., allow_fragments: bool = ...) -> SplitResultU: ...
3964
@overload
40-
def urlunparse(data: Tuple[str, str, str, str, str, str]) -> str: ...
65+
def urlunparse(data: Tuple[AnyStr, AnyStr, AnyStr, AnyStr, AnyStr, AnyStr]) -> AnyStr: ...
4166
@overload
42-
def urlunparse(data: Sequence[str]) -> str: ...
67+
def urlunparse(data: Sequence[AnyStr]) -> AnyStr: ...
4368
@overload
44-
def urlunsplit(data: Tuple[str, str, str, str, str]) -> str: ...
69+
def urlunsplit(data: Tuple[AnyStr, AnyStr, AnyStr, AnyStr, AnyStr]) -> AnyStr: ...
4570
@overload
46-
def urlunsplit(data: Sequence[str]) -> str: ...
71+
def urlunsplit(data: Sequence[AnyStr]) -> AnyStr: ...
4772
def urljoin(base: Union[str, unicode], url: Union[str, unicode], allow_fragments: bool = ...) -> str: ...
4873
def urldefrag(url: Union[str, unicode]) -> str: ...
4974
def unquote(s: str) -> str: ...

0 commit comments

Comments
 (0)