Skip to content

Commit 61c9ba4

Browse files
committed
Added support for labels on examples.
1 parent d493cdc commit 61c9ba4

File tree

7 files changed

+42
-23
lines changed

7 files changed

+42
-23
lines changed

babelsdk/babel/parser.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ def set_doc(self, docstring):
3838
def set_fields(self, fields):
3939
self.fields = fields
4040

41-
def add_example(self, label, example):
42-
self.examples[label] = example
41+
def add_example(self, label, text, example):
42+
self.examples[label] = (text, example)
4343

4444
def __str__(self):
4545
return self.__repr__()
@@ -234,8 +234,8 @@ def p_statement_typedef_union(self, p):
234234
if p[7] is not None:
235235
p[0].set_fields(p[7])
236236
if p[8]:
237-
for label, example in p[8]:
238-
p[0].add_example(label, example)
237+
for label, text, example in p[8]:
238+
p[0].add_example(label, text, example)
239239

240240
def p_inheritance(self, p):
241241
"""inheritance : EXTENDS ID
@@ -251,8 +251,8 @@ def p_statement_typedef_struct(self, p):
251251
if p[8] is not None:
252252
p[0].set_fields(p[8])
253253
if p[9] is not None:
254-
for label, example in p[9]:
255-
p[0].add_example(label, example)
254+
for label, text, example in p[9]:
255+
p[0].add_example(label, text, example)
256256

257257
def p_statement_request_section(self, p):
258258
"""reqsection : REQUEST COLON NEWLINE INDENT field_list DEDENT"""
@@ -378,8 +378,9 @@ def p_statement_field_symbol(self, p):
378378
p[0].set_doc(self._normalize_docstring(p[3]))
379379

380380
def p_statement_example(self, p):
381-
'example : KEYWORD ID COLON NEWLINE INDENT example_field_list DEDENT'
382-
p[0] = (p[2], p[6])
381+
"""example : KEYWORD ID STRING COLON NEWLINE INDENT example_field_list DEDENT
382+
| KEYWORD ID empty COLON NEWLINE INDENT example_field_list DEDENT"""
383+
p[0] = (p[2], p[3], p[7])
383384

384385
def p_statement_example_field_list(self, p):
385386
"""example_field_list : example_field

babelsdk/babel/tower.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ def _create_type(self, env, item):
129129
api_type_field = self._create_field(env, babel_field)
130130
api_type_fields.append(api_type_field)
131131
api_type = composite_type_obj(item.name, item.doc, api_type_fields, super_type)
132-
for example_label, example in item.examples.items():
133-
api_type.add_example(example_label, dict(example))
132+
for example_label, (example_text, example) in item.examples.items():
133+
api_type.add_example(example_label, example_text, dict(example))
134134
env[item.name] = api_type
135135
return api_type
136136

babelsdk/data_type.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,15 @@ def get_example(self, label, example):
366366
pass
367367

368368
@abstractmethod
369-
def add_example(self, label, example):
369+
def add_example(self, label, text, example):
370370
pass
371371

372+
class OrderedExample(OrderedDict):
373+
374+
def __init__(self, *args, **kwargs):
375+
super(OrderedExample, self).__init__(*args, **kwargs)
376+
self.text = None
377+
372378
class Struct(CompositeType):
373379
"""
374380
Defines a product type: Composed of other primitive and/or struct types.
@@ -387,7 +393,7 @@ def check(self, val):
387393
else:
388394
raise ValueError('Field %r is unspecified' % field.name)
389395

390-
def add_example(self, label, example):
396+
def add_example(self, label, text, example):
391397
"""
392398
Add a plausible example of the contents of this type. The example is
393399
validated against the type definition.
@@ -399,7 +405,8 @@ def add_example(self, label, example):
399405
if label in example:
400406
raise ValueError('Example label %s already specified' % label)
401407

402-
ordered_example = OrderedDict()
408+
ordered_example = OrderedExample()
409+
ordered_example.text = text
403410

404411
# Check for examples with keys that don't belong
405412
extra_fields = set(example.keys()) - set([f.name for f in self.all_fields])

babelsdk/generator/jinja.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ def __init__(self, api):
6060
self.template_env.filters['is_composite'] = lambda s: isinstance(s, Union)
6161
self.template_env.filters['formal'] = lambda s: ' '.join(word.capitalize() for word in split_words(s))
6262

63-
6463
# Filters for making it easier to render code (as opposed to HTML)
6564

6665
# Jinja has format(pattern, text), but no way to do the reverse. This
@@ -132,12 +131,15 @@ def _string_slice(str, start=0, end=None, step=1):
132131

133132
@staticmethod
134133
def get_template_filters(language):
135-
return {'method': lambda s: language.format_method(split_words(s)),
134+
return {
135+
'method': lambda s: language.format_method(split_words(s)),
136136
'class': lambda s: language.format_class(split_words(s)),
137137
'variable': lambda s: language.format_variable(split_words(s)),
138138
'string_value': language.format_string_value,
139139
'type': language.format_type,
140-
'pprint': language.format_obj,}
140+
'pprint': language.format_obj,
141+
'func_call_args': language.format_func_call_args,
142+
}
141143

142144
_split_words_capitalization_re = re.compile(
143145
'^[a-z0-9]+|[A-Z][a-z0-9]+|[A-Z]+(?=[A-Z][a-z0-9])|[A-Z]+$'

babelsdk/lang/lang.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ def format_string_value(self, s):
3232
return self.format_obj(eval(s))
3333

3434
def format_obj(self, o):
35+
"""The representation of an object in the target language. For example,
36+
it may convert a None to null for certain languages."""
3537
raise NotImplemented
38+
39+
def format_func_call_args(self, values):
40+
return ', '.join([self.format_obj(value) for value in values])

example/api/v2_files.babel

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ struct Folder extends BaseFile:
174174
Information about a folder.
175175

176176
shared_folder SharedFolder optional::
177-
If this a shared folder, information about it.
177+
If this is a shared folder, information about it.
178178

179179
example default:
180180
id="abc456"
@@ -519,6 +519,9 @@ struct RevisionHistory:
519519
revisions List(data_type=Entry)::
520520
List of file or folders that have been part of the revision history.
521521

522+
example default:
523+
pass
524+
522525
op Revisions:
523526
doc::
524527
Obtains file information for previous revisions.
@@ -573,13 +576,11 @@ struct SearchRequest:
573576

574577
struct SearchResults:
575578

576-
has_more Boolean::
577-
If true, then the number of files found exceeds the file_limit.
578579
results List(data_type=Entry)::
579580
List of file or folders that match the search query.
580581

581582
example default:
582-
has_more=false
583+
pass
583584

584585
op Search:
585586
doc::

example/api/v2_users.babel

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,20 @@ struct QuotaInfo:
2323

2424
struct Team:
2525
doc::
26-
Information relevant to a team.
26+
Information about a team.
2727

28+
id String::
29+
The team's unique ID.
2830
name String::
2931
The name of the team.
3032

3133
example default:
34+
id="ha83cda8h"
3235
name="Acme, Inc."
3336

3437
struct AccountInfo:
3538
doc::
36-
Information for a user's account.
39+
Information about a user's account.
3740

3841
display_name String::
3942
The full name of a user.
@@ -52,7 +55,7 @@ struct AccountInfo:
5255
team Team|null::
5356
If this account is a member of a team.
5457

55-
example default:
58+
example default "Paired account":
5659
display_name="Jon Snow"
5760
account_id="314159"
5861
email="jsnow@westeros.com"

0 commit comments

Comments
 (0)