-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGES.html
463 lines (462 loc) · 31 KB
/
CHANGES.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
<!DOCTYPE html>
<html><head><meta charset="utf-8">
<title>Nirum changelog — Nirum</title>
<meta name="generator" content="Nirum 0.5.0">
<meta name="author" content="Nirum team">
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav><a class="index" href="index.html">Nirum</a>
<ul class="manuals toc"><li><a href="docs/annotation.html">Annotations</a>
</li>
<li><a href="docs/package.html">Package</a>
</li>
<li><a href="docs/refactoring.html">Backward Compatible Refactoring</a>
</li>
<li><a href="docs/serialization.html">Serialization format</a>
</li>
<li><a href="docs/transport.html">Transport</a>
</li>
<li><a href="docs/tutorial.html">Step-by-step tutorial</a>
</li>
<li><a href="docs/target/docs.html">Docs target</a>
</li>
<li><a href="docs/target/python.html">Python target</a>
</li>
<li class="selected"><a href="CHANGES.html"><strong>Nirum changelog</strong>
</a>
</li>
<li><a href="CONTRIBUTING.html">Contirubtion guide</a>
</li>
</ul>
<ul class="modules toc"><li><a href="core/index.html"><code>core</code></code>
— Built-in types</a>
</li>
</ul>
</nav>
<article><h1>Nirum changelog</h1>
<h2>Version 0.5.0</h2>
<p>To be released.</p>
<h3>Language</h3>
<ul>
<li>The <code>uri</code> type has completly gone; use <code>url</code> instead.
[<a href="https://github.com/nirum-lang/nirum/issues/126">#126</a>, <a href="https://github.com/nirum-lang/nirum/pull/281">#281</a> by Jonghun Park]</li>
</ul>
<h3>Docs target</h3>
<ul>
<li>Docs target became to support manual pages besides reference docs extracted
from Nirum source codes. It scans all CommonMark (i.e., <em>*.md</em>) files and
transforms them to HTML pages.</li>
<li><a href="http://commonmark.org/">CommonMark</a> in docstrings became to support <a href="https://github.github.com/gfm/#tables-extension-">table syntax extension</a>.</li>
<li><a href="http://commonmark.org/">CommonMark</a> in docstrings became to have a limited subset of
<a href="https://michelf.ca/projects/php-markdown/extra/#spe-attr">special attributes extension</a>. It’s only allowed to heading elements and
only anchor identifiers are supported (e.g., <code>{#header-id}</code>).</li>
<li><code>style</code>, <code>header</code>, and <code>footer</code> options were added. These options purpose
to customize the look and feel of the result pages.</li>
<li>Fixed an incorrect processing of <a href="http://commonmark.org/">CommonMark</a> thight list items: it had
crashed when a thight list item contains blocks other than paragraphs.</li>
</ul>
<h3>Et cetera</h3>
<ul>
<li>Dropped 32-bit Windows support.</li>
<li>The official Docker image repository was moved to
<a href="https://hub.docker.com/r/nirumlang/nirum/">nirumlang/nirum</a>
(from <a href="https://hub.docker.com/r/spoqa/nirum/">spoqa/nirum</a>).</li>
</ul>
<h2>Version 0.4.1</h2>
<p>Released on June 8, 2018.</p>
<h3>Et cetera</h3>
<ul>
<li>The official Docker images became to have netbase pacakage. See the
<a href="https://github.com/commercialhaskell/stack/issues/2372">related issue on Haskell Stack</a> as well.</li>
</ul>
<h2>Version 0.4.0</h2>
<p>Released on May 25, 2018.</p>
<h3>Language</h3>
<ul>
<li><p>Union tags became possible to have <code>default</code> keyword. It’s useful
for migrating a record type to a union type. [<a href="https://github.com/nirum-lang/nirum/issues/13">#13</a>, <a href="https://github.com/nirum-lang/nirum/pull/227">#227</a>]</p></li>
<li><p>Enum members and union tags became disallowed to shadow an other type name
in a module. It’s because in some target languages we compile both types
and members/tags into objects that share the same namespace. In Python,
both types and union tags are compiled into classes.</p>
<p>For example, the following definitions had been allowed, but now became
disallowed:</p>
<pre><code class="language-nirum">unboxed foo (text);
// ^~~
enum bar = foo | baz;
// ^~~
</code></pre>
<pre><code class="language-nirum">record foo (text a);
// ^~~
union bar = foo (text b) | baz (text c);
// ^~~
</code></pre>
<p>This rule is applied even between a member/tag and its belonging enum/union
type as well. The following definitions are disallowed:</p>
<pre><code class="language-nirum">enum foo = foo | bar;
^~~ ^~~
</code></pre>
<pre><code class="language-nirum">union bar = foo (text a) | bar (text b);
^~~ ^~~
</code></pre>
<p>If you already have used the same name for a type and a tag, you can avoid
breaking backward compatibility of serialization by specifying a different
behind name. For example, if you’ve had a definition like:</p>
<pre><code class="language-nirum">enum foo = foo | bar;
// ^~~ ^~~
</code></pre>
<p>It can be changed like the following:</p>
<pre><code class="language-nirum">enum foo = foo-renamed/foo | bar;
// ^~~~~~~~~~~ ^~~
</code></pre>
<p>[<a href="https://github.com/nirum-lang/nirum/pull/254">#254</a>, <a href="https://github.com/nirum-lang/nirum/pull/255">#255</a>]</p></li>
<li><p>Enum members and union tags became disallowed to shadow other enum members
and union tags even if they belong to an other type. It’s because in some
target language we compile them into objects that share the same namespace,
regardless of their belonging type.</p>
<p>For example, the following definitions had been allowed, but now became
disallowed:</p>
<pre><code class="language-nirum">enum foo = bar | baz;
// ^~~
enum qux = quux | bar;
// ^~~
</code></pre>
<pre><code class="language-nirum">union foo = bar (text a) | baz (text b);
// ^~~
enum qux = quux | bar;
// ^~~
</code></pre>
<pre><code class="language-nirum">union foo = bar (text a) | baz (text b);
// ^~~
union qux = quux (text c) | baz (text d);
// ^~~
</code></pre>
<p>If you already have used the same name for members/tags of different
enum/union types, you can avoid breaking backward compatibility of
serialization by specifying a different behind name.
For example, if you’ve had a definition like:</p>
<pre><code class="language-nirum">enum foo = bar | baz;
// ^~~
union qux = bar (text a) | quux (text b);
// ^~~
</code></pre>
<p>It can be changed like the following:</p>
<pre><code class="language-nirum">enum foo = bar-renamed/bar | baz;
// ^~~~~~~~~~~ ^~~
union qux = bar (text a) | quux (text b);
</code></pre>
<p>[<a href="https://github.com/nirum-lang/nirum/pull/254">#254</a>, <a href="https://github.com/nirum-lang/nirum/pull/255">#255</a>]</p></li>
<li><p>Fixed a compiler bug that an error message on name duplicates had referred
to a wrong line/column number. [<a href="https://github.com/nirum-lang/nirum/pull/255">#255</a>]</p></li>
<li><p>Added aliased import. It’s handy to avoid a name shadowing.
[<a href="https://github.com/nirum-lang/nirum/issues/217">#217</a>, <a href="https://github.com/nirum-lang/nirum/pull/258">#258</a>]</p>
<pre><code class="language-nirum">import iso (country as iso-country);
import types (country);
</code></pre></li>
<li><p>Added support for integer type annotation argument. [<a href="https://github.com/nirum-lang/nirum/issues/178">#178</a>, <a href="https://github.com/nirum-lang/nirum/pull/267">#267</a>]</p>
<pre><code class="language-nirum">service foo-service (
@bar(baz=1)
int32 qux (int32 quux),
);
</code></pre></li>
<li><p>Deprecated <code>uri</code> and <code>url</code> type is added. [<a href="https://github.com/nirum-lang/nirum/issues/126">#126</a>, <a href="https://github.com/nirum-lang/nirum/pull/277">#277</a> by Jonghun Park]</p></li>
</ul>
<h3>Docs target</h3>
<ul>
<li><p>A new required configuration <code>targets.docs.title</code> was added.
It’s rendered in generated HTML documents’ <code><title></code> element.
[<a href="https://github.com/nirum-lang/nirum/pull/253">#253</a>]</p></li>
<li><p>Docs now have a sidebar which contains table of contents. [<a href="https://github.com/nirum-lang/nirum/pull/257">#257</a>]</p></li>
<li><p>Fixed a bug that a module-level docs hadn’t been rendered.
Now it’s shown in the right below the module name. [<a href="https://github.com/nirum-lang/nirum/pull/259">#259</a>]</p></li>
</ul>
<h3>Python target</h3>
<ul>
<li><p>Generated Python packages became to have two <a href="https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points">entry points</a> (a feature
provided by <em>setuptools</em>):</p>
<ul>
<li><code>nirum.modules</code>: It maps Nirum modules to Python modules.
Nirum module paths are normalized to avoid underscores and upper letters
and use hyphens and lower letters instead, e.g., <code>foo-bar.baz</code>.
The table works well with <code>renames</code> settings as well.</li>
<li><code>nirum.classes</code>: It maps Nirum types (including services) to Python
classes. Nirum type names are qualified and their leading module paths
are also normalized (the same rule to <code>nirum.modules</code> applies here).</li>
</ul></li>
<li><p>Generated deserializers became independent from <em>nirum-python</em> runtime
library. [<a href="https://github.com/nirum-lang/nirum/issues/160">#160</a>, <a href="https://github.com/nirum-lang/nirum/pull/272">#272</a>]</p>
<ul>
<li><p>Error messages made during deserialization became more standardized.
Every error now consists of two fields: one represents a path to the
value having an error, and other one is a human-readable message.</p>
<p>For example, suppose there’s types like:</p>
<pre><code class="language-nirum">record user (dob date);
record user-group ([user] users);
</code></pre>
<p>and the following payload for <code>user-group</code> type is given:</p>
<pre><code class="language-json">[
{"_type": "user", "dob": "2000-06-30"},
{"_type": "user", "dob": "2000-13-32"}
]
</code></pre>
<p>An error is reported with a path like <code>[1].dob</code>.</p></li>
<li><p>Added an optional <code>on_error</code> callback parameter to generated
<code>__nirum_deserialize__()</code> methods.</p>
<p>It has to be a callable which has two parameters (and no return value).
An <code>on_error</code> callback is called every time any validation/parsing error
happens during deserialization, and it can be called multiple times
at a single call of <code>__nirum_deserialize__()</code>.</p>
<p>The callback function’s first parameter takes a string referring
a path to the value having an error (e.g., <code>'.users[0].dob'</code>).
The second parameter takes an error message string (e.g.,
<code>'Expected a string of RFC 3339 date, but the date is invalid.'</code>).</p>
<p>When it’s omitted or <code>None</code>, a <code>ValueError</code> is raised with a multiline
message that consists of all error messages made during deserialization,
as it has been.</p></li>
</ul></li>
<li><p>Fixed a bug that record/union deserializers refuses payloads without
<code>"_type"</code> field. It is only for humans and can be omitted according to
the <a href="./docs/serialization.html">specification</a>.</p></li>
<li><p>All integral types (<code>int32</code>, <code>int64</code>, and <code>bigint</code>) became represented
as <a href="https://docs.python.org/2/library/numbers.html#numbers.Integral"><code>numbers.Integral</code></a> instead of
<a href="https://docs.python.org/2/library/functions.html#int"><code>int</code></a>.</p>
<p>There’s no change to Python 3.</p></li>
<li><p>The <code>uri</code> type became represented as <a href="https://docs.python.org/2/library/functions.html#basestring"><code>basestring</code></a>
instead of <a href="https://docs.python.org/2/library/functions.html#unicode"><code>unicode</code></a> in Python 2, since URI (unlike IRI)
is limited to a subset of ASCII character set.</p>
<p>There’s no change to Python 3.</p></li>
<li><p>Generated type constructors became to validate field value’s range or format
besides class checks: range checks for <code>int32</code>/<code>int64</code>, time zone
(<code>tzinfo</code>) awareness check for <code>datetime</code>, and basic format check for
<code>uri</code>.</p></li>
<li><p>Generated service methods became to have its own serialization and
deserialization functions. Each method object now has these attributes:</p>
<ul>
<li><p><code>__nirum_serialize_arguments__</code> takes the same keywords to the method
parameters and serialize them into a mapping object (which can be
directly translated to a JSON object). It can raise a <code>TypeError</code> or
<code>ValueError</code> if any invalid values are passed.</p></li>
<li><p><code>__nirum_deserialize_arguments__</code> takes a mapping object returned by
<code>json.load()</code>/<code>json.loads()</code> (and an optional <code>on_error</code> callable)
and deserialize it into a mapping object of pairs from parameter’s
facial name string to its corresponding Python object.</p></li>
<li><p><code>__nirum_argument_serializers__</code> is a mapping object that keys are
a string of method’s parameter facial name and values are its
serializer.</p>
<p>A serializer function takes an argument value and returns
its corresponding value which can be passed to
<code>json.dump()</code>/<code>json.dumps()</code>. It can raise a <code>TypeError</code> or
<code>ValueError</code> if an argument is invalid.</p></li>
<li><p><code>__nirum_argument_deserializers__</code> is a mapping object that keys are
a string of method’s parameter behind name and values are its
deserializer.</p>
<p>A deserializer function takes an argument value preprocessed by
<code>json.load()</code>/<code>json.loads()</code> with an optional <code>on_error</code> callback,
and returns its corresponding Python object.</p></li>
<li><p><code>__nirum_serialize_result__</code> takes a method’s return value and serialize
it into a corresponding value which can be passed to
<code>json.dump()</code>/<code>json.dumps()</code>.</p>
<p>If the given value does not match to method’s return type it raises
<code>TypeError</code>, or <code>ValueError</code> if the value is invalid.</p>
<p>This attribute is <code>None</code> if the method has no return type.</p></li>
<li><p><code>__nirum_deserialize_result__</code> takes a result value preprocessed by
<code>json.load()</code>/<code>json.loads()</code> with an optional <code>on_error</code> callback,
and deserialize it into its corresponding Python object.</p>
<p>This attribute is <code>None</code> if the method has no return type.</p></li>
<li><p><code>__nirum_serialize_error__</code> takes a method’s error object and serialize
it into a corresponding value which can be passed to
<code>json.dump()</code>/<code>json.dumps()</code>.</p>
<p>If the given error object does not match to method’s return type
it raises <code>TypeError</code>, or <code>ValueError</code> if the error object is invalid.</p>
<p>This attribute is <code>None</code> if the method has no error type.</p></li>
<li><p><code>__nirum_deserialize_error__</code> takes an error value preprocessed by
<code>json.load()</code>/<code>json.loads()</code> with an optional <code>on_error</code> callback,
and deserialize it into its corresponding Python object.</p>
<p>This attribute is <code>None</code> if the method has no error type.</p></li>
</ul></li>
<li><p>Removed <code>__nirum_get_inner_type__()</code> class methods from generated unboxed
type classes.</p></li>
<li><p>Removed <code>__nirum_record_behind_name__</code> static fields and
<code>__nirum_field_types__()</code> class methods from generated record type classes.</p></li>
<li><p>Removed <code>__nirum_tag_names__</code>, <code>__nirum_union_behind_name__</code>, and
<code>__nirum_field_names__</code> static fields from generated union type classes.</p></li>
<li><p>Removed <code>__nirum_tag_types__</code> static fields from generated union tag
classes.</p></li>
<li><p>Removed <code>__nirum_schema_version__</code> static field from generated service
classes.</p></li>
<li><p>Fixed a bug that generated service methods hadn’t checked its arguments
before its transport sends a payload. [<a href="https://github.com/nirum-lang/nirum/issues/220">#220</a>]</p></li>
<li><p>Fixed a bug that field/parameter names that use a module name of the Python
standard library cause runtime <code>TypeError</code>s (due to name shadowing).
Under the hood, all generated <code>import</code>s are now aliased with a name prefixed
an underscore.</p></li>
<li><p>Added Python classifier metadata field. [<a href="https://github.com/nirum-lang/nirum/issues/100">#100</a>, <a href="https://github.com/nirum-lang/nirum/pull/269">#269</a>]</p></li>
</ul>
<h3>Et cetera</h3>
<ul>
<li>The officially distributed executable binaries for Linux became
dependent on <a href="https://www.gnu.org/software/libc/">glibc</a> again.</li>
<li>The official Docker images became based on Debian (<a href="https://hub.docker.com/r/bitnami/minideb/">minideb</a>) instead of
Alpine Linux. It’s because Alpine Linux doesn’t provide GHC 8.2 as of
March 2018.</li>
</ul>
<h2>Version 0.3.3</h2>
<p>Released on March 15, 2018.</p>
<h3>Et cetera</h3>
<ul>
<li>The official Docker images became to have CA certificates.</li>
</ul>
<h2>Version 0.3.2</h2>
<p>Released on March 15, 2018.</p>
<h3>Et cetera</h3>
<ul>
<li>Fixed a broken build of the official Docker images.</li>
</ul>
<h2>Version 0.3.1</h2>
<p>Released on March 1, 2018.</p>
<h3>Python target</h3>
<ul>
<li>Fixed record/union deserializers to ignore unknown fields in data payload.
Deserializers had raised <code>KeyError</code> before. [<a href="https://github.com/nirum-lang/nirum/issues/232">#232</a>]</li>
</ul>
<h2>Version 0.3.0</h2>
<p>Released on February 18, 2018.</p>
<h3>Language</h3>
<ul>
<li><a href="./docs/package.html">Package</a> is now a new compilation unit of Nirum.
Every Nirum package needs <em>package.toml</em> manifest file.
[<a href="https://github.com/nirum-lang/nirum/pull/83">#83</a>, <a href="https://github.com/nirum-lang/nirum/pull/99">#99</a>]</li>
<li>Since a Nirum package can be compiled to more than one target languages,
the <code>nirum</code> command became to have <code>-t</code>/<code>--target</code> required parameter.
[<a href="https://github.com/nirum-lang/nirum/pull/106">#106</a>, <a href="https://github.com/nirum-lang/nirum/pull/111">#111</a>, <a href="https://github.com/nirum-lang/nirum/pull/114">#114</a>]</li>
<li>Added <code>-w</code>/<code>--watch</code> mode. [<a href="https://github.com/nirum-lang/nirum/issues/91">#91</a>, <a href="https://github.com/nirum-lang/nirum/pull/104">#104</a>, <a href="https://github.com/nirum-lang/nirum/issues/218">#218</a>]</li>
<li>Annotations became able to have multiple arguments and every parameter
became necessary to having its name (keyword). [<a href="https://github.com/nirum-lang/nirum/issues/178">#178</a>, <a href="https://github.com/nirum-lang/nirum/pull/190">#190</a>, <a href="https://github.com/nirum-lang/nirum/pull/197">#197</a>]</li>
<li>Service methods became able to omit their return types.
[<a href="https://github.com/nirum-lang/nirum/issues/179">#179</a>, <a href="https://github.com/nirum-lang/nirum/pull/199">#199</a> by Yang Chun Ung]</li>
<li>Added <code>@error</code> annotation to make a type to subclass an exception base
class (e.g., <a href="https://docs.python.org/3/library/exceptions.html#Exception"><code>Exception</code></a> in Python) when it’s compiled
to OO languages. [<a href="https://github.com/nirum-lang/nirum/issues/38">#38</a>, <a href="https://github.com/nirum-lang/nirum/pull/127">#127</a>]</li>
<li>Union tag docstrings in parentheses became allowed. [<a href="https://github.com/nirum-lang/nirum/issues/153">#153</a>, <a href="https://github.com/nirum-lang/nirum/pull/154">#154</a>]</li>
<li>Fixed a parser bug that a bare identifier (i.e., unquoted identifier) cannot
start with a reserved keyword, e.g., <code>types</code> (<code>type</code> is reserved),
<code>enumeration</code> (<code>enum</code> is reserved). [<a href="https://github.com/nirum-lang/nirum/issues/184">#184</a>, <a href="https://github.com/nirum-lang/nirum/pull/189">#189</a>]</li>
<li>Fixed a parser bug that <code>import</code> names had been disallowing to have
a trailing comma or newlines. [<a href="https://github.com/nirum-lang/nirum/pull/202">#202</a>]</li>
<li>Fixed the <code>nirum</code> command bug that it had always terminated with exit code
0 even when it errored. [<a href="https://github.com/nirum-lang/nirum/issues/97">#97</a>, <a href="https://github.com/nirum-lang/nirum/pull/108">#108</a>]</li>
</ul>
<h3>Docs target</h3>
<ul>
<li>A new target, <code>docs</code> is now available. To generate docs for a Nirum
package, specify <code>--target docs</code> option to the <code>nirum</code> command.
[<a href="https://github.com/nirum-lang/nirum/issues/10">#10</a>, <a href="https://github.com/nirum-lang/nirum/pull/113">#113</a>, <a href="https://github.com/nirum-lang/nirum/pull/116">#116</a>, <a href="https://github.com/nirum-lang/nirum/issues/125">#125</a>, <a href="https://github.com/nirum-lang/nirum/pull/131">#131</a>, <a href="https://github.com/nirum-lang/nirum/pull/152">#152</a>, <a href="https://github.com/nirum-lang/nirum/pull/170">#170</a>, <a href="https://github.com/nirum-lang/nirum/pull/223">#223</a>]</li>
</ul>
<h3>Python target</h3>
<ul>
<li>Now supports Python 2.7 besides Python 3.4 or later.
[<a href="https://github.com/nirum-lang/nirum/issues/50">#50</a>, <a href="https://github.com/nirum-lang/nirum/pull/85">#85</a>, <a href="https://github.com/nirum-lang/nirum/issues/93">#93</a>, <a href="https://github.com/nirum-lang/nirum/pull/117">#117</a>, <a href="https://github.com/nirum-lang/nirum-python/issues/22">nirum-python #22</a>]</li>
<li>Now requires <em>nirum-python</em> 0.6.0 or later. [<a href="https://github.com/nirum-lang/nirum/pull/119">#119</a>, <a href="https://github.com/nirum-lang/nirum/pull/141">#141</a>, <a href="https://github.com/nirum-lang/nirum/pull/146">#146</a>]</li>
<li>From now on, in order to compile a Nirum package to Python,
<em>package.toml</em> manifest need <a href="./target/python.html"><code>targets.python</code></a> section
and <code>targets.python.name</code> field. [<a href="https://github.com/nirum-lang/nirum/pull/99">#99</a>]</li>
<li>Added <code>targets.python.minimum_runtime</code> option to specify the minimum
version of <em>nirum-python</em> runtime library. [<a href="https://github.com/nirum-lang/nirum/issues/118">#118</a>, <a href="https://github.com/nirum-lang/nirum/pull/119">#119</a>]</li>
<li>Added <code>targets.python.renames</code> option to rename module names when they
are compiled to a Python module. [<a href="https://github.com/nirum-lang/nirum/pull/121">#121</a>]</li>
<li>More package metadata became configurable. [<a href="https://github.com/nirum-lang/nirum/issues/100">#100</a>]
<ul>
<li><code>targets.python.description</code> [<a href="https://github.com/nirum-lang/nirum/pull/174">#174</a> by Seunghun Lee]</li>
<li><code>targets.python.license</code> [<a href="https://github.com/nirum-lang/nirum/pull/180">#180</a> by Seunghun Lee]</li>
<li><code>targets.python.keywords</code> [<a href="https://github.com/nirum-lang/nirum/pull/183">#183</a> by Seunghun Lee]</li>
</ul></li>
<li>Added new transport layer. [<a href="https://github.com/nirum-lang/nirum/pull/149">#149</a>, <a href="https://github.com/nirum-lang/nirum-python/issues/79">nirum-python #79</a>, <a href="https://github.com/nirum-lang/nirum-python/pull/92">nirum-python #92</a>]
<ul>
<li>Generated constructors of service clients became to take a
<code>nirum.transport.Transport</code> instance.</li>
<li>Followed renamed/moved import paths of the runtime classes
(e.g., <code>nirum.rpc.Service</code> became to <code>nirum.service.Service</code>).</li>
<li>The way to avoid name collision between generated types and runtime
classes is changed. The runtime library had provided alternative names
like <code>service_type</code> for <code>Service</code> and generated imports had been like
<code>from nirum.rpc import service_type</code>, but it’s now
<code>from nirum.service import Service as service_type</code>.</li>
</ul></li>
<li>Record/union tag fields of an optional type can be omitted when
the constructor is called.
[<a href="https://github.com/nirum-lang/nirum/issues/70">#70</a>, <a href="https://github.com/nirum-lang/nirum/pull/165">#165</a> by Seunghun Lee]</li>
<li>Generated tag classes became qualified under its union class
(e.g., <code>Shape.Rectangle</code> instead of <code>Rectangle</code>).
Deprecated the old style and it is going to be obsolete in the near future.
[<a href="https://github.com/nirum-lang/nirum/issues/68">#68</a>, <a href="https://github.com/nirum-lang/nirum/pull/193">#193</a>]</li>
<li>Generated service clients became qualified under its service class
(e.g., <code>FooService.Client</code> instead of <code>FooService_Client</code>).
Deprecated the old style and it is going to be obsolete in the near future.
[<a href="https://github.com/nirum-lang/nirum/pull/167">#167</a>, <a href="https://github.com/nirum-lang/nirum/pull/222">#222</a>].</li>
<li>Generated serializers became independent from <em>nirum-python</em> runtime
library. [<a href="https://github.com/nirum-lang/nirum/issues/160">#160</a>, <a href="https://github.com/nirum-lang/nirum/pull/201">#201</a>, <a href="https://github.com/nirum-lang/nirum/pull/203">#203</a>, <a href="https://github.com/nirum-lang/nirum/pull/204">#204</a>]</li>
<li>Deserializers became to show multiple error messages at a time.
[<a href="https://github.com/nirum-lang/nirum/issues/168">#168</a>, <a href="https://github.com/nirum-lang/nirum/pull/224">#224</a>]</li>
<li>Generated Python classes became having <code>__nirum_type__</code> metadata for RTTI.
[<a href="https://github.com/nirum-lang/nirum-python/issues/34">nirum-python #34</a>, <a href="https://github.com/nirum-lang/nirum/pull/192">#192</a>]</li>
<li>Generated service classes became having <code>__nirum_method_annotations__</code>
metadata for processing annotations. [<a href="https://github.com/nirum-lang/nirum/pull/194">#194</a>]</li>
<li>Docstrings in a Nirum schema became to generate corresponding Python
docstrings. [<a href="https://github.com/nirum-lang/nirum/issues/102">#102</a>, <a href="https://github.com/nirum-lang/nirum/pull/128">#128</a>]</li>
<li>Sets, lists, and maps became compiled to immutable data structures
so that thay are easily hashable. [<a href="https://github.com/nirum-lang/nirum-python/issues/49">nirum-python #49</a>, <a href="https://github.com/nirum-lang/nirum/pull/123">#123</a>]</li>
<li>Fixed a bug that implicit ancestor packages hadn’t been generated even
if they have submodules. [<a href="https://github.com/nirum-lang/nirum/issues/92">#92</a>, <a href="https://github.com/nirum-lang/nirum/pull/105">#105</a>]</li>
<li>Fixed a bug that a generated Python code had raised
<a href="https://docs.python.org/3/library/exceptions.html#NameError"><code>NameError</code></a> when a referring type is above than
a referred type. [<a href="https://github.com/nirum-lang/nirum/issues/138">#138</a>, <a href="https://github.com/nirum-lang/nirum-python/pull/88">nirum-python #88</a>, <a href="https://github.com/nirum-lang/nirum/pull/146">#146</a>]</li>
<li>Fixed a bug that a generated Python <code>enum</code> code had became broken
when an enum type has a member named <code>mro</code>. [<a href="https://github.com/nirum-lang/nirum/issues/185">#185</a>, <a href="https://github.com/nirum-lang/nirum/pull/188">#188</a>]</li>
</ul>
<h3>Et cetera</h3>
<ul>
<li>The officially distributed executable binaries for Linux became
independent from <a href="https://www.gnu.org/software/libc/">glibc</a>; instead statically linked to <a href="https://www.musl-libc.org/">musl</a>. <a href="https://github.com/nirum-lang/nirum/issues/216">#216</a></li>
<li>The Docker image now has <code>nirum</code> command in <code>PATH</code>. [<a href="https://github.com/nirum-lang/nirum/pull/155">#155</a>]</li>
<li>The Docker image became based and built on <a href="https://alpinelinux.org/">Alpine Linux</a> so that
the image is now much lighter.</li>
</ul>
<h2>Version 0.2.0</h2>
<p>Still unstable release. Released on September 26, 2016.</p>
<h3>Language</h3>
<ul>
<li>The <code>boxed</code> keyword was renamed to <code>unboxed</code>. [<a href="https://github.com/nirum-lang/nirum/issues/65">#65</a>, <a href="https://github.com/nirum-lang/nirum/pull/81">#81</a>]</li>
<li><a href="./docs/annotation.html">Annotations</a> became renewed and complete
so that every type and module now can be annotated.
[<a href="https://github.com/nirum-lang/nirum/issues/40">#40</a>, <a href="https://github.com/nirum-lang/nirum/pull/73">#73</a>]</li>
<li>Docstrings became merely a syntactic sugar of <code>@docs</code> annotation.
[<a href="https://github.com/nirum-lang/nirum/pull/53">#53</a>, <a href="https://github.com/nirum-lang/nirum/pull/57">#57</a>]</li>
<li>Fixed a parser bug which had failed to parse spaces right before/after tag
parentheses. [<a href="https://github.com/nirum-lang/nirum/issues/69">#69</a>, <a href="https://github.com/nirum-lang/nirum/pull/71">#71</a>]</li>
<li>Fixed a parser bug which had referred to a wrong line/column position on
syntax error message when a trailing semicolon is missing. [<a href="https://github.com/nirum-lang/nirum/pull/64">#64</a>]</li>
</ul>
<h3>Python target</h3>
<ul>
<li>Services became to have their own client implementation of a name with
<code>_Client</code> postfix when they are compiled to Python. [<a href="https://github.com/nirum-lang/nirum/pull/52">#52</a>]</li>
<li>Generated types became to have <code>__hash__()</code> method so that they are now
hashable. [<a href="https://github.com/nirum-lang/nirum/issues/75">#75</a>, <a href="https://github.com/nirum-lang/nirum/pull/76">#76</a>]</li>
<li>Fixed a bug that a Python class generated from a parameterless tag had
been broken. [<a href="https://github.com/nirum-lang/nirum/issues/55">#55</a>, <a href="https://github.com/nirum-lang/nirum/pull/66">#66</a>]</li>
</ul>
<h3>Et cetera</h3>
<ul>
<li>Introduced the official Docker image. The image repository is located to
<a href="https://hub.docker.com/r/spoqa/nirum/">spoqa/nirum</a>.
[<a href="https://github.com/nirum-lang/nirum/pull/48">#48</a> by Minyoung Jeong]</li>
</ul>
<h2>Version 0.1.0</h2>
<p>Initial and unstable release for a
<a href="https://www.pycon.kr/2016apac/program/36">demo session at PyCon APAC 2016</a>.
Released on August 14, 2016.</p>
</article>
<div class="github"><a href="https://github.com/nirum-lang/nirum" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a></div>
</body>
</html>