Fix latest lints, remove author from pubspec (#30)

diff --git a/lib/src/bound_multipart_stream.dart b/lib/src/bound_multipart_stream.dart
index 4b32ef9..07418b2 100644
--- a/lib/src/bound_multipart_stream.dart
+++ b/lib/src/bound_multipart_stream.dart
@@ -45,24 +45,26 @@
 
 void _expectByteValue(int val1, int val2) {
   if (val1 != val2) {
-    throw MimeMultipartException("Failed to parse multipart mime 1");
+    throw MimeMultipartException('Failed to parse multipart mime 1');
   }
 }
 
 void _expectWhitespace(int byte) {
   if (byte != CharCode.SP && byte != CharCode.HT) {
-    throw MimeMultipartException("Failed to parse multipart mime 2");
+    throw MimeMultipartException('Failed to parse multipart mime 2');
   }
 }
 
 class _MimeMultipart extends MimeMultipart {
+  @override
   final Map<String, String> headers;
   final Stream<List<int>> _stream;
 
   _MimeMultipart(this.headers, this._stream);
 
-  StreamSubscription<List<int>> listen(void onData(List<int> data),
-      {void onDone(), Function onError, bool cancelOnError}) {
+  @override
+  StreamSubscription<List<int>> listen(void Function(List<int> data) onData,
+      {void Function() onDone, Function onError, bool cancelOnError}) {
     return _stream.listen(onData,
         onDone: onDone, onError: onError, cancelOnError: cancelOnError);
   }
@@ -137,7 +139,7 @@
           }, onDone: () {
             if (_state != _DONE) {
               _controller
-                  .addError(MimeMultipartException("Bad multipart ending"));
+                  .addError(MimeMultipartException('Bad multipart ending'));
             }
             _controller.close();
           }, onError: _controller.addError);
@@ -168,14 +170,14 @@
           _subscription.cancel();
           break;
         default:
-          throw StateError("This code should never be reached.");
+          throw StateError('This code should never be reached.');
       }
     }
   }
 
   void _parse() {
     // Number of boundary bytes to artificially place before the supplied data.
-    int boundaryPrefix = 0;
+    var boundaryPrefix = 0;
     // Position where content starts. Will be null if no known content
     // start exists. Will be negative of the content starts in the
     // boundary prefix. Will be zero or position if the content starts
@@ -209,7 +211,7 @@
     } else {
       contentStartIndex = null;
     }
-    // The data to parse might be "artificially" prefixed with a
+    // The data to parse might be 'artificially' prefixed with a
     // partial match of the boundary.
     boundaryPrefix = _boundaryIndex;
 
@@ -256,7 +258,7 @@
           break;
 
         case _HEADER_START:
-          _headers = Map<String, String>();
+          _headers = <String, String>{};
           if (byte == CharCode.CR) {
             _state = _HEADER_ENDING;
           } else {
@@ -271,7 +273,7 @@
             _state = _HEADER_VALUE_START;
           } else {
             if (!_isTokenChar(byte)) {
-              throw MimeMultipartException("Invalid header field name");
+              throw MimeMultipartException('Invalid header field name');
             }
             _headerField.add(_toLowerCase(byte));
           }
@@ -304,8 +306,8 @@
           if (byte == CharCode.SP || byte == CharCode.HT) {
             _state = _HEADER_VALUE_START;
           } else {
-            String headerField = utf8.decode(_headerField);
-            String headerValue = utf8.decode(_headerValue);
+            var headerField = utf8.decode(_headerField);
+            var headerValue = utf8.decode(_headerValue);
             _headers[headerField.toLowerCase()] = headerValue;
             _headerField.clear();
             _headerValue.clear();
@@ -353,7 +355,7 @@
           } else {
             // Restart matching of the boundary.
             _index = _index - _boundaryIndex;
-            if (contentStartIndex == null) contentStartIndex = _index;
+            contentStartIndex ??= _index;
             _boundaryIndex = 0;
           }
           break;
diff --git a/lib/src/magic_number.dart b/lib/src/magic_number.dart
index d490346..50be18a 100644
--- a/lib/src/magic_number.dart
+++ b/lib/src/magic_number.dart
@@ -14,7 +14,7 @@
   bool matches(List<int> header) {
     if (header.length < numbers.length) return false;
 
-    for (int i = 0; i < numbers.length; i++) {
+    for (var i = 0; i < numbers.length; i++) {
       if (mask != null) {
         if ((mask[i] & numbers[i]) != (mask[i] & header[i])) return false;
       } else {
diff --git a/lib/src/mime_multipart_transformer.dart b/lib/src/mime_multipart_transformer.dart
index 5509339..1869480 100644
--- a/lib/src/mime_multipart_transformer.dart
+++ b/lib/src/mime_multipart_transformer.dart
@@ -37,6 +37,7 @@
   MimeMultipartTransformer(String boundary)
       : _boundary = _getBoundary(boundary);
 
+  @override
   Stream<MimeMultipart> bind(Stream<List<int>> stream) {
     return BoundMultipartStream(_boundary, stream).stream;
   }
diff --git a/lib/src/mime_shared.dart b/lib/src/mime_shared.dart
index 5cc6a8f..00ade1d 100644
--- a/lib/src/mime_shared.dart
+++ b/lib/src/mime_shared.dart
@@ -8,9 +8,10 @@
 class MimeMultipartException implements Exception {
   final String message;
 
-  const MimeMultipartException([this.message = ""]);
+  const MimeMultipartException([this.message = '']);
 
-  String toString() => "MimeMultipartException: $message";
+  @override
+  String toString() => 'MimeMultipartException: $message';
 }
 
 /// A Mime Multipart class representing each part parsed by
diff --git a/lib/src/mime_type.dart b/lib/src/mime_type.dart
index 6fbe270..84ac306 100644
--- a/lib/src/mime_type.dart
+++ b/lib/src/mime_type.dart
@@ -104,7 +104,7 @@
   }
 
   static String _ext(String path) {
-    int index = path.lastIndexOf('.');
+    var index = path.lastIndexOf('.');
     if (index < 0 || index + 1 >= path.length) return path;
     return path.substring(index + 1).toLowerCase();
   }
diff --git a/pubspec.yaml b/pubspec.yaml
index e4038a7..b0c21b3 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,10 +1,9 @@
 name: mime
-version: 0.9.6+3
+version: 0.9.7-dev
 
 description: >-
   Utilities for handling media (MIME) types, including determining a type from
   a file extension and file contents.
-author: Dart Team <misc@dartlang.org>
 homepage: https://www.github.com/dart-lang/mime
 
 environment:
diff --git a/test/mime_multipart_transformer_test.dart b/test/mime_multipart_transformer_test.dart
index be8ca17..fbfe2b6 100644
--- a/test/mime_multipart_transformer_test.dart
+++ b/test/mime_multipart_transformer_test.dart
@@ -5,16 +5,16 @@
 import 'dart:async';
 import 'dart:math';
 
-import "package:test/test.dart";
-import "package:mime/mime.dart";
+import 'package:test/test.dart';
+import 'package:mime/mime.dart';
 
 void _writeInChunks(
     List<int> data, int chunkSize, StreamController<List<int>> controller) {
   if (chunkSize == -1) chunkSize = data.length;
 
-  for (int pos = 0; pos < data.length; pos += chunkSize) {
-    int remaining = data.length - pos;
-    int writeLength = min(chunkSize, remaining);
+  for (var pos = 0; pos < data.length; pos += chunkSize) {
+    var remaining = data.length - pos;
+    var writeLength = min(chunkSize, remaining);
     controller.add(data.sublist(pos, pos + writeLength));
   }
   controller.close();
@@ -29,11 +29,11 @@
 
     var stream =
         controller.stream.transform(MimeMultipartTransformer(boundary));
-    int i = 0;
+    var i = 0;
     var completer = Completer();
     var futures = <Future>[];
     stream.listen((multipart) {
-      int part = i++;
+      var part = i++;
       if (expectedHeaders != null) {
         expect(multipart.headers, equals(expectedHeaders[part]));
       }
@@ -121,10 +121,10 @@
     var stream =
         controller.stream.transform(MimeMultipartTransformer(boundary));
     var subscription;
-    int i = 0;
+    var i = 0;
     var futures = <Future>[];
     subscription = stream.listen((multipart) {
-      int partIndex = i;
+      var partIndex = i;
 
       if (partIndex >= parts) {
         throw StateError('Expected no more parts, but got one.');
@@ -153,7 +153,7 @@
 
   // Test parsing the data three times delivering the data in
   // different chunks.
-  List<int> data = message.codeUnits;
+  var data = message.codeUnits;
   test('test', () {
     expect(
         Future.wait([
@@ -178,7 +178,7 @@
     });
 
     test('test-n-parts-only', () {
-      int numPartsExpected = expectedParts.length - 1;
+      var numPartsExpected = expectedParts.length - 1;
       if (numPartsExpected == 0) numPartsExpected = 1;
 
       expect(
@@ -206,10 +206,10 @@
 void _testParseValid() {
   // Empty message from Chrome form post.
   var message = '------WebKitFormBoundaryU3FBruSkJKG0Yor1--\r\n';
-  _testParse(message, "----WebKitFormBoundaryU3FBruSkJKG0Yor1", [], []);
+  _testParse(message, '----WebKitFormBoundaryU3FBruSkJKG0Yor1', [], []);
 
   // Sample from Wikipedia.
-  message = """
+  message = '''
 This is a message with multiple parts in MIME format.\r
 --frontier\r
 Content-Type: text/plain\r
@@ -221,20 +221,20 @@
 \r
 PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
 Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=\r
---frontier--\r\n""";
-  var headers1 = <String, String>{"content-type": "text/plain"};
+--frontier--\r\n''';
+  var headers1 = <String, String>{'content-type': 'text/plain'};
   var headers2 = <String, String>{
-    "content-type": "application/octet-stream",
-    "content-transfer-encoding": "base64"
+    'content-type': 'application/octet-stream',
+    'content-transfer-encoding': 'base64'
   };
-  var body1 = "This is the body of the message.";
-  var body2 = """
+  var body1 = 'This is the body of the message.';
+  var body2 = '''
 PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
-Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=""";
-  _testParse(message, "frontier", [headers1, headers2], [body1, body2]);
+Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=''';
+  _testParse(message, 'frontier', [headers1, headers2], [body1, body2]);
 
   // Sample from HTML 4.01 Specification.
-  message = """
+  message = '''
 \r\n--AaB03x\r
 Content-Disposition: form-data; name=\"submit-name\"\r
 \r
@@ -244,17 +244,17 @@
 Content-Type: text/plain\r
 \r
 ... contents of file1.txt ...\r
---AaB03x--\r\n""";
+--AaB03x--\r\n''';
   headers1 = <String, String>{
-    "content-disposition": "form-data; name=\"submit-name\""
+    'content-disposition': 'form-data; name=\"submit-name\"'
   };
   headers2 = <String, String>{
-    "content-type": "text/plain",
-    "content-disposition": "form-data; name=\"files\"; filename=\"file1.txt\""
+    'content-type': 'text/plain',
+    'content-disposition': 'form-data; name=\"files\"; filename=\"file1.txt\"'
   };
-  body1 = "Larry";
-  body2 = "... contents of file1.txt ...";
-  _testParse(message, "AaB03x", [headers1, headers2], [body1, body2]);
+  body1 = 'Larry';
+  body2 = '... contents of file1.txt ...';
+  _testParse(message, 'AaB03x', [headers1, headers2], [body1, body2]);
 
   // Longer form from submitting the following from Chrome.
   //
@@ -262,19 +262,19 @@
   // <body>
   // <FORM action="http://127.0.0.1:1234/"
   //     enctype="multipart/form-data"
-  //     method="post">
+  //     method='post'>
   //  <P>
-  //  Text: <INPUT type="text" name="text_input">
-  //  Password: <INPUT type="password" name="password_input">
-  //  Checkbox: <INPUT type="checkbox" name="checkbox_input">
-  //  Radio: <INPUT type="radio" name="radio_input">
-  //  Send <INPUT type="submit">
+  //  Text: <INPUT type='text' name='text_input'>
+  //  Password: <INPUT type='password' name='password_input'>
+  //  Checkbox: <INPUT type='checkbox' name='checkbox_input'>
+  //  Radio: <INPUT type='radio' name='radio_input'>
+  //  Send <INPUT type='submit'>
   //  </P>
   // </FORM>
   // </body>
   // </html>
 
-  message = """
+  message = '''
 \r\n------WebKitFormBoundaryQ3cgYAmGRF8yOeYB\r
 Content-Disposition: form-data; name=\"text_input\"\r
 \r
@@ -291,28 +291,28 @@
 Content-Disposition: form-data; name=\"radio_input\"\r
 \r
 on\r
-------WebKitFormBoundaryQ3cgYAmGRF8yOeYB--\r\n""";
+------WebKitFormBoundaryQ3cgYAmGRF8yOeYB--\r\n''';
   headers1 = <String, String>{
-    "content-disposition": "form-data; name=\"text_input\""
+    'content-disposition': 'form-data; name=\"text_input\"'
   };
   headers2 = <String, String>{
-    "content-disposition": "form-data; name=\"password_input\""
+    'content-disposition': 'form-data; name=\"password_input\"'
   };
   var headers3 = <String, String>{
-    "content-disposition": "form-data; name=\"checkbox_input\""
+    'content-disposition': 'form-data; name=\"checkbox_input\"'
   };
   var headers4 = <String, String>{
-    "content-disposition": "form-data; name=\"radio_input\""
+    'content-disposition': 'form-data; name=\"radio_input\"'
   };
-  body1 = "text";
-  body2 = "password";
-  var body3 = "on";
-  var body4 = "on";
-  _testParse(message, "----WebKitFormBoundaryQ3cgYAmGRF8yOeYB",
+  body1 = 'text';
+  body2 = 'password';
+  var body3 = 'on';
+  var body4 = 'on';
+  _testParse(message, '----WebKitFormBoundaryQ3cgYAmGRF8yOeYB',
       [headers1, headers2, headers3, headers4], [body1, body2, body3, body4]);
 
   // Same form from Firefox.
-  message = """
+  message = '''
 \r\n-----------------------------52284550912143824192005403738\r
 Content-Disposition: form-data; name=\"text_input\"\r
 \r
@@ -329,15 +329,15 @@
 Content-Disposition: form-data; name=\"radio_input\"\r
 \r
 on\r
------------------------------52284550912143824192005403738--\r\n""";
+-----------------------------52284550912143824192005403738--\r\n''';
   _testParse(
       message,
-      "---------------------------52284550912143824192005403738",
+      '---------------------------52284550912143824192005403738',
       [headers1, headers2, headers3, headers4],
       [body1, body2, body3, body4]);
 
   // And Internet Explorer
-  message = """
+  message = '''
 \r\n-----------------------------7dc8f38c60326\r
 Content-Disposition: form-data; name=\"text_input\"\r
 \r
@@ -354,12 +354,12 @@
 Content-Disposition: form-data; name=\"radio_input\"\r
 \r
 on\r
------------------------------7dc8f38c60326--\r\n""";
-  _testParse(message, "---------------------------7dc8f38c60326",
+-----------------------------7dc8f38c60326--\r\n''';
+  _testParse(message, '---------------------------7dc8f38c60326',
       [headers1, headers2, headers3, headers4], [body1, body2, body3, body4]);
 
   // Test boundary prefix inside prefix and content.
-  message = """
+  message = '''
 -\r
 --\r
 --b\r
@@ -393,9 +393,9 @@
 --b\r\r\r\r
 --\r\r\r
 -\r\r
---boundary--\r\n""";
-  var headers = <String, String>{"content-type": "text/plain"};
-  body1 = """
+--boundary--\r\n''';
+  var headers = <String, String>{'content-type': 'text/plain'};
+  body1 = '''
 -\r
 --\r
 --b\r
@@ -404,8 +404,8 @@
 --boun\r
 --bound\r\r
 --bounda\r\r\r
---boundar\r\r\r""";
-  body2 = """
+--boundar\r\r\r''';
+  body2 = '''
 --boundar\r
 --bounda\r
 --bound\r
@@ -414,11 +414,11 @@
 --bo\r
 --b\r\r\r\r
 --\r\r\r
--\r""";
-  _testParse(message, "boundary", [headers, headers], [body1, body2]);
+-\r''';
+  _testParse(message, 'boundary', [headers, headers], [body1, body2]);
 
   // Without initial CRLF.
-  message = """
+  message = '''
 --xxx\r
 \r
 \r
@@ -427,13 +427,13 @@
 \r
 \r
 Body2\r
---xxx--\r\n""";
-  _testParse(message, "xxx", null, ["\r\nBody 1", "\r\nBody2"]);
+--xxx--\r\n''';
+  _testParse(message, 'xxx', null, ['\r\nBody 1', '\r\nBody2']);
 }
 
 void _testParseInvalid() {
   // Missing end boundary.
-  var message = """
+  var message = '''
 \r
 --xxx\r
 \r
@@ -443,8 +443,8 @@
 \r
 \r
 Body2\r
---xxx\r\n""";
-  _testParse(message, "xxx", null, [null, null], true);
+--xxx\r\n''';
+  _testParse(message, 'xxx', null, [null, null], true);
 }
 
 void main() {